From 17fa00b29ee2e91e6048b43a175276942ada8729 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sat, 21 Feb 2015 10:44:22 +0000 Subject: [PATCH 01/22] common interface and rendering for h/xslf git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1661320 13f79535-47bb-0310-9956-ffa450edef68 From cb09b997c45c042d742971e357ed06166639834a Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sat, 21 Feb 2015 10:56:03 +0000 Subject: [PATCH 02/22] initial commit - still lots of errors, but I need to switch to a clean trunk for releasing and testing git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1661322 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 40 +- .../poi/hslf/examples/ApacheconEU08.java | 3 +- .../apache/poi/xslf/usermodel/Tutorial4.java | 2 + .../poi/hssf/usermodel/HSSFPatriarch.java | 2 +- src/java/org/apache/poi/util/Units.java | 25 +- .../poi/xslf/model/PropertyFetcher.java | 4 +- .../poi/xslf/model/geom/PresetGeometries.java | 67 - .../apache/poi/xslf/usermodel/LineDash.java | 34 - .../poi/xslf/usermodel/RenderableShape.java | 2 + .../apache/poi/xslf/usermodel/TextAlign.java | 50 - .../poi/xslf/usermodel/TextAutofit.java | 59 - .../poi/xslf/usermodel/TextDirection.java | 48 - .../poi/xslf/usermodel/TextFragment.java | 90 - .../poi/xslf/usermodel/XMLSlideShow.java | 30 +- .../poi/xslf/usermodel/XSLFAutoShape.java | 3 +- .../poi/xslf/usermodel/XSLFBackground.java | 19 +- .../apache/poi/xslf/usermodel/XSLFColor.java | 210 +- .../poi/xslf/usermodel/XSLFGraphicFrame.java | 6 +- .../poi/xslf/usermodel/XSLFGroupShape.java | 30 +- .../apache/poi/xslf/usermodel/XSLFNotes.java | 21 +- .../poi/xslf/usermodel/XSLFNotesMaster.java | 5 +- .../apache/poi/xslf/usermodel/XSLFShadow.java | 3 +- .../apache/poi/xslf/usermodel/XSLFShape.java | 540 +- .../xslf/usermodel/XSLFShapeContainer.java | 25 +- .../poi/xslf/usermodel/XSLFShapeType.java | 236 - .../apache/poi/xslf/usermodel/XSLFSheet.java | 28 +- .../poi/xslf/usermodel/XSLFSimpleShape.java | 281 +- .../apache/poi/xslf/usermodel/XSLFSlide.java | 46 +- .../poi/xslf/usermodel/XSLFSlideLayout.java | 3 +- .../poi/xslf/usermodel/XSLFSlideMaster.java | 6 +- .../poi/xslf/usermodel/XSLFTableCell.java | 1 + .../poi/xslf/usermodel/XSLFTextParagraph.java | 340 +- .../poi/xslf/usermodel/XSLFTextRun.java | 3 +- .../poi/xslf/usermodel/XSLFTextShape.java | 163 +- .../poi/xslf/usermodel/TestXSLFAutoShape.java | 12 +- .../usermodel/TestXSLFConnectorShape.java | 6 +- .../xslf/usermodel/TestXSLFSimpleShape.java | 2 + .../poi/xslf/usermodel/TestXSLFTable.java | 2 + .../xslf/usermodel/TestXSLFTextParagraph.java | 3 + .../poi/xslf/usermodel/TestXSLFTextShape.java | 3 + .../poi/sl/draw/presetShapeDefinitions.xml | 19906 ++++++++++++++++ .../apache/poi/hslf/model/ActiveXShape.java | 6 +- .../org/apache/poi/hslf/model/AutoShape.java | 12 +- .../org/apache/poi/hslf/model/AutoShapes.java | 45 +- .../org/apache/poi/hslf/model/Background.java | 22 +- .../org/apache/poi/hslf/model/Freeform.java | 10 +- .../org/apache/poi/hslf/model/Hyperlink.java | 6 +- .../src/org/apache/poi/hslf/model/Line.java | 8 +- .../org/apache/poi/hslf/model/MovieShape.java | 5 +- .../org/apache/poi/hslf/model/OLEShape.java | 5 +- .../apache/poi/hslf/model/PPGraphics2D.java | 7 +- .../org/apache/poi/hslf/model/Picture.java | 10 +- .../apache/poi/hslf/model/Placeholder.java | 5 +- .../org/apache/poi/hslf/model/Polygon.java | 10 +- .../src/org/apache/poi/hslf/model/Shape.java | 79 +- .../apache/poi/hslf/model/ShapeFactory.java | 20 +- .../org/apache/poi/hslf/model/ShapeGroup.java | 80 +- .../org/apache/poi/hslf/model/ShapeTypes.java | 57 - .../src/org/apache/poi/hslf/model/Sheet.java | 78 +- .../apache/poi/hslf/model/SimpleShape.java | 19 +- .../src/org/apache/poi/hslf/model/Slide.java | 8 +- .../src/org/apache/poi/hslf/model/Table.java | 33 +- .../org/apache/poi/hslf/model/TableCell.java | 16 +- .../org/apache/poi/hslf/model/TextBox.java | 8 +- .../org/apache/poi/hslf/model/TextShape.java | 19 +- .../org/apache/poi/hslf/record/PPDrawing.java | 16 +- .../org/apache/poi/sl/draw/DrawAutoShape.java | 10 + .../org/apache/poi/sl/draw/DrawFactory.java | 96 + .../apache/poi/sl/draw/DrawFontManager.java} | 21 +- .../apache/poi/sl/draw/DrawFreeformShape.java | 9 + .../apache/poi/sl/draw/DrawMasterSheet.java | 22 + .../src/org/apache/poi/sl/draw/DrawPaint.java | 448 + .../src/org/apache/poi/sl/draw/DrawShape.java | 109 + .../src/org/apache/poi/sl/draw/DrawSheet.java | 72 + .../apache/poi/sl/draw/DrawSimpleShape.java | 391 + .../org/apache/poi/sl/draw/DrawTextBox.java | 9 + .../apache/poi/sl/draw/DrawTextFragment.java | 94 + .../apache/poi/sl/draw/DrawTextParagraph.java | 381 + .../org/apache/poi/sl/draw/DrawTextShape.java | 140 + .../src/org/apache/poi/sl/draw/Drawable.java | 123 + .../org/apache/poi/sl/draw/ImageRenderer.java | 155 + .../poi/sl/draw/binding/CTAdjPoint2D.java | 126 + .../sl/draw/binding/CTAdjustHandleList.java | 116 + .../apache/poi/sl/draw/binding/CTAngle.java | 86 + .../apache/poi/sl/draw/binding/CTColor.java | 254 + .../poi/sl/draw/binding/CTColorMRU.java | 123 + .../draw/binding/CTComplementTransform.java | 62 + .../poi/sl/draw/binding/CTConnection.java | 112 + .../poi/sl/draw/binding/CTConnectionSite.java | 131 + .../sl/draw/binding/CTConnectionSiteList.java | 110 + .../sl/draw/binding/CTCustomGeometry2D.java | 259 + .../draw/binding/CTEmbeddedWAVAudioFile.java | 169 + .../sl/draw/binding/CTFixedPercentage.java | 86 + .../poi/sl/draw/binding/CTGammaTransform.java | 62 + .../poi/sl/draw/binding/CTGeomGuide.java | 129 + .../poi/sl/draw/binding/CTGeomGuideList.java | 110 + .../poi/sl/draw/binding/CTGeomRect.java | 188 + .../sl/draw/binding/CTGrayscaleTransform.java | 62 + .../sl/draw/binding/CTGroupTransform2D.java | 313 + .../poi/sl/draw/binding/CTHslColor.java | 237 + .../poi/sl/draw/binding/CTHyperlink.java | 420 + .../draw/binding/CTInverseGammaTransform.java | 62 + .../sl/draw/binding/CTInverseTransform.java | 62 + .../sl/draw/binding/CTOfficeArtExtension.java | 139 + .../binding/CTOfficeArtExtensionList.java | 110 + .../apache/poi/sl/draw/binding/CTPath2D.java | 320 + .../poi/sl/draw/binding/CTPath2DArcTo.java | 187 + .../poi/sl/draw/binding/CTPath2DClose.java | 62 + .../draw/binding/CTPath2DCubicBezierTo.java | 109 + .../poi/sl/draw/binding/CTPath2DLineTo.java | 98 + .../poi/sl/draw/binding/CTPath2DList.java | 110 + .../poi/sl/draw/binding/CTPath2DMoveTo.java | 98 + .../sl/draw/binding/CTPath2DQuadBezierTo.java | 109 + .../poi/sl/draw/binding/CTPercentage.java | 86 + .../apache/poi/sl/draw/binding/CTPoint2D.java | 110 + .../apache/poi/sl/draw/binding/CTPoint3D.java | 133 + .../sl/draw/binding/CTPolarAdjustHandle.java | 289 + .../sl/draw/binding/CTPositiveFixedAngle.java | 86 + .../binding/CTPositiveFixedPercentage.java | 86 + .../sl/draw/binding/CTPositivePercentage.java | 86 + .../poi/sl/draw/binding/CTPositiveSize2D.java | 110 + .../poi/sl/draw/binding/CTPresetColor.java | 199 + .../sl/draw/binding/CTPresetGeometry2D.java | 131 + .../sl/draw/binding/CTPresetTextShape.java | 131 + .../apache/poi/sl/draw/binding/CTRatio.java | 110 + .../poi/sl/draw/binding/CTRelativeRect.java | 220 + .../poi/sl/draw/binding/CTSRgbColor.java | 202 + .../poi/sl/draw/binding/CTScRgbColor.java | 237 + .../apache/poi/sl/draw/binding/CTScale2D.java | 131 + .../poi/sl/draw/binding/CTSchemeColor.java | 199 + .../poi/sl/draw/binding/CTSphereCoords.java | 133 + .../poi/sl/draw/binding/CTSystemColor.java | 235 + .../poi/sl/draw/binding/CTTransform2D.java | 249 + .../poi/sl/draw/binding/CTVector3D.java | 133 + .../poi/sl/draw/binding/CTXYAdjustHandle.java | 289 + .../poi/sl/draw/binding/ObjectFactory.java | 2023 ++ .../poi/sl/draw/binding/STBlackWhiteMode.java | 149 + .../poi/sl/draw/binding/STPathFillMode.java | 109 + .../poi/sl/draw/binding/STPresetColorVal.java | 1181 + .../poi/sl/draw/binding/STRectAlignment.java | 133 + .../poi/sl/draw/binding/STSchemeColorVal.java | 197 + .../poi/sl/draw/binding/STShapeType.java | 1557 ++ .../poi/sl/draw/binding/STTextShapeType.java | 389 + .../poi/sl/draw}/geom/AbsExpression.java | 2 +- .../sl/draw}/geom/AddDivideExpression.java | 2 +- .../sl/draw}/geom/AddSubtractExpression.java | 2 +- .../apache/poi/sl/draw}/geom/AdjustValue.java | 4 +- .../poi/sl/draw}/geom/ArcTanExpression.java | 2 +- .../poi/sl/draw}/geom/ArcToCommand.java | 4 +- .../poi/sl/draw}/geom/ClosePathCommand.java | 2 +- .../org/apache/poi/sl/draw}/geom/Context.java | 2 +- .../poi/sl/draw}/geom/CosExpression.java | 2 +- .../sl/draw}/geom/CosineArcTanExpression.java | 2 +- .../poi/sl/draw}/geom/CurveToCommand.java | 4 +- .../poi/sl/draw}/geom/CustomGeometry.java | 40 +- .../apache/poi/sl/draw}/geom/Expression.java | 2 +- .../poi/sl/draw}/geom/ExpressionParser.java | 2 +- .../org/apache/poi/sl/draw}/geom/Formula.java | 2 +- .../org/apache/poi/sl/draw}/geom/Guide.java | 4 +- .../poi/sl/draw}/geom/IAdjustableShape.java | 2 +- .../poi/sl/draw}/geom/IfElseExpression.java | 2 +- .../poi/sl/draw}/geom/LineToCommand.java | 4 +- .../sl/draw}/geom/LiteralValueExpression.java | 2 +- .../poi/sl/draw}/geom/MaxExpression.java | 2 +- .../poi/sl/draw}/geom/MinExpression.java | 2 +- .../poi/sl/draw}/geom/ModExpression.java | 2 +- .../poi/sl/draw}/geom/MoveToCommand.java | 4 +- .../draw}/geom/MultiplyDivideExpression.java | 2 +- .../org/apache/poi/sl/draw}/geom/Outline.java | 2 +- .../org/apache/poi/sl/draw}/geom/Path.java | 22 +- .../apache/poi/sl/draw}/geom/PathCommand.java | 2 +- .../poi/sl/draw}/geom/PinExpression.java | 2 +- .../poi/sl/draw/geom/PresetGeometries.java | 114 + .../poi/sl/draw}/geom/QuadToCommand.java | 4 +- .../sl/draw}/geom/SinArcTanExpression.java | 2 +- .../poi/sl/draw}/geom/SinExpression.java | 2 +- .../poi/sl/draw}/geom/SqrtExpression.java | 2 +- .../poi/sl/draw}/geom/TanExpression.java | 2 +- .../apache/poi/sl/usermodel/AutoShape.java | 2 +- .../apache/poi/sl/usermodel/ColorStyle.java | 69 + .../{LineStyle.java => FillStyle.java} | 43 +- .../poi/sl/usermodel/FreeformShape.java} | 43 +- .../poi/sl/usermodel/GradientPaint.java | 32 + .../org/apache/poi/sl/usermodel/Insets2D.java | 146 + .../poi/sl/usermodel/LineDecoration.java | 69 + .../usermodel/{Fill.java => PaintStyle.java} | 6 +- .../poi/sl/usermodel/PlaceableShape.java | 39 + .../org/apache/poi/sl/usermodel/Shadow.java | 47 + .../org/apache/poi/sl/usermodel/Shape.java | 60 +- .../poi/sl/usermodel/ShapeContainer.java | 22 +- .../apache/poi/sl/usermodel/ShapeType.java | 295 + .../apache/poi/sl/usermodel/ShapeTypes.java | 224 - .../org/apache/poi/sl/usermodel/Sheet.java | 14 +- .../apache/poi/sl/usermodel/SimpleShape.java | 14 +- .../apache/poi/sl/usermodel/SlideShow.java | 18 +- .../apache/poi/sl/usermodel/SolidPaint.java} | 47 +- .../apache/poi/sl/usermodel/StrokeStyle.java | 59 + .../poi/sl/usermodel/TextParagraph.java | 132 + .../org/apache/poi/sl/usermodel/TextRun.java | 28 +- .../apache/poi/sl/usermodel/TextShape.java | 116 + .../poi/sl/usermodel/TexturePaint.java} | 31 +- .../poi/sl}/usermodel/VerticalAlignment.java | 2 +- .../apache/poi/hslf/model/TestBackground.java | 11 +- .../org/apache/poi/hslf/model/TestShapes.java | 5 +- .../apache/poi/hslf/model/TestTextShape.java | 73 +- .../apache/poi/hslf/usermodel/TestBugs.java | 2 +- src/types/definitions/dml-shapeGeometry.xjb | 7 + 207 files changed, 38606 insertions(+), 2271 deletions(-) delete mode 100644 src/ooxml/java/org/apache/poi/xslf/model/geom/PresetGeometries.java delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/TextAlign.java delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/TextAutofit.java delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/TextDirection.java delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/TextFragment.java delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeType.java create mode 100644 src/resources/scratchpad/org/apache/poi/sl/draw/presetShapeDefinitions.xml delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/ShapeTypes.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java rename src/{ooxml/java/org/apache/poi/xslf/usermodel/TextCap.java => scratchpad/src/org/apache/poi/sl/draw/DrawFontManager.java} (64%) create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAngle.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColorMRU.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTComplementTransform.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnection.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSite.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTFixedPercentage.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGammaTransform.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuide.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuideList.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomRect.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHslColor.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHyperlink.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseTransform.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DClose.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DList.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPercentage.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint3D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositivePercentage.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetColor.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetTextShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRatio.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRelativeRect.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSRgbColor.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScRgbColor.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScale2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSchemeColor.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSphereCoords.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSystemColor.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTTransform2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTVector3D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/ObjectFactory.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/STBlackWhiteMode.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/STPathFillMode.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/STPresetColorVal.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/STRectAlignment.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/STSchemeColorVal.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/STShapeType.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/binding/STTextShapeType.java rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/AbsExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/AddDivideExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/AddSubtractExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/AdjustValue.java (93%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/ArcTanExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/ArcToCommand.java (95%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/ClosePathCommand.java (96%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/Context.java (98%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/CosExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/CosineArcTanExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/CurveToCommand.java (94%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/CustomGeometry.java (69%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/Expression.java (96%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/ExpressionParser.java (98%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/Formula.java (99%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/Guide.java (93%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/IAdjustableShape.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/IfElseExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/LineToCommand.java (93%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/LiteralValueExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/MaxExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/MinExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/ModExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/MoveToCommand.java (93%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/MultiplyDivideExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/Outline.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/Path.java (87%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/PathCommand.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/PinExpression.java (97%) create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/QuadToCommand.java (93%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/SinArcTanExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/SinExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/SqrtExpression.java (97%) rename src/{ooxml/java/org/apache/poi/xslf/model => scratchpad/src/org/apache/poi/sl/draw}/geom/TanExpression.java (97%) create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/ColorStyle.java rename src/scratchpad/src/org/apache/poi/sl/usermodel/{LineStyle.java => FillStyle.java} (92%) rename src/{java/org/apache/poi/common/usermodel/LineStyle.java => scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java} (89%) create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/GradientPaint.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/Insets2D.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/LineDecoration.java rename src/scratchpad/src/org/apache/poi/sl/usermodel/{Fill.java => PaintStyle.java} (93%) create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/Shadow.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java delete mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeTypes.java rename src/{java/org/apache/poi/common/usermodel/Fill.java => scratchpad/src/org/apache/poi/sl/usermodel/SolidPaint.java} (86%) create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java rename src/{ooxml/java/org/apache/poi/xslf/usermodel/LineCap.java => scratchpad/src/org/apache/poi/sl/usermodel/TexturePaint.java} (72%) rename src/{ooxml/java/org/apache/poi/xslf => scratchpad/src/org/apache/poi/sl}/usermodel/VerticalAlignment.java (95%) create mode 100644 src/types/definitions/dml-shapeGeometry.xjb diff --git a/build.xml b/build.xml index cfa95666ec..f2d6630f5b 100644 --- a/build.xml +++ b/build.xml @@ -103,6 +103,12 @@ under the License. + + + + + + @@ -371,6 +377,7 @@ under the License. + @@ -690,7 +697,38 @@ under the License. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [MS-OSHARED] - 2.2.1.6 FixedPoint */ - public static double fixedPointToDecimal(int fixedPoint) { + public static double fixedPointToDouble(int fixedPoint) { int i = (fixedPoint >> 16); int f = (fixedPoint >> 0) & 0xFFFF; - double decimal = (i + f/65536.0); - return decimal; + double floatPoint = (i + f/65536d); + return floatPoint; + } + + /** + * Converts a value of type floating point to a FixedPoint + * + * @param floatPoint + * @return fixedPoint + * + * @see [MS-OSHARED] - 2.2.1.6 FixedPoint + */ + public static int doubleToFixedPoint(double floatPoint) { + int i = (int)Math.floor(floatPoint); + int f = (int)((floatPoint % 1d)*65536d); + int fixedPoint = (i << 16) | (f & 0xFFFF); + return fixedPoint; } } diff --git a/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java b/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java index d446ccedde..ddb3f0745b 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java +++ b/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java @@ -19,8 +19,8 @@ package org.apache.poi.xslf.model; -import org.apache.poi.xslf.usermodel.XSLFSimpleShape; import org.apache.poi.util.Internal; +import org.apache.poi.xslf.usermodel.XSLFShape; /** * Used internally to navigate the PresentationML text style hierarchy and fetch properties @@ -36,7 +36,7 @@ public abstract class PropertyFetcher { * @param shape the shape being examined * @return true if the desired property was fetched */ - public abstract boolean fetch(XSLFSimpleShape shape) ; + public abstract boolean fetch(XSLFShape shape) ; public T getValue(){ return _value; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/PresetGeometries.java b/src/ooxml/java/org/apache/poi/xslf/model/geom/PresetGeometries.java deleted file mode 100644 index 62accc42f3..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/PresetGeometries.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ==================================================================== - * 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 org.apache.poi.xslf.usermodel.XMLSlideShow; -import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D; - -import java.io.InputStream; -import java.util.LinkedHashMap; - -/** - * Date: 10/25/11 - * - * @author Yegor Kozlov - */ -public class PresetGeometries extends LinkedHashMap { - private static PresetGeometries _inst; - - private PresetGeometries(){ - try { - InputStream is = - XMLSlideShow.class.getResourceAsStream("presetShapeDefinitions.xml"); - read(is); - } catch (Exception e){ - throw new RuntimeException(e); - } - } - - private void read(InputStream is) throws Exception { - XmlObject obj = XmlObject.Factory.parse(is); - for (XmlObject def : obj.selectPath("*/*")) { - - String name = def.getDomNode().getLocalName(); - CTCustomGeometry2D geom = CTCustomGeometry2D.Factory.parse(def.toString()); - - if(containsKey(name)) { - System.out.println("Duplicate definoition of " + name) ; - } - put(name, new CustomGeometry(geom)); - } - } - - public static PresetGeometries getInstance(){ - if(_inst == null) _inst = new PresetGeometries(); - - return _inst; - } - -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java deleted file mode 100644 index 71891f841b..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java +++ /dev/null @@ -1,34 +0,0 @@ -/* ==================================================================== - 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.usermodel; - -/** - * @author Yegor Kozlov - */ -public enum LineDash { - SOLID, - DOT, - DASH, - LG_DASH, - DASH_DOT, - LG_DASH_DOT, - LG_DASH_DOT_DOT, - SYS_DASH, - SYS_DOT, - SYS_DASH_DOT, - SYS_DASH_DOT_DOT; -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java index 053ccd491d..8a11c1cd17 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java @@ -40,6 +40,8 @@ import java.util.Comparator; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.usermodel.LineCap; +import org.apache.poi.sl.usermodel.LineDash; import org.apache.poi.util.Internal; import org.apache.poi.util.Units; import org.apache.poi.xslf.model.PropertyFetcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAlign.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAlign.java deleted file mode 100644 index 2570e6cfc9..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAlign.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * ==================================================================== - * 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.usermodel; - -/** - * Specified a list of text alignment types - * - * @author Yegor Kozlov - */ -public enum TextAlign { - /** - * Align text to the left margin. - */ - LEFT, - /** - * Align text in the center. - */ - CENTER, - - /** - * Align text to the right margin. - */ - RIGHT, - - /** - * Align text so that it is justified across the whole line. It - * is smart in the sense that it will not justify sentences - * which are short - */ - JUSTIFY, - JUSTIFY_LOW, - DIST, - THAI_DIST -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAutofit.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAutofit.java deleted file mode 100644 index 94d6b24358..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAutofit.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ==================================================================== - * 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.usermodel; - -/** - * Specifies alist of auto-fit types. - *

- * Autofit specofies that a shape should be auto-fit to fully contain the text described within it. - * Auto-fitting is when text within a shape is scaled in order to contain all the text inside - *

- * - * @author Yegor Kozlov - */ -public enum TextAutofit { - /** - * Specifies that text within the text body should not be auto-fit to the bounding box. - * Auto-fitting is when text within a text box is scaled in order to remain inside - * the text box. - */ - NONE, - /** - * Specifies that text within the text body should be normally auto-fit to the bounding box. - * Autofitting is when text within a text box is scaled in order to remain inside the text box. - * - *

- * Example: Consider the situation where a user is building a diagram and needs - * to have the text for each shape that they are using stay within the bounds of the shape. - * An easy way this might be done is by using NORMAL autofit - *

- */ - NORMAL, - /** - * Specifies that a shape should be auto-fit to fully contain the text described within it. - * Auto-fitting is when text within a shape is scaled in order to contain all the text inside. - * - *

- * Example: Consider the situation where a user is building a diagram and needs to have - * the text for each shape that they are using stay within the bounds of the shape. - * An easy way this might be done is by using SHAPE autofit - *

- */ - SHAPE -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextDirection.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/TextDirection.java deleted file mode 100644 index 3f35ec23ac..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextDirection.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ==================================================================== - * 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.usermodel; - -/** - * Vertical Text Types - */ -public enum TextDirection { - /** - * Horizontal text. This should be default. - */ - HORIZONTAL, - /** - * Vertical orientation. - * (each line is 90 degrees rotated clockwise, so it goes - * from top to bottom; each next line is to the left from - * the previous one). - */ - VERTICAL, - /** - * Vertical orientation. - * (each line is 270 degrees rotated clockwise, so it goes - * from bottom to top; each next line is to the right from - * the previous one). - */ - VERTICAL_270, - /** - * Determines if all of the text is vertical - * ("one letter on top of another"). - */ - STACKED; -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextFragment.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/TextFragment.java deleted file mode 100644 index 1114b89445..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextFragment.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * ==================================================================== - * 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.usermodel; - -import java.awt.*; -import java.awt.font.TextLayout; -import java.text.AttributedCharacterIterator; -import java.text.AttributedString; -import java.text.CharacterIterator; - -/** - * a renderable text fragment -*/ -class TextFragment { - final TextLayout _layout; - final AttributedString _str; - - TextFragment(TextLayout layout, AttributedString str){ - _layout = layout; - _str = str; - } - - void draw(Graphics2D graphics, double x, double y){ - if(_str == null) { - return; - } - - double yBaseline = y + _layout.getAscent(); - - Integer textMode = (Integer)graphics.getRenderingHint(XSLFRenderingHint.TEXT_RENDERING_MODE); - if(textMode != null && textMode == XSLFRenderingHint.TEXT_AS_SHAPES){ - _layout.draw(graphics, (float)x, (float)yBaseline); - } else { - graphics.drawString(_str.getIterator(), (float)x, (float)yBaseline ); - } - } - - /** - * @return full height of this text run which is sum of ascent, descent and leading - */ - public float getHeight(){ - double h = Math.ceil(_layout.getAscent()) + Math.ceil(_layout.getDescent()) + _layout.getLeading(); - return (float)h; - } - - /** - * - * @return width if this text run - */ - public float getWidth(){ - return _layout.getAdvance(); - } - - /** - * - * @return the string to be painted - */ - public String getString(){ - if(_str == null) return ""; - - AttributedCharacterIterator it = _str.getIterator(); - StringBuffer buf = new StringBuffer(); - for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) { - buf.append(c); - } - return buf.toString(); - } - - @Override - public String toString(){ - return "[" + getClass().getSimpleName() + "] " + getString(); - } -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index b1c6be4573..1c5f855db3 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -20,7 +20,11 @@ import java.awt.Dimension; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.regex.Pattern; import org.apache.poi.POIXMLDocument; @@ -32,6 +36,9 @@ import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePartName; import org.apache.poi.openxml4j.opc.TargetMode; +import org.apache.poi.sl.usermodel.MasterSheet; +import org.apache.poi.sl.usermodel.Resources; +import org.apache.poi.sl.usermodel.SlideShow; import org.apache.poi.util.Beta; import org.apache.poi.util.IOUtils; import org.apache.poi.util.Internal; @@ -53,6 +60,10 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry; import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideSize; import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument; +import sun.reflect.generics.reflectiveObjects.NotImplementedException; + +import com.sun.org.apache.xml.internal.utils.UnImplNode; + /** * High level representation of a ooxml slideshow. * This is the first object most users will construct whether @@ -60,7 +71,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument * top level object for creating new slides/etc. */ @Beta -public class XMLSlideShow extends POIXMLDocument { +public class XMLSlideShow extends POIXMLDocument implements SlideShow { private static POILogger _logger = POILogFactory.getLogger(XMLSlideShow.class); private CTPresentation _presentation; @@ -437,7 +448,7 @@ public class XMLSlideShow extends POIXMLDocument { */ public int addPicture(byte[] pictureData, int format) { XSLFPictureData img = findPictureData(pictureData); - POIXMLRelation relDesc = XSLFPictureData.RELATIONS[format]; + // POIXMLRelation relDesc = XSLFPictureData.RELATIONS[format]; if(img == null) { int imageNumber = _pictures.size(); @@ -485,4 +496,17 @@ public class XMLSlideShow extends POIXMLDocument { return null; } + public MasterSheet[] getMasterSheet() { + return getSlideMasters(); + } + + public MasterSheet createMasterSheet() throws IOException { + // TODO: implement! + throw new UnsupportedOperationException(); + } + + public Resources getResources() { + // TODO: implement! + throw new UnsupportedOperationException(); + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java index 1ee8f6f55f..47bcace2f3 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java @@ -19,6 +19,7 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.sl.usermodel.AutoShape; import org.apache.poi.util.Beta; import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D; @@ -35,7 +36,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShapeNonVisual; * @author Yegor Kozlov */ @Beta -public class XSLFAutoShape extends XSLFTextShape { +public class XSLFAutoShape extends XSLFTextShape implements AutoShape { /*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) { super(shape, sheet); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java index 604c9dff3a..80c6a1acbe 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java @@ -17,25 +17,20 @@ package org.apache.poi.xslf.usermodel; -import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTBackgroundFillStyleList; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrixReference; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D; -import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Paint; +import java.awt.*; import java.awt.geom.Rectangle2D; +import org.apache.poi.sl.usermodel.Background; +import org.apache.xmlbeans.XmlObject; +import org.openxmlformats.schemas.drawingml.x2006.main.*; +import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground; + /** * Background shape * * @author Yegor Kozlov */ -public class XSLFBackground extends XSLFSimpleShape { +public class XSLFBackground extends XSLFSimpleShape implements Background { /* package */XSLFBackground(CTBackground shape, XSLFSheet sheet) { super(shape, sheet); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java index c0f4762c7e..527cef781d 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java @@ -18,22 +18,18 @@ */ package org.apache.poi.xslf.usermodel; -import org.apache.poi.util.Beta; -import org.apache.poi.util.Internal; -import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTHslColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTScRgbColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSystemColor; -import org.w3c.dom.Node; - import java.awt.Color; import java.util.HashMap; import java.util.Map; +import org.apache.poi.sl.draw.DrawPaint; +import org.apache.poi.sl.usermodel.ColorStyle; +import org.apache.poi.util.Beta; +import org.apache.poi.util.Internal; +import org.apache.xmlbeans.XmlObject; +import org.openxmlformats.schemas.drawingml.x2006.main.*; +import org.w3c.dom.Node; + /** * Encapsulates logic to read color definitions from DrawingML and convert them to java.awt.Color * @@ -63,40 +59,37 @@ public class XSLFColor { * If not color information was found in the supplied xml object then a null is returned. */ public Color getColor() { - return _color == null ? null : applyColorTransform(_color); + return DrawPaint.applyColorTransform(getColorStyle()); } - private Color applyColorTransform(Color color){ - Color result = color; + public ColorStyle getColorStyle() { + return new ColorStyle() { + public Color getColor() { + return _color; + } - int alpha = getAlpha(); - if(alpha != -1){ - result = new Color( - result.getRed(), result.getGreen(), result.getBlue(), - Math.round(255 * alpha * 0.01f)); - } + public int getAlpha() { + return getRawValue("alpha"); + } - int lumOff = getLumOff(); - int lumMod = getLumMod(); - if(lumMod != -1 || lumOff != -1){ - result = modulateLuminanace(result, - lumMod == -1 ? 100 : lumMod, - lumOff == -1 ? 0 : lumOff); - } + public int getLumOff() { + return getRawValue("lumOff"); + } - int shade = getShade(); - if(shade != -1){ - result = shade(result, shade); - } + public int getLumMod() { + return getRawValue("lumMod"); + } - int tint = getTint(); - if(tint != -1){ - result = tint(result, tint); - } + public int getShade() { + return getRawValue("shade"); + } - return result; + public int getTint() { + return getRawValue("tint"); + } + }; } - + Color toColor(XmlObject obj, XSLFTheme theme) { Color color = null; for (XmlObject ch : obj.selectPath("*")) { @@ -140,6 +133,7 @@ public class XSLFColor { color = new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]); } else { // YK: color is a string like "menuText" or "windowText", we return black for such cases + @SuppressWarnings("unused") String colorName = sys.getVal().toString(); color = Color.black; } @@ -150,6 +144,33 @@ public class XSLFColor { return color; } + private int getRawValue(String elem) { + String query = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem; + + XmlObject[] obj; + + // first ask the context color and if not found, ask the actual color bean + if (_phClr != null){ + obj = _phClr.selectPath(query); + if (obj.length == 1){ + Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val"); + if(attr != null) { + return Integer.parseInt(attr.getNodeValue()); + } + } + } + + obj = _xmlObject.selectPath(query); + if (obj.length == 1){ + Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val"); + if(attr != null) { + return Integer.parseInt(attr.getNodeValue()); + } + } + + return -1; + } + /** * Read a perecentage value from the supplied xml bean. * Example: @@ -160,56 +181,13 @@ public class XSLFColor { * @return the percentage value in the range [0 .. 100] */ private int getPercentageValue(String elem){ - String query = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem; - - XmlObject[] obj; - - // first ask the context color and if not found, ask the actual color bean - if(_phClr != null){ - obj = _phClr.selectPath(query); - if(obj.length == 1){ - Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val"); - if(attr != null) { - return Integer.parseInt(attr.getNodeValue()) / 1000; - } - } - } - - obj = _xmlObject.selectPath(query); - if(obj.length == 1){ - Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val"); - if(attr != null) { - return Integer.parseInt(attr.getNodeValue()) / 1000; - } - } - - - return -1; + int val = getRawValue(elem); + return (val == -1) ? val : (val / 1000); } private int getAngleValue(String elem){ - String color = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem; - XmlObject[] obj; - - // first ask the context color and if not found, ask the actual color bean - if(_phClr != null){ - obj = _xmlObject.selectPath( color ); - if(obj.length == 1){ - Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val"); - if(attr != null) { - return Integer.parseInt(attr.getNodeValue()) / 60000; - } - } - } - - obj = _xmlObject.selectPath( color ); - if(obj.length == 1){ - Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val"); - if(attr != null) { - return Integer.parseInt(attr.getNodeValue()) / 60000; - } - } - return -1; + int val = getRawValue(elem); + return (val == -1) ? val : (val / 60000); } /** @@ -387,7 +365,7 @@ public class XSLFColor { * percentage with 0% indicating minimal shade and 100% indicating maximum * or -1 if the value is not set */ - int getShade(){ + public int getShade(){ return getPercentageValue("shade"); } @@ -399,69 +377,11 @@ public class XSLFColor { * percentage with 0% indicating minimal tint and 100% indicating maximum * or -1 if the value is not set */ - int getTint(){ + public int getTint(){ return getPercentageValue("tint"); } - /** - * Apply lumMod / lumOff adjustments - * - * @param c the color to modify - * @param lumMod luminance modulation in the range [0..100] - * @param lumOff luminance offset in the range [0..100] - * @return modified color - */ - private static Color modulateLuminanace(Color c, int lumMod, int lumOff) { - Color color; - if (lumOff > 0) { - color = new Color( - (int) (Math.round((255 - c.getRed()) * (100.0 - lumMod) / 100.0 + c.getRed())), - (int) (Math.round((255 - c.getGreen()) * lumOff / 100.0 + c.getGreen())), - (int) (Math.round((255 - c.getBlue()) * lumOff / 100.0 + c.getBlue())), - c.getAlpha() - ); - } else { - color = new Color( - (int) (Math.round(c.getRed() * lumMod / 100.0)), - (int) (Math.round(c.getGreen() * lumMod / 100.0)), - (int) (Math.round(c.getBlue() * lumMod / 100.0)), - c.getAlpha() - ); - } - return color; - } - - /** - * This algorithm returns result different from PowerPoint. - * TODO: revisit and improve - */ - private static Color shade(Color c, int shade) { - return new Color( - (int)(c.getRed() * shade * 0.01), - (int)(c.getGreen() * shade * 0.01), - (int)(c.getBlue() * shade * 0.01), - c.getAlpha()); - } - - /** - * This algorithm returns result different from PowerPoint. - * TODO: revisit and improve - */ - private static Color tint(Color c, int tint) { - int r = c.getRed(); - int g = c.getGreen(); - int b = c.getBlue(); - - float ftint = tint / 100.0f; - - int red = Math.round(ftint * r + (1 - ftint) * 255); - int green = Math.round(ftint * g + (1 - ftint) * 255); - int blue = Math.round(ftint * b + (1 - ftint) * 255); - - return new Color(red, green, blue); - } - /** * Preset colors defined in DrawingML */ diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java index 529bacf734..514c1bc90f 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java @@ -23,6 +23,7 @@ import org.apache.poi.POIXMLException; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.Beta; import org.apache.poi.util.Units; import org.apache.xmlbeans.XmlCursor; @@ -34,6 +35,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D; import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; import javax.xml.namespace.QName; + import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -58,8 +60,8 @@ public class XSLFGraphicFrame extends XSLFShape { return _sheet; } - public int getShapeType(){ - throw new RuntimeException("NotImplemented"); + public ShapeType getShapeType(){ + throw new UnsupportedOperationException(); } public int getShapeId(){ diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java index 2ad699b408..f93fc803fb 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java @@ -19,9 +19,17 @@ package org.apache.poi.xslf.usermodel; +import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Pattern; + import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.openxml4j.opc.TargetMode; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.Beta; import org.apache.poi.util.Units; import org.apache.xmlbeans.XmlObject; @@ -35,13 +43,6 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual; import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; -import java.awt.Graphics2D; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Pattern; - /** * Represents a group shape that consists of many shapes grouped together. * @@ -207,30 +208,35 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { public XSLFAutoShape createAutoShape(){ XSLFAutoShape sh = getDrawing().createAutoShape(); _shapes.add(sh); + sh.setParent(this); return sh; } public XSLFFreeformShape createFreeform(){ XSLFFreeformShape sh = getDrawing().createFreeform(); _shapes.add(sh); + sh.setParent(this); return sh; } public XSLFTextBox createTextBox(){ XSLFTextBox sh = getDrawing().createTextBox(); _shapes.add(sh); + sh.setParent(this); return sh; } public XSLFConnectorShape createConnector(){ XSLFConnectorShape sh = getDrawing().createConnector(); _shapes.add(sh); + sh.setParent(this); return sh; } public XSLFGroupShape createGroup(){ XSLFGroupShape sh = getDrawing().createGroup(); _shapes.add(sh); + sh.setParent(this); return sh; } @@ -251,6 +257,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { XSLFPictureShape sh = getDrawing().createPicture(rel.getId()); sh.resize(); _shapes.add(sh); + sh.setParent(this); return sh; } @@ -343,4 +350,13 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { } } + public ShapeType getShapeType(){ + return null; + } + + public void addShape(XSLFShape shape) { + throw new UnsupportedOperationException( + "Adding a shape from a different container is not supported -" + + " create it from scratch witht XSLFGroupShape.create* methods"); + } } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java index 0a33132e28..62f9cc4ad6 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java @@ -21,6 +21,8 @@ import java.io.IOException; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.usermodel.Notes; +import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData; @@ -28,7 +30,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesSlide; import org.openxmlformats.schemas.presentationml.x2006.main.NotesDocument; @Beta -public final class XSLFNotes extends XSLFSheet { +public final class XSLFNotes extends XSLFSheet implements Notes { private CTNotesSlide _notes; /** @@ -80,7 +82,6 @@ public final class XSLFNotes extends XSLFSheet { return getMasterSheet().getTheme(); } - @Override public XSLFNotesMaster getMasterSheet() { for (POIXMLDocumentPart p : getRelations()) { if (p instanceof XSLFNotesMaster){ @@ -89,4 +90,20 @@ public final class XSLFNotes extends XSLFSheet { } return null; } + + public TextRun getTextRun() { + for (XSLFShape sh : super.getShapes()) { + if (sh instanceof XSLFTextShape) { + XSLFTextShape txt = (XSLFTextShape)sh; + for (XSLFTextParagraph p : txt.getTextParagraphs()) { + for (XSLFTextRun r : p.getTextRuns()) { + return r; + } + } + } + } + return null; + } + + } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java index 40937e8785..c5de537677 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java @@ -23,6 +23,7 @@ import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLException; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.usermodel.MasterSheet; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping; @@ -46,7 +47,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument; * @author Yegor Kozlov */ @Beta - public class XSLFNotesMaster extends XSLFSheet { + public class XSLFNotesMaster extends XSLFSheet implements MasterSheet { private CTNotesMaster _slide; private XSLFTheme _theme; @@ -93,7 +94,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument; } @Override - public XSLFSheet getMasterSheet() { + public MasterSheet getMasterSheet() { return null; } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java index 42dc360cd6..fa4b192ec4 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java @@ -17,6 +17,7 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.sl.usermodel.Shadow; import org.apache.poi.util.Units; import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect; import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor; @@ -31,7 +32,7 @@ import java.awt.geom.Rectangle2D; * * @author Yegor Kozlov */ -public class XSLFShadow extends XSLFSimpleShape { +public class XSLFShadow extends XSLFSimpleShape implements Shadow { private XSLFSimpleShape _parent; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java index 82addf7ddb..aa6e2c712f 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java @@ -19,13 +19,25 @@ package org.apache.poi.xslf.usermodel; -import java.awt.Graphics2D; -import java.awt.geom.AffineTransform; +import java.awt.Color; import java.awt.geom.Rectangle2D; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Comparator; -import org.apache.poi.util.Beta; -import org.apache.poi.util.Internal; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.draw.DrawPaint; +import org.apache.poi.sl.draw.geom.CustomGeometry; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.util.*; +import org.apache.poi.xslf.model.PropertyFetcher; import org.apache.xmlbeans.XmlObject; +import org.openxmlformats.schemas.drawingml.x2006.main.*; +import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; +import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; /** * Base super-class class for all shapes in PresentationML @@ -33,25 +45,43 @@ import org.apache.xmlbeans.XmlObject; * @author Yegor Kozlov */ @Beta -public abstract class XSLFShape { +public abstract class XSLFShape implements Shape { + protected final XmlObject _shape; + protected final XSLFSheet _sheet; + protected XSLFShapeContainer _parent; - /** - * @return the position of this shape within the drawing canvas. - * The coordinates are expressed in points - */ - public abstract Rectangle2D getAnchor(); + private CTShapeProperties _spPr; + private CTShapeStyle _spStyle; + private CTNonVisualDrawingProps _nvPr; + private CTPlaceholder _ph; - /** - * @param anchor the position of this shape within the drawing canvas. - * The coordinates are expressed in points - */ - public abstract void setAnchor(Rectangle2D anchor); + private static final PaintStyle TRANSPARENT_PAINT = new SolidPaint() { + public ColorStyle getSolidColor() { + return new ColorStyle(){ + public Color getColor() { return DrawPaint.NO_PAINT; } + public int getAlpha() { return -1; } + public int getLumOff() { return -1; } + public int getLumMod() { return -1; } + public int getShade() { return -1; } + public int getTint() { return -1; } + }; + } + }; + + + protected XSLFShape(XmlObject shape, XSLFSheet sheet) { + _shape = shape; + _sheet = sheet; + } + /** * @return the xml bean holding this shape's data */ - public abstract XmlObject getXmlObject(); - + public XmlObject getXmlObject() { + return _shape; + } + /** * @return human-readable name of this shape, e.g. "Rectange 3" */ @@ -118,84 +148,6 @@ public abstract class XSLFShape { */ public abstract boolean getFlipVertical(); - /** - * Draw this shape into the supplied canvas - * - * @param graphics the graphics to draw into - */ - public abstract void draw(Graphics2D graphics); - - /** - * Apply 2-D transforms before drawing this shape. This includes rotation and flipping. - * - * @param graphics the graphics whos transform matrix will be modified - */ - protected void applyTransform(Graphics2D graphics) { - Rectangle2D anchor = getAnchor(); - AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM); - if(tx != null) { - anchor = tx.createTransformedShape(anchor).getBounds2D(); - } - - // rotation - double rotation = getRotation(); - if (rotation != 0.) { - // PowerPoint rotates shapes relative to the geometric center - double centerX = anchor.getCenterX(); - double centerY = anchor.getCenterY(); - - // normalize rotation - rotation = (360.+(rotation%360.))%360.; - int quadrant = (((int)rotation+45)/90)%4; - double scaleX = 1.0, scaleY = 1.0; - - // scale to bounding box (bug #53176) - if (quadrant == 1 || quadrant == 3) { - // In quadrant 1 and 3, which is basically a shape in a more or less portrait orientation - // (45-135 degrees and 225-315 degrees), we need to first rotate the shape by a multiple - // of 90 degrees and then resize the bounding box to its original bbox. After that we can - // rotate the shape to the exact rotation amount. - // It's strange that you'll need to rotate the shape back and forth again, but you can - // think of it, as if you paint the shape on a canvas. First you rotate the canvas, which might - // be already (differently) scaled, so you can paint the shape in its default orientation - // and later on, turn it around again to compare it with its original size ... - AffineTransform txg = new AffineTransform(); // graphics coordinate space - AffineTransform txs = new AffineTransform(tx); // shape coordinate space - txg.translate(centerX, centerY); - txg.rotate(Math.toRadians(quadrant*90)); - txg.translate(-centerX, -centerY); - txs.translate(centerX, centerY); - txs.rotate(Math.toRadians(-quadrant*90)); - txs.translate(-centerX, -centerY); - txg.concatenate(txs); - Rectangle2D anchor2 = txg.createTransformedShape(getAnchor()).getBounds2D(); - scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth(); - scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight(); - } - - // transformation is applied reversed ... - graphics.translate(centerX, centerY); - graphics.rotate(Math.toRadians(rotation-(double)(quadrant*90))); - graphics.scale(scaleX, scaleY); - graphics.rotate(Math.toRadians(quadrant*90)); - graphics.translate(-centerX, -centerY); - } - - //flip horizontal - if (getFlipHorizontal()) { - graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY()); - graphics.scale(-1, 1); - graphics.translate(-anchor.getX(), -anchor.getY()); - } - - //flip vertical - if (getFlipVertical()) { - graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight()); - graphics.scale(1, -1); - graphics.translate(-anchor.getX(), -anchor.getY()); - } - } - /** * Set the contents of this shape to be a copy of the source shape. * This method is called recursively for each shape when merging slides @@ -212,4 +164,402 @@ public abstract class XSLFShape { setAnchor(sh.getAnchor()); } + + public void setParent(XSLFShapeContainer parent) { + this._parent = parent; + } + + public XSLFShapeContainer getParent() { + return this._parent; + } + + public boolean isPlaceholder() { + return false; + } + + public StrokeStyle getStrokeStyle() { + // TODO Auto-generated method stub + return null; + } + + public CustomGeometry getGeometry() { + // TODO Auto-generated method stub + return null; + } + + public ShapeType getShapeType() { + // TODO Auto-generated method stub + return null; + } + + public XSLFSheet getSheet() { + // TODO Auto-generated method stub + return null; + } + + /** + * fetch shape fill as a java.awt.Paint + * + * @return either Color or GradientPaint or TexturePaint or null + */ + @Override + public FillStyle getFillStyle() { + return new FillStyle() { + public PaintStyle getPaint() { + PropertyFetcher fetcher = new PropertyFetcher() { + public boolean fetch(XSLFShape shape) { + CTShapeProperties spPr = shape.getSpPr(); + if (spPr.isSetNoFill()) { + setValue(TRANSPARENT_PAINT); + return true; + } + + PaintStyle paint = null; + for (XmlObject obj : spPr.selectPath("*")) { + paint = selectPaint(obj, null, getSheet().getPackagePart()); + if (paint != null) break; + } + + if (paint == null) return false; + + setValue(paint); + return true; + } + }; + fetchShapeProperty(fetcher); + + PaintStyle paint = fetcher.getValue(); + + if (paint != null) return paint; + + // fill color was not found, check if it is defined in the theme + CTShapeStyle style = getSpStyle(); + if (style != null) { + // get a reference to a fill style within the style matrix. + CTStyleMatrixReference fillRef = style.getFillRef(); + // The idx attribute refers to the index of a fill style or + // background fill style within the presentation's style matrix, defined by the fmtScheme element. + // value of 0 or 1000 indicates no background, + // values 1-999 refer to the index of a fill style within the fillStyleLst element + // values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element. + int idx = (int)fillRef.getIdx(); + CTSchemeColor phClr = fillRef.getSchemeClr(); + XSLFSheet sheet = _sheet; + XSLFTheme theme = sheet.getTheme(); + XmlObject fillProps = null; + CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme(); + if(idx >= 1 && idx <= 999){ + fillProps = matrix.getFillStyleLst().selectPath("*")[idx - 1]; + } else if (idx >= 1001 ){ + fillProps = matrix.getBgFillStyleLst().selectPath("*")[idx - 1001]; + } + if(fillProps != null) { + paint = selectPaint(fillProps, phClr, sheet.getPackagePart()); + } + } + return paint == RenderableShape.NO_PAINT ? null : paint; + } + }; + } + + /** + * Walk up the inheritance tree and fetch shape properties. + * + * The following order of inheritance is assumed: + *

+ * slide <-- slideLayout <-- slideMaster + *

+ * + * @param visitor the object that collects the desired property + * @return true if the property was fetched + */ + protected boolean fetchShapeProperty(PropertyFetcher visitor) { + boolean ok = visitor.fetch(this); + + XSLFSimpleShape masterShape; + XSLFSheet masterSheet = (XSLFSheet)getSheet().getMasterSheet(); + CTPlaceholder ph = getCTPlaceholder(); + + if (masterSheet != null && ph != null) { + if (!ok) { + masterShape = masterSheet.getPlaceholder(ph); + if (masterShape != null) { + ok = visitor.fetch(masterShape); + } + } + + // try slide master + if (!ok ) { + int textType; + if ( !ph.isSetType()) textType = STPlaceholderType.INT_BODY; + else { + switch (ph.getType().intValue()) { + case STPlaceholderType.INT_TITLE: + case STPlaceholderType.INT_CTR_TITLE: + textType = STPlaceholderType.INT_TITLE; + break; + case STPlaceholderType.INT_FTR: + case STPlaceholderType.INT_SLD_NUM: + case STPlaceholderType.INT_DT: + textType = ph.getType().intValue(); + break; + default: + textType = STPlaceholderType.INT_BODY; + break; + } + } + XSLFSheet master = (XSLFSheet)masterSheet.getMasterSheet(); + if (master != null) { + masterShape = master.getPlaceholderByType(textType); + if (masterShape != null) { + ok = visitor.fetch(masterShape); + } + } + } + } + return ok; + } + + protected CTPlaceholder getCTPlaceholder() { + if (_ph == null) { + XmlObject[] obj = _shape.selectPath( + "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph"); + if (obj.length == 1) { + _ph = (CTPlaceholder) obj[0]; + } + } + return _ph; + } + + protected CTShapeStyle getSpStyle() { + if (_spStyle == null) { + for (XmlObject obj : _shape.selectPath("*")) { + if (obj instanceof CTShapeStyle) { + _spStyle = (CTShapeStyle) obj; + } + } + } + return _spStyle; + } + + protected CTNonVisualDrawingProps getNvPr() { + if (_nvPr == null) { + XmlObject[] rs = _shape + .selectPath("declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:cNvPr"); + if (rs.length != 0) { + _nvPr = (CTNonVisualDrawingProps) rs[0]; + } + } + return _nvPr; + } + + protected CTShapeProperties getSpPr() { + if (_spPr == null) { + for (XmlObject obj : _shape.selectPath("*")) { + if (obj instanceof CTShapeProperties) { + _spPr = (CTShapeProperties) obj; + } + } + } + if (_spPr == null) { + throw new IllegalStateException("CTShapeProperties was not found."); + } + return _spPr; + } + + CTTransform2D getXfrm() { + PropertyFetcher fetcher = new PropertyFetcher() { + public boolean fetch(XSLFShape shape) { + CTShapeProperties pr = shape.getSpPr(); + if (pr.isSetXfrm()) { + setValue(pr.getXfrm()); + return true; + } + return false; + } + }; + fetchShapeProperty(fetcher); + return fetcher.getValue(); + } + + /** + * @return the position of this shape within the drawing canvas. + * The coordinates are expressed in points + */ + public Rectangle2D getAnchor() { + CTTransform2D xfrm = getXfrm(); + if (xfrm == null) return null; + + CTPoint2D off = xfrm.getOff(); + long x = off.getX(); + long y = off.getY(); + CTPositiveSize2D ext = xfrm.getExt(); + long cx = ext.getCx(); + long cy = ext.getCy(); + return new Rectangle2D.Double( + Units.toPoints(x), Units.toPoints(y), + Units.toPoints(cx), Units.toPoints(cy)); + } + + /** + * @param anchor the position of this shape within the drawing canvas. + * The coordinates are expressed in points + */ + public void setAnchor(Rectangle2D anchor) { + CTShapeProperties spPr = getSpPr(); + if (spPr == null) return; + + CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm(); + CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff(); + long x = Units.toEMU(anchor.getX()); + long y = Units.toEMU(anchor.getY()); + off.setX(x); + off.setY(y); + CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm + .addNewExt(); + long cx = Units.toEMU(anchor.getWidth()); + long cy = Units.toEMU(anchor.getHeight()); + ext.setCx(cx); + ext.setCy(cy); + } + + /** + * Convert shape fill into java.awt.Paint. The result is either Color or + * TexturePaint or GradientPaint or null + * + * @param graphics the target graphics + * @param obj the xml to read. Must contain elements from the EG_ColorChoice group: + * + * a:scrgbClr RGB Color Model - Percentage Variant + * a:srgbClr RGB Color Model - Hex Variant + * a:hslClr Hue, Saturation, Luminance Color Model + * a:sysClr System Color + * a:schemeClr Scheme Color + * a:prstClr Preset Color + * + * + * @param phClr context color + * @param parentPart the parent package part. Any external references (images, etc.) are resolved relative to it. + * + * @return the applied Paint or null if none was applied + */ + protected PaintStyle selectPaint(XmlObject obj, final CTSchemeColor phClr, final PackagePart parentPart) { + final XSLFTheme theme = getSheet().getTheme(); + + if (obj instanceof CTNoFillProperties) { + return TRANSPARENT_PAINT; + } + + if (obj instanceof CTSolidColorFillProperties) { + CTSolidColorFillProperties solidFill = (CTSolidColorFillProperties) obj; + final XSLFColor c = new XSLFColor(solidFill, theme, phClr); + return new SolidPaint() { + public ColorStyle getSolidColor() { + return c.getColorStyle(); + } + }; + } + + if (obj instanceof CTBlipFillProperties) { + CTBlipFillProperties blipFill = (CTBlipFillProperties)obj; + final CTBlip blip = blipFill.getBlip(); + return new TexturePaint() { + private PackagePart getPart() { + try { + String blipId = blip.getEmbed(); + PackageRelationship rel = parentPart.getRelationship(blipId); + return parentPart.getRelatedPart(rel); + } catch (InvalidFormatException e) { + throw new RuntimeException(e); + } + } + + public InputStream getImageData() { + try { + return getPart().getInputStream(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public String getContentType() { + /* TOOD: map content-type */ + return getPart().getContentType(); + } + + public int getAlpha() { + return (blip.sizeOfAlphaModFixArray() > 0) + ? blip.getAlphaModFixArray(0).getAmt() + : 0; + } + }; + } + + if (obj instanceof CTGradientFillProperties) { + final CTGradientFillProperties gradFill = (CTGradientFillProperties) obj; + + @SuppressWarnings("deprecation") + final CTGradientStop[] gs = gradFill.getGsLst().getGsArray(); + + Arrays.sort(gs, new Comparator() { + public int compare(CTGradientStop o1, CTGradientStop o2) { + Integer pos1 = o1.getPos(); + Integer pos2 = o2.getPos(); + return pos1.compareTo(pos2); + } + }); + + final ColorStyle cs[] = new ColorStyle[gs.length]; + final float fractions[] = new float[gs.length]; + + int i=0; + for (CTGradientStop cgs : gs) { + cs[i] = new XSLFColor(cgs, theme, phClr).getColorStyle(); + fractions[i] = cgs.getPos() / 100000.f; + } + + return new GradientPaint() { + + public double getGradientAngle() { + return (gradFill.isSetLin()) + ? gradFill.getLin().getAng() / 60000.d + : 0; + } + + public ColorStyle[] getGradientColors() { + return cs; + } + + public float[] getGradientFractions() { + return fractions; + } + + public boolean isRotatedWithShape() { + // TODO: is this correct??? + return (gradFill.isSetRotWithShape() || !gradFill.getRotWithShape()); + } + + public GradientType getGradientType() { + if (gradFill.isSetLin()) { + return GradientType.linear; + } + + if (gradFill.isSetPath()) { + /* TODO: handle rect path */ + STPathShadeType.Enum ps = gradFill.getPath().getPath(); + if (ps == STPathShadeType.CIRCLE) { + return GradientType.circular; + } else if (ps == STPathShadeType.SHAPE) { + return GradientType.shape; + } + } + + return GradientType.linear; + } + }; + } + + return TRANSPARENT_PAINT; + } + } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java index 3a20891846..d839a49d37 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java @@ -19,10 +19,12 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.sl.usermodel.ShapeContainer; + /** * Common interface for shape containers, e.g. sheets or groups of shapes */ -public interface XSLFShapeContainer extends Iterable { +public interface XSLFShapeContainer extends ShapeContainer { /** * create a new shape with a predefined geometry and add it to this shape container @@ -55,27 +57,6 @@ public interface XSLFShapeContainer extends Iterable { */ XSLFPictureShape createPicture(int pictureIndex); - /** - * Returns an array containing all of the elements in this container in proper - * sequence (from first to last element). - * - * @return an array containing all of the elements in this container in proper - * sequence - */ - XSLFShape[] getShapes(); - - /** - * Removes the specified shape from this sheet, if it is present - * (optional operation). If this sheet does not contain the element, - * it is unchanged. - * - * @param xShape shape to be removed from this sheet, if present - * @return true if this sheet contained the specified element - * @throws IllegalArgumentException if the type of the specified shape - * is incompatible with this sheet (optional) - */ - boolean removeShape(XSLFShape xShape) ; - /** * Removes all of the elements from this container (optional operation). * The container will be empty after this call returns. diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeType.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeType.java deleted file mode 100644 index 57163ff742..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeType.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * ==================================================================== - * 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.usermodel; - -/** - * known preset shape geometries in PresentationML - * - * @author Yegor Kozlov - */ -public enum XSLFShapeType { - LINE(1), - LINE_INV(2), - TRIANGLE(3), - RT_TRIANGLE(4), - RECT(5), - DIAMOND(6), - PARALLELOGRAM(7), - TRAPEZOID(8), - NON_ISOSCELES_TRAPEZOID(9), - PENTAGON(10), - HEXAGON(11), - HEPTAGON(12), - OCTAGON(13), - DECAGON(14), - DODECAGON(15), - STAR_4(16), - STAR_5(17), - STAR_6(18), - STAR_7(19), - STAR_8(20), - STAR_10(21), - STAR_12(22), - STAR_16(23), - STAR_24(24), - STAR_32(25), - ROUND_RECT(26), - ROUND_1_RECT(27), - ROUND_2_SAME_RECT(28), - ROUND_2_DIAG_RECT(29), - SNIP_ROUND_RECT(30), - SNIP_1_RECT(31), - SNIP_2_SAME_RECT(32), - SNIP_2_DIAG_RECT(33), - PLAQUE(34), - ELLIPSE(35), - TEARDROP(36), - HOME_PLATE(37), - CHEVRON(38), - PIE_WEDGE(39), - PIE(40), - BLOCK_ARC(41), - DONUT(42), - NO_SMOKING(43), - RIGHT_ARROW(44), - LEFT_ARROW(45), - UP_ARROW(46), - DOWN_ARROW(47), - STRIPED_RIGHT_ARROW(48), - NOTCHED_RIGHT_ARROW(49), - BENT_UP_ARROW(50), - LEFT_RIGHT_ARROW(51), - UP_DOWN_ARROW(52), - LEFT_UP_ARROW(53), - LEFT_RIGHT_UP_ARROW(54), - QUAD_ARROW(55), - LEFT_ARROW_CALLOUT(56), - RIGHT_ARROW_CALLOUT(57), - UP_ARROW_CALLOUT(58), - DOWN_ARROW_CALLOUT(59), - LEFT_RIGHT_ARROW_CALLOUT(60), - UP_DOWN_ARROW_CALLOUT(61), - QUAD_ARROW_CALLOUT(62), - BENT_ARROW(63), - UTURN_ARROW(64), - CIRCULAR_ARROW(65), - LEFT_CIRCULAR_ARROW(66), - LEFT_RIGHT_CIRCULAR_ARROW(67), - CURVED_RIGHT_ARROW(68), - CURVED_LEFT_ARROW(69), - CURVED_UP_ARROW(70), - CURVED_DOWN_ARROW(71), - SWOOSH_ARROW(72), - CUBE(73), - CAN(74), - LIGHTNING_BOLT(75), - HEART(76), - SUN(77), - MOON(78), - SMILEY_FACE(79), - IRREGULAR_SEAL_1(80), - IRREGULAR_SEAL_2(81), - FOLDED_CORNER(82), - BEVEL(83), - FRAME(84), - HALF_FRAME(85), - CORNER(86), - DIAG_STRIPE(87), - CHORD(88), - ARC(89), - LEFT_BRACKET(90), - RIGHT_BRACKET(91), - LEFT_BRACE(92), - RIGHT_BRACE(93), - BRACKET_PAIR(94), - BRACE_PAIR(95), - STRAIGHT_CONNECTOR_1(96), - BENT_CONNECTOR_2(97), - BENT_CONNECTOR_3(98), - BENT_CONNECTOR_4(99), - BENT_CONNECTOR_5(100), - CURVED_CONNECTOR_2(101), - CURVED_CONNECTOR_3(102), - CURVED_CONNECTOR_4(103), - CURVED_CONNECTOR_5(104), - CALLOUT_1(105), - CALLOUT_2(106), - CALLOUT_3(107), - ACCENT_CALLOUT_1(108), - ACCENT_CALLOUT_2(109), - ACCENT_CALLOUT_3(110), - BORDER_CALLOUT_1(111), - BORDER_CALLOUT_2(112), - BORDER_CALLOUT_3(113), - ACCENT_BORDER_CALLOUT_1(114), - ACCENT_BORDER_CALLOUT_2(115), - ACCENT_BORDER_CALLOUT_3(116), - WEDGE_RECT_CALLOUT(117), - WEDGE_ROUND_RECT_CALLOUT(118), - WEDGE_ELLIPSE_CALLOUT(119), - CLOUD_CALLOUT(120), - CLOUD(121), - RIBBON(122), - RIBBON_2(123), - ELLIPSE_RIBBON(124), - ELLIPSE_RIBBON_2(125), - LEFT_RIGHT_RIBBON(126), - VERTICAL_SCROLL(127), - HORIZONTAL_SCROLL(128), - WAVE(129), - DOUBLE_WAVE(130), - PLUS(131), - FLOW_CHART_PROCESS(132), - FLOW_CHART_DECISION(133), - FLOW_CHART_INPUT_OUTPUT(134), - FLOW_CHART_PREDEFINED_PROCESS(135), - FLOW_CHART_INTERNAL_STORAGE(136), - FLOW_CHART_DOCUMENT(137), - FLOW_CHART_MULTIDOCUMENT(138), - FLOW_CHART_TERMINATOR(139), - FLOW_CHART_PREPARATION(140), - FLOW_CHART_MANUAL_INPUT(141), - FLOW_CHART_MANUAL_OPERATION(142), - FLOW_CHART_CONNECTOR(143), - FLOW_CHART_PUNCHED_CARD(144), - FLOW_CHART_PUNCHED_TAPE(145), - FLOW_CHART_SUMMING_JUNCTION(146), - FLOW_CHART_OR(147), - FLOW_CHART_COLLATE(148), - FLOW_CHART_SORT(149), - FLOW_CHART_EXTRACT(150), - FLOW_CHART_MERGE(151), - FLOW_CHART_OFFLINE_STORAGE(152), - FLOW_CHART_ONLINE_STORAGE(153), - FLOW_CHART_MAGNETIC_TAPE(154), - FLOW_CHART_MAGNETIC_DISK(155), - FLOW_CHART_MAGNETIC_DRUM(156), - FLOW_CHART_DISPLAY(157), - FLOW_CHART_DELAY(158), - FLOW_CHART_ALTERNATE_PROCESS(159), - FLOW_CHART_OFFPAGE_CONNECTOR(160), - ACTION_BUTTON_BLANK(161), - ACTION_BUTTON_HOME(162), - ACTION_BUTTON_HELP(163), - ACTION_BUTTON_INFORMATION(164), - ACTION_BUTTON_FORWARD_NEXT(165), - ACTION_BUTTON_BACK_PREVIOUS(166), - ACTION_BUTTON_END(167), - ACTION_BUTTON_BEGINNING(168), - ACTION_BUTTON_RETURN(169), - ACTION_BUTTON_DOCUMENT(170), - ACTION_BUTTON_SOUND(171), - ACTION_BUTTON_MOVIE(172), - GEAR_6(173), - GEAR_9(174), - FUNNEL(175), - MATH_PLUS(176), - MATH_MINUS(177), - MATH_MULTIPLY(178), - MATH_DIVIDE(179), - MATH_EQUAL(180), - MATH_NOT_EQUAL(181), - CORNER_TABS(182), - SQUARE_TABS(183), - PLAQUE_TABS(184), - CHART_X(185), - CHART_STAR(186), - CHART_PLUS(187); - - private int _idx; - - XSLFShapeType(int idx){ - _idx = idx; - } - - /** - * - * @return index in the STShapeType enum - */ - int getIndex(){ - return _idx; - } - - static XSLFShapeType forInt(int idx){ - for(XSLFShapeType t : values()){ - if(t._idx == idx) return t; - } - throw new IllegalArgumentException("Unknown shape type: " + idx); - } -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index 35100d1194..c9694e2185 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -23,6 +23,8 @@ import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.openxml4j.opc.TargetMode; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.sl.usermodel.MasterSheet; +import org.apache.poi.sl.usermodel.Sheet; import org.apache.poi.util.Beta; import org.apache.poi.util.IOUtils; import org.apache.poi.util.Internal; @@ -37,7 +39,10 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; +import com.sun.org.apache.xml.internal.utils.UnImplNode; + import javax.xml.namespace.QName; + import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.io.IOException; @@ -51,7 +56,7 @@ import java.util.Map; import java.util.regex.Pattern; @Beta -public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer { +public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet { private XSLFCommonSlideData _commonSlideData; private XSLFDrawing _drawing; private List _shapes; @@ -142,6 +147,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC List shapes = getShapeList(); XSLFAutoShape sh = getDrawing().createAutoShape(); shapes.add(sh); + sh.setParent(this); return sh; } @@ -149,6 +155,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC List shapes = getShapeList(); XSLFFreeformShape sh = getDrawing().createFreeform(); shapes.add(sh); + sh.setParent(this); return sh; } @@ -156,6 +163,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC List shapes = getShapeList(); XSLFTextBox sh = getDrawing().createTextBox(); shapes.add(sh); + sh.setParent(this); return sh; } @@ -163,6 +171,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC List shapes = getShapeList(); XSLFConnectorShape sh = getDrawing().createConnector(); shapes.add(sh); + sh.setParent(this); return sh; } @@ -170,6 +179,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC List shapes = getShapeList(); XSLFGroupShape sh = getDrawing().createGroup(); shapes.add(sh); + sh.setParent(this); return sh; } @@ -191,6 +201,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC sh.resize(); getShapeList().add(sh); + sh.setParent(this); return sh; } @@ -198,6 +209,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC List shapes = getShapeList(); XSLFTable sh = getDrawing().createTable(); shapes.add(sh); + sh.setParent(this); return sh; } @@ -219,6 +231,12 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC return getShapeList().iterator(); } + public void addShape(XSLFShape shape) { + throw new UnsupportedOperationException( + "Adding a shape from a different container is not supported -" + + " create it from scratch witht XSLFSheet.create* methods"); + } + /** * Removes the specified shape from this sheet, if it is present * (optional operation). If this sheet does not contain the element, @@ -370,12 +388,6 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC return null; } - /** - * - * @return master of this sheet. - */ - public abstract XSLFSheet getMasterSheet(); - protected XSLFTextShape getTextShapeByType(Placeholder type){ for(XSLFShape shape : this.getShapes()){ if(shape instanceof XSLFTextShape) { @@ -486,7 +498,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC * @param graphics */ public void draw(Graphics2D graphics){ - XSLFSheet master = getMasterSheet(); + XSLFSheet master = (XSLFSheet)getMasterSheet(); if(getFollowMasterGraphics() && master != null) master.draw(graphics); graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, new AffineTransform()); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java index d6cfa7fba3..ca548dd636 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java @@ -19,26 +19,25 @@ package org.apache.poi.xslf.usermodel; +import java.awt.*; +import java.awt.Shape; +import java.awt.geom.*; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.poi.sl.draw.geom.*; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.StrokeStyle.LineCap; +import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; 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.geom.CustomGeometry; -import org.apache.poi.xslf.model.geom.Outline; -import org.apache.poi.xslf.model.geom.Path; -import org.apache.poi.xslf.model.geom.PresetGeometries; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.*; -import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; -import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; -import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; - -import java.awt.*; -import java.awt.geom.AffineTransform; -import java.awt.geom.Ellipse2D; -import java.awt.geom.GeneralPath; -import java.awt.geom.Rectangle2D; -import java.util.ArrayList; -import java.util.List; +import org.openxmlformats.schemas.presentationml.x2006.main.*; /** * Represents a single (non-group) shape in a .pptx slide show @@ -46,24 +45,11 @@ import java.util.List; * @author Yegor Kozlov */ @Beta -public abstract class XSLFSimpleShape extends XSLFShape { +public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { private static CTOuterShadowEffect NO_SHADOW = CTOuterShadowEffect.Factory.newInstance(); - private final XmlObject _shape; - private final XSLFSheet _sheet; - private CTShapeProperties _spPr; - private CTShapeStyle _spStyle; - private CTNonVisualDrawingProps _nvPr; - private CTPlaceholder _ph; - /* package */XSLFSimpleShape(XmlObject shape, XSLFSheet sheet) { - _shape = shape; - _sheet = sheet; - } - - @Override - public XmlObject getXmlObject() { - return _shape; + super(shape,sheet); } /** @@ -78,16 +64,16 @@ public abstract class XSLFSimpleShape extends XSLFShape { * * @param type */ - public void setShapeType(XSLFShapeType type){ + public void setShapeType(ShapeType type){ CTShape shape = (CTShape) getXmlObject(); - STShapeType.Enum geom = STShapeType.Enum.forInt(type.getIndex()); + STShapeType.Enum geom = STShapeType.Enum.forInt(type.ooxmlId); shape.getSpPr().getPrstGeom().setPrst(geom); } - public XSLFShapeType getShapeType(){ + public ShapeType getShapeType(){ CTShape shape = (CTShape) getXmlObject(); STShapeType.Enum geom = shape.getSpPr().getPrstGeom().getPrst(); - return XSLFShapeType.forInt(geom.intValue()); + return ShapeType.forId(geom.intValue(), true); } @Override @@ -100,101 +86,6 @@ public abstract class XSLFSimpleShape extends XSLFShape { return (int) getNvPr().getId(); } - protected CTNonVisualDrawingProps getNvPr() { - if (_nvPr == null) { - XmlObject[] rs = _shape - .selectPath("declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:cNvPr"); - if (rs.length != 0) { - _nvPr = (CTNonVisualDrawingProps) rs[0]; - } - } - return _nvPr; - } - - protected CTShapeProperties getSpPr() { - if (_spPr == null) { - for (XmlObject obj : _shape.selectPath("*")) { - if (obj instanceof CTShapeProperties) { - _spPr = (CTShapeProperties) obj; - } - } - } - if (_spPr == null) { - throw new IllegalStateException("CTShapeProperties was not found."); - } - return _spPr; - } - - protected CTShapeStyle getSpStyle() { - if (_spStyle == null) { - for (XmlObject obj : _shape.selectPath("*")) { - if (obj instanceof CTShapeStyle) { - _spStyle = (CTShapeStyle) obj; - } - } - } - return _spStyle; - } - - protected CTPlaceholder getCTPlaceholder() { - if (_ph == null) { - XmlObject[] obj = _shape.selectPath( - "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph"); - if (obj.length == 1) { - _ph = (CTPlaceholder) obj[0]; - } - } - return _ph; - } - - CTTransform2D getXfrm() { - PropertyFetcher fetcher = new PropertyFetcher() { - public boolean fetch(XSLFSimpleShape shape) { - CTShapeProperties pr = shape.getSpPr(); - if (pr.isSetXfrm()) { - setValue(pr.getXfrm()); - return true; - } - return false; - } - }; - fetchShapeProperty(fetcher); - return fetcher.getValue(); - } - - @Override - public Rectangle2D getAnchor() { - - CTTransform2D xfrm = getXfrm(); - - CTPoint2D off = xfrm.getOff(); - long x = off.getX(); - long y = off.getY(); - CTPositiveSize2D ext = xfrm.getExt(); - long cx = ext.getCx(); - long cy = ext.getCy(); - return new Rectangle2D.Double( - Units.toPoints(x), Units.toPoints(y), - Units.toPoints(cx), Units.toPoints(cy)); - } - - @Override - public void setAnchor(Rectangle2D anchor) { - CTShapeProperties spPr = getSpPr(); - CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm(); - CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff(); - long x = Units.toEMU(anchor.getX()); - long y = Units.toEMU(anchor.getY()); - off.setX(x); - off.setY(y); - CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm - .addNewExt(); - long cx = Units.toEMU(anchor.getWidth()); - long cy = Units.toEMU(anchor.getHeight()); - ext.setCx(cx); - ext.setCy(cy); - } - @Override public void setRotation(double theta) { CTShapeProperties spPr = getSpPr(); @@ -314,7 +205,7 @@ public abstract class XSLFSimpleShape extends XSLFShape { */ public double getLineWidth() { PropertyFetcher fetcher = new PropertyFetcher() { - public boolean fetch(XSLFSimpleShape shape) { + public boolean fetch(XSLFShape shape) { CTShapeProperties spPr = shape.getSpPr(); CTLineProperties ln = spPr.getLn(); if (ln != null) { @@ -371,7 +262,7 @@ public abstract class XSLFSimpleShape extends XSLFShape { public LineDash getLineDash() { PropertyFetcher fetcher = new PropertyFetcher() { - public boolean fetch(XSLFSimpleShape shape) { + public boolean fetch(XSLFShape shape) { CTShapeProperties spPr = shape.getSpPr(); CTLineProperties ln = spPr.getLn(); if (ln != null) { @@ -421,7 +312,7 @@ public abstract class XSLFSimpleShape extends XSLFShape { */ public LineCap getLineCap() { PropertyFetcher fetcher = new PropertyFetcher() { - public boolean fetch(XSLFSimpleShape shape) { + public boolean fetch(XSLFShape shape) { CTShapeProperties spPr = shape.getSpPr(); CTLineProperties ln = spPr.getLn(); if (ln != null) { @@ -499,7 +390,7 @@ public abstract class XSLFSimpleShape extends XSLFShape { */ public XSLFShadow getShadow() { PropertyFetcher fetcher = new PropertyFetcher() { - public boolean fetch(XSLFSimpleShape shape) { + public boolean fetch(XSLFShape shape) { CTShapeProperties spPr = shape.getSpPr(); if (spPr.isSetEffectLst()) { CTOuterShadowEffect obj = spPr.getEffectLst().getOuterShdw(); @@ -528,90 +419,11 @@ public abstract class XSLFSimpleShape extends XSLFShape { return (obj == null || obj == NO_SHADOW) ? null : new XSLFShadow(obj, this); } - @Override - public void draw(Graphics2D graphics) { - RenderableShape rShape = new RenderableShape(this); - rShape.render(graphics); - - // draw line decorations - Color lineColor = getLineColor(); - if(lineColor != null) { - graphics.setPaint(lineColor); - for(Outline o : getDecorationOutlines(graphics)){ - if(o.getPath().isFilled()){ - graphics.fill(o.getOutline()); - } - if(o.getPath().isStroked()){ - graphics.draw(o.getOutline()); - } - } - } - } - - - /** - * Walk up the inheritance tree and fetch shape properties. - * - * The following order of inheritance is assumed: - *

- * slide <-- slideLayout <-- slideMaster - *

- * - * @param visitor the object that collects the desired property - * @return true if the property was fetched - */ - boolean fetchShapeProperty(PropertyFetcher visitor) { - boolean ok = visitor.fetch(this); - - XSLFSimpleShape masterShape; - XSLFSheet masterSheet = getSheet().getMasterSheet(); - CTPlaceholder ph = getCTPlaceholder(); - - if (masterSheet != null && ph != null) { - if (!ok) { - masterShape = masterSheet.getPlaceholder(ph); - if (masterShape != null) { - ok = visitor.fetch(masterShape); - } - } - - // try slide master - if (!ok ) { - int textType; - if ( !ph.isSetType()) textType = STPlaceholderType.INT_BODY; - else { - switch (ph.getType().intValue()) { - case STPlaceholderType.INT_TITLE: - case STPlaceholderType.INT_CTR_TITLE: - textType = STPlaceholderType.INT_TITLE; - break; - case STPlaceholderType.INT_FTR: - case STPlaceholderType.INT_SLD_NUM: - case STPlaceholderType.INT_DT: - textType = ph.getType().intValue(); - break; - default: - textType = STPlaceholderType.INT_BODY; - break; - } - } - XSLFSheet master = masterSheet.getMasterSheet(); - if (master != null) { - masterShape = master.getPlaceholderByType(textType); - if (masterShape != null) { - ok = visitor.fetch(masterShape); - } - } - } - } - return ok; - } - /** * * @return definition of the shape geometry */ - CustomGeometry getGeometry(){ + public CustomGeometry getGeometry(){ CTShapeProperties spPr = getSpPr(); CustomGeometry geom; PresetGeometries dict = PresetGeometries.getInstance(); @@ -622,23 +434,16 @@ public abstract class XSLFSimpleShape extends XSLFShape { throw new IllegalStateException("Unknown shape geometry: " + name); } } else if (spPr.isSetCustGeom()){ - geom = new CustomGeometry(spPr.getCustGeom()); + XMLStreamReader staxReader = spPr.getCustGeom().newXMLStreamReader(); + geom = PresetGeometries.convertCustomGeometry(staxReader); + try { staxReader.close(); } + catch (XMLStreamException e) {} } else { geom = dict.get("rect"); } return geom; } - - - /** - * draw any content within this shape (image, text, etc.). - * - * @param graphics the graphics to draw into - */ - public void drawContent(Graphics2D graphics){ - - } - + @Override void copy(XSLFShape sh){ super.copy(sh); @@ -943,4 +748,30 @@ public abstract class XSLFSimpleShape extends XSLFShape { return lst; } + public boolean isPlaceholder() { + CTPlaceholder ph = getCTPlaceholder(); + return ph != null; + } + + public Hyperlink getHyperlink() { + // TODO Auto-generated method stub + return null; + } + + public void setHyperlink(Hyperlink hyperlink) { + // TODO Auto-generated method stub + + } + + public Guide getAdjustValue(String name) { + // TODO Auto-generated method stub + return null; + } + + public org.apache.poi.sl.usermodel.LineDecoration getLineDecoration() { + // TODO Auto-generated method stub + return null; + } + + } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index f2d4b6eff1..af80a57ffc 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -16,29 +16,31 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; +import java.awt.Graphics2D; +import java.io.IOException; + import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.usermodel.Notes; +import org.apache.poi.sl.usermodel.Slide; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; +import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip; import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties; import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D; 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.CTBlip; +import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground; import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData; import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual; import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide; import org.openxmlformats.schemas.presentationml.x2006.main.SldDocument; -import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground; - -import java.awt.Graphics2D; -import java.io.IOException; @Beta -public final class XSLFSlide extends XSLFSheet { +public final class XSLFSlide extends XSLFSheet implements Slide { private final CTSlide _slide; private XSLFSlideLayout _layout; private XSLFComments _comments; @@ -111,7 +113,6 @@ public final class XSLFSlide extends XSLFSheet { return "sld"; } - @Override public XSLFSlideLayout getMasterSheet(){ return getSlideLayout(); } @@ -211,6 +212,15 @@ public final class XSLFSlide extends XSLFSheet { } + public boolean getFollowMasterObjects() { + return getFollowMasterGraphics(); + } + + public void setFollowMasterObjects(boolean follow) { + setFollowMasterGraphics(follow); + } + + @Override public void draw(Graphics2D graphics){ @@ -239,4 +249,26 @@ public final class XSLFSlide extends XSLFSheet { return this; } + public boolean getFollowMasterBackground() { + return false; + } + + public void setFollowMasterBackground(boolean follow) { + // not implemented ... also not in the specs + throw new UnsupportedOperationException(); + } + + public boolean getFollowMasterColourScheme() { + return false; + } + + public void setFollowMasterColourScheme(boolean follow) { + // not implemented ... only for OLE objects in the specs + throw new UnsupportedOperationException(); + } + + public void setNotes(Notes notes) { + // TODO Auto-generated method stub + + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java index f8cd23ccde..2373641354 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java @@ -19,6 +19,7 @@ package org.apache.poi.xslf.usermodel; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.usermodel.MasterSheet; import org.apache.poi.util.Beta; import org.apache.poi.util.Internal; import org.apache.xmlbeans.XmlException; @@ -30,7 +31,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.SldLayoutDocument; import java.io.IOException; @Beta -public class XSLFSlideLayout extends XSLFSheet { +public class XSLFSlideLayout extends XSLFSheet implements MasterSheet { private CTSlideLayout _layout; private XSLFSlideMaster _master; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java index d4383c4d9f..ebeec01efb 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java @@ -19,6 +19,7 @@ package org.apache.poi.xslf.usermodel; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.usermodel.MasterSheet; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping; @@ -53,7 +54,7 @@ import java.util.Map; * @author Yegor Kozlov */ @Beta - public class XSLFSlideMaster extends XSLFSheet { + public class XSLFSlideMaster extends XSLFSheet implements MasterSheet { private CTSlideMaster _slide; private Map _layouts; private XSLFTheme _theme; @@ -82,7 +83,7 @@ import java.util.Map; } @Override - public XSLFSheet getMasterSheet() { + public MasterSheet getMasterSheet() { return null; } @@ -177,5 +178,4 @@ import java.util.Map; return null; } } - } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java index a3671ab63d..a21b9d5e37 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java @@ -21,6 +21,7 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; +import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.util.Units; import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties; import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java index e0b383a76b..869421e5c0 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -18,42 +18,14 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; import java.awt.Graphics2D; -import java.awt.font.LineBreakMeasurer; -import java.awt.font.TextAttribute; -import java.awt.font.TextLayout; import java.awt.geom.Rectangle2D; -import java.text.AttributedCharacterIterator; -import java.text.AttributedString; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; -import org.apache.poi.hslf.model.TextPainter; -import org.apache.poi.util.Beta; -import org.apache.poi.util.Internal; -import org.apache.poi.util.Units; +import org.apache.poi.sl.usermodel.TextParagraph; +import org.apache.poi.util.*; import org.apache.poi.xslf.model.ParagraphPropertyFetcher; import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextAutonumberBullet; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePercent; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePoint; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharBullet; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextLineBreak; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNormalAutofit; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextTabStop; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextTabStopList; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextAutonumberScheme; +import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; @@ -65,16 +37,10 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; * @since POI-3.8 */ @Beta -public class XSLFTextParagraph implements Iterable{ +public class XSLFTextParagraph implements TextParagraph { private final CTTextParagraph _p; private final List _runs; private final XSLFTextShape _shape; - private List _lines; - private TextFragment _bullet; - /** - * the highest line in this paragraph. Used for line spacing. - */ - private double _maxLineHeight; XSLFTextParagraph(CTTextParagraph p, XSLFTextShape shape){ _p = p; @@ -122,7 +88,7 @@ public class XSLFTextParagraph implements Iterable{ return _p; } - XSLFTextShape getParentShape() { + public XSLFTextShape getParentShape() { return _shape; } @@ -194,7 +160,7 @@ public class XSLFTextParagraph implements Iterable{ /** * Specifies the alignment that is to be applied to the paragraph. * Possible values for this include left, right, centered, justified and distributed, - * see {@link org.apache.poi.xslf.usermodel.TextAlign}. + * see {@link org.apache.poi.sl.usermodel.TextAlign}. * * @param align text align */ @@ -408,6 +374,26 @@ public class XSLFTextParagraph implements Iterable{ return fetcher.getValue() == null ? 0 : fetcher.getValue(); } + /** + * + * @return the right margin of the paragraph + */ + public double getRightMargin(){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + public boolean fetch(CTTextParagraphProperties props){ + if(props.isSetMarR()){ + double val = Units.toPoints(props.getMarR()); + setValue(val); + return true; + } + return false; + } + }; + fetchParagraphProperty(fetcher); + // if the marL attribute is omitted, then a value of 347663 is implied + return fetcher.getValue() == null ? 0 : fetcher.getValue(); + } + /** * * @return the default size for a tab character within this paragraph in points @@ -711,10 +697,6 @@ public class XSLFTextParagraph implements Iterable{ return "[" + getClass() + "]" + getText(); } - List getTextLines(){ - return _lines; - } - /** * Returns wrapping width to break lines in this paragraph * @@ -754,244 +736,6 @@ public class XSLFTextParagraph implements Iterable{ return width; } - public double draw(Graphics2D graphics, double x, double y){ - double leftInset = _shape.getLeftInset(); - double rightInset = _shape.getRightInset(); - RenderableShape rShape = new RenderableShape(_shape); - Rectangle2D anchor = rShape.getAnchor(graphics); - double penY = y; - - double leftMargin = getLeftMargin(); - boolean firstLine = true; - double indent = getIndent(); - - //The vertical line spacing - double spacing = getLineSpacing(); - for(TextFragment line : _lines){ - double penX = x + leftMargin; - - if(firstLine) { - if(_bullet != null){ - if(indent < 0) { - // a negative value means "Hanging" indentation and - // indicates the position of the actual bullet character. - // (the bullet is shifted to right relative to the text) - _bullet.draw(graphics, penX + indent, penY); - } else if(indent > 0){ - // a positive value means the "First Line" indentation: - // the first line is indented and other lines start at the bullet ofset - _bullet.draw(graphics, penX, penY); - penX += indent; - } else { - // a zero indent means that the bullet and text have the same offset - _bullet.draw(graphics, penX, penY); - - // don't let text overlay the bullet and advance by the bullet width - penX += _bullet._layout.getAdvance() + 1; - } - } else { - penX += indent; - } - } - - - switch (getTextAlign()) { - case CENTER: - penX += (anchor.getWidth() - leftMargin - line.getWidth() - leftInset - rightInset) / 2; - break; - case RIGHT: - penX += (anchor.getWidth() - line.getWidth() - leftInset - rightInset); - break; - default: - break; - } - - line.draw(graphics, penX, penY); - - if(spacing > 0) { - // If linespacing >= 0, then linespacing is a percentage of normal line height. - penY += spacing*0.01* line.getHeight(); - } else { - // positive value means absolute spacing in points - penY += -spacing; - } - - firstLine = false; - } - - return penY - y; - } - - AttributedString getAttributedString(Graphics2D graphics){ - - String text = getRenderableText(); - - AttributedString string = new AttributedString(text); - - XSLFFontManager fontHandler = (XSLFFontManager)graphics.getRenderingHint(XSLFRenderingHint.FONT_HANDLER); - - int startIndex = 0; - for (XSLFTextRun run : _runs){ - int length = run.getRenderableText().length(); - if(length == 0) { - // skip empty runs - continue; - } - int endIndex = startIndex + length; - - string.addAttribute(TextAttribute.FOREGROUND, run.getFontColor(), startIndex, endIndex); - - // user can pass an custom object to convert fonts - String fontFamily = run.getFontFamily(); - @SuppressWarnings("unchecked") - Map fontMap = (Map)graphics.getRenderingHint(TextPainter.KEY_FONTMAP); - if (fontMap != null && fontMap.containsKey(fontFamily)) { - fontFamily = fontMap.get(fontFamily); - } - if(fontHandler != null) { - fontFamily = fontHandler.getRendererableFont(fontFamily, run.getPitchAndFamily()); - } - string.addAttribute(TextAttribute.FAMILY, fontFamily, startIndex, endIndex); - - float fontSz = (float)run.getFontSize(); - string.addAttribute(TextAttribute.SIZE, fontSz , startIndex, endIndex); - - if(run.isBold()) { - string.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, startIndex, endIndex); - } - if(run.isItalic()) { - string.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, startIndex, endIndex); - } - if(run.isUnderline()) { - string.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, startIndex, endIndex); - string.addAttribute(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, startIndex, endIndex); - } - if(run.isStrikethrough()) { - string.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, startIndex, endIndex); - } - if(run.isSubscript()) { - string.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUB, startIndex, endIndex); - } - if(run.isSuperscript()) { - string.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, startIndex, endIndex); - } - - - startIndex = endIndex; - } - - return string; - } - - /** - * ensure that the paragraph contains at least one character. - * We need this trick to correctly measure text - */ - private void ensureNotEmpty(){ - XSLFTextRun r = addNewTextRun(); - r.setText(" "); - CTTextCharacterProperties endPr = _p.getEndParaRPr(); - if(endPr != null) { - if(endPr.isSetSz()) r.setFontSize(endPr.getSz() / 100); - } - } - - /** - * break text into lines - * - * @param graphics - * @return array of text fragments, - * each representing a line of text that fits in the wrapping width - */ - List breakText(Graphics2D graphics){ - _lines = new ArrayList(); - - // does this paragraph contain text? - boolean emptyParagraph = _runs.size() == 0; - - // ensure that the paragraph contains at least one character - if(_runs.size() == 0) ensureNotEmpty(); - - String text = getRenderableText(); - if(text.length() == 0) return _lines; - - AttributedString at = getAttributedString(graphics); - AttributedCharacterIterator it = at.getIterator(); - LineBreakMeasurer measurer = new LineBreakMeasurer(it, graphics.getFontRenderContext()) ; - for (;;) { - int startIndex = measurer.getPosition(); - - double wrappingWidth = getWrappingWidth(_lines.size() == 0, graphics) + 1; // add a pixel to compensate rounding errors - // shape width can be smaller that the sum of insets (this was proved by a test file) - if(wrappingWidth < 0) wrappingWidth = 1; - - int nextBreak = text.indexOf('\n', startIndex + 1); - if(nextBreak == -1) nextBreak = it.getEndIndex(); - - TextLayout layout = measurer.nextLayout((float)wrappingWidth, nextBreak, true); - if (layout == null) { - // layout can be null if the entire word at the current position - // does not fit within the wrapping width. Try with requireNextWord=false. - layout = measurer.nextLayout((float)wrappingWidth, nextBreak, false); - } - - if(layout == null) { - // exit if can't break any more - break; - } - - int endIndex = measurer.getPosition(); - // skip over new line breaks (we paint 'clear' text runs not starting or ending with \n) - if(endIndex < it.getEndIndex() && text.charAt(endIndex) == '\n'){ - measurer.setPosition(endIndex + 1); - } - - TextAlign hAlign = getTextAlign(); - if(hAlign == TextAlign.JUSTIFY || hAlign == TextAlign.JUSTIFY_LOW) { - layout = layout.getJustifiedLayout((float)wrappingWidth); - } - - AttributedString str = new AttributedString(it, startIndex, endIndex); - TextFragment line = new TextFragment( - layout, // we will not paint empty paragraphs - emptyParagraph ? null : str); - _lines.add(line); - - _maxLineHeight = Math.max(_maxLineHeight, line.getHeight()); - - if(endIndex == it.getEndIndex()) break; - - } - - if(isBullet() && !emptyParagraph) { - String buCharacter = getBulletCharacter(); - String buFont = getBulletFont(); - if(buFont == null) buFont = getTextRuns().get(0).getFontFamily(); - if(buCharacter != null && buFont != null && _lines.size() > 0) { - AttributedString str = new AttributedString(buCharacter); - - TextFragment firstLine = _lines.get(0); - AttributedCharacterIterator bit = firstLine._str.getIterator(); - - Color buColor = getBulletFontColor(); - str.addAttribute(TextAttribute.FOREGROUND, buColor == null ? - bit.getAttribute(TextAttribute.FOREGROUND) : buColor); - str.addAttribute(TextAttribute.FAMILY, buFont); - - float fontSize = (Float)bit.getAttribute(TextAttribute.SIZE); - float buSz = (float)getBulletFontSize(); - if(buSz > 0) fontSize *= buSz* 0.01; - else fontSize = -buSz; - - str.addAttribute(TextAttribute.SIZE, fontSize); - - TextLayout layout = new TextLayout(str.getIterator(), graphics.getFontRenderContext()); - _bullet = new TextFragment(layout, str); - } - } - return _lines; - } - CTTextParagraphProperties getDefaultMasterStyle(){ CTPlaceholder ph = _shape.getCTPlaceholder(); String defaultStyleSelector; @@ -1017,7 +761,7 @@ public class XSLFTextParagraph implements Iterable{ // wind up and find the root master sheet which must be slide master XSLFSheet masterSheet = _shape.getSheet(); while (masterSheet.getMasterSheet() != null){ - masterSheet = masterSheet.getMasterSheet(); + masterSheet = (XSLFSheet)masterSheet.getMasterSheet(); } XmlObject[] o = masterSheet.getXmlObject().selectPath( @@ -1130,4 +874,32 @@ public class XSLFTextParagraph implements Iterable{ } } + public double getDefaultFontSize() { + CTTextCharacterProperties endPr = _p.getEndParaRPr(); + return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100); + } + + public String getDefaultFontFamily() { + return (_runs.isEmpty() ? "Arial" : _runs.get(0).getFontFamily()); + } + + public BulletStyle getBulletStyle() { + return new BulletStyle(){ + public String getBulletCharacter() { + return XSLFTextParagraph.this.getBulletCharacter(); + } + + public String getBulletFont() { + return XSLFTextParagraph.this.getBulletFont(); + } + + public double getBulletFontSize() { + return XSLFTextParagraph.this.getBulletFontSize(); + } + + public Color getBulletFontColor() { + return XSLFTextParagraph.this.getBulletFontColor(); + } + }; + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java index 16d0e803b1..0a6daf6cea 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java @@ -22,6 +22,7 @@ import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedString; +import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.Beta; import org.apache.poi.xslf.model.CharacterPropertyFetcher; import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; @@ -45,7 +46,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; * @author Yegor Kozlov */ @Beta -public class XSLFTextRun { +public class XSLFTextRun implements TextRun { private final CTRegularTextRun _r; private final XSLFTextParagraph _p; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java index d5ae1a2527..b4308c46c9 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java @@ -23,26 +23,20 @@ import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.*; import org.apache.poi.POIXMLException; +import org.apache.poi.sl.draw.DrawFactory; +import org.apache.poi.sl.draw.geom.Guide; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.LineDecoration; 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.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextVerticalType; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextWrappingType; -import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps; -import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; -import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; -import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; +import org.openxmlformats.schemas.drawingml.x2006.main.*; +import org.openxmlformats.schemas.presentationml.x2006.main.*; /** * Represents a shape that can hold text. @@ -50,7 +44,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; * @author Yegor Kozlov */ @Beta -public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable{ +public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape { private final List _paragraphs; /** @@ -338,7 +332,13 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable< } } - + @Override + public Insets2D getInsets() { + Insets2D insets = new Insets2D(getTopInset(), getLeftInset(), getBottomInset(), getRightInset()); + return insets; + } + + /** * @return whether to wrap words within the bounding rectangle */ @@ -453,6 +453,9 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable< // dry-run in a 1x1 image and return the vertical advance BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = img.createGraphics(); + DrawFactory fact = DrawFactory.getInstance(graphics); + fact.getDrawable(this); + breakText(graphics); return drawParagraphs(graphics, 0, 0); } @@ -475,121 +478,6 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable< return anchor; } - /** - * break the contained text into lines - */ - private void breakText(Graphics2D graphics){ - if(!_isTextBroken) { - for(XSLFTextParagraph p : _paragraphs) p.breakText(graphics); - - _isTextBroken = true; - } - } - - @Override - public void drawContent(Graphics2D graphics) { - breakText(graphics); - - RenderableShape rShape = new RenderableShape(this); - Rectangle2D anchor = rShape.getAnchor(graphics); - double x = anchor.getX() + getLeftInset(); - double y = anchor.getY(); - - // remember the initial transform - AffineTransform tx = graphics.getTransform(); - - // Transform of text in flipped shapes is special. - // At this point the flip and rotation transform is already applied - // (see XSLFShape#applyTransform ), but we need to restore it to avoid painting "upside down". - // See Bugzilla 54210. - - if(getFlipVertical()){ - graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight()); - graphics.scale(1, -1); - graphics.translate(-anchor.getX(), -anchor.getY()); - - // text in vertically flipped shapes is rotated by 180 degrees - double centerX = anchor.getX() + anchor.getWidth()/2; - double centerY = anchor.getY() + anchor.getHeight()/2; - graphics.translate(centerX, centerY); - graphics.rotate(Math.toRadians(180)); - graphics.translate(-centerX, -centerY); - } - - // Horizontal flipping applies only to shape outline and not to the text in the shape. - // Applying flip second time restores the original not-flipped transform - if(getFlipHorizontal()){ - graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY()); - graphics.scale(-1, 1); - graphics.translate(-anchor.getX() , -anchor.getY()); - } - - - // first dry-run to calculate the total height of the text - double textHeight = getTextHeight(); - - switch (getVerticalAlignment()){ - case TOP: - y += getTopInset(); - break; - case BOTTOM: - y += anchor.getHeight() - textHeight - getBottomInset(); - break; - default: - case MIDDLE: - double delta = anchor.getHeight() - textHeight - - getTopInset() - getBottomInset(); - y += getTopInset() + delta/2; - break; - } - - drawParagraphs(graphics, x, y); - - // restore the transform - graphics.setTransform(tx); - } - - - /** - * paint the paragraphs starting from top left (x,y) - * - * @return the vertical advance, i.e. the cumulative space occupied by the text - */ - private double drawParagraphs(Graphics2D graphics, double x, double y) { - double y0 = y; - for(int i = 0; i < _paragraphs.size(); i++){ - XSLFTextParagraph p = _paragraphs.get(i); - List lines = p.getTextLines(); - - if(i > 0 && lines.size() > 0) { - // the amount of vertical white space before the paragraph - double spaceBefore = p.getSpaceBefore(); - if(spaceBefore > 0) { - // positive value means percentage spacing of the height of the first line, e.g. - // the higher the first line, the bigger the space before the paragraph - y += spaceBefore*0.01*lines.get(0).getHeight(); - } else { - // negative value means the absolute spacing in points - y += -spaceBefore; - } - } - - y += p.draw(graphics, x, y); - - if(i < _paragraphs.size() - 1) { - double spaceAfter = p.getSpaceAfter(); - if(spaceAfter > 0) { - // positive value means percentage spacing of the height of the last line, e.g. - // the higher the last line, the bigger the space after the paragraph - y += spaceAfter*0.01*lines.get(lines.size() - 1).getHeight(); - } else { - // negative value means the absolute spacing in points - y += -spaceAfter; - } - } - } - return y - y0; - } @Override void copy(XSLFShape sh){ @@ -633,4 +521,19 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable< } } + + public LineDecoration getLineDecoration() { + // TODO Auto-generated method stub + return null; + } + + public FillStyle getFillStyle() { + // TODO Auto-generated method stub + return null; + } + + public Guide getAdjustValue(String name) { + // TODO Auto-generated method stub + return null; + } } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java index 922d25f83d..e3dad561b6 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java @@ -17,6 +17,10 @@ package org.apache.poi.xslf.usermodel; import junit.framework.TestCase; + +import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.usermodel.TextAlign; +import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.util.Units; import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType; import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType; @@ -270,12 +274,12 @@ public class TestXSLFAutoShape extends TestCase { XSLFSlide slide = ppt.createSlide(); XSLFAutoShape shape = slide.createAutoShape(); - assertEquals(XSLFShapeType.RECT, shape.getShapeType()); + assertEquals(ShapeType.RECT, shape.getShapeType()); - shape.setShapeType(XSLFShapeType.TRIANGLE); - assertEquals(XSLFShapeType.TRIANGLE, shape.getShapeType()); + shape.setShapeType(ShapeType.TRIANGLE); + assertEquals(ShapeType.TRIANGLE, shape.getShapeType()); - for(XSLFShapeType tp : XSLFShapeType.values()) { + for(ShapeType tp : ShapeType.values()) { shape.setShapeType(tp); assertEquals(tp, shape.getShapeType()); } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java index 98240b0ffa..ae7de8d5c0 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java @@ -17,6 +17,8 @@ package org.apache.poi.xslf.usermodel; import junit.framework.TestCase; + +import org.apache.poi.sl.usermodel.ShapeType; import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector; @@ -112,12 +114,12 @@ public class TestXSLFConnectorShape extends TestCase { XSLFSlide slide = pptx.createSlide(); XSLFAutoShape rect1 = slide.createAutoShape(); - rect1.setShapeType(XSLFShapeType.RECT); + rect1.setShapeType(ShapeType.RECT); rect1.setAnchor(new Rectangle(100, 100, 100, 100)); rect1.setFillColor(Color.blue); XSLFAutoShape rect2 = slide.createAutoShape(); - rect2.setShapeType(XSLFShapeType.RECT); + rect2.setShapeType(ShapeType.RECT); rect2.setAnchor(new Rectangle(300, 300, 100, 100)); rect2.setFillColor(Color.red); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java index 838db8137b..2153ceb26f 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java @@ -20,6 +20,8 @@ import java.awt.Color; import junit.framework.TestCase; +import org.apache.poi.sl.usermodel.LineCap; +import org.apache.poi.sl.usermodel.LineDash; import org.apache.poi.util.Units; import org.apache.poi.xslf.XSLFTestDataSamples; import org.openxmlformats.schemas.drawingml.x2006.main.CTEffectStyleItem; diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java index 0ded02a5a7..505703bcaa 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java @@ -17,6 +17,8 @@ package org.apache.poi.xslf.usermodel; import junit.framework.TestCase; + +import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.XSLFTestDataSamples; import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index 00b4cbdcce..45bc30286e 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -17,6 +17,9 @@ package org.apache.poi.xslf.usermodel; import junit.framework.TestCase; + +import org.apache.poi.sl.draw.TextFragment; +import org.apache.poi.sl.usermodel.TextAlign; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.xslf.XSLFTestDataSamples; diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java index 79063a3083..f217c58278 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java @@ -17,6 +17,9 @@ package org.apache.poi.xslf.usermodel; import junit.framework.TestCase; + +import org.apache.poi.sl.usermodel.TextAlign; +import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.XSLFTestDataSamples; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; diff --git a/src/resources/scratchpad/org/apache/poi/sl/draw/presetShapeDefinitions.xml b/src/resources/scratchpad/org/apache/poi/sl/draw/presetShapeDefinitions.xml new file mode 100644 index 0000000000..4a3a0701d3 --- /dev/null +++ b/src/resources/scratchpad/org/apache/poi/sl/draw/presetShapeDefinitions.xml @@ -0,0 +1,19906 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java index 525f673c3e..8036695285 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java @@ -34,6 +34,8 @@ import org.apache.poi.hslf.record.ExObjList; import org.apache.poi.hslf.record.OEShapeAtom; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.StringUtil; @@ -63,7 +65,7 @@ public final class ActiveXShape extends Picture { * this picture in the Slide * @param parent the parent shape of this picture */ - protected ActiveXShape(EscherContainerRecord escherRecord, Shape parent){ + protected ActiveXShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -78,7 +80,7 @@ public final class ActiveXShape extends Picture { EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID); spRecord.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_HASSHAPETYPE | EscherSpRecord.FLAG_OLESHAPE); - setShapeType(ShapeTypes.HostControl); + setShapeType(ShapeType.HOST_CONTROL); setEscherProperty(EscherProperties.BLIP__PICTUREID, idx); setEscherProperty(EscherProperties.LINESTYLE__COLOR, 0x8000001); setEscherProperty(EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x80008); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java index 1b8e7dde68..ccb302d715 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java @@ -18,6 +18,8 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.POILogger; import java.awt.geom.Rectangle2D; @@ -33,20 +35,20 @@ import java.awt.geom.Rectangle2D; */ public class AutoShape extends TextShape { - protected AutoShape(EscherContainerRecord escherRecord, Shape parent){ + protected AutoShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } - public AutoShape(int type, Shape parent){ + public AutoShape(ShapeType type, ShapeContainer parent){ super(null, parent); _escherContainer = createSpContainer(type, parent instanceof ShapeGroup); } - public AutoShape(int type){ + public AutoShape(ShapeType type){ this(type, null); } - protected EscherContainerRecord createSpContainer(int shapeType, boolean isChild){ + protected EscherContainerRecord createSpContainer(ShapeType shapeType, boolean isChild){ _escherContainer = super.createSpContainer(isChild); setShapeType(shapeType); @@ -110,7 +112,7 @@ public class AutoShape extends TextShape { ShapeOutline outline = AutoShapes.getShapeOutline(getShapeType()); Rectangle2D anchor = getLogicalAnchor2D(); if(outline == null){ - logger.log(POILogger.WARN, "Outline not found for " + ShapeTypes.typeName(getShapeType())); + logger.log(POILogger.WARN, "Outline not found for " + getShapeType().nativeName); return anchor; } java.awt.Shape shape = outline.getOutline(this); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java index 02b20fbe2a..25a68dfcd8 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java @@ -26,6 +26,7 @@ import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import org.apache.poi.ddf.EscherProperties; +import org.apache.poi.sl.usermodel.ShapeType; /** * Stores definition of auto-shapes. @@ -45,8 +46,8 @@ public final class AutoShapes { * * @return the shape outline */ - public static ShapeOutline getShapeOutline(int type){ - ShapeOutline outline = shapes[type]; + public static ShapeOutline getShapeOutline(ShapeType type){ + ShapeOutline outline = shapes[type.nativeId]; return outline; } @@ -68,14 +69,14 @@ public final class AutoShapes { static { shapes = new ShapeOutline[255]; - shapes[ShapeTypes.Rectangle] = new ShapeOutline(){ + shapes[ShapeType.RECT.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ Rectangle2D path = new Rectangle2D.Float(0, 0, 21600, 21600); return path; } }; - shapes[ShapeTypes.RoundRectangle] = new ShapeOutline(){ + shapes[ShapeType.ROUND_RECT.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); RoundRectangle2D path = new RoundRectangle2D.Float(0, 0, 21600, 21600, adjval, adjval); @@ -83,14 +84,14 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.Ellipse] = new ShapeOutline(){ + shapes[ShapeType.ELLIPSE.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ Ellipse2D path = new Ellipse2D.Float(0, 0, 21600, 21600); return path; } }; - shapes[ShapeTypes.Diamond] = new ShapeOutline(){ + shapes[ShapeType.DIAMOND.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ GeneralPath path = new GeneralPath(); path.moveTo(10800, 0); @@ -103,7 +104,7 @@ public final class AutoShapes { }; //m@0,l,21600r21600 - shapes[ShapeTypes.IsocelesTriangle] = new ShapeOutline(){ + shapes[ShapeType.TRIANGLE.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 10800); GeneralPath path = new GeneralPath(); @@ -115,7 +116,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.RightTriangle] = new ShapeOutline(){ + shapes[ShapeType.RT_TRIANGLE.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ GeneralPath path = new GeneralPath(); path.moveTo(0, 0); @@ -126,7 +127,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.Parallelogram] = new ShapeOutline(){ + shapes[ShapeType.PARALLELOGRAM.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); @@ -140,7 +141,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.Trapezoid] = new ShapeOutline(){ + shapes[ShapeType.TRAPEZOID.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); @@ -154,7 +155,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.Hexagon] = new ShapeOutline(){ + shapes[ShapeType.HEXAGON.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); @@ -170,7 +171,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.Octagon] = new ShapeOutline(){ + shapes[ShapeType.OCTAGON.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 6326); @@ -188,7 +189,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.Plus] = new ShapeOutline(){ + shapes[ShapeType.PLUS.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); @@ -210,7 +211,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.Pentagon] = new ShapeOutline(){ + shapes[ShapeType.PENTAGON.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ GeneralPath path = new GeneralPath(); @@ -224,7 +225,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.DownArrow] = new ShapeOutline(){ + shapes[ShapeType.DOWN_ARROW.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ //m0@0 l@1@0 @1,0 @2,0 @2@0,21600@0,10800,21600xe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200); @@ -242,7 +243,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.UpArrow] = new ShapeOutline(){ + shapes[ShapeType.UP_ARROW.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ //m0@0 l@1@0 @1,21600@2,21600@2@0,21600@0,10800,xe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); @@ -260,7 +261,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.Arrow] = new ShapeOutline(){ + shapes[ShapeType.RIGHT_ARROW.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ //m@0, l@0@1 ,0@1,0@2@0@2@0,21600,21600,10800xe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200); @@ -278,7 +279,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.LeftArrow] = new ShapeOutline(){ + shapes[ShapeType.LEFT_ARROW.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ //m@0, l@0@1,21600@1,21600@2@0@2@0,21600,,10800xe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); @@ -296,7 +297,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.Can] = new ShapeOutline(){ + shapes[ShapeType.CAN.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ //m10800,qx0@1l0@2qy10800,21600,21600@2l21600@1qy10800,xem0@1qy10800@0,21600@1nfe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); @@ -320,7 +321,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.LeftBrace] = new ShapeOutline(){ + shapes[ShapeType.LEFT_BRACE.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ //m21600,qx10800@0l10800@2qy0@11,10800@3l10800@1qy21600,21600e int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800); @@ -348,7 +349,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.RightBrace] = new ShapeOutline(){ + shapes[ShapeType.RIGHT_BRACE.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ //m,qx10800@0 l10800@2qy21600@11,10800@3l10800@1qy,21600e int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800); @@ -376,7 +377,7 @@ public final class AutoShapes { } }; - shapes[ShapeTypes.StraightConnector1] = new ShapeOutline(){ + shapes[ShapeType.STRAIGHT_CONNECTOR_1.nativeId] = new ShapeOutline(){ public java.awt.Shape getOutline(Shape shape){ return new Line2D.Float(0, 0, 21600, 21600); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Background.java b/src/scratchpad/src/org/apache/poi/hslf/model/Background.java index 531f2da191..12070cdf62 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Background.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Background.java @@ -17,16 +17,22 @@ package org.apache.poi.hslf.model; -import org.apache.poi.ddf.EscherContainerRecord; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.hslf.blip.Bitmap; -import org.apache.poi.util.POILogger; - -import javax.imageio.ImageIO; -import java.awt.*; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; +import javax.imageio.ImageIO; + +import org.apache.poi.ddf.EscherContainerRecord; +import org.apache.poi.hslf.blip.Bitmap; +import org.apache.poi.hslf.usermodel.PictureData; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.util.POILogger; + /** * Background shape * @@ -34,7 +40,7 @@ import java.io.ByteArrayInputStream; */ public final class Background extends Shape { - protected Background(EscherContainerRecord escherRecord, Shape parent) { + protected Background(EscherContainerRecord escherRecord, ShapeContainer parent) { super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java b/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java index 82f46b5e1c..187bfd0ca2 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java @@ -31,6 +31,8 @@ import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherOptRecord; import org.apache.poi.ddf.EscherProperties; import org.apache.poi.ddf.EscherSimpleProperty; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.POILogger; @@ -60,7 +62,7 @@ public final class Freeform extends AutoShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected Freeform(EscherContainerRecord escherRecord, Shape parent){ + protected Freeform(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -71,9 +73,9 @@ public final class Freeform extends AutoShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public Freeform(Shape parent){ - super(null, parent); - _escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup); + public Freeform(ShapeContainer parent){ + super((EscherContainerRecord)null, parent); + _escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof ShapeGroup); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java b/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java index fbdd2e7aee..d317b6ad56 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java @@ -152,7 +152,7 @@ public final class Hyperlink { * @return found hyperlinks or null if not found */ protected static Hyperlink[] find(TextRun run){ - ArrayList lst = new ArrayList(); + List lst = new ArrayList(); SlideShow ppt = run.getSheet().getSlideShow(); //document-level container which stores info about all links in a presentation ExObjList exobj = ppt.getDocumentRecord().getExObjList(); @@ -177,7 +177,7 @@ public final class Hyperlink { * @return found hyperlink or null */ protected static Hyperlink find(Shape shape){ - ArrayList lst = new ArrayList(); + List lst = new ArrayList(); SlideShow ppt = shape.getSheet().getSlideShow(); //document-level container which stores info about all links in a presentation ExObjList exobj = ppt.getDocumentRecord().getExObjList(); @@ -198,7 +198,7 @@ public final class Hyperlink { return lst.size() == 1 ? (Hyperlink)lst.get(0) : null; } - private static void find(Record[] records, ExObjList exobj, List out){ + private static void find(Record[] records, ExObjList exobj, List out){ for (int i = 0; i < records.length; i++) { //see if we have InteractiveInfo in the textrun's records if( records[i] instanceof InteractiveInfo){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java index 2a23d24819..3c078ec5a0 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java @@ -18,6 +18,8 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; import java.awt.geom.Rectangle2D; import java.awt.geom.Line2D; @@ -95,11 +97,11 @@ public final class Line extends SimpleShape { public static final int LINE_TRIPLE = 4; - protected Line(EscherContainerRecord escherRecord, Shape parent){ + protected Line(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } - public Line(Shape parent){ + public Line(ShapeContainer parent){ super(null, parent); _escherContainer = createSpContainer(parent instanceof ShapeGroup); } @@ -112,7 +114,7 @@ public final class Line extends SimpleShape { _escherContainer = super.createSpContainer(isChild); EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID); - short type = (ShapeTypes.Line << 4) | 0x2; + short type = (short)((ShapeType.LINE.nativeId << 4) | 0x2); spRecord.setOptions(type); //set default properties for a line diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java index 93e8a124fc..6b5225e925 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java @@ -25,6 +25,7 @@ import org.apache.poi.ddf.EscherProperties; import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.hslf.record.*; import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.sl.usermodel.ShapeContainer; /** * Represents a movie in a PowerPoint document. @@ -54,7 +55,7 @@ public final class MovieShape extends Picture { * @param idx the index of the picture * @param parent the parent shape */ - public MovieShape(int movieIdx, int idx, Shape parent) { + public MovieShape(int movieIdx, int idx, ShapeContainer parent) { super(idx, parent); setMovieIndex(movieIdx); } @@ -66,7 +67,7 @@ public final class MovieShape extends Picture { * this picture in the Slide * @param parent the parent shape of this picture */ - protected MovieShape(EscherContainerRecord escherRecord, Shape parent){ + protected MovieShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java index 659b340e1c..c4e560a91f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java @@ -24,6 +24,7 @@ import org.apache.poi.hslf.record.ExObjList; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.ExEmbed; import org.apache.poi.hslf.record.RecordTypes; +import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.POILogger; @@ -51,7 +52,7 @@ public final class OLEShape extends Picture { * @param idx the index of the picture * @param parent the parent shape */ - public OLEShape(int idx, Shape parent) { + public OLEShape(int idx, ShapeContainer parent) { super(idx, parent); } @@ -62,7 +63,7 @@ public final class OLEShape extends Picture { * this picture in the Slide * @param parent the parent shape of this picture */ - protected OLEShape(EscherContainerRecord escherRecord, Shape parent){ + protected OLEShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java index 99acb335b5..e592d77f8f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java @@ -1456,7 +1456,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { * @param hints the rendering hints to be set * @see RenderingHints */ - public void addRenderingHints(Map hints){ + public void addRenderingHints(Map hints){ this._hints.putAll(hints); } @@ -1581,8 +1581,9 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { * @param hints the rendering hints to be set * @see RenderingHints */ - public void setRenderingHints(Map hints){ - this._hints = new RenderingHints(hints); + public void setRenderingHints(Map hints){ + this._hints = new RenderingHints(null); + this._hints.putAll(hints); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java b/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java index eda9d25056..f57ced0ac4 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java @@ -39,6 +39,8 @@ import org.apache.poi.hslf.blip.Bitmap; import org.apache.poi.hslf.record.Document; import org.apache.poi.hslf.usermodel.PictureData; import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.POILogger; import org.apache.poi.util.StringUtil; import org.apache.poi.util.Units; @@ -96,7 +98,7 @@ public class Picture extends SimpleShape { * @param idx the index of the picture * @param parent the parent shape */ - public Picture(int idx, Shape parent) { + public Picture(int idx, ShapeContainer parent) { super(null, parent); _escherContainer = createSpContainer(idx, parent instanceof ShapeGroup); } @@ -108,7 +110,7 @@ public class Picture extends SimpleShape { * this picture in the Slide * @param parent the parent shape of this picture */ - protected Picture(EscherContainerRecord escherRecord, Shape parent){ + protected Picture(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -136,7 +138,7 @@ public class Picture extends SimpleShape { _escherContainer.setOptions((short)15); EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID); - spRecord.setOptions((short)((ShapeTypes.PictureFrame << 4) | 0x2)); + spRecord.setOptions((short)((ShapeType.FRAME.nativeId << 4) | 0x2)); //set default properties for a picture EscherOptRecord opt = getEscherOptRecord(); @@ -295,6 +297,6 @@ public class Picture extends SimpleShape { EscherSimpleProperty prop = getEscherProperty(opt, propertyId); if (prop == null) return 0; int fixedPoint = prop.getPropertyValue(); - return Units.fixedPointToDecimal(fixedPoint); + return Units.fixedPointToDouble(fixedPoint); } } \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java index a3eb1b978d..4b30c110e4 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java @@ -20,6 +20,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; import org.apache.poi.hslf.record.OEPlaceholderAtom; import org.apache.poi.hslf.exceptions.HSLFException; +import org.apache.poi.sl.usermodel.ShapeContainer; import java.io.ByteArrayOutputStream; @@ -30,11 +31,11 @@ import java.io.ByteArrayOutputStream; */ public final class Placeholder extends TextBox { - protected Placeholder(EscherContainerRecord escherRecord, Shape parent){ + protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } - public Placeholder(Shape parent){ + public Placeholder(ShapeContainer parent){ super(parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java index 09637a65ee..b7ea9c8356 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java @@ -18,6 +18,8 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.LittleEndian; import java.awt.geom.Point2D; @@ -34,7 +36,7 @@ public final class Polygon extends AutoShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected Polygon(EscherContainerRecord escherRecord, Shape parent){ + protected Polygon(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -45,9 +47,9 @@ public final class Polygon extends AutoShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public Polygon(Shape parent){ - super(null, parent); - _escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup); + public Polygon(ShapeContainer parent){ + super((EscherContainerRecord)null, parent); + _escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof ShapeGroup); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java b/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java index 4a136611ca..67da50097f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java @@ -19,6 +19,8 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; import org.apache.poi.hslf.record.ColorSchemeAtom; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.Units; @@ -43,7 +45,7 @@ import java.awt.geom.Rectangle2D; * * @author Yegor Kozlov */ -public abstract class Shape { +public abstract class Shape implements org.apache.poi.sl.usermodel.Shape { // For logging protected POILogger logger = POILogFactory.getLogger(this.getClass()); @@ -83,7 +85,7 @@ public abstract class Shape { * Parent of this shape. * null for the topmost shapes. */ - protected Shape _parent; + protected ShapeContainer _parent; /** * The Sheet this shape belongs to @@ -101,7 +103,7 @@ public abstract class Shape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of this Shape */ - protected Shape(EscherContainerRecord escherRecord, Shape parent){ + protected Shape(EscherContainerRecord escherRecord, ShapeContainer parent){ _escherContainer = escherRecord; _parent = parent; } @@ -114,7 +116,7 @@ public abstract class Shape { /** * @return the parent of this shape */ - public Shape getParent(){ + public ShapeContainer getParent(){ return _parent; } @@ -122,25 +124,25 @@ public abstract class Shape { * @return name of the shape. */ public String getShapeName(){ - return ShapeTypes.typeName(getShapeType()); + return getShapeType().nativeName; } /** * @return type of the shape. * @see org.apache.poi.hslf.record.RecordTypes */ - public int getShapeType(){ + public ShapeType getShapeType(){ EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); - return spRecord.getShapeType(); + return ShapeType.forId(spRecord.getShapeType(), false); } /** * @param type type of the shape. * @see org.apache.poi.hslf.record.RecordTypes */ - public void setShapeType(int type){ + public void setShapeType(ShapeType type){ EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); - spRecord.setShapeType( (short) type ); + spRecord.setShapeType( (short) type.nativeId ); spRecord.setVersion( (short) 0x2 ); } @@ -395,7 +397,7 @@ public abstract class Shape { EscherSimpleProperty op = getEscherProperty(opt, opacityProperty); int defaultOpacity = 0x00010000; int opacity = (op == null) ? defaultOpacity : op.getPropertyValue(); - double alpha = Units.fixedPointToDecimal(opacity)*255.0; + double alpha = Units.fixedPointToDouble(opacity)*255.0; return new Color(rgb[0], rgb[1], rgb[2], (int)alpha); } @@ -456,7 +458,7 @@ public abstract class Shape { * @return the hyperlink assigned to this shape * or null if not found. */ - public Hyperlink getHyperlink(){ + public Hyperlink getHyperlink(){ return Hyperlink.find(this); } @@ -477,44 +479,47 @@ public abstract class Shape { return getEscherChild(EscherOptRecord.RECORD_ID); } - /** - * Whether the shape is horizontally flipped - * - * @return whether the shape is horizontally flipped - */ - public boolean getFlipHorizontal(){ + @Override + public boolean getFlipHorizontal(){ EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPHORIZ) != 0; } + + @Override + public void setFlipHorizontal(boolean flip) { + EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); + int flag = spRecord.getFlags() | EscherSpRecord.FLAG_FLIPHORIZ; + spRecord.setFlags(flag); + } - /** - * Whether the shape is vertically flipped - * - * @return whether the shape is vertically flipped - */ + @Override public boolean getFlipVertical(){ EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPVERT) != 0; } + + @Override + public void setFlipVertical(boolean flip) { + EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); + int flag = spRecord.getFlags() | EscherSpRecord.FLAG_FLIPVERT; + spRecord.setFlags(flag); + } - /** - * Rotation angle in degrees - * - * @return rotation angle in degrees - */ - public int getRotation(){ + @Override + public double getRotation(){ int rot = getEscherProperty(EscherProperties.TRANSFORM__ROTATION); - int angle = (rot >> 16) % 360; - + double angle = Units.fixedPointToDouble(rot) % 360.0; return angle; } + + @Override + public void setRotation(double theta){ + int rot = Units.doubleToFixedPoint(theta % 360.0); + setEscherProperty(EscherProperties.TRANSFORM__ROTATION, rot); + } - /** - * Rotate this shape - * - * @param theta the rotation angle in degrees - */ - public void setRotation(int theta){ - setEscherProperty(EscherProperties.TRANSFORM__ROTATION, (theta << 16)); + @Override + public boolean isPlaceholder() { + return false; } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java index c3843c2911..e9c2172649 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java @@ -34,6 +34,8 @@ import org.apache.poi.hslf.record.InteractiveInfoAtom; import org.apache.poi.hslf.record.OEShapeAtom; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -49,14 +51,14 @@ public final class ShapeFactory { /** * Create a new shape from the data provided. */ - public static Shape createShape(EscherContainerRecord spContainer, Shape parent){ + public static Shape createShape(EscherContainerRecord spContainer, ShapeContainer parent){ if (spContainer.getRecordId() == EscherContainerRecord.SPGR_CONTAINER){ return createShapeGroup(spContainer, parent); } return createSimpeShape(spContainer, parent); } - public static ShapeGroup createShapeGroup(EscherContainerRecord spContainer, Shape parent){ + public static ShapeGroup createShapeGroup(EscherContainerRecord spContainer, ShapeContainer parent){ ShapeGroup group = null; EscherRecord opt = Shape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122); if(opt != null){ @@ -80,17 +82,17 @@ public final class ShapeFactory { return group; } - public static Shape createSimpeShape(EscherContainerRecord spContainer, Shape parent){ + public static Shape createSimpeShape(EscherContainerRecord spContainer, ShapeContainer parent){ Shape shape = null; EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID); - int type = spRecord.getShapeType(); + ShapeType type = ShapeType.forId(spRecord.getShapeType(), false); switch (type){ - case ShapeTypes.TextBox: + case TEXT_BOX: shape = new TextBox(spContainer, parent); break; - case ShapeTypes.HostControl: - case ShapeTypes.PictureFrame: { + case HOST_CONTROL: + case FRAME: { InteractiveInfo info = getClientDataRecord(spContainer, RecordTypes.InteractiveInfo.typeID); OEShapeAtom oes = getClientDataRecord(spContainer, RecordTypes.OEShapeAtom.typeID); if(info != null && info.getInteractiveInfoAtom() != null){ @@ -111,10 +113,10 @@ public final class ShapeFactory { if(shape == null) shape = new Picture(spContainer, parent); break; } - case ShapeTypes.Line: + case LINE: shape = new Line(spContainer, parent); break; - case ShapeTypes.NotPrimitive: { + case NOT_PRIMITIVE: { EscherOptRecord opt = Shape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID); EscherProperty prop = Shape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES); if(prop != null) diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java index 796b248ac5..f18701a0e4 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java @@ -30,6 +30,8 @@ import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherRecord; import org.apache.poi.ddf.EscherSpRecord; import org.apache.poi.ddf.EscherSpgrRecord; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.POILogger; @@ -38,7 +40,7 @@ import org.apache.poi.util.POILogger; * * @author Yegor Kozlov */ -public class ShapeGroup extends Shape{ +public class ShapeGroup extends Shape implements ShapeContainer { /** * Create a new ShapeGroup. This constructor is used when a new shape is created. @@ -55,7 +57,7 @@ public class ShapeGroup extends Shape{ * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected ShapeGroup(EscherContainerRecord escherRecord, Shape parent){ + protected ShapeGroup(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -63,31 +65,7 @@ public class ShapeGroup extends Shape{ * @return the shapes contained in this group container */ public Shape[] getShapes() { - // Out escher container record should contain several - // SpContainers, the first of which is the group shape itself - Iterator iter = _escherContainer.getChildIterator(); - - // Don't include the first SpContainer, it is always NotPrimitive - if (iter.hasNext()) { - iter.next(); - } - List shapeList = new ArrayList(); - while (iter.hasNext()) { - EscherRecord r = iter.next(); - if(r instanceof EscherContainerRecord) { - // Create the Shape for it - EscherContainerRecord container = (EscherContainerRecord)r; - Shape shape = ShapeFactory.createShape(container, this); - shape.setSheet(getSheet()); - shapeList.add( shape ); - } else { - // Should we do anything special with these non - // Container records? - logger.log(POILogger.ERROR, "Shape contained non container escher record, was " + r.getClass().getName()); - } - } - - // Put the shapes into an array, and return + List shapeList = getShapeList(); Shape[] shapes = shapeList.toArray(new Shape[shapeList.size()]); return shapes; } @@ -179,7 +157,7 @@ public class ShapeGroup extends Shape{ spcont.addChildRecord(spg); EscherSpRecord sp = new EscherSpRecord(); - short type = (ShapeTypes.NotPrimitive << 4) + 2; + short type = (short)((ShapeType.NOT_PRIMITIVE.nativeId << 4) + 2); sp.setOptions(type); sp.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_GROUP); spcont.addChildRecord(sp); @@ -260,9 +238,10 @@ public class ShapeGroup extends Shape{ * * @return type of the shape. */ - public int getShapeType(){ + public ShapeType getShapeType(){ EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); - return spRecord.getOptions() >> 4; + int nativeId = spRecord.getOptions() >> 4; + return ShapeType.forId(nativeId, false); } /** @@ -291,4 +270,45 @@ public class ShapeGroup extends Shape{ EscherContainerRecord groupInfoContainer = (EscherContainerRecord)_escherContainer.getChild(0); return groupInfoContainer.getChildById((short)recordId); } + + public Iterator iterator() { + return getShapeList().iterator(); + } + + public boolean removeShape(Shape shape) { + // TODO: implement! + throw new UnsupportedOperationException(); + } + + /** + * @return the shapes contained in this group container + */ + protected List getShapeList() { + // Out escher container record should contain several + // SpContainers, the first of which is the group shape itself + Iterator iter = _escherContainer.getChildIterator(); + + // Don't include the first SpContainer, it is always NotPrimitive + if (iter.hasNext()) { + iter.next(); + } + List shapeList = new ArrayList(); + while (iter.hasNext()) { + EscherRecord r = iter.next(); + if(r instanceof EscherContainerRecord) { + // Create the Shape for it + EscherContainerRecord container = (EscherContainerRecord)r; + Shape shape = ShapeFactory.createShape(container, this); + shape.setSheet(getSheet()); + shapeList.add( shape ); + } else { + // Should we do anything special with these non + // Container records? + logger.log(POILogger.ERROR, "Shape contained non container escher record, was " + r.getClass().getName()); + } + } + + return shapeList; + } + } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeTypes.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeTypes.java deleted file mode 100644 index 4840c93130..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeTypes.java +++ /dev/null @@ -1,57 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - -import java.lang.reflect.Field; -import java.util.HashMap; - -import org.apache.poi.hslf.exceptions.HSLFException; - -/** - * Contains all known shape types in PowerPoint - * - * @author Yegor Kozlov - */ -public final class ShapeTypes implements org.apache.poi.sl.usermodel.ShapeTypes { - /** - * Return name of the shape by id - * @param type - the id of the shape, one of the static constants defined in this class - * @return the name of the shape - */ - public static String typeName(int type) { - String name = (String)types.get(Integer.valueOf(type)); - return name; - } - - public static final HashMap types; - static { - types = new HashMap(); - try { - Field[] f = org.apache.poi.sl.usermodel.ShapeTypes.class.getFields(); - for (int i = 0; i < f.length; i++){ - Object val = f[i].get(null); - if (val instanceof Integer) { - types.put(val, f[i].getName()); - } - } - } catch (IllegalAccessException e){ - throw new HSLFException("Failed to initialize shape types"); - } - } - -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java b/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java index c5256b1d2a..c3383f4d69 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java @@ -45,6 +45,7 @@ import org.apache.poi.hslf.record.TextHeaderAtom; import org.apache.poi.hslf.record.TextRulerAtom; import org.apache.poi.hslf.record.TextSpecInfoAtom; import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -56,7 +57,7 @@ import org.apache.poi.util.POILogger; * @author Yegor Kozlov */ -public abstract class Sheet { +public abstract class Sheet implements ShapeContainer { private static POILogger logger = POILogFactory.getLogger(Sheet.class); /** @@ -272,36 +273,8 @@ public abstract class Sheet { * @return all shapes contained in this Sheet (Slide or Notes) */ public Shape[] getShapes() { - PPDrawing ppdrawing = getPPDrawing(); - - EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; - EscherContainerRecord spgr = null; - - for (Iterator it = dg.getChildIterator(); it.hasNext();) { - EscherRecord rec = it.next(); - if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) { - spgr = (EscherContainerRecord) rec; - break; - } - } - if (spgr == null) { - throw new IllegalStateException("spgr not found"); - } - - List shapes = new ArrayList(); - Iterator it = spgr.getChildIterator(); - if (it.hasNext()) { - // skip first item - it.next(); - } - for (; it.hasNext();) { - EscherContainerRecord sp = (EscherContainerRecord) it.next(); - Shape sh = ShapeFactory.createShape(sp, null); - sh.setSheet(this); - shapes.add(sh); - } - - return shapes.toArray(new Shape[shapes.size()]); + List shapeList = getShapeList(); + return shapeList.toArray(new Shape[shapeList.size()]); } /** @@ -524,4 +497,47 @@ public abstract class Sheet { } + public Iterator iterator() { + return getShapeList().iterator(); + } + + + /** + * Returns all shapes contained in this Sheet + * + * @return all shapes contained in this Sheet (Slide or Notes) + */ + protected List getShapeList() { + PPDrawing ppdrawing = getPPDrawing(); + + EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; + EscherContainerRecord spgr = null; + + for (Iterator it = dg.getChildIterator(); it.hasNext();) { + EscherRecord rec = it.next(); + if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) { + spgr = (EscherContainerRecord) rec; + break; + } + } + if (spgr == null) { + throw new IllegalStateException("spgr not found"); + } + + List shapeList = new ArrayList(); + Iterator it = spgr.getChildIterator(); + if (it.hasNext()) { + // skip first item + it.next(); + } + for (; it.hasNext();) { + EscherContainerRecord sp = (EscherContainerRecord) it.next(); + Shape sh = ShapeFactory.createShape(sp, null); + sh.setSheet(this); + shapeList.add(sh); + } + + return shapeList; + } + } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java index 34db620951..7694cacba2 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java @@ -38,6 +38,7 @@ import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.hslf.record.InteractiveInfo; import org.apache.poi.hslf.record.InteractiveInfoAtom; import org.apache.poi.hslf.record.Record; +import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.util.LittleEndian; /** @@ -62,7 +63,7 @@ public abstract class SimpleShape extends Shape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected SimpleShape(EscherContainerRecord escherRecord, Shape parent){ + protected SimpleShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -191,7 +192,7 @@ public abstract class SimpleShape extends Shape { * * @return style of the line. */ - public int getLineStyle(){ + public int getStrokeStyle(){ EscherOptRecord opt = getEscherOptRecord(); EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE); return prop == null ? Line.LINE_SIMPLE : prop.getPropertyValue(); @@ -221,12 +222,14 @@ public abstract class SimpleShape extends Shape { Rectangle2D anchor = getAnchor2D(); //if it is a groupped shape see if we need to transform the coordinates - if (_parent != null){ + if (getParent() != null){ ArrayList lst = new ArrayList(); - for (Shape top=this; (top = top.getParent()) != null; ) { - lst.add(0, (ShapeGroup)top); + for (ShapeContainer parent=this.getParent(); + parent instanceof ShapeGroup; + parent = ((ShapeGroup)parent).getParent()) { + lst.add(0, (ShapeGroup)parent); } - + AffineTransform tx = new AffineTransform(); for(ShapeGroup prnt : lst) { Rectangle2D exterior = prnt.getAnchor2D(); @@ -243,8 +246,8 @@ public abstract class SimpleShape extends Shape { anchor = tx.createTransformedShape(anchor).getBounds2D(); } - int angle = getRotation(); - if(angle != 0){ + double angle = getRotation(); + if(angle != 0.){ double centerX = anchor.getX() + anchor.getWidth()/2; double centerY = anchor.getY() + anchor.getHeight()/2; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java b/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java index 9e040c1677..f5342534a5 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java @@ -34,9 +34,10 @@ import org.apache.poi.hslf.record.RecordContainer; import org.apache.poi.hslf.record.RecordTypes; import org.apache.poi.hslf.record.SSSlideInfoAtom; import org.apache.poi.hslf.record.SlideAtom; +import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet; import org.apache.poi.hslf.record.StyleTextProp9Atom; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet; +import org.apache.poi.sl.usermodel.ShapeType; /** * This class represents a slide in a PowerPoint Document. It allows @@ -47,8 +48,7 @@ import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet; * @author Yegor Kozlov */ -public final class Slide extends Sheet -{ +public final class Slide extends Sheet { private int _slideNo; private SlideAtomsSet _atomSet; private TextRun[] _runs; @@ -180,7 +180,7 @@ public final class Slide extends Sheet */ public TextBox addTitle() { Placeholder pl = new Placeholder(); - pl.setShapeType(ShapeTypes.Rectangle); + pl.setShapeType(ShapeType.RECT); pl.getTextRun().setRunType(TextHeaderAtom.TITLE_TYPE); pl.setText("Click to edit title"); pl.setAnchor(new java.awt.Rectangle(54, 48, 612, 90)); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java index c494789917..266e6d913b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java @@ -18,6 +18,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; +import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.util.LittleEndian; import java.util.*; @@ -92,7 +93,7 @@ public final class Table extends ShapeGroup { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - public Table(EscherContainerRecord escherRecord, Shape parent) { + public Table(EscherContainerRecord escherRecord, ShapeContainer parent) { super(escherRecord, parent); } @@ -125,7 +126,7 @@ public final class Table extends ShapeGroup { TableCell cell = cells[i][0]; int rowHeight = cell.getAnchor().height*MASTER_DPI/POINT_DPI; byte[] val = new byte[4]; - LittleEndian.putInt(val, rowHeight); + LittleEndian.putInt(val, 0, rowHeight); p.setElement(i, val); for (int j = 0; j < cells[i].length; j++) { TableCell c = cells[i][j]; @@ -149,11 +150,11 @@ public final class Table extends ShapeGroup { } protected void initTable(){ - Shape[] sh = getShapes(); - Arrays.sort(sh, new Comparator(){ - public int compare( Object o1, Object o2 ) { - Rectangle anchor1 = ((Shape)o1).getAnchor(); - Rectangle anchor2 = ((Shape)o2).getAnchor(); + List shapeList = getShapeList(); + Collections.sort(shapeList, new Comparator(){ + public int compare( Shape o1, Shape o2 ) { + Rectangle anchor1 = o1.getAnchor(); + Rectangle anchor2 = o2.getAnchor(); int delta = anchor1.y - anchor2.y; if(delta == 0) delta = anchor1.x - anchor2.x; return delta; @@ -161,23 +162,23 @@ public final class Table extends ShapeGroup { }); int y0 = -1; int maxrowlen = 0; - ArrayList lst = new ArrayList(); - ArrayList row = null; - for (int i = 0; i < sh.length; i++) { - if(sh[i] instanceof TextShape){ - Rectangle anchor = sh[i].getAnchor(); + List> lst = new ArrayList>(); + List row = null; + for (Shape sh : shapeList) { + if(sh instanceof TextShape){ + Rectangle anchor = sh.getAnchor(); if(anchor.y != y0){ y0 = anchor.y; - row = new ArrayList(); + row = new ArrayList(); lst.add(row); } - row.add(sh[i]); + row.add(sh); maxrowlen = Math.max(maxrowlen, row.size()); } } cells = new TableCell[lst.size()][maxrowlen]; for (int i = 0; i < lst.size(); i++) { - row = (ArrayList)lst.get(i); + row = lst.get(i); for (int j = 0; j < row.size(); j++) { TextShape tx = (TextShape)row.get(j); cells[i][j] = new TableCell(tx.getSpContainer(), getParent()); @@ -318,7 +319,7 @@ public final class Table extends ShapeGroup { private Line cloneBorder(Line line){ Line border = createBorder(); border.setLineWidth(line.getLineWidth()); - border.setLineStyle(line.getLineStyle()); + border.setLineStyle(line.getStrokeStyle()); border.setLineDashing(line.getLineDashing()); border.setLineColor(line.getLineColor()); return border; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java b/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java index 864d55eae4..15854bb50a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java @@ -17,9 +17,13 @@ package org.apache.poi.hslf.model; -import org.apache.poi.ddf.*; +import java.awt.Rectangle; -import java.awt.*; +import org.apache.poi.ddf.EscherContainerRecord; +import org.apache.poi.ddf.EscherOptRecord; +import org.apache.poi.ddf.EscherProperties; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; /** * Represents a cell in a ppt table @@ -38,10 +42,10 @@ public final class TableCell extends TextBox { /** * Create a TableCell object and initialize it from the supplied Record container. * - * @param escherRecord EscherSpContainer container which holds information about this shape + * @param escherRecord {@link EscherSpContainer} container which holds information about this shape * @param parent the parent of the shape */ - protected TableCell(EscherContainerRecord escherRecord, Shape parent){ + protected TableCell(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -51,10 +55,10 @@ public final class TableCell extends TextBox { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public TableCell(Shape parent){ + public TableCell(ShapeContainer parent){ super(parent); - setShapeType(ShapeTypes.Rectangle); + setShapeType(ShapeType.RECT); //_txtrun.setRunType(TextHeaderAtom.HALF_BODY_TYPE); //_txtrun.getRichTextRuns()[0].setFlag(false, 0, false); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java index 46e080eb5d..267102aa52 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java @@ -18,6 +18,8 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; +import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.ShapeType; /** * Represents a TextFrame shape in PowerPoint. @@ -36,7 +38,7 @@ public class TextBox extends TextShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected TextBox(EscherContainerRecord escherRecord, Shape parent){ + protected TextBox(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -47,7 +49,7 @@ public class TextBox extends TextShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public TextBox(Shape parent){ + public TextBox(ShapeContainer parent){ super(parent); } @@ -67,7 +69,7 @@ public class TextBox extends TextShape { protected EscherContainerRecord createSpContainer(boolean isChild){ _escherContainer = super.createSpContainer(isChild); - setShapeType(ShapeTypes.TextBox); + setShapeType(ShapeType.TEXT_BOX); //set default properties for a TextBox setEscherProperty(EscherProperties.FILL__FILLCOLOR, 0x8000004); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java index b585d61e1b..e1e053e397 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java @@ -41,12 +41,14 @@ import org.apache.poi.hslf.record.OutlineTextRefAtom; import org.apache.poi.hslf.record.PPDrawing; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; +import org.apache.poi.hslf.record.RoundTripHFPlaceholder12; import org.apache.poi.hslf.record.StyleTextPropAtom; import org.apache.poi.hslf.record.TextBytesAtom; import org.apache.poi.hslf.record.TextCharsAtom; import org.apache.poi.hslf.record.TextHeaderAtom; import org.apache.poi.hslf.record.TxInteractiveInfoAtom; import org.apache.poi.hslf.usermodel.RichTextRun; +import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.util.POILogger; /** @@ -109,7 +111,7 @@ public abstract class TextShape extends SimpleShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected TextShape(EscherContainerRecord escherRecord, Shape parent){ + protected TextShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -120,7 +122,7 @@ public abstract class TextShape extends SimpleShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public TextShape(Shape parent){ + public TextShape(ShapeContainer parent){ super(null, parent); _escherContainer = createSpContainer(parent instanceof ShapeGroup); } @@ -623,4 +625,17 @@ public abstract class TextShape extends SimpleShape { } + @Override + public boolean isPlaceholder() { + OEPlaceholderAtom oep = getPlaceholderAtom(); + if (oep != null) return true; + + //special case for files saved in Office 2007 + RoundTripHFPlaceholder12 hldr = getClientDataRecord(RecordTypes.RoundTripHFPlaceholder12.typeID); + if (hldr != null) return true; + + return false; + } + + } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java index 8b8146f132..38535ecf09 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java @@ -37,7 +37,7 @@ import org.apache.poi.ddf.EscherSpRecord; import org.apache.poi.ddf.EscherSpgrRecord; import org.apache.poi.ddf.EscherTextboxRecord; import org.apache.poi.ddf.UnknownEscherRecord; -import org.apache.poi.hslf.model.ShapeTypes; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.POILogger; @@ -95,7 +95,7 @@ public final class PPDrawing extends RecordAtom { final DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory(); final List escherChildren = new ArrayList(); findEscherChildren(erf, contents, 8, len-8, escherChildren); - this.childRecords = (EscherRecord[]) escherChildren.toArray(new EscherRecord[escherChildren.size()]); + this.childRecords = escherChildren.toArray(new EscherRecord[escherChildren.size()]); if (1 == this.childRecords.length && (short)0xf002 == this.childRecords[0].getRecordId() && this.childRecords[0] instanceof EscherContainerRecord) { this.textboxWrappers = findInDgContainer((EscherContainerRecord) this.childRecords[0]); @@ -103,7 +103,7 @@ public final class PPDrawing extends RecordAtom { // Find and EscherTextboxRecord's, and wrap them up final List textboxes = new ArrayList(); findEscherTextboxRecord(childRecords, textboxes); - this.textboxWrappers = (EscherTextboxWrapper[]) textboxes.toArray(new EscherTextboxWrapper[textboxes.size()]); + this.textboxWrappers = textboxes.toArray(new EscherTextboxWrapper[textboxes.size()]); } } private EscherTextboxWrapper[] findInDgContainer(final EscherContainerRecord escherContainerF002) { @@ -131,7 +131,7 @@ public final class PPDrawing extends RecordAtom { found.add(w); } } - return (EscherTextboxWrapper[]) found.toArray(new EscherTextboxWrapper[found.size()]); + return found.toArray(new EscherTextboxWrapper[found.size()]); } private StyleTextProp9Atom findInSpContainer(final EscherContainerRecord spContainer) { final EscherContainerRecord escherContainerF011 = findFirstEscherContainerRecordOfType((short)0xf011, spContainer); @@ -301,7 +301,7 @@ public final class PPDrawing extends RecordAtom { spContainer.addChildRecord(spgr); EscherSpRecord sp = new EscherSpRecord(); - sp.setOptions((short)((ShapeTypes.NotPrimitive << 4) + 2)); + sp.setOptions((short)((ShapeType.NOT_PRIMITIVE.nativeId << 4) + 2)); sp.setFlags(EscherSpRecord.FLAG_PATRIARCH | EscherSpRecord.FLAG_GROUP); spContainer.addChildRecord(sp); spgrContainer.addChildRecord(spContainer); @@ -311,7 +311,7 @@ public final class PPDrawing extends RecordAtom { spContainer.setOptions((short)15); spContainer.setRecordId(EscherContainerRecord.SP_CONTAINER); sp = new EscherSpRecord(); - sp.setOptions((short)((ShapeTypes.Rectangle << 4) + 2)); + sp.setOptions((short)((ShapeType.RECT.nativeId << 4) + 2)); sp.setFlags(EscherSpRecord.FLAG_BACKGROUND | EscherSpRecord.FLAG_HASSHAPETYPE); spContainer.addChildRecord(sp); @@ -393,7 +393,7 @@ public final class PPDrawing extends RecordAtom { result.add(child); } } - return (EscherContainerRecord[]) result.toArray(new EscherContainerRecord[result.size()]); + return result.toArray(new EscherContainerRecord[result.size()]); } protected Record buildFromUnknownEscherRecord(UnknownEscherRecord unknown) { byte[] bingo = unknown.getData(); @@ -436,6 +436,6 @@ public final class PPDrawing extends RecordAtom { } } } - return (StyleTextProp9Atom[]) result.toArray(new StyleTextProp9Atom[result.size()]); + return result.toArray(new StyleTextProp9Atom[result.size()]); } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java new file mode 100644 index 0000000000..a8dcca5958 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java @@ -0,0 +1,10 @@ +package org.apache.poi.sl.draw; + +import org.apache.poi.sl.usermodel.*; + + +public class DrawAutoShape extends DrawTextShape { + public DrawAutoShape(T shape) { + super(shape); + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java new file mode 100644 index 0000000000..9270091a1d --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java @@ -0,0 +1,96 @@ +/* ==================================================================== + 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.sl.draw; + +import static org.apache.poi.sl.draw.Drawable.DRAW_FACTORY; + +import java.awt.Graphics2D; +import java.awt.font.TextLayout; +import java.text.AttributedString; + +import org.apache.poi.sl.usermodel.*; + +public class DrawFactory { + protected static ThreadLocal defaultFactory = new ThreadLocal(); + + /** + * Set a custom draw factory for the current thread. + * This is a fallback, for operations where usercode can't set a graphics context. + * Preferably use the rendering hint {@link Drawable#DRAW_FACTORY} to set the factory. + * + * @param factory + */ + public static void setDefaultFactory(DrawFactory factory) { + defaultFactory.set(factory); + } + + public static DrawFactory getInstance(Graphics2D graphics) { + // first try to find the factory over the rendering hing + DrawFactory factory = (DrawFactory)graphics.getRenderingHint(DRAW_FACTORY); + // secondly try the thread local default + if (factory == null) { + factory = defaultFactory.get(); + } + // and at last, use the default factory + if (factory == null) { + factory = new DrawFactory(); + graphics.setRenderingHint(DRAW_FACTORY, factory); + } + return factory; + } + + public Drawable getDrawable(Sheet sheet) { + return new DrawSheet(sheet); + } + + public Drawable getDrawable(MasterSheet sheet) { + return new DrawMasterSheet(sheet); + } + + @SuppressWarnings("unchecked") + public Drawable getDrawable(Shape shape) { + if (shape instanceof TextBox) { + return getDrawable((TextBox)shape); + } else if (shape instanceof FreeformShape) { + return getDrawable((FreeformShape)shape); + } + + throw new IllegalArgumentException("Unsupported shape type: "+shape.getClass()); + } + + public DrawTextBox getDrawable(T shape) { + return new DrawTextBox(shape); + } + + public DrawFreeformShape getDrawable(T shape) { + return new DrawFreeformShape(shape); + } + + + public DrawTextParagraph getDrawable(TextParagraph paragraph) { + return new DrawTextParagraph(paragraph); + } + + public DrawTextFragment getTextFragment(TextLayout layout, AttributedString str) { + return new DrawTextFragment(layout, str); + } + + public DrawPaint getPaint(PlaceableShape shape) { + return new DrawPaint(shape); + } +} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextCap.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFontManager.java similarity index 64% rename from src/ooxml/java/org/apache/poi/xslf/usermodel/TextCap.java rename to src/scratchpad/src/org/apache/poi/sl/draw/DrawFontManager.java index c4ad6255d8..9c49489ffc 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextCap.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFontManager.java @@ -17,13 +17,22 @@ * ==================================================================== */ -package org.apache.poi.xslf.usermodel; +package org.apache.poi.sl.draw; /** - * @author Yegor Kozlov + * Manages fonts when rendering slides. + * + * Use this class to handle unknown / missing fonts or to substitute fonts */ -public enum TextCap { - NONE, - SMALL, - ALL +public interface DrawFontManager { + + /** + * select a font to be used to paint text + * + * @param typeface the font family as defined in the .pptx file. + * This can be unknown or missing in the graphic environment. + * + * @return the font to be used to paint text + */ + String getRendererableFont(String typeface, int pitchFamily); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java new file mode 100644 index 0000000000..666b85a1c7 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java @@ -0,0 +1,9 @@ +package org.apache.poi.sl.draw; + +import org.apache.poi.sl.usermodel.*; + +public class DrawFreeformShape extends DrawAutoShape { + public DrawFreeformShape(T shape) { + super(shape); + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java new file mode 100644 index 0000000000..c4afeb35e6 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java @@ -0,0 +1,22 @@ +package org.apache.poi.sl.draw; + +import org.apache.poi.sl.usermodel.MasterSheet; +import org.apache.poi.sl.usermodel.Shape; + + +public class DrawMasterSheet extends DrawSheet { + + public DrawMasterSheet(MasterSheet sheet) { + super(sheet); + } + + /** + * Checks if this sheet displays the specified shape. + * + * Subclasses can override it and skip certain shapes from drawings, + * for instance, slide masters and layouts don't display placeholders + */ + protected boolean canDraw(Shape shape){ + return !shape.isPlaceholder(); + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java new file mode 100644 index 0000000000..c608ec3b05 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java @@ -0,0 +1,448 @@ +/* ==================================================================== + 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.sl.draw; + +import java.awt.*; +import java.awt.MultipleGradientPaint.ColorSpaceType; +import java.awt.MultipleGradientPaint.CycleMethod; +import java.awt.Shape; +import java.awt.geom.*; +import java.awt.image.*; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.GradientPaint; +import org.apache.poi.sl.usermodel.TexturePaint; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; + + +public class DrawPaint { + public final static Color NO_PAINT = new Color(0xFF, 0xFF, 0xFF, 0); + private final static POILogger LOG = POILogFactory.getLogger(DrawPaint.class); + + protected PlaceableShape shape; + + public DrawPaint(PlaceableShape shape) { + this.shape = shape; + } + + public Paint getPaint(Graphics2D graphics, PaintStyle paint) { + if (paint instanceof SolidPaint) { + return getSolidPaint((SolidPaint)paint, graphics); + } else if (paint instanceof GradientPaint) { + return getGradientPaint((GradientPaint)paint, graphics); + } else if (paint instanceof TexturePaint) { + return getTexturePaint((TexturePaint)paint, graphics); + } + return null; + } + + protected Paint getSolidPaint(SolidPaint fill, Graphics2D graphics) { + return applyColorTransform(fill.getSolidColor()); + } + + protected Paint getGradientPaint(GradientPaint fill, Graphics2D graphics) { + switch (fill.getGradientType()) { + case linear: + return createLinearGradientPaint(fill, graphics); + case circular: + return createRadialGradientPaint(fill, graphics); + case shape: + return createPathGradientPaint(fill, graphics); + default: + throw new UnsupportedOperationException("gradient fill of type "+fill+" not supported."); + } + } + + protected Paint getTexturePaint(TexturePaint fill, Graphics2D graphics) { + InputStream is = fill.getImageData(); + if (is == null) return NO_PAINT; + assert(graphics != null); + + ImageRenderer renderer = (ImageRenderer)graphics.getRenderingHint(Drawable.IMAGE_RENDERER); + if (renderer == null) renderer = new ImageRenderer(); + + try { + renderer.loadImage(fill.getImageData(), fill.getContentType()); + } catch (IOException e) { + LOG.log(POILogger.ERROR, "Can't load image data - using transparent color", e); + return NO_PAINT; + } + + int alpha = fill.getAlpha(); + if (alpha != -1) { + renderer.setAlpha(fill.getAlpha()/100000.f); + } + + Dimension dim = renderer.getDimension(); + Rectangle2D textAnchor = new Rectangle2D.Double(0, 0, dim.getWidth(), dim.getHeight()); + Paint paint = new java.awt.TexturePaint(renderer.getImage(), textAnchor); + + return paint; + } + + /** + * Convert color transformations in {@link ColorStyle} to a {@link Color} instance + */ + public static Color applyColorTransform(ColorStyle color){ + Color result = color.getColor(); + + if (result == null || color.getAlpha() == 100) return NO_PAINT; + + result = applyAlpha(result, color); + result = applyLuminanace(result, color); + result = applyShade(result, color); + result = applyTint(result, color); + + return result; + } + + protected static Color applyAlpha(Color c, ColorStyle fc) { + int alpha = c.getAlpha(); + return (alpha == 0 || alpha == -1) ? c : new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha); + } + + /** + * Apply lumMod / lumOff adjustments + * + * @param c the color to modify + * @param lumMod luminance modulation in the range [0..100000] + * @param lumOff luminance offset in the range [0..100000] + * @return modified color + */ + protected static Color applyLuminanace(Color c, ColorStyle fc) { + int lumMod = fc.getLumMod(); + if (lumMod == -1) lumMod = 100000; + + int lumOff = fc.getLumOff(); + if (lumOff == -1) lumOff = 0; + + if (lumMod == 100000 && lumOff == 0) return c; + + int r = c.getRed(); + int g = c.getGreen(); + int b = c.getBlue(); + + float red,green,blue; + + Color color; + if (lumOff > 0) { + float flumOff = lumOff / 100000.f; + red = (255.f - r) * (1.f - flumOff) + r; + green = (255.f - g) * flumOff + g; + blue = (255.f - b) * flumOff + b; + } else { + float flumMod = lumMod / 100000.f; + red = r * lumMod; + green = g * lumMod; + blue = b * lumMod; + } + return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha()); + } + + /** + * This algorithm returns result different from PowerPoint. + * TODO: revisit and improve + */ + protected static Color applyShade(Color c, ColorStyle fc) { + int shade = fc.getShade(); + if (shade == -1) return c; + + float fshade = shade / 100000.f; + + float red = c.getRed() * fshade; + float green = c.getGreen() * fshade; + float blue = c.getGreen() * fshade; + + return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha()); + } + + /** + * This algorithm returns result different from PowerPoint. + * TODO: revisit and improve + */ + protected static Color applyTint(Color c, ColorStyle fc) { + int tint = fc.getTint(); + if (tint == -1) return c; + + float ftint = tint / 100000.f; + + float red = ftint * c.getRed() + (1.f - ftint) * 255.f; + float green = ftint * c.getGreen() + (1.f - ftint) * 255.f; + float blue = ftint * c.getBlue() + (1.f - ftint) * 255.f; + + return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha()); + } + + + protected Paint createLinearGradientPaint(GradientPaint fill, Graphics2D graphics) { + double angle = fill.getGradientAngle(); + Rectangle2D anchor = DrawShape.getAnchor(graphics, shape); + + AffineTransform at = AffineTransform.getRotateInstance( + Math.toRadians(angle), + anchor.getX() + anchor.getWidth() / 2, + anchor.getY() + anchor.getHeight() / 2); + + double diagonal = Math.sqrt(anchor.getHeight() * anchor.getHeight() + anchor.getWidth() * anchor.getWidth()); + Point2D p1 = new Point2D.Double(anchor.getX() + anchor.getWidth() / 2 - diagonal / 2, + anchor.getY() + anchor.getHeight() / 2); + p1 = at.transform(p1, null); + + Point2D p2 = new Point2D.Double(anchor.getX() + anchor.getWidth(), anchor.getY() + anchor.getHeight() / 2); + p2 = at.transform(p2, null); + + snapToAnchor(p1, anchor); + snapToAnchor(p2, anchor); + + float[] fractions = fill.getGradientFractions(); + Color[] colors = new Color[fractions.length]; + + int i = 0; + for (ColorStyle fc : fill.getGradientColors()) { + colors[i++] = applyColorTransform(fc); + } + + AffineTransform grAt = new AffineTransform(); + if(fill.isRotatedWithShape()) { + double rotation = shape.getRotation(); + if (rotation != 0.) { + double centerX = anchor.getX() + anchor.getWidth() / 2; + double centerY = anchor.getY() + anchor.getHeight() / 2; + + grAt.translate(centerX, centerY); + grAt.rotate(Math.toRadians(-rotation)); + grAt.translate(-centerX, -centerY); + } + } + + return new LinearGradientPaint + (p1, p2, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, grAt); + } + + protected Paint createRadialGradientPaint(GradientPaint fill, Graphics2D graphics) { + Rectangle2D anchor = DrawShape.getAnchor(graphics, shape); + + Point2D pCenter = new Point2D.Double(anchor.getX() + anchor.getWidth()/2, + anchor.getY() + anchor.getHeight()/2); + + float radius = (float)Math.max(anchor.getWidth(), anchor.getHeight()); + + float[] fractions = fill.getGradientFractions(); + Color[] colors = new Color[fractions.length]; + + int i=0; + for (ColorStyle fc : fill.getGradientColors()) { + colors[i++] = applyColorTransform(fc); + } + + return new RadialGradientPaint(pCenter, radius, fractions, colors); + } + + protected Paint createPathGradientPaint(GradientPaint fill, Graphics2D graphics) { + // currently we ignore an eventually center setting + + float[] fractions = fill.getGradientFractions(); + Color[] colors = new Color[fractions.length]; + + int i=0; + for (ColorStyle fc : fill.getGradientColors()) { + colors[i++] = applyColorTransform(fc); + } + + return new PathGradientPaint(colors, fractions); + } + + protected void snapToAnchor(Point2D p, Rectangle2D anchor) { + if (p.getX() < anchor.getX()) { + p.setLocation(anchor.getX(), p.getY()); + } else if (p.getX() > (anchor.getX() + anchor.getWidth())) { + p.setLocation(anchor.getX() + anchor.getWidth(), p.getY()); + } + + if (p.getY() < anchor.getY()) { + p.setLocation(p.getX(), anchor.getY()); + } else if (p.getY() > (anchor.getY() + anchor.getHeight())) { + p.setLocation(p.getX(), anchor.getY() + anchor.getHeight()); + } + } + + public static class PathGradientPaint implements Paint { + + // http://asserttrue.blogspot.de/2010/01/how-to-iimplement-custom-paint-in-50.html + protected final Color colors[]; + protected final float fractions[]; + protected final int capStyle; + protected final int joinStyle; + protected final int transparency; + + + public PathGradientPaint(Color colors[], float fractions[]) { + this(colors,fractions,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); + } + + public PathGradientPaint(Color colors[], float fractions[], int capStyle, int joinStyle) { + this.colors = colors; + this.fractions = fractions; + this.capStyle = capStyle; + this.joinStyle = joinStyle; + + // determine transparency + boolean opaque = true; + for (int i = 0; i < colors.length; i++){ + opaque = opaque && (colors[i].getAlpha() == 0xff); + } + this.transparency = opaque ? OPAQUE : TRANSLUCENT; + } + + public PaintContext createContext(ColorModel cm, + Rectangle deviceBounds, + Rectangle2D userBounds, + AffineTransform transform, + RenderingHints hints) { + return new PathGradientContext(cm, deviceBounds, userBounds, transform, hints); + } + + public int getTransparency() { + return transparency; + } + + class PathGradientContext implements PaintContext { + protected final Rectangle deviceBounds; + protected final Rectangle2D userBounds; + protected final AffineTransform xform; + protected final RenderingHints hints; + + /** + * for POI: the shape will be only known when the subclasses determines the concrete implementation + * in the draw/-content method, so we need to postpone the setting/creation as long as possible + **/ + protected final Shape shape; + protected final PaintContext pCtx; + protected final int gradientSteps; + WritableRaster raster; + + public PathGradientContext( + ColorModel cm + , Rectangle deviceBounds + , Rectangle2D userBounds + , AffineTransform xform + , RenderingHints hints + ) { + shape = (Shape)hints.get(Drawable.GRADIENT_SHAPE); + if (shape == null) { + throw new IllegalPathStateException("PathGradientPaint needs a shape to be set via the rendering hint PathGradientPaint.GRADIANT_SHAPE."); + } + + this.deviceBounds = deviceBounds; + this.userBounds = userBounds; + this.xform = xform; + this.hints = hints; + + gradientSteps = getGradientSteps(shape); + + Point2D start = new Point2D.Double(0, 0); + Point2D end = new Point2D.Double(gradientSteps, 0); + LinearGradientPaint gradientPaint = new LinearGradientPaint(start, end, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, new AffineTransform()); + + Rectangle bounds = new Rectangle(0, 0, gradientSteps, 1); + pCtx = gradientPaint.createContext(cm, bounds, bounds, new AffineTransform(), hints); + } + + public void dispose() {} + + public ColorModel getColorModel() { + return pCtx.getColorModel(); + } + + public Raster getRaster(int xOffset, int yOffset, int w, int h) { + ColorModel cm = getColorModel(); + if (raster == null) createRaster(); + + // TODO: eventually use caching here + WritableRaster childRaster = cm.createCompatibleWritableRaster(w, h); + Rectangle2D childRect = new Rectangle2D.Double(xOffset, yOffset, w, h); + if (!childRect.intersects(deviceBounds)) { + // usually doesn't happen ... + return childRaster; + } + + Rectangle2D destRect = new Rectangle2D.Double(); + Rectangle2D.intersect(childRect, deviceBounds, destRect); + int dx = (int)(destRect.getX()-deviceBounds.getX()); + int dy = (int)(destRect.getY()-deviceBounds.getY()); + int dw = (int)destRect.getWidth(); + int dh = (int)destRect.getHeight(); + Object data = raster.getDataElements(dx, dy, dw, dh, null); + dx = (int)(destRect.getX()-childRect.getX()); + dy = (int)(destRect.getY()-childRect.getY()); + childRaster.setDataElements(dx, dy, dw, dh, data); + + return childRaster; + } + + protected int getGradientSteps(Shape shape) { + Rectangle rect = shape.getBounds(); + int lower = 1; + int upper = (int)(Math.max(rect.getWidth(),rect.getHeight())/2.0); + while (lower < upper-1) { + int mid = lower + (upper - lower) / 2; + BasicStroke bs = new BasicStroke(mid, capStyle, joinStyle); + Area area = new Area(bs.createStrokedShape(shape)); + if (area.isSingular()) { + upper = mid; + } else { + lower = mid; + } + } + return upper; + } + + + + protected void createRaster() { + ColorModel cm = getColorModel(); + raster = cm.createCompatibleWritableRaster((int)deviceBounds.getWidth(), (int)deviceBounds.getHeight()); + BufferedImage img = new BufferedImage(cm, raster, false, null); + Graphics2D graphics = img.createGraphics(); + graphics.setRenderingHints(hints); + graphics.translate(-deviceBounds.getX(), -deviceBounds.getY()); + graphics.transform(xform); + + Raster img2 = pCtx.getRaster(0, 0, gradientSteps, 1); + int rgb[] = new int[cm.getNumComponents()]; + + for (int i = gradientSteps-1; i>=0; i--) { + img2.getPixel(i, 0, rgb); + Color c = new Color(rgb[0],rgb[1],rgb[2]); + if (rgb.length == 4) { + // it doesn't work to use just a color with transparency ... + graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, rgb[3]/255.0f)); + } + graphics.setStroke(new BasicStroke(i+1, capStyle, joinStyle)); + graphics.setColor(c); + graphics.draw(shape); + } + + graphics.dispose(); + } + } + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java new file mode 100644 index 0000000000..f2510a0cc1 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java @@ -0,0 +1,109 @@ +package org.apache.poi.sl.draw; + +import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; + +import org.apache.poi.sl.usermodel.PlaceableShape; +import org.apache.poi.sl.usermodel.Shape; + + +public class DrawShape implements Drawable { + + protected final T shape; + + public DrawShape(T shape) { + this.shape = shape; + } + + /** + * Apply 2-D transforms before drawing this shape. This includes rotation and flipping. + * + * @param graphics the graphics whos transform matrix will be modified + */ + public void applyTransform(Graphics2D graphics) { + Rectangle2D anchor = shape.getAnchor(); + AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM); + if(tx != null) { + anchor = tx.createTransformedShape(anchor).getBounds2D(); + } + + // rotation + double rotation = shape.getRotation(); + if (rotation != 0.) { + // PowerPoint rotates shapes relative to the geometric center + double centerX = anchor.getCenterX(); + double centerY = anchor.getCenterY(); + + // normalize rotation + rotation = (360.+(rotation%360.))%360.; + int quadrant = (((int)rotation+45)/90)%4; + double scaleX = 1.0, scaleY = 1.0; + + // scale to bounding box (bug #53176) + if (quadrant == 1 || quadrant == 3) { + // In quadrant 1 and 3, which is basically a shape in a more or less portrait orientation + // (45-135 degrees and 225-315 degrees), we need to first rotate the shape by a multiple + // of 90 degrees and then resize the bounding box to its original bbox. After that we can + // rotate the shape to the exact rotation amount. + // It's strange that you'll need to rotate the shape back and forth again, but you can + // think of it, as if you paint the shape on a canvas. First you rotate the canvas, which might + // be already (differently) scaled, so you can paint the shape in its default orientation + // and later on, turn it around again to compare it with its original size ... + AffineTransform txg = new AffineTransform(); // graphics coordinate space + AffineTransform txs = new AffineTransform(tx); // shape coordinate space + txg.translate(centerX, centerY); + txg.rotate(Math.toRadians(quadrant*90)); + txg.translate(-centerX, -centerY); + txs.translate(centerX, centerY); + txs.rotate(Math.toRadians(-quadrant*90)); + txs.translate(-centerX, -centerY); + txg.concatenate(txs); + Rectangle2D anchor2 = txg.createTransformedShape(shape.getAnchor()).getBounds2D(); + scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth(); + scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight(); + } + + // transformation is applied reversed ... + graphics.translate(centerX, centerY); + graphics.rotate(Math.toRadians(rotation-quadrant*90.)); + graphics.scale(scaleX, scaleY); + graphics.rotate(Math.toRadians(quadrant*90)); + graphics.translate(-centerX, -centerY); + } + + //flip horizontal + if (shape.getFlipHorizontal()) { + graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY()); + graphics.scale(-1, 1); + graphics.translate(-anchor.getX(), -anchor.getY()); + } + + //flip vertical + if (shape.getFlipVertical()) { + graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight()); + graphics.scale(1, -1); + graphics.translate(-anchor.getX(), -anchor.getY()); + } + } + + + public void draw(Graphics2D graphics) { + } + + public void drawContent(Graphics2D context) { + } + + public static Rectangle2D getAnchor(Graphics2D graphics, PlaceableShape shape) { + Rectangle2D anchor = shape.getAnchor(); + if(graphics == null) { + return anchor; + } + + AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM); + if(tx != null) { + anchor = tx.createTransformedShape(anchor).getBounds2D(); + } + return anchor; + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java new file mode 100644 index 0000000000..7598d21420 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java @@ -0,0 +1,72 @@ +package org.apache.poi.sl.draw; + +import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; + +import org.apache.poi.sl.usermodel.MasterSheet; +import org.apache.poi.sl.usermodel.Shape; +import org.apache.poi.sl.usermodel.Sheet; + + +public class DrawSheet implements Drawable { + + protected final Sheet sheet; + + public DrawSheet(Sheet sheet) { + this.sheet = sheet; + } + + public void applyTransform(Graphics2D context) { + // TODO Auto-generated method stub + + } + + public void draw(Graphics2D graphics) { + DrawFactory drawFact = DrawFactory.getInstance(graphics); + MasterSheet master = sheet.getMasterSheet(); + + if(sheet.getFollowMasterGraphics() && master != null) { + Drawable drawer = drawFact.getDrawable(master); + drawer.draw(graphics); + } + + graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, new AffineTransform()); + + for (Shape shape : sheet.getShapes()) { + if(!canDraw(shape)) continue; + + // remember the initial transform and restore it after we are done with drawing + AffineTransform at = graphics.getTransform(); + + // concrete implementations can make sense of this hint, + // for example PSGraphics2D or PDFGraphics2D would call gsave() / grestore + graphics.setRenderingHint(Drawable.GSAVE, true); + + // apply rotation and flipping + Drawable drawer = drawFact.getDrawable(shape); + drawer.applyTransform(graphics); + // draw stuff + drawer.draw(graphics); + + // restore the coordinate system + graphics.setTransform(at); + + graphics.setRenderingHint(Drawable.GRESTORE, true); + } + } + + public void drawContent(Graphics2D context) { + // TODO Auto-generated method stub + + } + + /** + * Checks if this sheet displays the specified shape. + * + * Subclasses can override it and skip certain shapes from drawings, + * for instance, slide masters and layouts don't display placeholders + */ + protected boolean canDraw(Shape shape){ + return true; + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java new file mode 100644 index 0000000000..5bb6f34c39 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java @@ -0,0 +1,391 @@ +package org.apache.poi.sl.draw; + +import java.awt.*; +import java.awt.geom.*; +import java.io.*; +import java.nio.charset.Charset; +import java.util.*; +import java.util.List; + +import javax.xml.bind.*; +import javax.xml.stream.*; +import javax.xml.stream.EventFilter; +import javax.xml.stream.events.StartElement; +import javax.xml.stream.events.XMLEvent; + +import org.apache.poi.sl.draw.binding.CTCustomGeometry2D; +import org.apache.poi.sl.draw.geom.*; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize; +import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; +import org.apache.poi.util.Units; + + +public class DrawSimpleShape extends DrawShape { + + public DrawSimpleShape(T shape) { + super(shape); + } + + @Override + public void draw(Graphics2D graphics) { +// RenderableShape rShape = new RenderableShape(this); +// rShape.render(graphics); + + DrawPaint drawPaint = DrawFactory.getInstance(graphics).getPaint(shape); + Paint fill = drawPaint.getPaint(graphics, shape.getFillStyle().getPaint()); + Paint line = drawPaint.getPaint(graphics, shape.getStrokeStyle().getPaint()); + BasicStroke stroke = getStroke(); // the stroke applies both to the shadow and the shape + graphics.setStroke(stroke); + + Collection elems = computeOutlines(graphics); + + // first paint the shadow + drawShadow(graphics, elems, fill, line); + + // then fill the shape interior + if (fill != null) { + graphics.setPaint(fill); + for (Outline o : elems) { + if (o.getPath().isFilled()){ + java.awt.Shape s = o.getOutline(); + graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s); + graphics.fill(s); + } + } + } + + // then draw any content within this shape (text, image, etc.) + drawContent(graphics); + + // then stroke the shape outline + if(line != null) { + graphics.setPaint(line); + for(Outline o : elems){ + if(o.getPath().isStroked()){ + java.awt.Shape s = o.getOutline(); + graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s); + graphics.draw(s); + } + } + } + + // draw line decorations + drawDecoration(graphics, line, stroke); + } + + protected void drawDecoration(Graphics2D graphics, Paint line, BasicStroke stroke) { + if(line == null) return; + graphics.setPaint(line); + + List lst = new ArrayList(); + LineDecoration deco = shape.getLineDecoration(); + Outline head = getHeadDecoration(graphics, deco, stroke); + if (head != null) lst.add(head); + Outline tail = getTailDecoration(graphics, deco, stroke); + if (tail != null) lst.add(tail); + + + for(Outline o : lst){ + java.awt.Shape s = o.getOutline(); + Path p = o.getPath(); + graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s); + + if(p.isFilled()) graphics.fill(s); + if(p.isStroked()) graphics.draw(s); + } + } + + protected Outline getTailDecoration(Graphics2D graphics, LineDecoration deco, BasicStroke stroke) { + DecorationSize tailLength = deco.getTailLength(); + DecorationSize tailWidth = deco.getTailWidth(); + + double lineWidth = Math.max(2.5, stroke.getLineWidth()); + + Rectangle2D anchor = getAnchor(graphics, shape); + double x2 = anchor.getX() + anchor.getWidth(), + y2 = anchor.getY() + anchor.getHeight(); + + double alpha = Math.atan(anchor.getHeight() / anchor.getWidth()); + + AffineTransform at = new AffineTransform(); + java.awt.Shape shape = null; + Path p = null; + Rectangle2D bounds; + double scaleY = Math.pow(2, tailWidth.ordinal()); + double scaleX = Math.pow(2, tailLength.ordinal()); + switch (deco.getTailShape()) { + case OVAL: + p = new Path(); + shape = new Ellipse2D.Double(0, 0, lineWidth * scaleX, lineWidth * scaleY); + bounds = shape.getBounds2D(); + at.translate(x2 - bounds.getWidth() / 2, y2 - bounds.getHeight() / 2); + at.rotate(alpha, bounds.getX() + bounds.getWidth() / 2, bounds.getY() + bounds.getHeight() / 2); + break; + case ARROW: + p = new Path(); + GeneralPath arrow = new GeneralPath(); + arrow.moveTo((float) (-lineWidth * 3), (float) (-lineWidth * 2)); + arrow.lineTo(0, 0); + arrow.lineTo((float) (-lineWidth * 3), (float) (lineWidth * 2)); + shape = arrow; + at.translate(x2, y2); + at.rotate(alpha); + break; + case TRIANGLE: + p = new Path(); + scaleY = tailWidth.ordinal() + 1; + scaleX = tailLength.ordinal() + 1; + GeneralPath triangle = new GeneralPath(); + triangle.moveTo((float) (-lineWidth * scaleX), (float) (-lineWidth * scaleY / 2)); + triangle.lineTo(0, 0); + triangle.lineTo((float) (-lineWidth * scaleX), (float) (lineWidth * scaleY / 2)); + triangle.closePath(); + shape = triangle; + at.translate(x2, y2); + at.rotate(alpha); + break; + default: + break; + } + + if (shape != null) { + shape = at.createTransformedShape(shape); + } + return shape == null ? null : new Outline(shape, p); + } + + Outline getHeadDecoration(Graphics2D graphics, LineDecoration deco, BasicStroke stroke) { + DecorationSize headLength = deco.getHeadLength(); + DecorationSize headWidth = deco.getHeadWidth(); + + double lineWidth = Math.max(2.5, stroke.getLineWidth()); + + Rectangle2D anchor = getAnchor(graphics, shape); + double x1 = anchor.getX(), + y1 = anchor.getY(); + + double alpha = Math.atan(anchor.getHeight() / anchor.getWidth()); + + AffineTransform at = new AffineTransform(); + java.awt.Shape shape = null; + Path p = null; + Rectangle2D bounds; + double scaleY = 1; + double scaleX = 1; + switch (deco.getHeadShape()) { + case OVAL: + p = new Path(); + 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: + p = new Path(false, true); + GeneralPath arrow = new GeneralPath(); + arrow.moveTo((float) (lineWidth * 3 * scaleX), (float) (-lineWidth * scaleY * 2)); + arrow.lineTo(0, 0); + arrow.lineTo((float) (lineWidth * 3 * scaleX), (float) (lineWidth * scaleY * 2)); + shape = arrow; + at.translate(x1, y1); + at.rotate(alpha); + break; + case TRIANGLE: + p = new Path(); + scaleY = headWidth.ordinal() + 1; + scaleX = headLength.ordinal() + 1; + GeneralPath triangle = new GeneralPath(); + triangle.moveTo((float) (lineWidth * scaleX), (float) (-lineWidth * scaleY / 2)); + triangle.lineTo(0, 0); + triangle.lineTo((float) (lineWidth * scaleX), (float) (lineWidth * scaleY / 2)); + triangle.closePath(); + shape = triangle; + at.translate(x1, y1); + at.rotate(alpha); + break; + default: + break; + } + + if (shape != null) { + shape = at.createTransformedShape(shape); + } + return shape == null ? null : new Outline(shape, p); + } + + public BasicStroke getStroke() { + StrokeStyle strokeStyle = shape.getStrokeStyle(); + + float lineWidth = (float) strokeStyle.getLineWidth(); + if (lineWidth == 0.0f) lineWidth = 0.25f; // Both PowerPoint and OOo draw zero-length lines as 0.25pt + + LineDash lineDash = strokeStyle.getLineDash(); + int dashPatI[] = lineDash.pattern; + float[] dashPatF = new float[dashPatI.length]; + final float dash_phase = 0; + for (int i=0; i outlines + , Paint fill + , Paint line + ) { + Shadow shadow = shape.getShadow(); + if (shadow == null || (fill == null && line == null)) return; + + double shapeRotation = shape.getRotation(); + if(shape.getFlipVertical()) { + shapeRotation += 180; + } + double angle = shadow.getAngle() - shapeRotation; + double dist = shadow.getDistance(); + double dx = dist * Math.cos(Math.toRadians(angle)); + double dy = dist * Math.sin(Math.toRadians(angle)); + + graphics.translate(dx, dy); + + for(Outline o : outlines){ + java.awt.Shape s = o.getOutline(); + Path p = o.getPath(); + graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s); + + if(fill != null && p.isFilled()){ + graphics.setPaint(fill); + graphics.fill(s); + } else if (line != null && p.isStroked()) { + graphics.setPaint(line); + graphics.draw(s); + } + } + + graphics.translate(-dx, -dy); + } + + protected static CustomGeometry getCustomGeometry(String name) { + return getCustomGeometry(name, null); + } + + protected static CustomGeometry getCustomGeometry(String name, Graphics2D graphics) { + @SuppressWarnings("unchecked") + Map presets = (graphics == null) + ? null + : (Map)graphics.getRenderingHint(Drawable.PRESET_GEOMETRY_CACHE); + + if (presets == null) { + presets = new HashMap(); + if (graphics != null) { + graphics.setRenderingHint(Drawable.PRESET_GEOMETRY_CACHE, presets); + } + + String packageName = "org.apache.poi.sl.draw.binding"; + InputStream presetIS = Drawable.class.getResourceAsStream("presetShapeDefinitions.xml"); + Reader xml = new InputStreamReader( presetIS, Charset.forName("UTF-8") ); + + // StAX: + EventFilter startElementFilter = new EventFilter() { + @Override + public boolean accept(XMLEvent event) { + return event.isStartElement(); + } + }; + + try { + XMLInputFactory staxFactory = XMLInputFactory.newInstance(); + XMLEventReader staxReader = staxFactory.createXMLEventReader(xml); + XMLEventReader staxFiltRd = staxFactory.createFilteredReader(staxReader, startElementFilter); + // Ignore StartElement: + staxFiltRd.nextEvent(); + // JAXB: + JAXBContext jaxbContext = JAXBContext.newInstance(packageName); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + + while (staxFiltRd.peek() != null) { + StartElement evRoot = (StartElement)staxFiltRd.peek(); + String cusName = evRoot.getName().getLocalPart(); + // XMLEvent ev = staxReader.nextEvent(); + JAXBElement el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class); + CTCustomGeometry2D cusGeom = el.getValue(); + + presets.put(cusName, new CustomGeometry(cusGeom)); + } + } catch (Exception e) { + throw new RuntimeException("Unable to load preset geometries.", e); + } + } + + return presets.get(name); + } + + protected Collection computeOutlines(Graphics2D graphics) { + + List lst = new ArrayList(); + CustomGeometry geom = shape.getGeometry(); + if(geom == null) { + return lst; + } + + Rectangle2D anchor = getAnchor(graphics, shape); + for (Path p : geom) { + + double w = p.getW() == -1 ? anchor.getWidth() * Units.EMU_PER_POINT : p.getW(); + double h = p.getH() == -1 ? anchor.getHeight() * Units.EMU_PER_POINT : p.getH(); + + // the guides in the shape definitions are all defined relative to each other, + // so we build the path starting from (0,0). + final Rectangle2D pathAnchor = new Rectangle2D.Double(0,0,w,h); + + Context ctx = new Context(geom, pathAnchor, shape); + + java.awt.Shape gp = p.getPath(ctx); + + // translate the result to the canvas coordinates in points + AffineTransform at = new AffineTransform(); + at.translate(anchor.getX(), anchor.getY()); + + double scaleX, scaleY; + if (p.getW() != -1) { + scaleX = anchor.getWidth() / p.getW(); + } else { + scaleX = 1.0 / Units.EMU_PER_POINT; + } + if (p.getH() != -1) { + scaleY = anchor.getHeight() / p.getH(); + } else { + scaleY = 1.0 / Units.EMU_PER_POINT; + } + + at.scale(scaleX, scaleY); + + java.awt.Shape canvasShape = at.createTransformedShape(gp); + + lst.add(new Outline(canvasShape, p)); + } + + return lst; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java new file mode 100644 index 0000000000..42f5316447 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java @@ -0,0 +1,9 @@ +package org.apache.poi.sl.draw; + +import org.apache.poi.sl.usermodel.*; + +public class DrawTextBox extends DrawAutoShape { + public DrawTextBox(T shape) { + super(shape); + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java new file mode 100644 index 0000000000..c9bf1f4085 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java @@ -0,0 +1,94 @@ +package org.apache.poi.sl.draw; + +import java.awt.Graphics2D; +import java.awt.font.TextLayout; +import java.text.*; + +import org.apache.poi.xslf.usermodel.XSLFRenderingHint; + +public class DrawTextFragment implements Drawable { + final TextLayout layout; + final AttributedString str; + double x, y; + + public DrawTextFragment(TextLayout layout, AttributedString str) { + this.layout = layout; + this.str = str; + } + + public void setPosition(double x, double y) { + // TODO: replace it, by applyTransform???? + this.x = x; + this.y = y; + } + + public void draw(Graphics2D graphics){ + if(str == null) { + return; + } + + double yBaseline = y + layout.getAscent(); + + Integer textMode = (Integer)graphics.getRenderingHint(XSLFRenderingHint.TEXT_RENDERING_MODE); + if(textMode != null && textMode == XSLFRenderingHint.TEXT_AS_SHAPES){ + layout.draw(graphics, (float)x, (float)yBaseline); + } else { + graphics.drawString(str.getIterator(), (float)x, (float)yBaseline ); + } + } + + public void applyTransform(Graphics2D graphics) { + // TODO Auto-generated method stub + + } + + public void drawContent(Graphics2D graphics) { + // TODO Auto-generated method stub + + } + + public TextLayout getLayout() { + return layout; + } + + public AttributedString getAttributedString() { + return str; + } + + /** + * @return full height of this text run which is sum of ascent, descent and leading + */ + public float getHeight(){ + double h = Math.ceil(layout.getAscent()) + Math.ceil(layout.getDescent()) + layout.getLeading(); + return (float)h; + } + + /** + * + * @return width if this text run + */ + public float getWidth(){ + return layout.getAdvance(); + } + + /** + * + * @return the string to be painted + */ + public String getString(){ + if (str == null) return ""; + + AttributedCharacterIterator it = str.getIterator(); + StringBuilder buf = new StringBuilder(); + for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) { + buf.append(c); + } + return buf.toString(); + } + + @Override + public String toString(){ + return "[" + getClass().getSimpleName() + "] " + getString(); + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java new file mode 100644 index 0000000000..f116f1b5b2 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java @@ -0,0 +1,381 @@ +package org.apache.poi.sl.draw; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.font.*; +import java.awt.geom.Rectangle2D; +import java.text.*; +import java.text.AttributedCharacterIterator.Attribute; +import java.util.*; + +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle; +import org.apache.poi.sl.usermodel.TextRun.TextCap; +import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; + +public class DrawTextParagraph implements Drawable { + protected TextParagraph paragraph; + double x, y; + protected Insets2D insets = new Insets2D(0,0,0,0); + protected List lines = new ArrayList(); + protected String rawText; + protected DrawTextFragment bullet; + + /** + * the highest line in this paragraph. Used for line spacing. + */ + protected double maxLineHeight; + + public DrawTextParagraph(TextParagraph paragraph) { + this.paragraph = paragraph; + } + + public Insets2D getInsets() { + return insets; + } + + public void setInsets(Insets2D insets) { + this.insets.set(insets.top, insets.left, insets.bottom, insets.right); + } + + public void setPosition(double x, double y) { + // TODO: replace it, by applyTransform???? + this.x = x; + this.y = y; + } + + public double getY() { + return y; + } + + public void draw(Graphics2D graphics){ + if (lines.isEmpty()) return; + + double leftInset = insets.left; + double rightInset = insets.right; + double penY = y; + + double leftMargin = paragraph.getLeftMargin(); + boolean firstLine = true; + double indent = paragraph.getIndent(); + + //The vertical line spacing + double spacing = paragraph.getLineSpacing(); + for(DrawTextFragment line : lines){ + double penX = x + leftMargin; + + if(firstLine) { + if (!isEmptyParagraph()) { + bullet = getBullet(graphics, line.getAttributedString().getIterator()); + } + + if(bullet != null){ + if (indent < 0) { + // a negative value means "Hanging" indentation and + // indicates the position of the actual bullet character. + // (the bullet is shifted to right relative to the text) + bullet.setPosition(penX + indent, penY); + } else if(indent > 0){ + // a positive value means the "First Line" indentation: + // the first line is indented and other lines start at the bullet ofset + bullet.setPosition(penX, penY); + penX += indent; + } else { + // a zero indent means that the bullet and text have the same offset + bullet.setPosition(penX, penY); + + // don't let text overlay the bullet and advance by the bullet width + penX += bullet.getLayout().getAdvance() + 1; + } + + bullet.draw(graphics); + } else { + penX += indent; + } + } + + Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape()); + + switch (paragraph.getTextAlign()) { + case CENTER: + penX += (anchor.getWidth() - leftMargin - line.getWidth() - leftInset - rightInset) / 2; + break; + case RIGHT: + penX += (anchor.getWidth() - line.getWidth() - leftInset - rightInset); + break; + default: + break; + } + + line.setPosition(penX, penY); + line.draw(graphics); + + if(spacing > 0) { + // If linespacing >= 0, then linespacing is a percentage of normal line height. + penY += spacing*0.01* line.getHeight(); + } else { + // positive value means absolute spacing in points + penY += -spacing; + } + + firstLine = false; + } + + y = penY - y; + } + + public float getFirstLineHeight() { + return (lines.isEmpty()) ? 0 : lines.get(0).getHeight(); + } + + public float getLastLineHeight() { + return (lines.isEmpty()) ? 0 : lines.get(lines.size()-1).getHeight(); + } + + public boolean isEmptyParagraph() { + return (lines.isEmpty() || rawText.trim().isEmpty()); + } + + public void applyTransform(Graphics2D graphics) { + } + + public void drawContent(Graphics2D graphics) { + } + + /** + * break text into lines, each representing a line of text that fits in the wrapping width + * + * @param graphics + */ + protected void breakText(Graphics2D graphics){ + lines.clear(); + + DrawFactory fact = DrawFactory.getInstance(graphics); + StringBuilder text = new StringBuilder(); + AttributedString at = getAttributedString(graphics, text); + boolean emptyParagraph = ("".equals(text.toString().trim())); + + AttributedCharacterIterator it = at.getIterator(); + LineBreakMeasurer measurer = new LineBreakMeasurer(it, graphics.getFontRenderContext()); + for (;;) { + int startIndex = measurer.getPosition(); + + double wrappingWidth = getWrappingWidth(lines.size() == 0, graphics) + 1; // add a pixel to compensate rounding errors + // shape width can be smaller that the sum of insets (this was proved by a test file) + if(wrappingWidth < 0) wrappingWidth = 1; + + int nextBreak = text.indexOf("\n", startIndex + 1); + if(nextBreak == -1) nextBreak = it.getEndIndex(); + + TextLayout layout = measurer.nextLayout((float)wrappingWidth, nextBreak, true); + if (layout == null) { + // layout can be null if the entire word at the current position + // does not fit within the wrapping width. Try with requireNextWord=false. + layout = measurer.nextLayout((float)wrappingWidth, nextBreak, false); + } + + if(layout == null) { + // exit if can't break any more + break; + } + + int endIndex = measurer.getPosition(); + // skip over new line breaks (we paint 'clear' text runs not starting or ending with \n) + if(endIndex < it.getEndIndex() && text.charAt(endIndex) == '\n'){ + measurer.setPosition(endIndex + 1); + } + + TextAlign hAlign = paragraph.getTextAlign(); + if(hAlign == TextAlign.JUSTIFY || hAlign == TextAlign.JUSTIFY_LOW) { + layout = layout.getJustifiedLayout((float)wrappingWidth); + } + + AttributedString str = (emptyParagraph) + ? null // we will not paint empty paragraphs + : new AttributedString(it, startIndex, endIndex); + DrawTextFragment line = fact.getTextFragment(layout, str); + lines.add(line); + + maxLineHeight = Math.max(maxLineHeight, line.getHeight()); + + if(endIndex == it.getEndIndex()) break; + } + + rawText = text.toString(); + } + + protected DrawTextFragment getBullet(Graphics2D graphics, AttributedCharacterIterator firstLineAttr) { + BulletStyle bulletStyle = paragraph.getBulletStyle(); + if (bulletStyle == null) return null; + + String buCharacter = bulletStyle.getBulletCharacter(); + if (buCharacter == null) return null; + + String buFont = bulletStyle.getBulletFont(); + if (buFont == null) buFont = paragraph.getDefaultFontFamily(); + assert(buFont != null); + + Color buColor = bulletStyle.getBulletFontColor(); + if (buColor == null) buColor = (Color)firstLineAttr.getAttribute(TextAttribute.FOREGROUND); + + float fontSize = (Float)firstLineAttr.getAttribute(TextAttribute.SIZE); + float buSz = (float)bulletStyle.getBulletFontSize(); + if(buSz > 0) fontSize *= buSz* 0.01; + else fontSize = -buSz; + + + AttributedString str = new AttributedString(buCharacter); + str.addAttribute(TextAttribute.FOREGROUND, buColor); + str.addAttribute(TextAttribute.FAMILY, buFont); + str.addAttribute(TextAttribute.SIZE, fontSize); + + TextLayout layout = new TextLayout(str.getIterator(), graphics.getFontRenderContext()); + DrawFactory fact = DrawFactory.getInstance(graphics); + return fact.getTextFragment(layout, str); + } + + protected String getRenderableText(TextRun tr) { + StringBuilder buf = new StringBuilder(); + TextCap cap = tr.getTextCap(); + for (char c : tr.getText().toCharArray()) { + if(c == '\t') { + // TODO: finish support for tabs + buf.append(" "); + continue; + } + + switch (cap) { + case ALL: c = Character.toUpperCase(c); break; + case SMALL: c = Character.toLowerCase(c); break; + case NONE: break; + } + + buf.append(c); + } + + return buf.toString(); + } + + /** + * Returns wrapping width to break lines in this paragraph + * + * @param firstLine whether the first line is breaking + * + * @return wrapping width in points + */ + protected double getWrappingWidth(boolean firstLine, Graphics2D graphics){ + // internal margins for the text box + + double leftInset = insets.left; + double rightInset = insets.right; + + Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape()); + + double leftMargin = paragraph.getLeftMargin(); + double indent = paragraph.getIndent(); + + double width; + TextShape ts = paragraph.getParentShape(); + if (!ts.getWordWrap()) { + // if wordWrap == false then we return the advance to the right border of the sheet + width = ts.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX(); + } else { + width = anchor.getWidth() - leftInset - rightInset - leftMargin; + if (firstLine) { + if (bullet != null){ + if (indent > 0) width -= indent; + } else { + if (indent > 0) width -= indent; // first line indentation + else if (indent < 0) { // hanging indentation: the first line start at the left margin + width += leftMargin; + } + } + } + } + + return width; + } + + private static class AttributedStringData { + Attribute attribute; + Object value; + int beginIndex, endIndex; + AttributedStringData(Attribute attribute, Object value, int beginIndex, int endIndex) { + this.attribute = attribute; + this.value = value; + this.beginIndex = beginIndex; + this.endIndex = endIndex; + } + } + + protected AttributedString getAttributedString(Graphics2D graphics, StringBuilder text){ + List attList = new ArrayList(); + if (text == null) text = new StringBuilder(); + + DrawFontManager fontHandler = (DrawFontManager)graphics.getRenderingHint(Drawable.FONT_HANDLER); + + for (TextRun run : paragraph){ + String runText = getRenderableText(run); + // skip empty runs + if (runText.isEmpty()) continue; + + int beginIndex = text.length(); + text.append(runText); + int endIndex = text.length(); + + attList.add(new AttributedStringData(TextAttribute.FOREGROUND, run.getFontColor(), beginIndex, endIndex)); + + // user can pass an custom object to convert fonts + String fontFamily = run.getFontFamily(); + @SuppressWarnings("unchecked") + Map fontMap = (Map)graphics.getRenderingHint(Drawable.FONT_MAP); + if (fontMap != null && fontMap.containsKey(fontFamily)) { + fontFamily = fontMap.get(fontFamily); + } + if(fontHandler != null) { + fontFamily = fontHandler.getRendererableFont(fontFamily, run.getPitchAndFamily()); + } + attList.add(new AttributedStringData(TextAttribute.FAMILY, fontFamily, beginIndex, endIndex)); + + float fontSz = (float)run.getFontSize(); + attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz, beginIndex, endIndex)); + + if(run.isBold()) { + attList.add(new AttributedStringData(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, beginIndex, endIndex)); + } + if(run.isItalic()) { + attList.add(new AttributedStringData(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, beginIndex, endIndex)); + } + if(run.isUnderline()) { + attList.add(new AttributedStringData(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, beginIndex, endIndex)); + attList.add(new AttributedStringData(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, beginIndex, endIndex)); + } + if(run.isStrikethrough()) { + attList.add(new AttributedStringData(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, beginIndex, endIndex)); + } + if(run.isSubscript()) { + attList.add(new AttributedStringData(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUB, beginIndex, endIndex)); + } + if(run.isSuperscript()) { + attList.add(new AttributedStringData(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, beginIndex, endIndex)); + } + } + + // ensure that the paragraph contains at least one character + // We need this trick to correctly measure text + if (text.length() == 0) { + float fontSz = (float)paragraph.getDefaultFontSize(); + text.append(" "); + attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz, 0, 1)); + } + + AttributedString string = new AttributedString(text.toString()); + for (AttributedStringData asd : attList) { + string.addAttribute(asd.attribute, asd.value, asd.beginIndex, asd.endIndex); + } + + return string; + } + + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java new file mode 100644 index 0000000000..c71c1082d9 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java @@ -0,0 +1,140 @@ +package org.apache.poi.sl.draw; + +import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.util.Iterator; + +import org.apache.poi.sl.usermodel.*; + +public class DrawTextShape extends DrawSimpleShape { + + public DrawTextShape(T shape) { + super(shape); + } + + @Override + public void drawContent(Graphics2D graphics) { + Rectangle2D anchor = DrawShape.getAnchor(graphics, shape); + Insets2D insets = shape.getInsets(); + double x = anchor.getX() + insets.left; + double y = anchor.getY(); + + // remember the initial transform + AffineTransform tx = graphics.getTransform(); + + // Transform of text in flipped shapes is special. + // At this point the flip and rotation transform is already applied + // (see XSLFShape#applyTransform ), but we need to restore it to avoid painting "upside down". + // See Bugzilla 54210. + + if(shape.getFlipVertical()){ + graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight()); + graphics.scale(1, -1); + graphics.translate(-anchor.getX(), -anchor.getY()); + + // text in vertically flipped shapes is rotated by 180 degrees + double centerX = anchor.getX() + anchor.getWidth()/2; + double centerY = anchor.getY() + anchor.getHeight()/2; + graphics.translate(centerX, centerY); + graphics.rotate(Math.toRadians(180)); + graphics.translate(-centerX, -centerY); + } + + // Horizontal flipping applies only to shape outline and not to the text in the shape. + // Applying flip second time restores the original not-flipped transform + if(shape.getFlipHorizontal()){ + graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY()); + graphics.scale(-1, 1); + graphics.translate(-anchor.getX() , -anchor.getY()); + } + + + // first dry-run to calculate the total height of the text + double textHeight = shape.getTextHeight(); + + switch (shape.getVerticalAlignment()){ + case TOP: + y += insets.top; + break; + case BOTTOM: + y += anchor.getHeight() - textHeight - insets.bottom; + break; + default: + case MIDDLE: + double delta = anchor.getHeight() - textHeight - insets.top - insets.bottom; + y += insets.top + delta/2; + break; + } + + drawParagraphs(graphics, x, y); + + // restore the transform + graphics.setTransform(tx); + } + + /** + * paint the paragraphs starting from top left (x,y) + * + * @return the vertical advance, i.e. the cumulative space occupied by the text + */ + public double drawParagraphs(Graphics2D graphics, double x, double y) { + DrawFactory fact = DrawFactory.getInstance(graphics); + Insets2D shapePadding = shape.getInsets(); + + double y0 = y; + Iterator paragraphs = shape.iterator(); + + boolean isFirstLine = true; + while (paragraphs.hasNext()){ + TextParagraph p = paragraphs.next(); + DrawTextParagraph dp = fact.getDrawable(p); + dp.setInsets(shapePadding); + dp.breakText(graphics); + + if (!isFirstLine) { + // the amount of vertical white space before the paragraph + double spaceBefore = p.getSpaceBefore(); + if(spaceBefore > 0) { + // positive value means percentage spacing of the height of the first line, e.g. + // the higher the first line, the bigger the space before the paragraph + y += spaceBefore*0.01*dp.getFirstLineHeight(); + } else { + // negative value means the absolute spacing in points + y += -spaceBefore; + } + isFirstLine = false; + } + + dp.setPosition(x, y); + dp.draw(graphics); + y += dp.getY(); + + if (paragraphs.hasNext()) { + double spaceAfter = p.getSpaceAfter(); + if(spaceAfter > 0) { + // positive value means percentage spacing of the height of the last line, e.g. + // the higher the last line, the bigger the space after the paragraph + y += spaceAfter*0.01*dp.getLastLineHeight(); + } else { + // negative value means the absolute spacing in points + y += -spaceAfter; + } + } + } + return y - y0; + } + + /** + * Compute the cumulative height occupied by the text + */ + protected double getTextHeight(){ + // dry-run in a 1x1 image and return the vertical advance + BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); + Graphics2D graphics = img.createGraphics(); + return drawParagraphs(graphics, 0, 0); + } + + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java b/src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java new file mode 100644 index 0000000000..8789082afd --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java @@ -0,0 +1,123 @@ +/* ==================================================================== + 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.sl.draw; + +import java.awt.Graphics2D; +import java.awt.RenderingHints; + +import org.apache.poi.util.Internal; + + +public interface Drawable { + class DrawableHint extends RenderingHints.Key { + protected DrawableHint(int id) { + super(id); + } + + public boolean isCompatibleValue(Object val) { + return true; + } + } + + /** + * {@link DrawFactory} which will be used to draw objects into this graphics context + */ + DrawableHint DRAW_FACTORY = new DrawableHint(1); + + /** + * Key will be internally used to store affine transformation temporarily within group shapes + */ + @Internal + DrawableHint GROUP_TRANSFORM = new DrawableHint(2); + + /** + * Use a custom image renderer of an instance of {@link ImageRenderer} + */ + DrawableHint IMAGE_RENDERER = new DrawableHint(3); + + /** + * how to render text: + * + * {@link #TEXT_AS_CHARACTERS} (default) means to draw via + * {@link java.awt.Graphics2D#drawString(java.text.AttributedCharacterIterator, float, float)}. + * This mode draws text as characters. Use it if the target graphics writes the actual + * character codes instead of glyph outlines (PDFGraphics2D, SVGGraphics2D, etc.) + * + * {@link #TEXT_AS_SHAPES} means to render via + * {@link java.awt.font.TextLayout#draw(java.awt.Graphics2D, float, float)}. + * This mode draws glyphs as shapes and provides some advanced capabilities such as + * justification and font substitution. Use it if the target graphics is an image. + * + */ + DrawableHint TEXT_RENDERING_MODE = new DrawableHint(4); + + /** + * PathGradientPaint needs the shape to be set. + * It will be achieved through setting it in the rendering hints + */ + DrawableHint GRADIENT_SHAPE = new DrawableHint(5); + + + /** + * Internal key for caching the preset geometries + */ + DrawableHint PRESET_GEOMETRY_CACHE = new DrawableHint(6); + + /** + * draw text via {@link java.awt.Graphics2D#drawString(java.text.AttributedCharacterIterator, float, float)} + */ + int TEXT_AS_CHARACTERS = 1; + + /** + * draw text via {@link java.awt.font.TextLayout#draw(java.awt.Graphics2D, float, float)} + */ + int TEXT_AS_SHAPES = 2; + + /** + * Use this object to resolve unknown / missing fonts when rendering slides + */ + DrawableHint FONT_HANDLER = new DrawableHint(7); + DrawableHint FONT_FALLBACK = new DrawableHint(8); + DrawableHint FONT_MAP = new DrawableHint(9); + + DrawableHint GSAVE = new DrawableHint(10); + DrawableHint GRESTORE = new DrawableHint(11); + + + + /** + * Apply 2-D transforms before drawing this shape. This includes rotation and flipping. + * + * @param graphics the graphics whos transform matrix will be modified + */ + void applyTransform(Graphics2D graphics); + + /** + * Draw this shape into the supplied canvas + * + * @param graphics the graphics to draw into + */ + void draw(Graphics2D graphics); + + /** + * draw any content within this shape (image, text, etc.). + * + * @param graphics the graphics to draw into + */ + void drawContent(Graphics2D graphics); +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java b/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java new file mode 100644 index 0000000000..74ac997ab5 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java @@ -0,0 +1,155 @@ +/* + * ==================================================================== + * 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.sl.draw; + +import java.awt.*; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.awt.image.RescaleOp; +import java.io.IOException; +import java.io.InputStream; + +import javax.imageio.ImageIO; + +/** + * For now this class renders only images supported by the javax.imageio.ImageIO + * framework. Subclasses can override this class to support other formats, for + * example, Use Apache batik to render WMF: + * + *
+ * 
+ * public class MyImageRendener extends ImageRendener {
+ *
+ *     public boolean drawImage(Graphics2D graphics,Rectangle2D anchor,Insets clip) {
+ *         // draw image
+ *     }
+ *
+ *     public void loadImage(InputStream data, String contentType) throws IOException {
+ *         if ("image/wmf".equals(contentType)) {
+ *             // use Apache Batik to handle WMF
+ *         } else {
+ *             super.loadImage(data,contentType);
+ *         }
+ *     }
+ * }
+ * 
+ * 
+ * + * and then pass this class to your instance of java.awt.Graphics2D: + * + *
+ * 
+ * graphics.setRenderingHint(Drawable.IMAGE_RENDERER, new MyImageRendener());
+ * 
+ * 
+ */ +public class ImageRenderer { + protected BufferedImage img; + + /** + * Load and buffer the image + * + * @param data the raw image stream + * @param contentType the content type + */ + public void loadImage(InputStream data, String contentType) throws IOException { + img = ImageIO.read(data); + } + + /** + * @return the buffered image + */ + public BufferedImage getImage() { + return img; + } + + /** + * @return the dimension of the buffered image + */ + public Dimension getDimension() { + return (img == null) + ? new Dimension(0,0) + : new Dimension(img.getWidth(),img.getHeight()); + } + + /** + * @param alpha the alpha [0..1] to be added to the image (possibly already containing an alpha channel) + */ + public void setAlpha(double alpha) { + if (img == null) return; + + Dimension dim = getDimension(); + BufferedImage newImg = new BufferedImage((int)dim.getWidth(), (int)dim.getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics2D g = newImg.createGraphics(); + RescaleOp op = new RescaleOp(new float[]{1.0f, 1.0f, 1.0f, (float)alpha}, new float[]{0,0,0,0}, null); + g.drawImage(img, op, 0, 0); + g.dispose(); + + img = newImg; + } + + + /** + * Render picture data into the supplied graphics + * + * @return true if the picture data was successfully rendered + */ + public boolean drawImage( + Graphics2D graphics, + Rectangle2D anchor) { + return drawImage(graphics, anchor, null); + } + + /** + * Render picture data into the supplied graphics + * + * @return true if the picture data was successfully rendered + */ + public boolean drawImage( + Graphics2D graphics, + Rectangle2D anchor, + Insets clip) { + if (img == null) return false; + + boolean isClipped = true; + if (clip == null) { + isClipped = false; + clip = new Insets(0,0,0,0); + } + + int iw = img.getWidth(); + int ih = img.getHeight(); + + double cw = (100000-clip.left-clip.right) / 100000.0; + double ch = (100000-clip.top-clip.bottom) / 100000.0; + double sx = anchor.getWidth()/(iw*cw); + double sy = anchor.getHeight()/(ih*ch); + double tx = anchor.getX()-(iw*sx*clip.left/100000.0); + double ty = anchor.getY()-(ih*sy*clip.top/100000.0); + AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ; + + Shape clipOld = graphics.getClip(); + if (isClipped) graphics.clip(anchor.getBounds2D()); + graphics.drawRenderedImage(img, at); + graphics.setClip(clipOld); + + return true; + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java new file mode 100644 index 0000000000..ff07ce7cf2 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java @@ -0,0 +1,126 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_AdjPoint2D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_AdjPoint2D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="x" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="y" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_AdjPoint2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTAdjPoint2D + implements Locatable +{ + + @XmlAttribute(name = "x", required = true) + protected String x; + @XmlAttribute(name = "y", required = true) + protected String y; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX(String value) { + this.x = value; + } + + public boolean isSetX() { + return (this.x!= null); + } + + /** + * Gets the value of the y property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getY() { + return y; + } + + /** + * Sets the value of the y property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setY(String value) { + this.y = value; + } + + public boolean isSetY() { + return (this.y!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java new file mode 100644 index 0000000000..ae1482e49d --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java @@ -0,0 +1,116 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_AdjustHandleList complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_AdjustHandleList">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element name="ahXY" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_XYAdjustHandle"/>
+ *         <element name="ahPolar" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PolarAdjustHandle"/>
+ *       </choice>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_AdjustHandleList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "ahXYOrAhPolar" +}) +public class CTAdjustHandleList + implements Locatable +{ + + @XmlElements({ + @XmlElement(name = "ahXY", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTXYAdjustHandle.class), + @XmlElement(name = "ahPolar", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPolarAdjustHandle.class) + }) + protected List ahXYOrAhPolar; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the ahXYOrAhPolar property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the ahXYOrAhPolar property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getAhXYOrAhPolar().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CTXYAdjustHandle } + * {@link CTPolarAdjustHandle } + * + * + */ + public List getAhXYOrAhPolar() { + if (ahXYOrAhPolar == null) { + ahXYOrAhPolar = new ArrayList(); + } + return this.ahXYOrAhPolar; + } + + public boolean isSetAhXYOrAhPolar() { + return ((this.ahXYOrAhPolar!= null)&&(!this.ahXYOrAhPolar.isEmpty())); + } + + public void unsetAhXYOrAhPolar() { + this.ahXYOrAhPolar = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAngle.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAngle.java new file mode 100644 index 0000000000..77f138790d --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAngle.java @@ -0,0 +1,86 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Angle complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Angle">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Angle" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Angle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTAngle implements Locatable +{ + + @XmlAttribute(name = "val", required = true) + protected int val; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the val property. + * + */ + public int getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + */ + public void setVal(int value) { + this.val = value; + } + + public boolean isSetVal() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java new file mode 100644 index 0000000000..c03c7319da --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java @@ -0,0 +1,254 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Color complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Color">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorChoice"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Color", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "scrgbClr", + "srgbClr", + "hslClr", + "sysClr", + "schemeClr", + "prstClr" +}) +public class CTColor + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTScRgbColor scrgbClr; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTSRgbColor srgbClr; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTHslColor hslClr; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTSystemColor sysClr; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTSchemeColor schemeClr; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTPresetColor prstClr; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the scrgbClr property. + * + * @return + * possible object is + * {@link CTScRgbColor } + * + */ + public CTScRgbColor getScrgbClr() { + return scrgbClr; + } + + /** + * Sets the value of the scrgbClr property. + * + * @param value + * allowed object is + * {@link CTScRgbColor } + * + */ + public void setScrgbClr(CTScRgbColor value) { + this.scrgbClr = value; + } + + public boolean isSetScrgbClr() { + return (this.scrgbClr!= null); + } + + /** + * Gets the value of the srgbClr property. + * + * @return + * possible object is + * {@link CTSRgbColor } + * + */ + public CTSRgbColor getSrgbClr() { + return srgbClr; + } + + /** + * Sets the value of the srgbClr property. + * + * @param value + * allowed object is + * {@link CTSRgbColor } + * + */ + public void setSrgbClr(CTSRgbColor value) { + this.srgbClr = value; + } + + public boolean isSetSrgbClr() { + return (this.srgbClr!= null); + } + + /** + * Gets the value of the hslClr property. + * + * @return + * possible object is + * {@link CTHslColor } + * + */ + public CTHslColor getHslClr() { + return hslClr; + } + + /** + * Sets the value of the hslClr property. + * + * @param value + * allowed object is + * {@link CTHslColor } + * + */ + public void setHslClr(CTHslColor value) { + this.hslClr = value; + } + + public boolean isSetHslClr() { + return (this.hslClr!= null); + } + + /** + * Gets the value of the sysClr property. + * + * @return + * possible object is + * {@link CTSystemColor } + * + */ + public CTSystemColor getSysClr() { + return sysClr; + } + + /** + * Sets the value of the sysClr property. + * + * @param value + * allowed object is + * {@link CTSystemColor } + * + */ + public void setSysClr(CTSystemColor value) { + this.sysClr = value; + } + + public boolean isSetSysClr() { + return (this.sysClr!= null); + } + + /** + * Gets the value of the schemeClr property. + * + * @return + * possible object is + * {@link CTSchemeColor } + * + */ + public CTSchemeColor getSchemeClr() { + return schemeClr; + } + + /** + * Sets the value of the schemeClr property. + * + * @param value + * allowed object is + * {@link CTSchemeColor } + * + */ + public void setSchemeClr(CTSchemeColor value) { + this.schemeClr = value; + } + + public boolean isSetSchemeClr() { + return (this.schemeClr!= null); + } + + /** + * Gets the value of the prstClr property. + * + * @return + * possible object is + * {@link CTPresetColor } + * + */ + public CTPresetColor getPrstClr() { + return prstClr; + } + + /** + * Sets the value of the prstClr property. + * + * @param value + * allowed object is + * {@link CTPresetColor } + * + */ + public void setPrstClr(CTPresetColor value) { + this.prstClr = value; + } + + public boolean isSetPrstClr() { + return (this.prstClr!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColorMRU.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColorMRU.java new file mode 100644 index 0000000000..2439cc1ba5 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColorMRU.java @@ -0,0 +1,123 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_ColorMRU complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_ColorMRU">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorChoice" maxOccurs="10" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_ColorMRU", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "egColorChoice" +}) +public class CTColorMRU + implements Locatable +{ + + @XmlElements({ + @XmlElement(name = "scrgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTScRgbColor.class), + @XmlElement(name = "srgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSRgbColor.class), + @XmlElement(name = "hslClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTHslColor.class), + @XmlElement(name = "sysClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSystemColor.class), + @XmlElement(name = "schemeClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSchemeColor.class), + @XmlElement(name = "prstClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPresetColor.class) + }) + protected List egColorChoice; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the egColorChoice property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the egColorChoice property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getEGColorChoice().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CTScRgbColor } + * {@link CTSRgbColor } + * {@link CTHslColor } + * {@link CTSystemColor } + * {@link CTSchemeColor } + * {@link CTPresetColor } + * + * + */ + public List getEGColorChoice() { + if (egColorChoice == null) { + egColorChoice = new ArrayList(); + } + return this.egColorChoice; + } + + public boolean isSetEGColorChoice() { + return ((this.egColorChoice!= null)&&(!this.egColorChoice.isEmpty())); + } + + public void unsetEGColorChoice() { + this.egColorChoice = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTComplementTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTComplementTransform.java new file mode 100644 index 0000000000..491971549e --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTComplementTransform.java @@ -0,0 +1,62 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_ComplementTransform complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_ComplementTransform">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_ComplementTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTComplementTransform implements Locatable +{ + + @XmlLocation + @XmlTransient + protected Locator locator; + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnection.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnection.java new file mode 100644 index 0000000000..b2c88ae455 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnection.java @@ -0,0 +1,112 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Connection complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Connection">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="id" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_DrawingElementId" />
+ *       <attribute name="idx" use="required" type="{http://www.w3.org/2001/XMLSchema}unsignedInt" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Connection", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTConnection + implements Locatable +{ + + @XmlAttribute(name = "id", required = true) + protected long id; + @XmlAttribute(name = "idx", required = true) + @XmlSchemaType(name = "unsignedInt") + protected long idx; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the id property. + * + */ + public long getId() { + return id; + } + + /** + * Sets the value of the id property. + * + */ + public void setId(long value) { + this.id = value; + } + + public boolean isSetId() { + return true; + } + + /** + * Gets the value of the idx property. + * + */ + public long getIdx() { + return idx; + } + + /** + * Sets the value of the idx property. + * + */ + public void setIdx(long value) { + this.idx = value; + } + + public boolean isSetIdx() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSite.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSite.java new file mode 100644 index 0000000000..c6189d1128 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSite.java @@ -0,0 +1,131 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_ConnectionSite complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_ConnectionSite">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="pos" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>
+ *       </sequence>
+ *       <attribute name="ang" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_ConnectionSite", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "pos" +}) +public class CTConnectionSite + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected CTAdjPoint2D pos; + @XmlAttribute(name = "ang", required = true) + protected String ang; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the pos property. + * + * @return + * possible object is + * {@link CTAdjPoint2D } + * + */ + public CTAdjPoint2D getPos() { + return pos; + } + + /** + * Sets the value of the pos property. + * + * @param value + * allowed object is + * {@link CTAdjPoint2D } + * + */ + public void setPos(CTAdjPoint2D value) { + this.pos = value; + } + + public boolean isSetPos() { + return (this.pos!= null); + } + + /** + * Gets the value of the ang property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAng() { + return ang; + } + + /** + * Sets the value of the ang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAng(String value) { + this.ang = value; + } + + public boolean isSetAng() { + return (this.ang!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java new file mode 100644 index 0000000000..49e8123993 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java @@ -0,0 +1,110 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_ConnectionSiteList complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_ConnectionSiteList">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="cxn" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_ConnectionSite" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_ConnectionSiteList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "cxn" +}) +public class CTConnectionSiteList + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected List cxn; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the cxn property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the cxn property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getCxn().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CTConnectionSite } + * + * + */ + public List getCxn() { + if (cxn == null) { + cxn = new ArrayList(); + } + return this.cxn; + } + + public boolean isSetCxn() { + return ((this.cxn!= null)&&(!this.cxn.isEmpty())); + } + + public void unsetCxn() { + this.cxn = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java new file mode 100644 index 0000000000..4e43d915c7 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java @@ -0,0 +1,259 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_CustomGeometry2D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_CustomGeometry2D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="avLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>
+ *         <element name="gdLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>
+ *         <element name="ahLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjustHandleList" minOccurs="0"/>
+ *         <element name="cxnLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_ConnectionSiteList" minOccurs="0"/>
+ *         <element name="rect" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomRect" minOccurs="0"/>
+ *         <element name="pathLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DList"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_CustomGeometry2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "avLst", + "gdLst", + "ahLst", + "cxnLst", + "rect", + "pathLst" +}) +public class CTCustomGeometry2D + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTGeomGuideList avLst; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTGeomGuideList gdLst; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTAdjustHandleList ahLst; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTConnectionSiteList cxnLst; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTGeomRect rect; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected CTPath2DList pathLst; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the avLst property. + * + * @return + * possible object is + * {@link CTGeomGuideList } + * + */ + public CTGeomGuideList getAvLst() { + return avLst; + } + + /** + * Sets the value of the avLst property. + * + * @param value + * allowed object is + * {@link CTGeomGuideList } + * + */ + public void setAvLst(CTGeomGuideList value) { + this.avLst = value; + } + + public boolean isSetAvLst() { + return (this.avLst!= null); + } + + /** + * Gets the value of the gdLst property. + * + * @return + * possible object is + * {@link CTGeomGuideList } + * + */ + public CTGeomGuideList getGdLst() { + return gdLst; + } + + /** + * Sets the value of the gdLst property. + * + * @param value + * allowed object is + * {@link CTGeomGuideList } + * + */ + public void setGdLst(CTGeomGuideList value) { + this.gdLst = value; + } + + public boolean isSetGdLst() { + return (this.gdLst!= null); + } + + /** + * Gets the value of the ahLst property. + * + * @return + * possible object is + * {@link CTAdjustHandleList } + * + */ + public CTAdjustHandleList getAhLst() { + return ahLst; + } + + /** + * Sets the value of the ahLst property. + * + * @param value + * allowed object is + * {@link CTAdjustHandleList } + * + */ + public void setAhLst(CTAdjustHandleList value) { + this.ahLst = value; + } + + public boolean isSetAhLst() { + return (this.ahLst!= null); + } + + /** + * Gets the value of the cxnLst property. + * + * @return + * possible object is + * {@link CTConnectionSiteList } + * + */ + public CTConnectionSiteList getCxnLst() { + return cxnLst; + } + + /** + * Sets the value of the cxnLst property. + * + * @param value + * allowed object is + * {@link CTConnectionSiteList } + * + */ + public void setCxnLst(CTConnectionSiteList value) { + this.cxnLst = value; + } + + public boolean isSetCxnLst() { + return (this.cxnLst!= null); + } + + /** + * Gets the value of the rect property. + * + * @return + * possible object is + * {@link CTGeomRect } + * + */ + public CTGeomRect getRect() { + return rect; + } + + /** + * Sets the value of the rect property. + * + * @param value + * allowed object is + * {@link CTGeomRect } + * + */ + public void setRect(CTGeomRect value) { + this.rect = value; + } + + public boolean isSetRect() { + return (this.rect!= null); + } + + /** + * Gets the value of the pathLst property. + * + * @return + * possible object is + * {@link CTPath2DList } + * + */ + public CTPath2DList getPathLst() { + return pathLst; + } + + /** + * Sets the value of the pathLst property. + * + * @param value + * allowed object is + * {@link CTPath2DList } + * + */ + public void setPathLst(CTPath2DList value) { + this.pathLst = value; + } + + public boolean isSetPathLst() { + return (this.pathLst!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java new file mode 100644 index 0000000000..aaef46da9a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java @@ -0,0 +1,169 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_EmbeddedWAVAudioFile complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_EmbeddedWAVAudioFile">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute ref="{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embed use="required""/>
+ *       <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" default="" />
+ *       <attribute name="builtIn" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_EmbeddedWAVAudioFile", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTEmbeddedWAVAudioFile + implements Locatable +{ + + @XmlAttribute(name = "embed", namespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", required = true) + protected String embed; + @XmlAttribute(name = "name") + protected String name; + @XmlAttribute(name = "builtIn") + protected Boolean builtIn; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Embedded Audio File Relationship ID + * + * @return + * possible object is + * {@link String } + * + */ + public String getEmbed() { + return embed; + } + + /** + * Sets the value of the embed property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setEmbed(String value) { + this.embed = value; + } + + public boolean isSetEmbed() { + return (this.embed!= null); + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + if (name == null) { + return ""; + } else { + return name; + } + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + public boolean isSetName() { + return (this.name!= null); + } + + /** + * Gets the value of the builtIn property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isBuiltIn() { + if (builtIn == null) { + return false; + } else { + return builtIn; + } + } + + /** + * Sets the value of the builtIn property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setBuiltIn(boolean value) { + this.builtIn = value; + } + + public boolean isSetBuiltIn() { + return (this.builtIn!= null); + } + + public void unsetBuiltIn() { + this.builtIn = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTFixedPercentage.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTFixedPercentage.java new file mode 100644 index 0000000000..14bcd3776f --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTFixedPercentage.java @@ -0,0 +1,86 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_FixedPercentage complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_FixedPercentage">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_FixedPercentage" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_FixedPercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTFixedPercentage implements Locatable +{ + + @XmlAttribute(name = "val", required = true) + protected int val; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the val property. + * + */ + public int getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + */ + public void setVal(int value) { + this.val = value; + } + + public boolean isSetVal() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGammaTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGammaTransform.java new file mode 100644 index 0000000000..84e7f3b0e0 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGammaTransform.java @@ -0,0 +1,62 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_GammaTransform complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_GammaTransform">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_GammaTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTGammaTransform implements Locatable +{ + + @XmlLocation + @XmlTransient + protected Locator locator; + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuide.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuide.java new file mode 100644 index 0000000000..e0723d97a2 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuide.java @@ -0,0 +1,129 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_GeomGuide complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_GeomGuide">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="name" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />
+ *       <attribute name="fmla" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideFormula" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_GeomGuide", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTGeomGuide + implements Locatable +{ + + @XmlAttribute(name = "name", required = true) + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String name; + @XmlAttribute(name = "fmla", required = true) + protected String fmla; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + public boolean isSetName() { + return (this.name!= null); + } + + /** + * Gets the value of the fmla property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getFmla() { + return fmla; + } + + /** + * Sets the value of the fmla property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setFmla(String value) { + this.fmla = value; + } + + public boolean isSetFmla() { + return (this.fmla!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuideList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuideList.java new file mode 100644 index 0000000000..d5203d8493 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuideList.java @@ -0,0 +1,110 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_GeomGuideList complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_GeomGuideList">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="gd" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuide" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_GeomGuideList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "gd" +}) +public class CTGeomGuideList + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected List gd; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the gd property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the gd property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getGd().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CTGeomGuide } + * + * + */ + public List getGd() { + if (gd == null) { + gd = new ArrayList(); + } + return this.gd; + } + + public boolean isSetGd() { + return ((this.gd!= null)&&(!this.gd.isEmpty())); + } + + public void unsetGd() { + this.gd = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomRect.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomRect.java new file mode 100644 index 0000000000..f0383f81f8 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomRect.java @@ -0,0 +1,188 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_GeomRect complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_GeomRect">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="l" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="t" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="r" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="b" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_GeomRect", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTGeomRect + implements Locatable +{ + + @XmlAttribute(name = "l", required = true) + protected String l; + @XmlAttribute(name = "t", required = true) + protected String t; + @XmlAttribute(name = "r", required = true) + protected String r; + @XmlAttribute(name = "b", required = true) + protected String b; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the l property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getL() { + return l; + } + + /** + * Sets the value of the l property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setL(String value) { + this.l = value; + } + + public boolean isSetL() { + return (this.l!= null); + } + + /** + * Gets the value of the t property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getT() { + return t; + } + + /** + * Sets the value of the t property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setT(String value) { + this.t = value; + } + + public boolean isSetT() { + return (this.t!= null); + } + + /** + * Gets the value of the r property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getR() { + return r; + } + + /** + * Sets the value of the r property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setR(String value) { + this.r = value; + } + + public boolean isSetR() { + return (this.r!= null); + } + + /** + * Gets the value of the b property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getB() { + return b; + } + + /** + * Sets the value of the b property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setB(String value) { + this.b = value; + } + + public boolean isSetB() { + return (this.b!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java new file mode 100644 index 0000000000..ef5ad887f6 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java @@ -0,0 +1,62 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_GrayscaleTransform complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_GrayscaleTransform">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_GrayscaleTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTGrayscaleTransform implements Locatable +{ + + @XmlLocation + @XmlTransient + protected Locator locator; + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java new file mode 100644 index 0000000000..15386a230d --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java @@ -0,0 +1,313 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_GroupTransform2D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_GroupTransform2D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="off" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Point2D" minOccurs="0"/>
+ *         <element name="ext" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PositiveSize2D" minOccurs="0"/>
+ *         <element name="chOff" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Point2D" minOccurs="0"/>
+ *         <element name="chExt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PositiveSize2D" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="rot" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Angle" default="0" />
+ *       <attribute name="flipH" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       <attribute name="flipV" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_GroupTransform2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "off", + "ext", + "chOff", + "chExt" +}) +public class CTGroupTransform2D + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTPoint2D off; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTPositiveSize2D ext; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTPoint2D chOff; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTPositiveSize2D chExt; + @XmlAttribute(name = "rot") + protected Integer rot; + @XmlAttribute(name = "flipH") + protected Boolean flipH; + @XmlAttribute(name = "flipV") + protected Boolean flipV; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the off property. + * + * @return + * possible object is + * {@link CTPoint2D } + * + */ + public CTPoint2D getOff() { + return off; + } + + /** + * Sets the value of the off property. + * + * @param value + * allowed object is + * {@link CTPoint2D } + * + */ + public void setOff(CTPoint2D value) { + this.off = value; + } + + public boolean isSetOff() { + return (this.off!= null); + } + + /** + * Gets the value of the ext property. + * + * @return + * possible object is + * {@link CTPositiveSize2D } + * + */ + public CTPositiveSize2D getExt() { + return ext; + } + + /** + * Sets the value of the ext property. + * + * @param value + * allowed object is + * {@link CTPositiveSize2D } + * + */ + public void setExt(CTPositiveSize2D value) { + this.ext = value; + } + + public boolean isSetExt() { + return (this.ext!= null); + } + + /** + * Gets the value of the chOff property. + * + * @return + * possible object is + * {@link CTPoint2D } + * + */ + public CTPoint2D getChOff() { + return chOff; + } + + /** + * Sets the value of the chOff property. + * + * @param value + * allowed object is + * {@link CTPoint2D } + * + */ + public void setChOff(CTPoint2D value) { + this.chOff = value; + } + + public boolean isSetChOff() { + return (this.chOff!= null); + } + + /** + * Gets the value of the chExt property. + * + * @return + * possible object is + * {@link CTPositiveSize2D } + * + */ + public CTPositiveSize2D getChExt() { + return chExt; + } + + /** + * Sets the value of the chExt property. + * + * @param value + * allowed object is + * {@link CTPositiveSize2D } + * + */ + public void setChExt(CTPositiveSize2D value) { + this.chExt = value; + } + + public boolean isSetChExt() { + return (this.chExt!= null); + } + + /** + * Gets the value of the rot property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public int getRot() { + if (rot == null) { + return 0; + } else { + return rot; + } + } + + /** + * Sets the value of the rot property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setRot(int value) { + this.rot = value; + } + + public boolean isSetRot() { + return (this.rot!= null); + } + + public void unsetRot() { + this.rot = null; + } + + /** + * Gets the value of the flipH property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isFlipH() { + if (flipH == null) { + return false; + } else { + return flipH; + } + } + + /** + * Sets the value of the flipH property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setFlipH(boolean value) { + this.flipH = value; + } + + public boolean isSetFlipH() { + return (this.flipH!= null); + } + + public void unsetFlipH() { + this.flipH = null; + } + + /** + * Gets the value of the flipV property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isFlipV() { + if (flipV == null) { + return false; + } else { + return flipV; + } + } + + /** + * Sets the value of the flipV property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setFlipV(boolean value) { + this.flipV = value; + } + + public boolean isSetFlipV() { + return (this.flipV!= null); + } + + public void unsetFlipV() { + this.flipV = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHslColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHslColor.java new file mode 100644 index 0000000000..534a9b3700 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHslColor.java @@ -0,0 +1,237 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_HslColor complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_HslColor">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="hue" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />
+ *       <attribute name="sat" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />
+ *       <attribute name="lum" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_HslColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "egColorTransform" +}) +public class CTHslColor implements Locatable +{ + + @XmlElementRefs({ + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + }) + protected List> egColorTransform; + @XmlAttribute(name = "hue", required = true) + protected int hue; + @XmlAttribute(name = "sat", required = true) + protected int sat; + @XmlAttribute(name = "lum", required = true) + protected int lum; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the egColorTransform property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the egColorTransform property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getEGColorTransform().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * + * + */ + public List> getEGColorTransform() { + if (egColorTransform == null) { + egColorTransform = new ArrayList>(); + } + return this.egColorTransform; + } + + public boolean isSetEGColorTransform() { + return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty())); + } + + public void unsetEGColorTransform() { + this.egColorTransform = null; + } + + /** + * Gets the value of the hue property. + * + */ + public int getHue() { + return hue; + } + + /** + * Sets the value of the hue property. + * + */ + public void setHue(int value) { + this.hue = value; + } + + public boolean isSetHue() { + return true; + } + + /** + * Gets the value of the sat property. + * + */ + public int getSat() { + return sat; + } + + /** + * Sets the value of the sat property. + * + */ + public void setSat(int value) { + this.sat = value; + } + + public boolean isSetSat() { + return true; + } + + /** + * Gets the value of the lum property. + * + */ + public int getLum() { + return lum; + } + + /** + * Sets the value of the lum property. + * + */ + public void setLum(int value) { + this.lum = value; + } + + public boolean isSetLum() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHyperlink.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHyperlink.java new file mode 100644 index 0000000000..571ff8b646 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHyperlink.java @@ -0,0 +1,420 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Hyperlink complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Hyperlink">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="snd" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_EmbeddedWAVAudioFile" minOccurs="0"/>
+ *         <element name="extLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_OfficeArtExtensionList" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute ref="{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id"/>
+ *       <attribute name="invalidUrl" type="{http://www.w3.org/2001/XMLSchema}string" default="" />
+ *       <attribute name="action" type="{http://www.w3.org/2001/XMLSchema}string" default="" />
+ *       <attribute name="tgtFrame" type="{http://www.w3.org/2001/XMLSchema}string" default="" />
+ *       <attribute name="tooltip" type="{http://www.w3.org/2001/XMLSchema}string" default="" />
+ *       <attribute name="history" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
+ *       <attribute name="highlightClick" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       <attribute name="endSnd" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Hyperlink", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "snd", + "extLst" +}) +public class CTHyperlink + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTEmbeddedWAVAudioFile snd; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTOfficeArtExtensionList extLst; + @XmlAttribute(name = "id", namespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships") + protected String id; + @XmlAttribute(name = "invalidUrl") + protected String invalidUrl; + @XmlAttribute(name = "action") + protected String action; + @XmlAttribute(name = "tgtFrame") + protected String tgtFrame; + @XmlAttribute(name = "tooltip") + protected String tooltip; + @XmlAttribute(name = "history") + protected Boolean history; + @XmlAttribute(name = "highlightClick") + protected Boolean highlightClick; + @XmlAttribute(name = "endSnd") + protected Boolean endSnd; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the snd property. + * + * @return + * possible object is + * {@link CTEmbeddedWAVAudioFile } + * + */ + public CTEmbeddedWAVAudioFile getSnd() { + return snd; + } + + /** + * Sets the value of the snd property. + * + * @param value + * allowed object is + * {@link CTEmbeddedWAVAudioFile } + * + */ + public void setSnd(CTEmbeddedWAVAudioFile value) { + this.snd = value; + } + + public boolean isSetSnd() { + return (this.snd!= null); + } + + /** + * Gets the value of the extLst property. + * + * @return + * possible object is + * {@link CTOfficeArtExtensionList } + * + */ + public CTOfficeArtExtensionList getExtLst() { + return extLst; + } + + /** + * Sets the value of the extLst property. + * + * @param value + * allowed object is + * {@link CTOfficeArtExtensionList } + * + */ + public void setExtLst(CTOfficeArtExtensionList value) { + this.extLst = value; + } + + public boolean isSetExtLst() { + return (this.extLst!= null); + } + + /** + * Drawing Object Hyperlink Target + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + + public boolean isSetId() { + return (this.id!= null); + } + + /** + * Gets the value of the invalidUrl property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getInvalidUrl() { + if (invalidUrl == null) { + return ""; + } else { + return invalidUrl; + } + } + + /** + * Sets the value of the invalidUrl property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setInvalidUrl(String value) { + this.invalidUrl = value; + } + + public boolean isSetInvalidUrl() { + return (this.invalidUrl!= null); + } + + /** + * Gets the value of the action property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAction() { + if (action == null) { + return ""; + } else { + return action; + } + } + + /** + * Sets the value of the action property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAction(String value) { + this.action = value; + } + + public boolean isSetAction() { + return (this.action!= null); + } + + /** + * Gets the value of the tgtFrame property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getTgtFrame() { + if (tgtFrame == null) { + return ""; + } else { + return tgtFrame; + } + } + + /** + * Sets the value of the tgtFrame property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setTgtFrame(String value) { + this.tgtFrame = value; + } + + public boolean isSetTgtFrame() { + return (this.tgtFrame!= null); + } + + /** + * Gets the value of the tooltip property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getTooltip() { + if (tooltip == null) { + return ""; + } else { + return tooltip; + } + } + + /** + * Sets the value of the tooltip property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setTooltip(String value) { + this.tooltip = value; + } + + public boolean isSetTooltip() { + return (this.tooltip!= null); + } + + /** + * Gets the value of the history property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isHistory() { + if (history == null) { + return true; + } else { + return history; + } + } + + /** + * Sets the value of the history property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setHistory(boolean value) { + this.history = value; + } + + public boolean isSetHistory() { + return (this.history!= null); + } + + public void unsetHistory() { + this.history = null; + } + + /** + * Gets the value of the highlightClick property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isHighlightClick() { + if (highlightClick == null) { + return false; + } else { + return highlightClick; + } + } + + /** + * Sets the value of the highlightClick property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setHighlightClick(boolean value) { + this.highlightClick = value; + } + + public boolean isSetHighlightClick() { + return (this.highlightClick!= null); + } + + public void unsetHighlightClick() { + this.highlightClick = null; + } + + /** + * Gets the value of the endSnd property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isEndSnd() { + if (endSnd == null) { + return false; + } else { + return endSnd; + } + } + + /** + * Sets the value of the endSnd property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setEndSnd(boolean value) { + this.endSnd = value; + } + + public boolean isSetEndSnd() { + return (this.endSnd!= null); + } + + public void unsetEndSnd() { + this.endSnd = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java new file mode 100644 index 0000000000..091d6e2318 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java @@ -0,0 +1,62 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_InverseGammaTransform complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_InverseGammaTransform">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_InverseGammaTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTInverseGammaTransform implements Locatable +{ + + @XmlLocation + @XmlTransient + protected Locator locator; + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseTransform.java new file mode 100644 index 0000000000..e1de7b8b5a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseTransform.java @@ -0,0 +1,62 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_InverseTransform complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_InverseTransform">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_InverseTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTInverseTransform implements Locatable +{ + + @XmlLocation + @XmlTransient + protected Locator locator; + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java new file mode 100644 index 0000000000..db1831fdf1 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java @@ -0,0 +1,139 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.w3c.dom.Element; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_OfficeArtExtension complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_OfficeArtExtension">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <any processContents='lax'/>
+ *       </sequence>
+ *       <attribute name="uri" type="{http://www.w3.org/2001/XMLSchema}token" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_OfficeArtExtension", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "any" +}) +public class CTOfficeArtExtension + implements Locatable +{ + + @XmlAnyElement(lax = true) + protected Object any; + @XmlAttribute(name = "uri") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlSchemaType(name = "token") + protected String uri; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the any property. + * + * @return + * possible object is + * {@link Object } + * {@link Element } + * + */ + public Object getAny() { + return any; + } + + /** + * Sets the value of the any property. + * + * @param value + * allowed object is + * {@link Object } + * {@link Element } + * + */ + public void setAny(Object value) { + this.any = value; + } + + public boolean isSetAny() { + return (this.any!= null); + } + + /** + * Gets the value of the uri property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUri() { + return uri; + } + + /** + * Sets the value of the uri property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUri(String value) { + this.uri = value; + } + + public boolean isSetUri() { + return (this.uri!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java new file mode 100644 index 0000000000..fc806911f0 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java @@ -0,0 +1,110 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_OfficeArtExtensionList complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_OfficeArtExtensionList">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_OfficeArtExtensionList"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_OfficeArtExtensionList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "ext" +}) +public class CTOfficeArtExtensionList + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected List ext; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the ext property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the ext property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getExt().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CTOfficeArtExtension } + * + * + */ + public List getExt() { + if (ext == null) { + ext = new ArrayList(); + } + return this.ext; + } + + public boolean isSetExt() { + return ((this.ext!= null)&&(!this.ext.isEmpty())); + } + + public void unsetExt() { + this.ext = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2D.java new file mode 100644 index 0000000000..bcba3c8c8e --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2D.java @@ -0,0 +1,320 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElements; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Path2D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Path2D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element name="close" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DClose"/>
+ *         <element name="moveTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DMoveTo"/>
+ *         <element name="lnTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DLineTo"/>
+ *         <element name="arcTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DArcTo"/>
+ *         <element name="quadBezTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DQuadBezierTo"/>
+ *         <element name="cubicBezTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DCubicBezierTo"/>
+ *       </choice>
+ *       <attribute name="w" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveCoordinate" default="0" />
+ *       <attribute name="h" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveCoordinate" default="0" />
+ *       <attribute name="fill" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PathFillMode" default="norm" />
+ *       <attribute name="stroke" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
+ *       <attribute name="extrusionOk" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Path2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "closeOrMoveToOrLnTo" +}) +public class CTPath2D + implements Locatable +{ + + @XmlElements({ + @XmlElement(name = "close", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DClose.class), + @XmlElement(name = "moveTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DMoveTo.class), + @XmlElement(name = "lnTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DLineTo.class), + @XmlElement(name = "arcTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DArcTo.class), + @XmlElement(name = "quadBezTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DQuadBezierTo.class), + @XmlElement(name = "cubicBezTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DCubicBezierTo.class) + }) + protected List closeOrMoveToOrLnTo; + @XmlAttribute(name = "w") + protected Long w; + @XmlAttribute(name = "h") + protected Long h; + @XmlAttribute(name = "fill") + protected STPathFillMode fill; + @XmlAttribute(name = "stroke") + protected Boolean stroke; + @XmlAttribute(name = "extrusionOk") + protected Boolean extrusionOk; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the closeOrMoveToOrLnTo property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the closeOrMoveToOrLnTo property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getCloseOrMoveToOrLnTo().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CTPath2DClose } + * {@link CTPath2DMoveTo } + * {@link CTPath2DLineTo } + * {@link CTPath2DArcTo } + * {@link CTPath2DQuadBezierTo } + * {@link CTPath2DCubicBezierTo } + * + * + */ + public List getCloseOrMoveToOrLnTo() { + if (closeOrMoveToOrLnTo == null) { + closeOrMoveToOrLnTo = new ArrayList(); + } + return this.closeOrMoveToOrLnTo; + } + + public boolean isSetCloseOrMoveToOrLnTo() { + return ((this.closeOrMoveToOrLnTo!= null)&&(!this.closeOrMoveToOrLnTo.isEmpty())); + } + + public void unsetCloseOrMoveToOrLnTo() { + this.closeOrMoveToOrLnTo = null; + } + + /** + * Gets the value of the w property. + * + * @return + * possible object is + * {@link Long } + * + */ + public long getW() { + if (w == null) { + return 0L; + } else { + return w; + } + } + + /** + * Sets the value of the w property. + * + * @param value + * allowed object is + * {@link Long } + * + */ + public void setW(long value) { + this.w = value; + } + + public boolean isSetW() { + return (this.w!= null); + } + + public void unsetW() { + this.w = null; + } + + /** + * Gets the value of the h property. + * + * @return + * possible object is + * {@link Long } + * + */ + public long getH() { + if (h == null) { + return 0L; + } else { + return h; + } + } + + /** + * Sets the value of the h property. + * + * @param value + * allowed object is + * {@link Long } + * + */ + public void setH(long value) { + this.h = value; + } + + public boolean isSetH() { + return (this.h!= null); + } + + public void unsetH() { + this.h = null; + } + + /** + * Gets the value of the fill property. + * + * @return + * possible object is + * {@link STPathFillMode } + * + */ + public STPathFillMode getFill() { + if (fill == null) { + return STPathFillMode.NORM; + } else { + return fill; + } + } + + /** + * Sets the value of the fill property. + * + * @param value + * allowed object is + * {@link STPathFillMode } + * + */ + public void setFill(STPathFillMode value) { + this.fill = value; + } + + public boolean isSetFill() { + return (this.fill!= null); + } + + /** + * Gets the value of the stroke property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isStroke() { + if (stroke == null) { + return true; + } else { + return stroke; + } + } + + /** + * Sets the value of the stroke property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setStroke(boolean value) { + this.stroke = value; + } + + public boolean isSetStroke() { + return (this.stroke!= null); + } + + public void unsetStroke() { + this.stroke = null; + } + + /** + * Gets the value of the extrusionOk property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isExtrusionOk() { + if (extrusionOk == null) { + return true; + } else { + return extrusionOk; + } + } + + /** + * Sets the value of the extrusionOk property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setExtrusionOk(boolean value) { + this.extrusionOk = value; + } + + public boolean isSetExtrusionOk() { + return (this.extrusionOk!= null); + } + + public void unsetExtrusionOk() { + this.extrusionOk = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java new file mode 100644 index 0000000000..225d87005a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java @@ -0,0 +1,187 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Path2DArcTo complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Path2DArcTo">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="wR" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="hR" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="stAng" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />
+ *       <attribute name="swAng" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Path2DArcTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTPath2DArcTo implements Locatable +{ + + @XmlAttribute(name = "wR", required = true) + protected String wr; + @XmlAttribute(name = "hR", required = true) + protected String hr; + @XmlAttribute(name = "stAng", required = true) + protected String stAng; + @XmlAttribute(name = "swAng", required = true) + protected String swAng; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the wr property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getWR() { + return wr; + } + + /** + * Sets the value of the wr property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setWR(String value) { + this.wr = value; + } + + public boolean isSetWR() { + return (this.wr!= null); + } + + /** + * Gets the value of the hr property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getHR() { + return hr; + } + + /** + * Sets the value of the hr property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setHR(String value) { + this.hr = value; + } + + public boolean isSetHR() { + return (this.hr!= null); + } + + /** + * Gets the value of the stAng property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getStAng() { + return stAng; + } + + /** + * Sets the value of the stAng property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setStAng(String value) { + this.stAng = value; + } + + public boolean isSetStAng() { + return (this.stAng!= null); + } + + /** + * Gets the value of the swAng property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSwAng() { + return swAng; + } + + /** + * Sets the value of the swAng property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSwAng(String value) { + this.swAng = value; + } + + public boolean isSetSwAng() { + return (this.swAng!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DClose.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DClose.java new file mode 100644 index 0000000000..f8f2514fac --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DClose.java @@ -0,0 +1,62 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Path2DClose complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Path2DClose">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Path2DClose", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTPath2DClose implements Locatable +{ + + @XmlLocation + @XmlTransient + protected Locator locator; + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java new file mode 100644 index 0000000000..0f27b0506a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java @@ -0,0 +1,109 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Path2DCubicBezierTo complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Path2DCubicBezierTo">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="pt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D" maxOccurs="3" minOccurs="3"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Path2DCubicBezierTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "pt" +}) +public class CTPath2DCubicBezierTo implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected List pt; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the pt property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the pt property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getPt().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CTAdjPoint2D } + * + * + */ + public List getPt() { + if (pt == null) { + pt = new ArrayList(); + } + return this.pt; + } + + public boolean isSetPt() { + return ((this.pt!= null)&&(!this.pt.isEmpty())); + } + + public void unsetPt() { + this.pt = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java new file mode 100644 index 0000000000..0cfeb7cd64 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java @@ -0,0 +1,98 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Path2DLineTo complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Path2DLineTo">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="pt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Path2DLineTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "pt" +}) +public class CTPath2DLineTo implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected CTAdjPoint2D pt; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the pt property. + * + * @return + * possible object is + * {@link CTAdjPoint2D } + * + */ + public CTAdjPoint2D getPt() { + return pt; + } + + /** + * Sets the value of the pt property. + * + * @param value + * allowed object is + * {@link CTAdjPoint2D } + * + */ + public void setPt(CTAdjPoint2D value) { + this.pt = value; + } + + public boolean isSetPt() { + return (this.pt!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DList.java new file mode 100644 index 0000000000..c190710cf4 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DList.java @@ -0,0 +1,110 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Path2DList complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Path2DList">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="path" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2D" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Path2DList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "path" +}) +public class CTPath2DList + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected List path; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the path property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the path property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getPath().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CTPath2D } + * + * + */ + public List getPath() { + if (path == null) { + path = new ArrayList(); + } + return this.path; + } + + public boolean isSetPath() { + return ((this.path!= null)&&(!this.path.isEmpty())); + } + + public void unsetPath() { + this.path = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java new file mode 100644 index 0000000000..6554a296dc --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java @@ -0,0 +1,98 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Path2DMoveTo complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Path2DMoveTo">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="pt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Path2DMoveTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "pt" +}) +public class CTPath2DMoveTo implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected CTAdjPoint2D pt; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the pt property. + * + * @return + * possible object is + * {@link CTAdjPoint2D } + * + */ + public CTAdjPoint2D getPt() { + return pt; + } + + /** + * Sets the value of the pt property. + * + * @param value + * allowed object is + * {@link CTAdjPoint2D } + * + */ + public void setPt(CTAdjPoint2D value) { + this.pt = value; + } + + public boolean isSetPt() { + return (this.pt!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java new file mode 100644 index 0000000000..4db3737224 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java @@ -0,0 +1,109 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Path2DQuadBezierTo complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Path2DQuadBezierTo">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="pt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D" maxOccurs="2" minOccurs="2"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Path2DQuadBezierTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "pt" +}) +public class CTPath2DQuadBezierTo implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected List pt; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the pt property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the pt property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getPt().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CTAdjPoint2D } + * + * + */ + public List getPt() { + if (pt == null) { + pt = new ArrayList(); + } + return this.pt; + } + + public boolean isSetPt() { + return ((this.pt!= null)&&(!this.pt.isEmpty())); + } + + public void unsetPt() { + this.pt = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPercentage.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPercentage.java new file mode 100644 index 0000000000..1c07c22d94 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPercentage.java @@ -0,0 +1,86 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Percentage complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Percentage">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Percentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTPercentage implements Locatable +{ + + @XmlAttribute(name = "val", required = true) + protected int val; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the val property. + * + */ + public int getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + */ + public void setVal(int value) { + this.val = value; + } + + public boolean isSetVal() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint2D.java new file mode 100644 index 0000000000..a178b26b19 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint2D.java @@ -0,0 +1,110 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Point2D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Point2D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="x" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />
+ *       <attribute name="y" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Point2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTPoint2D + implements Locatable +{ + + @XmlAttribute(name = "x", required = true) + protected long x; + @XmlAttribute(name = "y", required = true) + protected long y; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the x property. + * + */ + public long getX() { + return x; + } + + /** + * Sets the value of the x property. + * + */ + public void setX(long value) { + this.x = value; + } + + public boolean isSetX() { + return true; + } + + /** + * Gets the value of the y property. + * + */ + public long getY() { + return y; + } + + /** + * Sets the value of the y property. + * + */ + public void setY(long value) { + this.y = value; + } + + public boolean isSetY() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint3D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint3D.java new file mode 100644 index 0000000000..641ad4611d --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint3D.java @@ -0,0 +1,133 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Point3D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Point3D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="x" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />
+ *       <attribute name="y" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />
+ *       <attribute name="z" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Point3D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTPoint3D + implements Locatable +{ + + @XmlAttribute(name = "x", required = true) + protected long x; + @XmlAttribute(name = "y", required = true) + protected long y; + @XmlAttribute(name = "z", required = true) + protected long z; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the x property. + * + */ + public long getX() { + return x; + } + + /** + * Sets the value of the x property. + * + */ + public void setX(long value) { + this.x = value; + } + + public boolean isSetX() { + return true; + } + + /** + * Gets the value of the y property. + * + */ + public long getY() { + return y; + } + + /** + * Sets the value of the y property. + * + */ + public void setY(long value) { + this.y = value; + } + + public boolean isSetY() { + return true; + } + + /** + * Gets the value of the z property. + * + */ + public long getZ() { + return z; + } + + /** + * Sets the value of the z property. + * + */ + public void setZ(long value) { + this.z = value; + } + + public boolean isSetZ() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java new file mode 100644 index 0000000000..2c3f9b9923 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java @@ -0,0 +1,289 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_PolarAdjustHandle complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_PolarAdjustHandle">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="pos" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>
+ *       </sequence>
+ *       <attribute name="gdRefR" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />
+ *       <attribute name="minR" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="maxR" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="gdRefAng" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />
+ *       <attribute name="minAng" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />
+ *       <attribute name="maxAng" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_PolarAdjustHandle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "pos" +}) +public class CTPolarAdjustHandle implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected CTAdjPoint2D pos; + @XmlAttribute(name = "gdRefR") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String gdRefR; + @XmlAttribute(name = "minR") + protected String minR; + @XmlAttribute(name = "maxR") + protected String maxR; + @XmlAttribute(name = "gdRefAng") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String gdRefAng; + @XmlAttribute(name = "minAng") + protected String minAng; + @XmlAttribute(name = "maxAng") + protected String maxAng; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the pos property. + * + * @return + * possible object is + * {@link CTAdjPoint2D } + * + */ + public CTAdjPoint2D getPos() { + return pos; + } + + /** + * Sets the value of the pos property. + * + * @param value + * allowed object is + * {@link CTAdjPoint2D } + * + */ + public void setPos(CTAdjPoint2D value) { + this.pos = value; + } + + public boolean isSetPos() { + return (this.pos!= null); + } + + /** + * Gets the value of the gdRefR property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getGdRefR() { + return gdRefR; + } + + /** + * Sets the value of the gdRefR property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setGdRefR(String value) { + this.gdRefR = value; + } + + public boolean isSetGdRefR() { + return (this.gdRefR!= null); + } + + /** + * Gets the value of the minR property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMinR() { + return minR; + } + + /** + * Sets the value of the minR property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMinR(String value) { + this.minR = value; + } + + public boolean isSetMinR() { + return (this.minR!= null); + } + + /** + * Gets the value of the maxR property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMaxR() { + return maxR; + } + + /** + * Sets the value of the maxR property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMaxR(String value) { + this.maxR = value; + } + + public boolean isSetMaxR() { + return (this.maxR!= null); + } + + /** + * Gets the value of the gdRefAng property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getGdRefAng() { + return gdRefAng; + } + + /** + * Sets the value of the gdRefAng property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setGdRefAng(String value) { + this.gdRefAng = value; + } + + public boolean isSetGdRefAng() { + return (this.gdRefAng!= null); + } + + /** + * Gets the value of the minAng property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMinAng() { + return minAng; + } + + /** + * Sets the value of the minAng property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMinAng(String value) { + this.minAng = value; + } + + public boolean isSetMinAng() { + return (this.minAng!= null); + } + + /** + * Gets the value of the maxAng property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMaxAng() { + return maxAng; + } + + /** + * Sets the value of the maxAng property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMaxAng(String value) { + this.maxAng = value; + } + + public boolean isSetMaxAng() { + return (this.maxAng!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java new file mode 100644 index 0000000000..c544044ae3 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java @@ -0,0 +1,86 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_PositiveFixedAngle complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_PositiveFixedAngle">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_PositiveFixedAngle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTPositiveFixedAngle implements Locatable +{ + + @XmlAttribute(name = "val", required = true) + protected int val; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the val property. + * + */ + public int getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + */ + public void setVal(int value) { + this.val = value; + } + + public boolean isSetVal() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java new file mode 100644 index 0000000000..475ae740c0 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java @@ -0,0 +1,86 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_PositiveFixedPercentage complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_PositiveFixedPercentage">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedPercentage" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_PositiveFixedPercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTPositiveFixedPercentage implements Locatable +{ + + @XmlAttribute(name = "val", required = true) + protected int val; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the val property. + * + */ + public int getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + */ + public void setVal(int value) { + this.val = value; + } + + public boolean isSetVal() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositivePercentage.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositivePercentage.java new file mode 100644 index 0000000000..9d7b8b9750 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositivePercentage.java @@ -0,0 +1,86 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_PositivePercentage complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_PositivePercentage">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositivePercentage" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_PositivePercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTPositivePercentage implements Locatable +{ + + @XmlAttribute(name = "val", required = true) + protected int val; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the val property. + * + */ + public int getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + */ + public void setVal(int value) { + this.val = value; + } + + public boolean isSetVal() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java new file mode 100644 index 0000000000..f070ab75a6 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java @@ -0,0 +1,110 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_PositiveSize2D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_PositiveSize2D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="cx" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveCoordinate" />
+ *       <attribute name="cy" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveCoordinate" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_PositiveSize2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTPositiveSize2D + implements Locatable +{ + + @XmlAttribute(name = "cx", required = true) + protected long cx; + @XmlAttribute(name = "cy", required = true) + protected long cy; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the cx property. + * + */ + public long getCx() { + return cx; + } + + /** + * Sets the value of the cx property. + * + */ + public void setCx(long value) { + this.cx = value; + } + + public boolean isSetCx() { + return true; + } + + /** + * Gets the value of the cy property. + * + */ + public long getCy() { + return cy; + } + + /** + * Sets the value of the cy property. + * + */ + public void setCy(long value) { + this.cy = value; + } + + public boolean isSetCy() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetColor.java new file mode 100644 index 0000000000..5c8d53e107 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetColor.java @@ -0,0 +1,199 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_PresetColor complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_PresetColor">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="val" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PresetColorVal" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_PresetColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "egColorTransform" +}) +public class CTPresetColor implements Locatable +{ + + @XmlElementRefs({ + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + }) + protected List> egColorTransform; + @XmlAttribute(name = "val") + protected STPresetColorVal val; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the egColorTransform property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the egColorTransform property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getEGColorTransform().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} + * + * + */ + public List> getEGColorTransform() { + if (egColorTransform == null) { + egColorTransform = new ArrayList>(); + } + return this.egColorTransform; + } + + public boolean isSetEGColorTransform() { + return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty())); + } + + public void unsetEGColorTransform() { + this.egColorTransform = null; + } + + /** + * Gets the value of the val property. + * + * @return + * possible object is + * {@link STPresetColorVal } + * + */ + public STPresetColorVal getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + * @param value + * allowed object is + * {@link STPresetColorVal } + * + */ + public void setVal(STPresetColorVal value) { + this.val = value; + } + + public boolean isSetVal() { + return (this.val!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java new file mode 100644 index 0000000000..0989d29f07 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java @@ -0,0 +1,131 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_PresetGeometry2D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_PresetGeometry2D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="avLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="prst" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_ShapeType" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_PresetGeometry2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "avLst" +}) +public class CTPresetGeometry2D + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTGeomGuideList avLst; + @XmlAttribute(name = "prst", required = true) + protected STShapeType prst; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the avLst property. + * + * @return + * possible object is + * {@link CTGeomGuideList } + * + */ + public CTGeomGuideList getAvLst() { + return avLst; + } + + /** + * Sets the value of the avLst property. + * + * @param value + * allowed object is + * {@link CTGeomGuideList } + * + */ + public void setAvLst(CTGeomGuideList value) { + this.avLst = value; + } + + public boolean isSetAvLst() { + return (this.avLst!= null); + } + + /** + * Gets the value of the prst property. + * + * @return + * possible object is + * {@link STShapeType } + * + */ + public STShapeType getPrst() { + return prst; + } + + /** + * Sets the value of the prst property. + * + * @param value + * allowed object is + * {@link STShapeType } + * + */ + public void setPrst(STShapeType value) { + this.prst = value; + } + + public boolean isSetPrst() { + return (this.prst!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetTextShape.java new file mode 100644 index 0000000000..77d5e3f251 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetTextShape.java @@ -0,0 +1,131 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_PresetTextShape complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_PresetTextShape">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="avLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="prst" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_TextShapeType" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_PresetTextShape", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "avLst" +}) +public class CTPresetTextShape + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTGeomGuideList avLst; + @XmlAttribute(name = "prst", required = true) + protected STTextShapeType prst; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the avLst property. + * + * @return + * possible object is + * {@link CTGeomGuideList } + * + */ + public CTGeomGuideList getAvLst() { + return avLst; + } + + /** + * Sets the value of the avLst property. + * + * @param value + * allowed object is + * {@link CTGeomGuideList } + * + */ + public void setAvLst(CTGeomGuideList value) { + this.avLst = value; + } + + public boolean isSetAvLst() { + return (this.avLst!= null); + } + + /** + * Gets the value of the prst property. + * + * @return + * possible object is + * {@link STTextShapeType } + * + */ + public STTextShapeType getPrst() { + return prst; + } + + /** + * Sets the value of the prst property. + * + * @param value + * allowed object is + * {@link STTextShapeType } + * + */ + public void setPrst(STTextShapeType value) { + this.prst = value; + } + + public boolean isSetPrst() { + return (this.prst!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRatio.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRatio.java new file mode 100644 index 0000000000..3ea12ebe5d --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRatio.java @@ -0,0 +1,110 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Ratio complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Ratio">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="n" use="required" type="{http://www.w3.org/2001/XMLSchema}long" />
+ *       <attribute name="d" use="required" type="{http://www.w3.org/2001/XMLSchema}long" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Ratio", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTRatio + implements Locatable +{ + + @XmlAttribute(name = "n", required = true) + protected long n; + @XmlAttribute(name = "d", required = true) + protected long d; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the n property. + * + */ + public long getN() { + return n; + } + + /** + * Sets the value of the n property. + * + */ + public void setN(long value) { + this.n = value; + } + + public boolean isSetN() { + return true; + } + + /** + * Gets the value of the d property. + * + */ + public long getD() { + return d; + } + + /** + * Sets the value of the d property. + * + */ + public void setD(long value) { + this.d = value; + } + + public boolean isSetD() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRelativeRect.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRelativeRect.java new file mode 100644 index 0000000000..7d46b575ac --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRelativeRect.java @@ -0,0 +1,220 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_RelativeRect complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_RelativeRect">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="l" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" default="0" />
+ *       <attribute name="t" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" default="0" />
+ *       <attribute name="r" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" default="0" />
+ *       <attribute name="b" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" default="0" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_RelativeRect", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTRelativeRect + implements Locatable +{ + + @XmlAttribute(name = "l") + protected Integer l; + @XmlAttribute(name = "t") + protected Integer t; + @XmlAttribute(name = "r") + protected Integer r; + @XmlAttribute(name = "b") + protected Integer b; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the l property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public int getL() { + if (l == null) { + return 0; + } else { + return l; + } + } + + /** + * Sets the value of the l property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setL(int value) { + this.l = value; + } + + public boolean isSetL() { + return (this.l!= null); + } + + public void unsetL() { + this.l = null; + } + + /** + * Gets the value of the t property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public int getT() { + if (t == null) { + return 0; + } else { + return t; + } + } + + /** + * Sets the value of the t property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setT(int value) { + this.t = value; + } + + public boolean isSetT() { + return (this.t!= null); + } + + public void unsetT() { + this.t = null; + } + + /** + * Gets the value of the r property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public int getR() { + if (r == null) { + return 0; + } else { + return r; + } + } + + /** + * Sets the value of the r property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setR(int value) { + this.r = value; + } + + public boolean isSetR() { + return (this.r!= null); + } + + public void unsetR() { + this.r = null; + } + + /** + * Gets the value of the b property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public int getB() { + if (b == null) { + return 0; + } else { + return b; + } + } + + /** + * Sets the value of the b property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setB(int value) { + this.b = value; + } + + public boolean isSetB() { + return (this.b!= null); + } + + public void unsetB() { + this.b = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSRgbColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSRgbColor.java new file mode 100644 index 0000000000..d74a3527c3 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSRgbColor.java @@ -0,0 +1,202 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.HexBinaryAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_SRgbColor complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_SRgbColor">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_HexBinary3" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_SRgbColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "egColorTransform" +}) +public class CTSRgbColor implements Locatable +{ + + @XmlElementRefs({ + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + }) + protected List> egColorTransform; + @XmlAttribute(name = "val", required = true) + @XmlJavaTypeAdapter(HexBinaryAdapter.class) + protected byte[] val; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the egColorTransform property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the egColorTransform property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getEGColorTransform().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * + * + */ + public List> getEGColorTransform() { + if (egColorTransform == null) { + egColorTransform = new ArrayList>(); + } + return this.egColorTransform; + } + + public boolean isSetEGColorTransform() { + return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty())); + } + + public void unsetEGColorTransform() { + this.egColorTransform = null; + } + + /** + * Gets the value of the val property. + * + * @return + * possible object is + * {@link String } + * + */ + public byte[] getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setVal(byte[] value) { + this.val = value; + } + + public boolean isSetVal() { + return (this.val!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScRgbColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScRgbColor.java new file mode 100644 index 0000000000..80d88ccc60 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScRgbColor.java @@ -0,0 +1,237 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_ScRgbColor complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_ScRgbColor">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="r" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />
+ *       <attribute name="g" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />
+ *       <attribute name="b" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_ScRgbColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "egColorTransform" +}) +public class CTScRgbColor implements Locatable +{ + + @XmlElementRefs({ + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + }) + protected List> egColorTransform; + @XmlAttribute(name = "r", required = true) + protected int r; + @XmlAttribute(name = "g", required = true) + protected int g; + @XmlAttribute(name = "b", required = true) + protected int b; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the egColorTransform property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the egColorTransform property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getEGColorTransform().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * + * + */ + public List> getEGColorTransform() { + if (egColorTransform == null) { + egColorTransform = new ArrayList>(); + } + return this.egColorTransform; + } + + public boolean isSetEGColorTransform() { + return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty())); + } + + public void unsetEGColorTransform() { + this.egColorTransform = null; + } + + /** + * Gets the value of the r property. + * + */ + public int getR() { + return r; + } + + /** + * Sets the value of the r property. + * + */ + public void setR(int value) { + this.r = value; + } + + public boolean isSetR() { + return true; + } + + /** + * Gets the value of the g property. + * + */ + public int getG() { + return g; + } + + /** + * Sets the value of the g property. + * + */ + public void setG(int value) { + this.g = value; + } + + public boolean isSetG() { + return true; + } + + /** + * Gets the value of the b property. + * + */ + public int getB() { + return b; + } + + /** + * Sets the value of the b property. + * + */ + public void setB(int value) { + this.b = value; + } + + public boolean isSetB() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScale2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScale2D.java new file mode 100644 index 0000000000..0f00fd8400 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScale2D.java @@ -0,0 +1,131 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Scale2D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Scale2D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="sx" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Ratio"/>
+ *         <element name="sy" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Ratio"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Scale2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "sx", + "sy" +}) +public class CTScale2D + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected CTRatio sx; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected CTRatio sy; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the sx property. + * + * @return + * possible object is + * {@link CTRatio } + * + */ + public CTRatio getSx() { + return sx; + } + + /** + * Sets the value of the sx property. + * + * @param value + * allowed object is + * {@link CTRatio } + * + */ + public void setSx(CTRatio value) { + this.sx = value; + } + + public boolean isSetSx() { + return (this.sx!= null); + } + + /** + * Gets the value of the sy property. + * + * @return + * possible object is + * {@link CTRatio } + * + */ + public CTRatio getSy() { + return sy; + } + + /** + * Sets the value of the sy property. + * + * @param value + * allowed object is + * {@link CTRatio } + * + */ + public void setSy(CTRatio value) { + this.sy = value; + } + + public boolean isSetSy() { + return (this.sy!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSchemeColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSchemeColor.java new file mode 100644 index 0000000000..078e5793d3 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSchemeColor.java @@ -0,0 +1,199 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_SchemeColor complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_SchemeColor">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_SchemeColorVal" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_SchemeColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "egColorTransform" +}) +public class CTSchemeColor implements Locatable +{ + + @XmlElementRefs({ + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + }) + protected List> egColorTransform; + @XmlAttribute(name = "val", required = true) + protected STSchemeColorVal val; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the egColorTransform property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the egColorTransform property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getEGColorTransform().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * + * + */ + public List> getEGColorTransform() { + if (egColorTransform == null) { + egColorTransform = new ArrayList>(); + } + return this.egColorTransform; + } + + public boolean isSetEGColorTransform() { + return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty())); + } + + public void unsetEGColorTransform() { + this.egColorTransform = null; + } + + /** + * Gets the value of the val property. + * + * @return + * possible object is + * {@link STSchemeColorVal } + * + */ + public STSchemeColorVal getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + * @param value + * allowed object is + * {@link STSchemeColorVal } + * + */ + public void setVal(STSchemeColorVal value) { + this.val = value; + } + + public boolean isSetVal() { + return (this.val!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSphereCoords.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSphereCoords.java new file mode 100644 index 0000000000..4ea585716a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSphereCoords.java @@ -0,0 +1,133 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_SphereCoords complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_SphereCoords">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="lat" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />
+ *       <attribute name="lon" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />
+ *       <attribute name="rev" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_SphereCoords", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTSphereCoords + implements Locatable +{ + + @XmlAttribute(name = "lat", required = true) + protected int lat; + @XmlAttribute(name = "lon", required = true) + protected int lon; + @XmlAttribute(name = "rev", required = true) + protected int rev; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the lat property. + * + */ + public int getLat() { + return lat; + } + + /** + * Sets the value of the lat property. + * + */ + public void setLat(int value) { + this.lat = value; + } + + public boolean isSetLat() { + return true; + } + + /** + * Gets the value of the lon property. + * + */ + public int getLon() { + return lon; + } + + /** + * Sets the value of the lon property. + * + */ + public void setLon(int value) { + this.lon = value; + } + + public boolean isSetLon() { + return true; + } + + /** + * Gets the value of the rev property. + * + */ + public int getRev() { + return rev; + } + + /** + * Sets the value of the rev property. + * + */ + public void setRev(int value) { + this.rev = value; + } + + public boolean isSetRev() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSystemColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSystemColor.java new file mode 100644 index 0000000000..f91a719507 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSystemColor.java @@ -0,0 +1,235 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.HexBinaryAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_SystemColor complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_SystemColor">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_SystemColorVal" />
+ *       <attribute name="lastClr" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_HexBinary3" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_SystemColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "egColorTransform" +}) +public class CTSystemColor implements Locatable +{ + + @XmlElementRefs({ + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + }) + protected List> egColorTransform; + @XmlAttribute(name = "val", required = true) + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String val; + @XmlAttribute(name = "lastClr") + @XmlJavaTypeAdapter(HexBinaryAdapter.class) + protected byte[] lastClr; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the egColorTransform property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the egColorTransform property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getEGColorTransform().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * + * + */ + public List> getEGColorTransform() { + if (egColorTransform == null) { + egColorTransform = new ArrayList>(); + } + return this.egColorTransform; + } + + public boolean isSetEGColorTransform() { + return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty())); + } + + public void unsetEGColorTransform() { + this.egColorTransform = null; + } + + /** + * Gets the value of the val property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getVal() { + return val; + } + + /** + * Sets the value of the val property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setVal(String value) { + this.val = value; + } + + public boolean isSetVal() { + return (this.val!= null); + } + + /** + * Gets the value of the lastClr property. + * + * @return + * possible object is + * {@link String } + * + */ + public byte[] getLastClr() { + return lastClr; + } + + /** + * Sets the value of the lastClr property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLastClr(byte[] value) { + this.lastClr = value; + } + + public boolean isSetLastClr() { + return (this.lastClr!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTTransform2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTTransform2D.java new file mode 100644 index 0000000000..2ba4704cfa --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTTransform2D.java @@ -0,0 +1,249 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Transform2D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Transform2D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="off" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Point2D" minOccurs="0"/>
+ *         <element name="ext" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PositiveSize2D" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="rot" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Angle" default="0" />
+ *       <attribute name="flipH" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       <attribute name="flipV" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Transform2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "off", + "ext" +}) +public class CTTransform2D + implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTPoint2D off; + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") + protected CTPositiveSize2D ext; + @XmlAttribute(name = "rot") + protected Integer rot; + @XmlAttribute(name = "flipH") + protected Boolean flipH; + @XmlAttribute(name = "flipV") + protected Boolean flipV; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the off property. + * + * @return + * possible object is + * {@link CTPoint2D } + * + */ + public CTPoint2D getOff() { + return off; + } + + /** + * Sets the value of the off property. + * + * @param value + * allowed object is + * {@link CTPoint2D } + * + */ + public void setOff(CTPoint2D value) { + this.off = value; + } + + public boolean isSetOff() { + return (this.off!= null); + } + + /** + * Gets the value of the ext property. + * + * @return + * possible object is + * {@link CTPositiveSize2D } + * + */ + public CTPositiveSize2D getExt() { + return ext; + } + + /** + * Sets the value of the ext property. + * + * @param value + * allowed object is + * {@link CTPositiveSize2D } + * + */ + public void setExt(CTPositiveSize2D value) { + this.ext = value; + } + + public boolean isSetExt() { + return (this.ext!= null); + } + + /** + * Gets the value of the rot property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public int getRot() { + if (rot == null) { + return 0; + } else { + return rot; + } + } + + /** + * Sets the value of the rot property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setRot(int value) { + this.rot = value; + } + + public boolean isSetRot() { + return (this.rot!= null); + } + + public void unsetRot() { + this.rot = null; + } + + /** + * Gets the value of the flipH property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isFlipH() { + if (flipH == null) { + return false; + } else { + return flipH; + } + } + + /** + * Sets the value of the flipH property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setFlipH(boolean value) { + this.flipH = value; + } + + public boolean isSetFlipH() { + return (this.flipH!= null); + } + + public void unsetFlipH() { + this.flipH = null; + } + + /** + * Gets the value of the flipV property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isFlipV() { + if (flipV == null) { + return false; + } else { + return flipV; + } + } + + /** + * Sets the value of the flipV property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setFlipV(boolean value) { + this.flipV = value; + } + + public boolean isSetFlipV() { + return (this.flipV!= null); + } + + public void unsetFlipV() { + this.flipV = null; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTVector3D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTVector3D.java new file mode 100644 index 0000000000..53f4b8e038 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTVector3D.java @@ -0,0 +1,133 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_Vector3D complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_Vector3D">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="dx" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />
+ *       <attribute name="dy" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />
+ *       <attribute name="dz" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_Vector3D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +public class CTVector3D + implements Locatable +{ + + @XmlAttribute(name = "dx", required = true) + protected long dx; + @XmlAttribute(name = "dy", required = true) + protected long dy; + @XmlAttribute(name = "dz", required = true) + protected long dz; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the dx property. + * + */ + public long getDx() { + return dx; + } + + /** + * Sets the value of the dx property. + * + */ + public void setDx(long value) { + this.dx = value; + } + + public boolean isSetDx() { + return true; + } + + /** + * Gets the value of the dy property. + * + */ + public long getDy() { + return dy; + } + + /** + * Sets the value of the dy property. + * + */ + public void setDy(long value) { + this.dy = value; + } + + public boolean isSetDy() { + return true; + } + + /** + * Gets the value of the dz property. + * + */ + public long getDz() { + return dz; + } + + /** + * Sets the value of the dz property. + * + */ + public void setDz(long value) { + this.dz = value; + } + + public boolean isSetDz() { + return true; + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java new file mode 100644 index 0000000000..e316f77832 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java @@ -0,0 +1,289 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import com.sun.xml.internal.bind.Locatable; +import com.sun.xml.internal.bind.annotation.XmlLocation; +import org.xml.sax.Locator; + + +/** + *

Java class for CT_XYAdjustHandle complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CT_XYAdjustHandle">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="pos" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>
+ *       </sequence>
+ *       <attribute name="gdRefX" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />
+ *       <attribute name="minX" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="maxX" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="gdRefY" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />
+ *       <attribute name="minY" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *       <attribute name="maxY" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CT_XYAdjustHandle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { + "pos" +}) +public class CTXYAdjustHandle implements Locatable +{ + + @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) + protected CTAdjPoint2D pos; + @XmlAttribute(name = "gdRefX") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String gdRefX; + @XmlAttribute(name = "minX") + protected String minX; + @XmlAttribute(name = "maxX") + protected String maxX; + @XmlAttribute(name = "gdRefY") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + protected String gdRefY; + @XmlAttribute(name = "minY") + protected String minY; + @XmlAttribute(name = "maxY") + protected String maxY; + @XmlLocation + @XmlTransient + protected Locator locator; + + /** + * Gets the value of the pos property. + * + * @return + * possible object is + * {@link CTAdjPoint2D } + * + */ + public CTAdjPoint2D getPos() { + return pos; + } + + /** + * Sets the value of the pos property. + * + * @param value + * allowed object is + * {@link CTAdjPoint2D } + * + */ + public void setPos(CTAdjPoint2D value) { + this.pos = value; + } + + public boolean isSetPos() { + return (this.pos!= null); + } + + /** + * Gets the value of the gdRefX property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getGdRefX() { + return gdRefX; + } + + /** + * Sets the value of the gdRefX property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setGdRefX(String value) { + this.gdRefX = value; + } + + public boolean isSetGdRefX() { + return (this.gdRefX!= null); + } + + /** + * Gets the value of the minX property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMinX() { + return minX; + } + + /** + * Sets the value of the minX property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMinX(String value) { + this.minX = value; + } + + public boolean isSetMinX() { + return (this.minX!= null); + } + + /** + * Gets the value of the maxX property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMaxX() { + return maxX; + } + + /** + * Sets the value of the maxX property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMaxX(String value) { + this.maxX = value; + } + + public boolean isSetMaxX() { + return (this.maxX!= null); + } + + /** + * Gets the value of the gdRefY property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getGdRefY() { + return gdRefY; + } + + /** + * Sets the value of the gdRefY property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setGdRefY(String value) { + this.gdRefY = value; + } + + public boolean isSetGdRefY() { + return (this.gdRefY!= null); + } + + /** + * Gets the value of the minY property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMinY() { + return minY; + } + + /** + * Sets the value of the minY property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMinY(String value) { + this.minY = value; + } + + public boolean isSetMinY() { + return (this.minY!= null); + } + + /** + * Gets the value of the maxY property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMaxY() { + return maxY; + } + + /** + * Sets the value of the maxY property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMaxY(String value) { + this.maxY = value; + } + + public boolean isSetMaxY() { + return (this.maxY!= null); + } + + public Locator sourceLocation() { + return locator; + } + + public void setSourceLocation(Locator newLocator) { + locator = newLocator; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/ObjectFactory.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/ObjectFactory.java new file mode 100644 index 0000000000..d5c0d65f81 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/ObjectFactory.java @@ -0,0 +1,2023 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlElementDecl; +import javax.xml.bind.annotation.XmlRegistry; +import javax.xml.namespace.QName; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the org.apache.poi.sl.draw.binding package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + private final static QName _CTHslColorAlpha_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alpha"); + private final static QName _CTHslColorLum_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lum"); + private final static QName _CTHslColorGamma_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "gamma"); + private final static QName _CTHslColorInvGamma_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "invGamma"); + private final static QName _CTHslColorAlphaMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alphaMod"); + private final static QName _CTHslColorRedOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "redOff"); + private final static QName _CTHslColorAlphaOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alphaOff"); + private final static QName _CTHslColorGreenOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "greenOff"); + private final static QName _CTHslColorHue_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hue"); + private final static QName _CTHslColorRedMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "redMod"); + private final static QName _CTHslColorSatOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "satOff"); + private final static QName _CTHslColorGreenMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "greenMod"); + private final static QName _CTHslColorSat_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "sat"); + private final static QName _CTHslColorBlue_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blue"); + private final static QName _CTHslColorRed_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "red"); + private final static QName _CTHslColorSatMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "satMod"); + private final static QName _CTHslColorBlueMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blueMod"); + private final static QName _CTHslColorHueOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hueOff"); + private final static QName _CTHslColorShade_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "shade"); + private final static QName _CTHslColorLumMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lumMod"); + private final static QName _CTHslColorInv_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "inv"); + private final static QName _CTHslColorLumOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lumOff"); + private final static QName _CTHslColorTint_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tint"); + private final static QName _CTHslColorGreen_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "green"); + private final static QName _CTHslColorComp_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "comp"); + private final static QName _CTHslColorBlueOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blueOff"); + private final static QName _CTHslColorHueMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hueMod"); + private final static QName _CTHslColorGray_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "gray"); + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.poi.sl.draw.binding + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link CTPath2DQuadBezierTo } + * + */ + public CTPath2DQuadBezierTo createCTPath2DQuadBezierTo() { + return new CTPath2DQuadBezierTo(); + } + + /** + * Create an instance of {@link CTCustomGeometry2D } + * + */ + public CTCustomGeometry2D createCTCustomGeometry2D() { + return new CTCustomGeometry2D(); + } + + /** + * Create an instance of {@link CTPolarAdjustHandle } + * + */ + public CTPolarAdjustHandle createCTPolarAdjustHandle() { + return new CTPolarAdjustHandle(); + } + + /** + * Create an instance of {@link CTPath2DClose } + * + */ + public CTPath2DClose createCTPath2DClose() { + return new CTPath2DClose(); + } + + /** + * Create an instance of {@link CTPoint2D } + * + */ + public CTPoint2D createCTPoint2D() { + return new CTPoint2D(); + } + + /** + * Create an instance of {@link CTInverseTransform } + * + */ + public CTInverseTransform createCTInverseTransform() { + return new CTInverseTransform(); + } + + /** + * Create an instance of {@link CTPercentage } + * + */ + public CTPercentage createCTPercentage() { + return new CTPercentage(); + } + + /** + * Create an instance of {@link CTSystemColor } + * + */ + public CTSystemColor createCTSystemColor() { + return new CTSystemColor(); + } + + /** + * Create an instance of {@link CTConnectionSite } + * + */ + public CTConnectionSite createCTConnectionSite() { + return new CTConnectionSite(); + } + + /** + * Create an instance of {@link CTColor } + * + */ + public CTColor createCTColor() { + return new CTColor(); + } + + /** + * Create an instance of {@link CTPositiveFixedAngle } + * + */ + public CTPositiveFixedAngle createCTPositiveFixedAngle() { + return new CTPositiveFixedAngle(); + } + + /** + * Create an instance of {@link CTFixedPercentage } + * + */ + public CTFixedPercentage createCTFixedPercentage() { + return new CTFixedPercentage(); + } + + /** + * Create an instance of {@link CTHslColor } + * + */ + public CTHslColor createCTHslColor() { + return new CTHslColor(); + } + + /** + * Create an instance of {@link CTConnection } + * + */ + public CTConnection createCTConnection() { + return new CTConnection(); + } + + /** + * Create an instance of {@link CTPath2DLineTo } + * + */ + public CTPath2DLineTo createCTPath2DLineTo() { + return new CTPath2DLineTo(); + } + + /** + * Create an instance of {@link CTTransform2D } + * + */ + public CTTransform2D createCTTransform2D() { + return new CTTransform2D(); + } + + /** + * Create an instance of {@link CTPositivePercentage } + * + */ + public CTPositivePercentage createCTPositivePercentage() { + return new CTPositivePercentage(); + } + + /** + * Create an instance of {@link CTVector3D } + * + */ + public CTVector3D createCTVector3D() { + return new CTVector3D(); + } + + /** + * Create an instance of {@link CTSphereCoords } + * + */ + public CTSphereCoords createCTSphereCoords() { + return new CTSphereCoords(); + } + + /** + * Create an instance of {@link CTPath2D } + * + */ + public CTPath2D createCTPath2D() { + return new CTPath2D(); + } + + /** + * Create an instance of {@link CTGroupTransform2D } + * + */ + public CTGroupTransform2D createCTGroupTransform2D() { + return new CTGroupTransform2D(); + } + + /** + * Create an instance of {@link CTGrayscaleTransform } + * + */ + public CTGrayscaleTransform createCTGrayscaleTransform() { + return new CTGrayscaleTransform(); + } + + /** + * Create an instance of {@link CTRatio } + * + */ + public CTRatio createCTRatio() { + return new CTRatio(); + } + + /** + * Create an instance of {@link CTSRgbColor } + * + */ + public CTSRgbColor createCTSRgbColor() { + return new CTSRgbColor(); + } + + /** + * Create an instance of {@link CTGeomGuideList } + * + */ + public CTGeomGuideList createCTGeomGuideList() { + return new CTGeomGuideList(); + } + + /** + * Create an instance of {@link CTComplementTransform } + * + */ + public CTComplementTransform createCTComplementTransform() { + return new CTComplementTransform(); + } + + /** + * Create an instance of {@link CTPath2DCubicBezierTo } + * + */ + public CTPath2DCubicBezierTo createCTPath2DCubicBezierTo() { + return new CTPath2DCubicBezierTo(); + } + + /** + * Create an instance of {@link CTXYAdjustHandle } + * + */ + public CTXYAdjustHandle createCTXYAdjustHandle() { + return new CTXYAdjustHandle(); + } + + /** + * Create an instance of {@link CTPresetColor } + * + */ + public CTPresetColor createCTPresetColor() { + return new CTPresetColor(); + } + + /** + * Create an instance of {@link CTOfficeArtExtension } + * + */ + public CTOfficeArtExtension createCTOfficeArtExtension() { + return new CTOfficeArtExtension(); + } + + /** + * Create an instance of {@link CTSchemeColor } + * + */ + public CTSchemeColor createCTSchemeColor() { + return new CTSchemeColor(); + } + + /** + * Create an instance of {@link CTConnectionSiteList } + * + */ + public CTConnectionSiteList createCTConnectionSiteList() { + return new CTConnectionSiteList(); + } + + /** + * Create an instance of {@link CTPath2DArcTo } + * + */ + public CTPath2DArcTo createCTPath2DArcTo() { + return new CTPath2DArcTo(); + } + + /** + * Create an instance of {@link CTPath2DList } + * + */ + public CTPath2DList createCTPath2DList() { + return new CTPath2DList(); + } + + /** + * Create an instance of {@link CTAngle } + * + */ + public CTAngle createCTAngle() { + return new CTAngle(); + } + + /** + * Create an instance of {@link CTScale2D } + * + */ + public CTScale2D createCTScale2D() { + return new CTScale2D(); + } + + /** + * Create an instance of {@link CTPositiveSize2D } + * + */ + public CTPositiveSize2D createCTPositiveSize2D() { + return new CTPositiveSize2D(); + } + + /** + * Create an instance of {@link CTOfficeArtExtensionList } + * + */ + public CTOfficeArtExtensionList createCTOfficeArtExtensionList() { + return new CTOfficeArtExtensionList(); + } + + /** + * Create an instance of {@link CTHyperlink } + * + */ + public CTHyperlink createCTHyperlink() { + return new CTHyperlink(); + } + + /** + * Create an instance of {@link CTPoint3D } + * + */ + public CTPoint3D createCTPoint3D() { + return new CTPoint3D(); + } + + /** + * Create an instance of {@link CTInverseGammaTransform } + * + */ + public CTInverseGammaTransform createCTInverseGammaTransform() { + return new CTInverseGammaTransform(); + } + + /** + * Create an instance of {@link CTPositiveFixedPercentage } + * + */ + public CTPositiveFixedPercentage createCTPositiveFixedPercentage() { + return new CTPositiveFixedPercentage(); + } + + /** + * Create an instance of {@link CTGeomRect } + * + */ + public CTGeomRect createCTGeomRect() { + return new CTGeomRect(); + } + + /** + * Create an instance of {@link CTPresetTextShape } + * + */ + public CTPresetTextShape createCTPresetTextShape() { + return new CTPresetTextShape(); + } + + /** + * Create an instance of {@link CTColorMRU } + * + */ + public CTColorMRU createCTColorMRU() { + return new CTColorMRU(); + } + + /** + * Create an instance of {@link CTPath2DMoveTo } + * + */ + public CTPath2DMoveTo createCTPath2DMoveTo() { + return new CTPath2DMoveTo(); + } + + /** + * Create an instance of {@link CTEmbeddedWAVAudioFile } + * + */ + public CTEmbeddedWAVAudioFile createCTEmbeddedWAVAudioFile() { + return new CTEmbeddedWAVAudioFile(); + } + + /** + * Create an instance of {@link CTScRgbColor } + * + */ + public CTScRgbColor createCTScRgbColor() { + return new CTScRgbColor(); + } + + /** + * Create an instance of {@link CTPresetGeometry2D } + * + */ + public CTPresetGeometry2D createCTPresetGeometry2D() { + return new CTPresetGeometry2D(); + } + + /** + * Create an instance of {@link CTGeomGuide } + * + */ + public CTGeomGuide createCTGeomGuide() { + return new CTGeomGuide(); + } + + /** + * Create an instance of {@link CTRelativeRect } + * + */ + public CTRelativeRect createCTRelativeRect() { + return new CTRelativeRect(); + } + + /** + * Create an instance of {@link CTAdjustHandleList } + * + */ + public CTAdjustHandleList createCTAdjustHandleList() { + return new CTAdjustHandleList(); + } + + /** + * Create an instance of {@link CTAdjPoint2D } + * + */ + public CTAdjPoint2D createCTAdjPoint2D() { + return new CTAdjPoint2D(); + } + + /** + * Create an instance of {@link CTGammaTransform } + * + */ + public CTGammaTransform createCTGammaTransform() { + return new CTGammaTransform(); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTHslColor.class) + public JAXBElement createCTHslColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTHslColor.class) + public JAXBElement createCTHslColorLum(CTPercentage value) { + return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTHslColor.class) + public JAXBElement createCTHslColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTHslColor.class) + public JAXBElement createCTHslColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorRedOff(CTPercentage value) { + return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTHslColor.class) + public JAXBElement createCTHslColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorRedMod(CTPercentage value) { + return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorSatOff(CTPercentage value) { + return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTHslColor.class) + public JAXBElement createCTHslColorSat(CTPercentage value) { + return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTHslColor.class) + public JAXBElement createCTHslColorBlue(CTPercentage value) { + return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTHslColor.class) + public JAXBElement createCTHslColorRed(CTPercentage value) { + return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorSatMod(CTPercentage value) { + return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorHueOff(CTAngle value) { + return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTHslColor.class) + public JAXBElement createCTHslColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorLumMod(CTPercentage value) { + return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTHslColor.class) + public JAXBElement createCTHslColorInv(CTInverseTransform value) { + return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorLumOff(CTPercentage value) { + return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTHslColor.class) + public JAXBElement createCTHslColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTHslColor.class) + public JAXBElement createCTHslColorGreen(CTPercentage value) { + return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTHslColor.class) + public JAXBElement createCTHslColorComp(CTComplementTransform value) { + return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTHslColor.class) + public JAXBElement createCTHslColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorLum(CTPercentage value) { + return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorRedOff(CTPercentage value) { + return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorRedMod(CTPercentage value) { + return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorSatOff(CTPercentage value) { + return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorSat(CTPercentage value) { + return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorBlue(CTPercentage value) { + return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorRed(CTPercentage value) { + return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorSatMod(CTPercentage value) { + return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorHueOff(CTAngle value) { + return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorLumMod(CTPercentage value) { + return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorInv(CTInverseTransform value) { + return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorLumOff(CTPercentage value) { + return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGreen(CTPercentage value) { + return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorComp(CTComplementTransform value) { + return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorLum(CTPercentage value) { + return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorRedOff(CTPercentage value) { + return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorRedMod(CTPercentage value) { + return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorSatOff(CTPercentage value) { + return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorSat(CTPercentage value) { + return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorBlue(CTPercentage value) { + return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorRed(CTPercentage value) { + return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorSatMod(CTPercentage value) { + return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorHueOff(CTAngle value) { + return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorLumMod(CTPercentage value) { + return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorInv(CTInverseTransform value) { + return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorLumOff(CTPercentage value) { + return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGreen(CTPercentage value) { + return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorComp(CTComplementTransform value) { + return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorLum(CTPercentage value) { + return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorRedOff(CTPercentage value) { + return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorRedMod(CTPercentage value) { + return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorSatOff(CTPercentage value) { + return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorSat(CTPercentage value) { + return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorBlue(CTPercentage value) { + return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorRed(CTPercentage value) { + return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorSatMod(CTPercentage value) { + return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorHueOff(CTAngle value) { + return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorLumMod(CTPercentage value) { + return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorInv(CTInverseTransform value) { + return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorLumOff(CTPercentage value) { + return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGreen(CTPercentage value) { + return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorComp(CTComplementTransform value) { + return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorLum(CTPercentage value) { + return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorRedOff(CTPercentage value) { + return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorRedMod(CTPercentage value) { + return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorSatOff(CTPercentage value) { + return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorSat(CTPercentage value) { + return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorBlue(CTPercentage value) { + return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorRed(CTPercentage value) { + return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorSatMod(CTPercentage value) { + return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorHueOff(CTAngle value) { + return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorLumMod(CTPercentage value) { + return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorInv(CTInverseTransform value) { + return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorLumOff(CTPercentage value) { + return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorGreen(CTPercentage value) { + return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorComp(CTComplementTransform value) { + return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorLum(CTPercentage value) { + return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorRedOff(CTPercentage value) { + return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorRedMod(CTPercentage value) { + return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorSatOff(CTPercentage value) { + return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorSat(CTPercentage value) { + return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorBlue(CTPercentage value) { + return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorRed(CTPercentage value) { + return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorSatMod(CTPercentage value) { + return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorHueOff(CTAngle value) { + return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorLumMod(CTPercentage value) { + return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorInv(CTInverseTransform value) { + return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorLumOff(CTPercentage value) { + return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorGreen(CTPercentage value) { + return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorComp(CTComplementTransform value) { + return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTPresetColor.class, value); + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/STBlackWhiteMode.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STBlackWhiteMode.java new file mode 100644 index 0000000000..27262d6060 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STBlackWhiteMode.java @@ -0,0 +1,149 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for ST_BlackWhiteMode. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="ST_BlackWhiteMode">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}token">
+ *     <enumeration value="clr"/>
+ *     <enumeration value="auto"/>
+ *     <enumeration value="gray"/>
+ *     <enumeration value="ltGray"/>
+ *     <enumeration value="invGray"/>
+ *     <enumeration value="grayWhite"/>
+ *     <enumeration value="blackGray"/>
+ *     <enumeration value="blackWhite"/>
+ *     <enumeration value="black"/>
+ *     <enumeration value="white"/>
+ *     <enumeration value="hidden"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "ST_BlackWhiteMode", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +@XmlEnum +public enum STBlackWhiteMode { + + + /** + * Color + * + */ + @XmlEnumValue("clr") + CLR("clr"), + + /** + * Automatic + * + */ + @XmlEnumValue("auto") + AUTO("auto"), + + /** + * Gray + * + */ + @XmlEnumValue("gray") + GRAY("gray"), + + /** + * Light Gray + * + */ + @XmlEnumValue("ltGray") + LT_GRAY("ltGray"), + + /** + * Inverse Gray + * + */ + @XmlEnumValue("invGray") + INV_GRAY("invGray"), + + /** + * Gray and White + * + */ + @XmlEnumValue("grayWhite") + GRAY_WHITE("grayWhite"), + + /** + * Black and Gray + * + */ + @XmlEnumValue("blackGray") + BLACK_GRAY("blackGray"), + + /** + * Black and White + * + */ + @XmlEnumValue("blackWhite") + BLACK_WHITE("blackWhite"), + + /** + * Black + * + */ + @XmlEnumValue("black") + BLACK("black"), + + /** + * White + * + */ + @XmlEnumValue("white") + WHITE("white"), + + /** + * Hidden + * + */ + @XmlEnumValue("hidden") + HIDDEN("hidden"); + private final String value; + + STBlackWhiteMode(String v) { + value = v; + } + + public String value() { + return value; + } + + public static STBlackWhiteMode fromValue(String v) { + for (STBlackWhiteMode c: STBlackWhiteMode.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/STPathFillMode.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STPathFillMode.java new file mode 100644 index 0000000000..8a26458f02 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STPathFillMode.java @@ -0,0 +1,109 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for ST_PathFillMode. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="ST_PathFillMode">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}token">
+ *     <enumeration value="none"/>
+ *     <enumeration value="norm"/>
+ *     <enumeration value="lighten"/>
+ *     <enumeration value="lightenLess"/>
+ *     <enumeration value="darken"/>
+ *     <enumeration value="darkenLess"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "ST_PathFillMode", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +@XmlEnum +public enum STPathFillMode { + + + /** + * No Path Fill + * + */ + @XmlEnumValue("none") + NONE("none"), + + /** + * Normal Path Fill + * + */ + @XmlEnumValue("norm") + NORM("norm"), + + /** + * Lighten Path Fill + * + */ + @XmlEnumValue("lighten") + LIGHTEN("lighten"), + + /** + * Lighten Path Fill Less + * + */ + @XmlEnumValue("lightenLess") + LIGHTEN_LESS("lightenLess"), + + /** + * Darken Path Fill + * + */ + @XmlEnumValue("darken") + DARKEN("darken"), + + /** + * Darken Path Fill Less + * + */ + @XmlEnumValue("darkenLess") + DARKEN_LESS("darkenLess"); + private final String value; + + STPathFillMode(String v) { + value = v; + } + + public String value() { + return value; + } + + public static STPathFillMode fromValue(String v) { + for (STPathFillMode c: STPathFillMode.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/STPresetColorVal.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STPresetColorVal.java new file mode 100644 index 0000000000..7450ac656c --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STPresetColorVal.java @@ -0,0 +1,1181 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for ST_PresetColorVal. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="ST_PresetColorVal">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}token">
+ *     <enumeration value="aliceBlue"/>
+ *     <enumeration value="antiqueWhite"/>
+ *     <enumeration value="aqua"/>
+ *     <enumeration value="aquamarine"/>
+ *     <enumeration value="azure"/>
+ *     <enumeration value="beige"/>
+ *     <enumeration value="bisque"/>
+ *     <enumeration value="black"/>
+ *     <enumeration value="blanchedAlmond"/>
+ *     <enumeration value="blue"/>
+ *     <enumeration value="blueViolet"/>
+ *     <enumeration value="brown"/>
+ *     <enumeration value="burlyWood"/>
+ *     <enumeration value="cadetBlue"/>
+ *     <enumeration value="chartreuse"/>
+ *     <enumeration value="chocolate"/>
+ *     <enumeration value="coral"/>
+ *     <enumeration value="cornflowerBlue"/>
+ *     <enumeration value="cornsilk"/>
+ *     <enumeration value="crimson"/>
+ *     <enumeration value="cyan"/>
+ *     <enumeration value="dkBlue"/>
+ *     <enumeration value="dkCyan"/>
+ *     <enumeration value="dkGoldenrod"/>
+ *     <enumeration value="dkGray"/>
+ *     <enumeration value="dkGreen"/>
+ *     <enumeration value="dkKhaki"/>
+ *     <enumeration value="dkMagenta"/>
+ *     <enumeration value="dkOliveGreen"/>
+ *     <enumeration value="dkOrange"/>
+ *     <enumeration value="dkOrchid"/>
+ *     <enumeration value="dkRed"/>
+ *     <enumeration value="dkSalmon"/>
+ *     <enumeration value="dkSeaGreen"/>
+ *     <enumeration value="dkSlateBlue"/>
+ *     <enumeration value="dkSlateGray"/>
+ *     <enumeration value="dkTurquoise"/>
+ *     <enumeration value="dkViolet"/>
+ *     <enumeration value="deepPink"/>
+ *     <enumeration value="deepSkyBlue"/>
+ *     <enumeration value="dimGray"/>
+ *     <enumeration value="dodgerBlue"/>
+ *     <enumeration value="firebrick"/>
+ *     <enumeration value="floralWhite"/>
+ *     <enumeration value="forestGreen"/>
+ *     <enumeration value="fuchsia"/>
+ *     <enumeration value="gainsboro"/>
+ *     <enumeration value="ghostWhite"/>
+ *     <enumeration value="gold"/>
+ *     <enumeration value="goldenrod"/>
+ *     <enumeration value="gray"/>
+ *     <enumeration value="green"/>
+ *     <enumeration value="greenYellow"/>
+ *     <enumeration value="honeydew"/>
+ *     <enumeration value="hotPink"/>
+ *     <enumeration value="indianRed"/>
+ *     <enumeration value="indigo"/>
+ *     <enumeration value="ivory"/>
+ *     <enumeration value="khaki"/>
+ *     <enumeration value="lavender"/>
+ *     <enumeration value="lavenderBlush"/>
+ *     <enumeration value="lawnGreen"/>
+ *     <enumeration value="lemonChiffon"/>
+ *     <enumeration value="ltBlue"/>
+ *     <enumeration value="ltCoral"/>
+ *     <enumeration value="ltCyan"/>
+ *     <enumeration value="ltGoldenrodYellow"/>
+ *     <enumeration value="ltGray"/>
+ *     <enumeration value="ltGreen"/>
+ *     <enumeration value="ltPink"/>
+ *     <enumeration value="ltSalmon"/>
+ *     <enumeration value="ltSeaGreen"/>
+ *     <enumeration value="ltSkyBlue"/>
+ *     <enumeration value="ltSlateGray"/>
+ *     <enumeration value="ltSteelBlue"/>
+ *     <enumeration value="ltYellow"/>
+ *     <enumeration value="lime"/>
+ *     <enumeration value="limeGreen"/>
+ *     <enumeration value="linen"/>
+ *     <enumeration value="magenta"/>
+ *     <enumeration value="maroon"/>
+ *     <enumeration value="medAquamarine"/>
+ *     <enumeration value="medBlue"/>
+ *     <enumeration value="medOrchid"/>
+ *     <enumeration value="medPurple"/>
+ *     <enumeration value="medSeaGreen"/>
+ *     <enumeration value="medSlateBlue"/>
+ *     <enumeration value="medSpringGreen"/>
+ *     <enumeration value="medTurquoise"/>
+ *     <enumeration value="medVioletRed"/>
+ *     <enumeration value="midnightBlue"/>
+ *     <enumeration value="mintCream"/>
+ *     <enumeration value="mistyRose"/>
+ *     <enumeration value="moccasin"/>
+ *     <enumeration value="navajoWhite"/>
+ *     <enumeration value="navy"/>
+ *     <enumeration value="oldLace"/>
+ *     <enumeration value="olive"/>
+ *     <enumeration value="oliveDrab"/>
+ *     <enumeration value="orange"/>
+ *     <enumeration value="orangeRed"/>
+ *     <enumeration value="orchid"/>
+ *     <enumeration value="paleGoldenrod"/>
+ *     <enumeration value="paleGreen"/>
+ *     <enumeration value="paleTurquoise"/>
+ *     <enumeration value="paleVioletRed"/>
+ *     <enumeration value="papayaWhip"/>
+ *     <enumeration value="peachPuff"/>
+ *     <enumeration value="peru"/>
+ *     <enumeration value="pink"/>
+ *     <enumeration value="plum"/>
+ *     <enumeration value="powderBlue"/>
+ *     <enumeration value="purple"/>
+ *     <enumeration value="red"/>
+ *     <enumeration value="rosyBrown"/>
+ *     <enumeration value="royalBlue"/>
+ *     <enumeration value="saddleBrown"/>
+ *     <enumeration value="salmon"/>
+ *     <enumeration value="sandyBrown"/>
+ *     <enumeration value="seaGreen"/>
+ *     <enumeration value="seaShell"/>
+ *     <enumeration value="sienna"/>
+ *     <enumeration value="silver"/>
+ *     <enumeration value="skyBlue"/>
+ *     <enumeration value="slateBlue"/>
+ *     <enumeration value="slateGray"/>
+ *     <enumeration value="snow"/>
+ *     <enumeration value="springGreen"/>
+ *     <enumeration value="steelBlue"/>
+ *     <enumeration value="tan"/>
+ *     <enumeration value="teal"/>
+ *     <enumeration value="thistle"/>
+ *     <enumeration value="tomato"/>
+ *     <enumeration value="turquoise"/>
+ *     <enumeration value="violet"/>
+ *     <enumeration value="wheat"/>
+ *     <enumeration value="white"/>
+ *     <enumeration value="whiteSmoke"/>
+ *     <enumeration value="yellow"/>
+ *     <enumeration value="yellowGreen"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "ST_PresetColorVal", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +@XmlEnum +public enum STPresetColorVal { + + + /** + * Alice Blue Preset Color + * + */ + @XmlEnumValue("aliceBlue") + ALICE_BLUE("aliceBlue"), + + /** + * Antique White Preset Color + * + */ + @XmlEnumValue("antiqueWhite") + ANTIQUE_WHITE("antiqueWhite"), + + /** + * Aqua Preset Color + * + */ + @XmlEnumValue("aqua") + AQUA("aqua"), + + /** + * Aquamarine Preset Color + * + */ + @XmlEnumValue("aquamarine") + AQUAMARINE("aquamarine"), + + /** + * Azure Preset Color + * + */ + @XmlEnumValue("azure") + AZURE("azure"), + + /** + * Beige Preset Color + * + */ + @XmlEnumValue("beige") + BEIGE("beige"), + + /** + * Bisque Preset Color + * + */ + @XmlEnumValue("bisque") + BISQUE("bisque"), + + /** + * Black Preset Color + * + */ + @XmlEnumValue("black") + BLACK("black"), + + /** + * Blanched Almond Preset Color + * + */ + @XmlEnumValue("blanchedAlmond") + BLANCHED_ALMOND("blanchedAlmond"), + + /** + * Blue Preset Color + * + */ + @XmlEnumValue("blue") + BLUE("blue"), + + /** + * Blue Violet Preset Color + * + */ + @XmlEnumValue("blueViolet") + BLUE_VIOLET("blueViolet"), + + /** + * Brown Preset Color + * + */ + @XmlEnumValue("brown") + BROWN("brown"), + + /** + * Burly Wood Preset Color + * + */ + @XmlEnumValue("burlyWood") + BURLY_WOOD("burlyWood"), + + /** + * Cadet Blue Preset Color + * + */ + @XmlEnumValue("cadetBlue") + CADET_BLUE("cadetBlue"), + + /** + * Chartreuse Preset Color + * + */ + @XmlEnumValue("chartreuse") + CHARTREUSE("chartreuse"), + + /** + * Chocolate Preset Color + * + */ + @XmlEnumValue("chocolate") + CHOCOLATE("chocolate"), + + /** + * Coral Preset Color + * + */ + @XmlEnumValue("coral") + CORAL("coral"), + + /** + * Cornflower Blue Preset Color + * + */ + @XmlEnumValue("cornflowerBlue") + CORNFLOWER_BLUE("cornflowerBlue"), + + /** + * Cornsilk Preset Color + * + */ + @XmlEnumValue("cornsilk") + CORNSILK("cornsilk"), + + /** + * Crimson Preset Color + * + */ + @XmlEnumValue("crimson") + CRIMSON("crimson"), + + /** + * Cyan Preset Color + * + */ + @XmlEnumValue("cyan") + CYAN("cyan"), + + /** + * Dark Blue Preset Color + * + */ + @XmlEnumValue("dkBlue") + DK_BLUE("dkBlue"), + + /** + * Dark Cyan Preset Color + * + */ + @XmlEnumValue("dkCyan") + DK_CYAN("dkCyan"), + + /** + * Dark Goldenrod Preset Color + * + */ + @XmlEnumValue("dkGoldenrod") + DK_GOLDENROD("dkGoldenrod"), + + /** + * Dark Gray Preset Color + * + */ + @XmlEnumValue("dkGray") + DK_GRAY("dkGray"), + + /** + * Dark Green Preset Color + * + */ + @XmlEnumValue("dkGreen") + DK_GREEN("dkGreen"), + + /** + * Dark Khaki Preset Color + * + */ + @XmlEnumValue("dkKhaki") + DK_KHAKI("dkKhaki"), + + /** + * Dark Magenta Preset Color + * + */ + @XmlEnumValue("dkMagenta") + DK_MAGENTA("dkMagenta"), + + /** + * Dark Olive Green Preset Color + * + */ + @XmlEnumValue("dkOliveGreen") + DK_OLIVE_GREEN("dkOliveGreen"), + + /** + * Dark Orange Preset Color + * + */ + @XmlEnumValue("dkOrange") + DK_ORANGE("dkOrange"), + + /** + * Dark Orchid Preset Color + * + */ + @XmlEnumValue("dkOrchid") + DK_ORCHID("dkOrchid"), + + /** + * Dark Red Preset Color + * + */ + @XmlEnumValue("dkRed") + DK_RED("dkRed"), + + /** + * Dark Salmon Preset Color + * + */ + @XmlEnumValue("dkSalmon") + DK_SALMON("dkSalmon"), + + /** + * Dark Sea Green Preset Color + * + */ + @XmlEnumValue("dkSeaGreen") + DK_SEA_GREEN("dkSeaGreen"), + + /** + * Dark Slate Blue Preset Color + * + */ + @XmlEnumValue("dkSlateBlue") + DK_SLATE_BLUE("dkSlateBlue"), + + /** + * Dark Slate Gray Preset Color + * + */ + @XmlEnumValue("dkSlateGray") + DK_SLATE_GRAY("dkSlateGray"), + + /** + * Dark Turquoise Preset Color + * + */ + @XmlEnumValue("dkTurquoise") + DK_TURQUOISE("dkTurquoise"), + + /** + * Dark Violet Preset Color + * + */ + @XmlEnumValue("dkViolet") + DK_VIOLET("dkViolet"), + + /** + * Deep Pink Preset Color + * + */ + @XmlEnumValue("deepPink") + DEEP_PINK("deepPink"), + + /** + * Deep Sky Blue Preset Color + * + */ + @XmlEnumValue("deepSkyBlue") + DEEP_SKY_BLUE("deepSkyBlue"), + + /** + * Dim Gray Preset Color + * + */ + @XmlEnumValue("dimGray") + DIM_GRAY("dimGray"), + + /** + * Dodger Blue Preset Color + * + */ + @XmlEnumValue("dodgerBlue") + DODGER_BLUE("dodgerBlue"), + + /** + * Firebrick Preset Color + * + */ + @XmlEnumValue("firebrick") + FIREBRICK("firebrick"), + + /** + * Floral White Preset Color + * + */ + @XmlEnumValue("floralWhite") + FLORAL_WHITE("floralWhite"), + + /** + * Forest Green Preset Color + * + */ + @XmlEnumValue("forestGreen") + FOREST_GREEN("forestGreen"), + + /** + * Fuchsia Preset Color + * + */ + @XmlEnumValue("fuchsia") + FUCHSIA("fuchsia"), + + /** + * Gainsboro Preset Color + * + */ + @XmlEnumValue("gainsboro") + GAINSBORO("gainsboro"), + + /** + * Ghost White Preset Color + * + */ + @XmlEnumValue("ghostWhite") + GHOST_WHITE("ghostWhite"), + + /** + * Gold Preset Color + * + */ + @XmlEnumValue("gold") + GOLD("gold"), + + /** + * Goldenrod Preset Color + * + */ + @XmlEnumValue("goldenrod") + GOLDENROD("goldenrod"), + + /** + * Gray Preset Color + * + */ + @XmlEnumValue("gray") + GRAY("gray"), + + /** + * Green Preset Color + * + */ + @XmlEnumValue("green") + GREEN("green"), + + /** + * Green Yellow Preset Color + * + */ + @XmlEnumValue("greenYellow") + GREEN_YELLOW("greenYellow"), + + /** + * Honeydew Preset Color + * + */ + @XmlEnumValue("honeydew") + HONEYDEW("honeydew"), + + /** + * Hot Pink Preset Color + * + */ + @XmlEnumValue("hotPink") + HOT_PINK("hotPink"), + + /** + * Indian Red Preset Color + * + */ + @XmlEnumValue("indianRed") + INDIAN_RED("indianRed"), + + /** + * Indigo Preset Color + * + */ + @XmlEnumValue("indigo") + INDIGO("indigo"), + + /** + * Ivory Preset Color + * + */ + @XmlEnumValue("ivory") + IVORY("ivory"), + + /** + * Khaki Preset Color + * + */ + @XmlEnumValue("khaki") + KHAKI("khaki"), + + /** + * Lavender Preset Color + * + */ + @XmlEnumValue("lavender") + LAVENDER("lavender"), + + /** + * Lavender Blush Preset Color + * + */ + @XmlEnumValue("lavenderBlush") + LAVENDER_BLUSH("lavenderBlush"), + + /** + * Lawn Green Preset Color + * + */ + @XmlEnumValue("lawnGreen") + LAWN_GREEN("lawnGreen"), + + /** + * Lemon Chiffon Preset Color + * + */ + @XmlEnumValue("lemonChiffon") + LEMON_CHIFFON("lemonChiffon"), + + /** + * Light Blue Preset Color + * + */ + @XmlEnumValue("ltBlue") + LT_BLUE("ltBlue"), + + /** + * Light Coral Preset Color + * + */ + @XmlEnumValue("ltCoral") + LT_CORAL("ltCoral"), + + /** + * Light Cyan Preset Color + * + */ + @XmlEnumValue("ltCyan") + LT_CYAN("ltCyan"), + + /** + * Light Goldenrod Yellow Preset Color + * + */ + @XmlEnumValue("ltGoldenrodYellow") + LT_GOLDENROD_YELLOW("ltGoldenrodYellow"), + + /** + * Light Gray Preset Color + * + */ + @XmlEnumValue("ltGray") + LT_GRAY("ltGray"), + + /** + * Light Green Preset Color + * + */ + @XmlEnumValue("ltGreen") + LT_GREEN("ltGreen"), + + /** + * Light Pink Preset Color + * + */ + @XmlEnumValue("ltPink") + LT_PINK("ltPink"), + + /** + * Light Salmon Preset Color + * + */ + @XmlEnumValue("ltSalmon") + LT_SALMON("ltSalmon"), + + /** + * Light Sea Green Preset Color + * + */ + @XmlEnumValue("ltSeaGreen") + LT_SEA_GREEN("ltSeaGreen"), + + /** + * Light Sky Blue Preset Color + * + */ + @XmlEnumValue("ltSkyBlue") + LT_SKY_BLUE("ltSkyBlue"), + + /** + * Light Slate Gray Preset Color + * + */ + @XmlEnumValue("ltSlateGray") + LT_SLATE_GRAY("ltSlateGray"), + + /** + * Light Steel Blue Preset Color + * + */ + @XmlEnumValue("ltSteelBlue") + LT_STEEL_BLUE("ltSteelBlue"), + + /** + * Light Yellow Preset Color + * + */ + @XmlEnumValue("ltYellow") + LT_YELLOW("ltYellow"), + + /** + * Lime Preset Color + * + */ + @XmlEnumValue("lime") + LIME("lime"), + + /** + * Lime Green Preset Color + * + */ + @XmlEnumValue("limeGreen") + LIME_GREEN("limeGreen"), + + /** + * Linen Preset Color + * + */ + @XmlEnumValue("linen") + LINEN("linen"), + + /** + * Magenta Preset Color + * + */ + @XmlEnumValue("magenta") + MAGENTA("magenta"), + + /** + * Maroon Preset Color + * + */ + @XmlEnumValue("maroon") + MAROON("maroon"), + + /** + * Medium Aquamarine Preset Color + * + */ + @XmlEnumValue("medAquamarine") + MED_AQUAMARINE("medAquamarine"), + + /** + * Medium Blue Preset Color + * + */ + @XmlEnumValue("medBlue") + MED_BLUE("medBlue"), + + /** + * Medium Orchid Preset Color + * + */ + @XmlEnumValue("medOrchid") + MED_ORCHID("medOrchid"), + + /** + * Medium Purple Preset Color + * + */ + @XmlEnumValue("medPurple") + MED_PURPLE("medPurple"), + + /** + * Medium Sea Green Preset Color + * + */ + @XmlEnumValue("medSeaGreen") + MED_SEA_GREEN("medSeaGreen"), + + /** + * Medium Slate Blue Preset Color + * + */ + @XmlEnumValue("medSlateBlue") + MED_SLATE_BLUE("medSlateBlue"), + + /** + * Medium Spring Green Preset Color + * + */ + @XmlEnumValue("medSpringGreen") + MED_SPRING_GREEN("medSpringGreen"), + + /** + * Medium Turquoise Preset Color + * + */ + @XmlEnumValue("medTurquoise") + MED_TURQUOISE("medTurquoise"), + + /** + * Medium Violet Red Preset Color + * + */ + @XmlEnumValue("medVioletRed") + MED_VIOLET_RED("medVioletRed"), + + /** + * Midnight Blue Preset Color + * + */ + @XmlEnumValue("midnightBlue") + MIDNIGHT_BLUE("midnightBlue"), + + /** + * Mint Cream Preset Color + * + */ + @XmlEnumValue("mintCream") + MINT_CREAM("mintCream"), + + /** + * Misty Rose Preset Color + * + */ + @XmlEnumValue("mistyRose") + MISTY_ROSE("mistyRose"), + + /** + * Moccasin Preset Color + * + */ + @XmlEnumValue("moccasin") + MOCCASIN("moccasin"), + + /** + * Navajo White Preset Color + * + */ + @XmlEnumValue("navajoWhite") + NAVAJO_WHITE("navajoWhite"), + + /** + * Navy Preset Color + * + */ + @XmlEnumValue("navy") + NAVY("navy"), + + /** + * Old Lace Preset Color + * + */ + @XmlEnumValue("oldLace") + OLD_LACE("oldLace"), + + /** + * Olive Preset Color + * + */ + @XmlEnumValue("olive") + OLIVE("olive"), + + /** + * Olive Drab Preset Color + * + */ + @XmlEnumValue("oliveDrab") + OLIVE_DRAB("oliveDrab"), + + /** + * Orange Preset Color + * + */ + @XmlEnumValue("orange") + ORANGE("orange"), + + /** + * Orange Red Preset Color + * + */ + @XmlEnumValue("orangeRed") + ORANGE_RED("orangeRed"), + + /** + * Orchid Preset Color + * + */ + @XmlEnumValue("orchid") + ORCHID("orchid"), + + /** + * Pale Goldenrod Preset Color + * + */ + @XmlEnumValue("paleGoldenrod") + PALE_GOLDENROD("paleGoldenrod"), + + /** + * Pale Green Preset Color + * + */ + @XmlEnumValue("paleGreen") + PALE_GREEN("paleGreen"), + + /** + * Pale Turquoise Preset Color + * + */ + @XmlEnumValue("paleTurquoise") + PALE_TURQUOISE("paleTurquoise"), + + /** + * Pale Violet Red Preset Color + * + */ + @XmlEnumValue("paleVioletRed") + PALE_VIOLET_RED("paleVioletRed"), + + /** + * Papaya Whip Preset Color + * + */ + @XmlEnumValue("papayaWhip") + PAPAYA_WHIP("papayaWhip"), + + /** + * Peach Puff Preset Color + * + */ + @XmlEnumValue("peachPuff") + PEACH_PUFF("peachPuff"), + + /** + * Peru Preset Color + * + */ + @XmlEnumValue("peru") + PERU("peru"), + + /** + * Pink Preset Color + * + */ + @XmlEnumValue("pink") + PINK("pink"), + + /** + * Plum Preset Color + * + */ + @XmlEnumValue("plum") + PLUM("plum"), + + /** + * Powder Blue Preset Color + * + */ + @XmlEnumValue("powderBlue") + POWDER_BLUE("powderBlue"), + + /** + * Purple Preset Color + * + */ + @XmlEnumValue("purple") + PURPLE("purple"), + + /** + * Red Preset Color + * + */ + @XmlEnumValue("red") + RED("red"), + + /** + * Rosy Brown Preset Color + * + */ + @XmlEnumValue("rosyBrown") + ROSY_BROWN("rosyBrown"), + + /** + * Royal Blue Preset Color + * + */ + @XmlEnumValue("royalBlue") + ROYAL_BLUE("royalBlue"), + + /** + * Saddle Brown Preset Color + * + */ + @XmlEnumValue("saddleBrown") + SADDLE_BROWN("saddleBrown"), + + /** + * Salmon Preset Color + * + */ + @XmlEnumValue("salmon") + SALMON("salmon"), + + /** + * Sandy Brown Preset Color + * + */ + @XmlEnumValue("sandyBrown") + SANDY_BROWN("sandyBrown"), + + /** + * Sea Green Preset Color + * + */ + @XmlEnumValue("seaGreen") + SEA_GREEN("seaGreen"), + + /** + * Sea Shell Preset Color + * + */ + @XmlEnumValue("seaShell") + SEA_SHELL("seaShell"), + + /** + * Sienna Preset Color + * + */ + @XmlEnumValue("sienna") + SIENNA("sienna"), + + /** + * Silver Preset Color + * + */ + @XmlEnumValue("silver") + SILVER("silver"), + + /** + * Sky Blue Preset Color + * + */ + @XmlEnumValue("skyBlue") + SKY_BLUE("skyBlue"), + + /** + * Slate Blue Preset Color + * + */ + @XmlEnumValue("slateBlue") + SLATE_BLUE("slateBlue"), + + /** + * Slate Gray Preset Color + * + */ + @XmlEnumValue("slateGray") + SLATE_GRAY("slateGray"), + + /** + * Snow Preset Color + * + */ + @XmlEnumValue("snow") + SNOW("snow"), + + /** + * Spring Green Preset Color + * + */ + @XmlEnumValue("springGreen") + SPRING_GREEN("springGreen"), + + /** + * Steel Blue Preset Color + * + */ + @XmlEnumValue("steelBlue") + STEEL_BLUE("steelBlue"), + + /** + * Tan Preset Color + * + */ + @XmlEnumValue("tan") + TAN("tan"), + + /** + * Teal Preset Color + * + */ + @XmlEnumValue("teal") + TEAL("teal"), + + /** + * Thistle Preset Color + * + */ + @XmlEnumValue("thistle") + THISTLE("thistle"), + + /** + * Tomato Preset Color + * + */ + @XmlEnumValue("tomato") + TOMATO("tomato"), + + /** + * Turquoise Preset Color + * + */ + @XmlEnumValue("turquoise") + TURQUOISE("turquoise"), + + /** + * Violet Preset Color + * + */ + @XmlEnumValue("violet") + VIOLET("violet"), + + /** + * Wheat Preset Color + * + */ + @XmlEnumValue("wheat") + WHEAT("wheat"), + + /** + * White Preset Color + * + */ + @XmlEnumValue("white") + WHITE("white"), + + /** + * White Smoke Preset Color + * + */ + @XmlEnumValue("whiteSmoke") + WHITE_SMOKE("whiteSmoke"), + + /** + * Yellow Preset Color + * + */ + @XmlEnumValue("yellow") + YELLOW("yellow"), + + /** + * Yellow Green Preset Color + * + */ + @XmlEnumValue("yellowGreen") + YELLOW_GREEN("yellowGreen"); + private final String value; + + STPresetColorVal(String v) { + value = v; + } + + public String value() { + return value; + } + + public static STPresetColorVal fromValue(String v) { + for (STPresetColorVal c: STPresetColorVal.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/STRectAlignment.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STRectAlignment.java new file mode 100644 index 0000000000..688a166baf --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STRectAlignment.java @@ -0,0 +1,133 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for ST_RectAlignment. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="ST_RectAlignment">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}token">
+ *     <enumeration value="tl"/>
+ *     <enumeration value="t"/>
+ *     <enumeration value="tr"/>
+ *     <enumeration value="l"/>
+ *     <enumeration value="ctr"/>
+ *     <enumeration value="r"/>
+ *     <enumeration value="bl"/>
+ *     <enumeration value="b"/>
+ *     <enumeration value="br"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "ST_RectAlignment", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +@XmlEnum +public enum STRectAlignment { + + + /** + * Rectangle Alignment Enum ( Top Left ) + * + */ + @XmlEnumValue("tl") + TL("tl"), + + /** + * Rectangle Alignment Enum ( Top ) + * + */ + @XmlEnumValue("t") + T("t"), + + /** + * Rectangle Alignment Enum ( Top Right ) + * + */ + @XmlEnumValue("tr") + TR("tr"), + + /** + * Rectangle Alignment Enum ( Left ) + * + */ + @XmlEnumValue("l") + L("l"), + + /** + * Rectangle Alignment Enum ( Center ) + * + */ + @XmlEnumValue("ctr") + CTR("ctr"), + + /** + * Rectangle Alignment Enum ( Right ) + * + */ + @XmlEnumValue("r") + R("r"), + + /** + * Rectangle Alignment Enum ( Bottom Left ) + * + */ + @XmlEnumValue("bl") + BL("bl"), + + /** + * Rectangle Alignment Enum ( Bottom ) + * + */ + @XmlEnumValue("b") + B("b"), + + /** + * Rectangle Alignment Enum ( Bottom Right ) + * + */ + @XmlEnumValue("br") + BR("br"); + private final String value; + + STRectAlignment(String v) { + value = v; + } + + public String value() { + return value; + } + + public static STRectAlignment fromValue(String v) { + for (STRectAlignment c: STRectAlignment.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/STSchemeColorVal.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STSchemeColorVal.java new file mode 100644 index 0000000000..84b88075f1 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STSchemeColorVal.java @@ -0,0 +1,197 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for ST_SchemeColorVal. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="ST_SchemeColorVal">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}token">
+ *     <enumeration value="bg1"/>
+ *     <enumeration value="tx1"/>
+ *     <enumeration value="bg2"/>
+ *     <enumeration value="tx2"/>
+ *     <enumeration value="accent1"/>
+ *     <enumeration value="accent2"/>
+ *     <enumeration value="accent3"/>
+ *     <enumeration value="accent4"/>
+ *     <enumeration value="accent5"/>
+ *     <enumeration value="accent6"/>
+ *     <enumeration value="hlink"/>
+ *     <enumeration value="folHlink"/>
+ *     <enumeration value="phClr"/>
+ *     <enumeration value="dk1"/>
+ *     <enumeration value="lt1"/>
+ *     <enumeration value="dk2"/>
+ *     <enumeration value="lt2"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "ST_SchemeColorVal", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +@XmlEnum +public enum STSchemeColorVal { + + + /** + * Background Color 1 + * + */ + @XmlEnumValue("bg1") + BG_1("bg1"), + + /** + * Text Color 1 + * + */ + @XmlEnumValue("tx1") + TX_1("tx1"), + + /** + * Background Color 2 + * + */ + @XmlEnumValue("bg2") + BG_2("bg2"), + + /** + * Text Color 2 + * + */ + @XmlEnumValue("tx2") + TX_2("tx2"), + + /** + * Accent Color 1 + * + */ + @XmlEnumValue("accent1") + ACCENT_1("accent1"), + + /** + * Accent Color 2 + * + */ + @XmlEnumValue("accent2") + ACCENT_2("accent2"), + + /** + * Accent Color 3 + * + */ + @XmlEnumValue("accent3") + ACCENT_3("accent3"), + + /** + * Accent Color 4 + * + */ + @XmlEnumValue("accent4") + ACCENT_4("accent4"), + + /** + * Accent Color 5 + * + */ + @XmlEnumValue("accent5") + ACCENT_5("accent5"), + + /** + * Accent Color 6 + * + */ + @XmlEnumValue("accent6") + ACCENT_6("accent6"), + + /** + * Hyperlink Color + * + */ + @XmlEnumValue("hlink") + HLINK("hlink"), + + /** + * Followed Hyperlink Color + * + */ + @XmlEnumValue("folHlink") + FOL_HLINK("folHlink"), + + /** + * Style Color + * + */ + @XmlEnumValue("phClr") + PH_CLR("phClr"), + + /** + * Dark Color 1 + * + */ + @XmlEnumValue("dk1") + DK_1("dk1"), + + /** + * Light Color 1 + * + */ + @XmlEnumValue("lt1") + LT_1("lt1"), + + /** + * Dark Color 2 + * + */ + @XmlEnumValue("dk2") + DK_2("dk2"), + + /** + * Light Color 2 + * + */ + @XmlEnumValue("lt2") + LT_2("lt2"); + private final String value; + + STSchemeColorVal(String v) { + value = v; + } + + public String value() { + return value; + } + + public static STSchemeColorVal fromValue(String v) { + for (STSchemeColorVal c: STSchemeColorVal.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/STShapeType.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STShapeType.java new file mode 100644 index 0000000000..559b0a1591 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STShapeType.java @@ -0,0 +1,1557 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for ST_ShapeType. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="ST_ShapeType">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}token">
+ *     <enumeration value="line"/>
+ *     <enumeration value="lineInv"/>
+ *     <enumeration value="triangle"/>
+ *     <enumeration value="rtTriangle"/>
+ *     <enumeration value="rect"/>
+ *     <enumeration value="diamond"/>
+ *     <enumeration value="parallelogram"/>
+ *     <enumeration value="trapezoid"/>
+ *     <enumeration value="nonIsoscelesTrapezoid"/>
+ *     <enumeration value="pentagon"/>
+ *     <enumeration value="hexagon"/>
+ *     <enumeration value="heptagon"/>
+ *     <enumeration value="octagon"/>
+ *     <enumeration value="decagon"/>
+ *     <enumeration value="dodecagon"/>
+ *     <enumeration value="star4"/>
+ *     <enumeration value="star5"/>
+ *     <enumeration value="star6"/>
+ *     <enumeration value="star7"/>
+ *     <enumeration value="star8"/>
+ *     <enumeration value="star10"/>
+ *     <enumeration value="star12"/>
+ *     <enumeration value="star16"/>
+ *     <enumeration value="star24"/>
+ *     <enumeration value="star32"/>
+ *     <enumeration value="roundRect"/>
+ *     <enumeration value="round1Rect"/>
+ *     <enumeration value="round2SameRect"/>
+ *     <enumeration value="round2DiagRect"/>
+ *     <enumeration value="snipRoundRect"/>
+ *     <enumeration value="snip1Rect"/>
+ *     <enumeration value="snip2SameRect"/>
+ *     <enumeration value="snip2DiagRect"/>
+ *     <enumeration value="plaque"/>
+ *     <enumeration value="ellipse"/>
+ *     <enumeration value="teardrop"/>
+ *     <enumeration value="homePlate"/>
+ *     <enumeration value="chevron"/>
+ *     <enumeration value="pieWedge"/>
+ *     <enumeration value="pie"/>
+ *     <enumeration value="blockArc"/>
+ *     <enumeration value="donut"/>
+ *     <enumeration value="noSmoking"/>
+ *     <enumeration value="rightArrow"/>
+ *     <enumeration value="leftArrow"/>
+ *     <enumeration value="upArrow"/>
+ *     <enumeration value="downArrow"/>
+ *     <enumeration value="stripedRightArrow"/>
+ *     <enumeration value="notchedRightArrow"/>
+ *     <enumeration value="bentUpArrow"/>
+ *     <enumeration value="leftRightArrow"/>
+ *     <enumeration value="upDownArrow"/>
+ *     <enumeration value="leftUpArrow"/>
+ *     <enumeration value="leftRightUpArrow"/>
+ *     <enumeration value="quadArrow"/>
+ *     <enumeration value="leftArrowCallout"/>
+ *     <enumeration value="rightArrowCallout"/>
+ *     <enumeration value="upArrowCallout"/>
+ *     <enumeration value="downArrowCallout"/>
+ *     <enumeration value="leftRightArrowCallout"/>
+ *     <enumeration value="upDownArrowCallout"/>
+ *     <enumeration value="quadArrowCallout"/>
+ *     <enumeration value="bentArrow"/>
+ *     <enumeration value="uturnArrow"/>
+ *     <enumeration value="circularArrow"/>
+ *     <enumeration value="leftCircularArrow"/>
+ *     <enumeration value="leftRightCircularArrow"/>
+ *     <enumeration value="curvedRightArrow"/>
+ *     <enumeration value="curvedLeftArrow"/>
+ *     <enumeration value="curvedUpArrow"/>
+ *     <enumeration value="curvedDownArrow"/>
+ *     <enumeration value="swooshArrow"/>
+ *     <enumeration value="cube"/>
+ *     <enumeration value="can"/>
+ *     <enumeration value="lightningBolt"/>
+ *     <enumeration value="heart"/>
+ *     <enumeration value="sun"/>
+ *     <enumeration value="moon"/>
+ *     <enumeration value="smileyFace"/>
+ *     <enumeration value="irregularSeal1"/>
+ *     <enumeration value="irregularSeal2"/>
+ *     <enumeration value="foldedCorner"/>
+ *     <enumeration value="bevel"/>
+ *     <enumeration value="frame"/>
+ *     <enumeration value="halfFrame"/>
+ *     <enumeration value="corner"/>
+ *     <enumeration value="diagStripe"/>
+ *     <enumeration value="chord"/>
+ *     <enumeration value="arc"/>
+ *     <enumeration value="leftBracket"/>
+ *     <enumeration value="rightBracket"/>
+ *     <enumeration value="leftBrace"/>
+ *     <enumeration value="rightBrace"/>
+ *     <enumeration value="bracketPair"/>
+ *     <enumeration value="bracePair"/>
+ *     <enumeration value="straightConnector1"/>
+ *     <enumeration value="bentConnector2"/>
+ *     <enumeration value="bentConnector3"/>
+ *     <enumeration value="bentConnector4"/>
+ *     <enumeration value="bentConnector5"/>
+ *     <enumeration value="curvedConnector2"/>
+ *     <enumeration value="curvedConnector3"/>
+ *     <enumeration value="curvedConnector4"/>
+ *     <enumeration value="curvedConnector5"/>
+ *     <enumeration value="callout1"/>
+ *     <enumeration value="callout2"/>
+ *     <enumeration value="callout3"/>
+ *     <enumeration value="accentCallout1"/>
+ *     <enumeration value="accentCallout2"/>
+ *     <enumeration value="accentCallout3"/>
+ *     <enumeration value="borderCallout1"/>
+ *     <enumeration value="borderCallout2"/>
+ *     <enumeration value="borderCallout3"/>
+ *     <enumeration value="accentBorderCallout1"/>
+ *     <enumeration value="accentBorderCallout2"/>
+ *     <enumeration value="accentBorderCallout3"/>
+ *     <enumeration value="wedgeRectCallout"/>
+ *     <enumeration value="wedgeRoundRectCallout"/>
+ *     <enumeration value="wedgeEllipseCallout"/>
+ *     <enumeration value="cloudCallout"/>
+ *     <enumeration value="cloud"/>
+ *     <enumeration value="ribbon"/>
+ *     <enumeration value="ribbon2"/>
+ *     <enumeration value="ellipseRibbon"/>
+ *     <enumeration value="ellipseRibbon2"/>
+ *     <enumeration value="leftRightRibbon"/>
+ *     <enumeration value="verticalScroll"/>
+ *     <enumeration value="horizontalScroll"/>
+ *     <enumeration value="wave"/>
+ *     <enumeration value="doubleWave"/>
+ *     <enumeration value="plus"/>
+ *     <enumeration value="flowChartProcess"/>
+ *     <enumeration value="flowChartDecision"/>
+ *     <enumeration value="flowChartInputOutput"/>
+ *     <enumeration value="flowChartPredefinedProcess"/>
+ *     <enumeration value="flowChartInternalStorage"/>
+ *     <enumeration value="flowChartDocument"/>
+ *     <enumeration value="flowChartMultidocument"/>
+ *     <enumeration value="flowChartTerminator"/>
+ *     <enumeration value="flowChartPreparation"/>
+ *     <enumeration value="flowChartManualInput"/>
+ *     <enumeration value="flowChartManualOperation"/>
+ *     <enumeration value="flowChartConnector"/>
+ *     <enumeration value="flowChartPunchedCard"/>
+ *     <enumeration value="flowChartPunchedTape"/>
+ *     <enumeration value="flowChartSummingJunction"/>
+ *     <enumeration value="flowChartOr"/>
+ *     <enumeration value="flowChartCollate"/>
+ *     <enumeration value="flowChartSort"/>
+ *     <enumeration value="flowChartExtract"/>
+ *     <enumeration value="flowChartMerge"/>
+ *     <enumeration value="flowChartOfflineStorage"/>
+ *     <enumeration value="flowChartOnlineStorage"/>
+ *     <enumeration value="flowChartMagneticTape"/>
+ *     <enumeration value="flowChartMagneticDisk"/>
+ *     <enumeration value="flowChartMagneticDrum"/>
+ *     <enumeration value="flowChartDisplay"/>
+ *     <enumeration value="flowChartDelay"/>
+ *     <enumeration value="flowChartAlternateProcess"/>
+ *     <enumeration value="flowChartOffpageConnector"/>
+ *     <enumeration value="actionButtonBlank"/>
+ *     <enumeration value="actionButtonHome"/>
+ *     <enumeration value="actionButtonHelp"/>
+ *     <enumeration value="actionButtonInformation"/>
+ *     <enumeration value="actionButtonForwardNext"/>
+ *     <enumeration value="actionButtonBackPrevious"/>
+ *     <enumeration value="actionButtonEnd"/>
+ *     <enumeration value="actionButtonBeginning"/>
+ *     <enumeration value="actionButtonReturn"/>
+ *     <enumeration value="actionButtonDocument"/>
+ *     <enumeration value="actionButtonSound"/>
+ *     <enumeration value="actionButtonMovie"/>
+ *     <enumeration value="gear6"/>
+ *     <enumeration value="gear9"/>
+ *     <enumeration value="funnel"/>
+ *     <enumeration value="mathPlus"/>
+ *     <enumeration value="mathMinus"/>
+ *     <enumeration value="mathMultiply"/>
+ *     <enumeration value="mathDivide"/>
+ *     <enumeration value="mathEqual"/>
+ *     <enumeration value="mathNotEqual"/>
+ *     <enumeration value="cornerTabs"/>
+ *     <enumeration value="squareTabs"/>
+ *     <enumeration value="plaqueTabs"/>
+ *     <enumeration value="chartX"/>
+ *     <enumeration value="chartStar"/>
+ *     <enumeration value="chartPlus"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "ST_ShapeType", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +@XmlEnum +public enum STShapeType { + + + /** + * Line Shape + * + */ + @XmlEnumValue("line") + LINE("line"), + + /** + * Line Inverse Shape + * + */ + @XmlEnumValue("lineInv") + LINE_INV("lineInv"), + + /** + * Triangle Shape + * + */ + @XmlEnumValue("triangle") + TRIANGLE("triangle"), + + /** + * Right Triangle Shape + * + */ + @XmlEnumValue("rtTriangle") + RT_TRIANGLE("rtTriangle"), + + /** + * Rectangle Shape + * + */ + @XmlEnumValue("rect") + RECT("rect"), + + /** + * Diamond Shape + * + */ + @XmlEnumValue("diamond") + DIAMOND("diamond"), + + /** + * Parallelogram Shape + * + */ + @XmlEnumValue("parallelogram") + PARALLELOGRAM("parallelogram"), + + /** + * Trapezoid Shape + * + */ + @XmlEnumValue("trapezoid") + TRAPEZOID("trapezoid"), + + /** + * Non-Isosceles Trapezoid Shape + * + */ + @XmlEnumValue("nonIsoscelesTrapezoid") + NON_ISOSCELES_TRAPEZOID("nonIsoscelesTrapezoid"), + + /** + * Pentagon Shape + * + */ + @XmlEnumValue("pentagon") + PENTAGON("pentagon"), + + /** + * Hexagon Shape + * + */ + @XmlEnumValue("hexagon") + HEXAGON("hexagon"), + + /** + * Heptagon Shape + * + */ + @XmlEnumValue("heptagon") + HEPTAGON("heptagon"), + + /** + * Octagon Shape + * + */ + @XmlEnumValue("octagon") + OCTAGON("octagon"), + + /** + * Decagon Shape + * + */ + @XmlEnumValue("decagon") + DECAGON("decagon"), + + /** + * Dodecagon Shape + * + */ + @XmlEnumValue("dodecagon") + DODECAGON("dodecagon"), + + /** + * Four Pointed Star Shape + * + */ + @XmlEnumValue("star4") + STAR_4("star4"), + + /** + * Five Pointed Star Shape + * + */ + @XmlEnumValue("star5") + STAR_5("star5"), + + /** + * Six Pointed Star Shape + * + */ + @XmlEnumValue("star6") + STAR_6("star6"), + + /** + * Seven Pointed Star Shape + * + */ + @XmlEnumValue("star7") + STAR_7("star7"), + + /** + * Eight Pointed Star Shape + * + */ + @XmlEnumValue("star8") + STAR_8("star8"), + + /** + * Ten Pointed Star Shape + * + */ + @XmlEnumValue("star10") + STAR_10("star10"), + + /** + * Twelve Pointed Star Shape + * + */ + @XmlEnumValue("star12") + STAR_12("star12"), + + /** + * Sixteen Pointed Star Shape + * + */ + @XmlEnumValue("star16") + STAR_16("star16"), + + /** + * Twenty Four Pointed Star Shape + * + */ + @XmlEnumValue("star24") + STAR_24("star24"), + + /** + * Thirty Two Pointed Star Shape + * + */ + @XmlEnumValue("star32") + STAR_32("star32"), + + /** + * Round Corner Rectangle Shape + * + */ + @XmlEnumValue("roundRect") + ROUND_RECT("roundRect"), + + /** + * One Round Corner Rectangle Shape + * + */ + @XmlEnumValue("round1Rect") + ROUND_1_RECT("round1Rect"), + + /** + * Two Same-side Round Corner Rectangle Shape + * + */ + @XmlEnumValue("round2SameRect") + ROUND_2_SAME_RECT("round2SameRect"), + + /** + * Two Diagonal Round Corner Rectangle Shape + * + */ + @XmlEnumValue("round2DiagRect") + ROUND_2_DIAG_RECT("round2DiagRect"), + + /** + * One Snip One Round Corner Rectangle Shape + * + */ + @XmlEnumValue("snipRoundRect") + SNIP_ROUND_RECT("snipRoundRect"), + + /** + * One Snip Corner Rectangle Shape + * + */ + @XmlEnumValue("snip1Rect") + SNIP_1_RECT("snip1Rect"), + + /** + * Two Same-side Snip Corner Rectangle Shape + * + */ + @XmlEnumValue("snip2SameRect") + SNIP_2_SAME_RECT("snip2SameRect"), + + /** + * Two Diagonal Snip Corner Rectangle Shape + * + */ + @XmlEnumValue("snip2DiagRect") + SNIP_2_DIAG_RECT("snip2DiagRect"), + + /** + * Plaque Shape + * + */ + @XmlEnumValue("plaque") + PLAQUE("plaque"), + + /** + * Ellipse Shape + * + */ + @XmlEnumValue("ellipse") + ELLIPSE("ellipse"), + + /** + * Teardrop Shape + * + */ + @XmlEnumValue("teardrop") + TEARDROP("teardrop"), + + /** + * Home Plate Shape + * + */ + @XmlEnumValue("homePlate") + HOME_PLATE("homePlate"), + + /** + * Chevron Shape + * + */ + @XmlEnumValue("chevron") + CHEVRON("chevron"), + + /** + * Pie Wedge Shape + * + */ + @XmlEnumValue("pieWedge") + PIE_WEDGE("pieWedge"), + + /** + * Pie Shape + * + */ + @XmlEnumValue("pie") + PIE("pie"), + + /** + * Block Arc Shape + * + */ + @XmlEnumValue("blockArc") + BLOCK_ARC("blockArc"), + + /** + * Donut Shape + * + */ + @XmlEnumValue("donut") + DONUT("donut"), + + /** + * No Smoking Shape + * + */ + @XmlEnumValue("noSmoking") + NO_SMOKING("noSmoking"), + + /** + * Right Arrow Shape + * + */ + @XmlEnumValue("rightArrow") + RIGHT_ARROW("rightArrow"), + + /** + * Left Arrow Shape + * + */ + @XmlEnumValue("leftArrow") + LEFT_ARROW("leftArrow"), + + /** + * Up Arrow Shape + * + */ + @XmlEnumValue("upArrow") + UP_ARROW("upArrow"), + + /** + * Down Arrow Shape + * + */ + @XmlEnumValue("downArrow") + DOWN_ARROW("downArrow"), + + /** + * Striped Right Arrow Shape + * + */ + @XmlEnumValue("stripedRightArrow") + STRIPED_RIGHT_ARROW("stripedRightArrow"), + + /** + * Notched Right Arrow Shape + * + */ + @XmlEnumValue("notchedRightArrow") + NOTCHED_RIGHT_ARROW("notchedRightArrow"), + + /** + * Bent Up Arrow Shape + * + */ + @XmlEnumValue("bentUpArrow") + BENT_UP_ARROW("bentUpArrow"), + + /** + * Left Right Arrow Shape + * + */ + @XmlEnumValue("leftRightArrow") + LEFT_RIGHT_ARROW("leftRightArrow"), + + /** + * Up Down Arrow Shape + * + */ + @XmlEnumValue("upDownArrow") + UP_DOWN_ARROW("upDownArrow"), + + /** + * Left Up Arrow Shape + * + */ + @XmlEnumValue("leftUpArrow") + LEFT_UP_ARROW("leftUpArrow"), + + /** + * Left Right Up Arrow Shape + * + */ + @XmlEnumValue("leftRightUpArrow") + LEFT_RIGHT_UP_ARROW("leftRightUpArrow"), + + /** + * Quad-Arrow Shape + * + */ + @XmlEnumValue("quadArrow") + QUAD_ARROW("quadArrow"), + + /** + * Callout Left Arrow Shape + * + */ + @XmlEnumValue("leftArrowCallout") + LEFT_ARROW_CALLOUT("leftArrowCallout"), + + /** + * Callout Right Arrow Shape + * + */ + @XmlEnumValue("rightArrowCallout") + RIGHT_ARROW_CALLOUT("rightArrowCallout"), + + /** + * Callout Up Arrow Shape + * + */ + @XmlEnumValue("upArrowCallout") + UP_ARROW_CALLOUT("upArrowCallout"), + + /** + * Callout Down Arrow Shape + * + */ + @XmlEnumValue("downArrowCallout") + DOWN_ARROW_CALLOUT("downArrowCallout"), + + /** + * Callout Left Right Arrow Shape + * + */ + @XmlEnumValue("leftRightArrowCallout") + LEFT_RIGHT_ARROW_CALLOUT("leftRightArrowCallout"), + + /** + * Callout Up Down Arrow Shape + * + */ + @XmlEnumValue("upDownArrowCallout") + UP_DOWN_ARROW_CALLOUT("upDownArrowCallout"), + + /** + * Callout Quad-Arrow Shape + * + */ + @XmlEnumValue("quadArrowCallout") + QUAD_ARROW_CALLOUT("quadArrowCallout"), + + /** + * Bent Arrow Shape + * + */ + @XmlEnumValue("bentArrow") + BENT_ARROW("bentArrow"), + + /** + * U-Turn Arrow Shape + * + */ + @XmlEnumValue("uturnArrow") + UTURN_ARROW("uturnArrow"), + + /** + * Circular Arrow Shape + * + */ + @XmlEnumValue("circularArrow") + CIRCULAR_ARROW("circularArrow"), + + /** + * Left Circular Arrow Shape + * + */ + @XmlEnumValue("leftCircularArrow") + LEFT_CIRCULAR_ARROW("leftCircularArrow"), + + /** + * Left Right Circular Arrow Shape + * + */ + @XmlEnumValue("leftRightCircularArrow") + LEFT_RIGHT_CIRCULAR_ARROW("leftRightCircularArrow"), + + /** + * Curved Right Arrow Shape + * + */ + @XmlEnumValue("curvedRightArrow") + CURVED_RIGHT_ARROW("curvedRightArrow"), + + /** + * Curved Left Arrow Shape + * + */ + @XmlEnumValue("curvedLeftArrow") + CURVED_LEFT_ARROW("curvedLeftArrow"), + + /** + * Curved Up Arrow Shape + * + */ + @XmlEnumValue("curvedUpArrow") + CURVED_UP_ARROW("curvedUpArrow"), + + /** + * Curved Down Arrow Shape + * + */ + @XmlEnumValue("curvedDownArrow") + CURVED_DOWN_ARROW("curvedDownArrow"), + + /** + * Swoosh Arrow Shape + * + */ + @XmlEnumValue("swooshArrow") + SWOOSH_ARROW("swooshArrow"), + + /** + * Cube Shape + * + */ + @XmlEnumValue("cube") + CUBE("cube"), + + /** + * Can Shape + * + */ + @XmlEnumValue("can") + CAN("can"), + + /** + * Lightning Bolt Shape + * + */ + @XmlEnumValue("lightningBolt") + LIGHTNING_BOLT("lightningBolt"), + + /** + * Heart Shape + * + */ + @XmlEnumValue("heart") + HEART("heart"), + + /** + * Sun Shape + * + */ + @XmlEnumValue("sun") + SUN("sun"), + + /** + * Moon Shape + * + */ + @XmlEnumValue("moon") + MOON("moon"), + + /** + * Smiley Face Shape + * + */ + @XmlEnumValue("smileyFace") + SMILEY_FACE("smileyFace"), + + /** + * Irregular Seal 1 Shape + * + */ + @XmlEnumValue("irregularSeal1") + IRREGULAR_SEAL_1("irregularSeal1"), + + /** + * Irregular Seal 2 Shape + * + */ + @XmlEnumValue("irregularSeal2") + IRREGULAR_SEAL_2("irregularSeal2"), + + /** + * Folded Corner Shape + * + */ + @XmlEnumValue("foldedCorner") + FOLDED_CORNER("foldedCorner"), + + /** + * Bevel Shape + * + */ + @XmlEnumValue("bevel") + BEVEL("bevel"), + + /** + * Frame Shape + * + */ + @XmlEnumValue("frame") + FRAME("frame"), + + /** + * Half Frame Shape + * + */ + @XmlEnumValue("halfFrame") + HALF_FRAME("halfFrame"), + + /** + * Corner Shape + * + */ + @XmlEnumValue("corner") + CORNER("corner"), + + /** + * Diagonal Stripe Shape + * + */ + @XmlEnumValue("diagStripe") + DIAG_STRIPE("diagStripe"), + + /** + * Chord Shape + * + */ + @XmlEnumValue("chord") + CHORD("chord"), + + /** + * Curved Arc Shape + * + */ + @XmlEnumValue("arc") + ARC("arc"), + + /** + * Left Bracket Shape + * + */ + @XmlEnumValue("leftBracket") + LEFT_BRACKET("leftBracket"), + + /** + * Right Bracket Shape + * + */ + @XmlEnumValue("rightBracket") + RIGHT_BRACKET("rightBracket"), + + /** + * Left Brace Shape + * + */ + @XmlEnumValue("leftBrace") + LEFT_BRACE("leftBrace"), + + /** + * Right Brace Shape + * + */ + @XmlEnumValue("rightBrace") + RIGHT_BRACE("rightBrace"), + + /** + * Bracket Pair Shape + * + */ + @XmlEnumValue("bracketPair") + BRACKET_PAIR("bracketPair"), + + /** + * Brace Pair Shape + * + */ + @XmlEnumValue("bracePair") + BRACE_PAIR("bracePair"), + + /** + * Straight Connector 1 Shape + * + */ + @XmlEnumValue("straightConnector1") + STRAIGHT_CONNECTOR_1("straightConnector1"), + + /** + * Bent Connector 2 Shape + * + */ + @XmlEnumValue("bentConnector2") + BENT_CONNECTOR_2("bentConnector2"), + + /** + * Bent Connector 3 Shape + * + */ + @XmlEnumValue("bentConnector3") + BENT_CONNECTOR_3("bentConnector3"), + + /** + * Bent Connector 4 Shape + * + */ + @XmlEnumValue("bentConnector4") + BENT_CONNECTOR_4("bentConnector4"), + + /** + * Bent Connector 5 Shape + * + */ + @XmlEnumValue("bentConnector5") + BENT_CONNECTOR_5("bentConnector5"), + + /** + * Curved Connector 2 Shape + * + */ + @XmlEnumValue("curvedConnector2") + CURVED_CONNECTOR_2("curvedConnector2"), + + /** + * Curved Connector 3 Shape + * + */ + @XmlEnumValue("curvedConnector3") + CURVED_CONNECTOR_3("curvedConnector3"), + + /** + * Curved Connector 4 Shape + * + */ + @XmlEnumValue("curvedConnector4") + CURVED_CONNECTOR_4("curvedConnector4"), + + /** + * Curved Connector 5 Shape + * + */ + @XmlEnumValue("curvedConnector5") + CURVED_CONNECTOR_5("curvedConnector5"), + + /** + * Callout 1 Shape + * + */ + @XmlEnumValue("callout1") + CALLOUT_1("callout1"), + + /** + * Callout 2 Shape + * + */ + @XmlEnumValue("callout2") + CALLOUT_2("callout2"), + + /** + * Callout 3 Shape + * + */ + @XmlEnumValue("callout3") + CALLOUT_3("callout3"), + + /** + * Callout 1 Shape + * + */ + @XmlEnumValue("accentCallout1") + ACCENT_CALLOUT_1("accentCallout1"), + + /** + * Callout 2 Shape + * + */ + @XmlEnumValue("accentCallout2") + ACCENT_CALLOUT_2("accentCallout2"), + + /** + * Callout 3 Shape + * + */ + @XmlEnumValue("accentCallout3") + ACCENT_CALLOUT_3("accentCallout3"), + + /** + * Callout 1 with Border Shape + * + */ + @XmlEnumValue("borderCallout1") + BORDER_CALLOUT_1("borderCallout1"), + + /** + * Callout 2 with Border Shape + * + */ + @XmlEnumValue("borderCallout2") + BORDER_CALLOUT_2("borderCallout2"), + + /** + * Callout 3 with Border Shape + * + */ + @XmlEnumValue("borderCallout3") + BORDER_CALLOUT_3("borderCallout3"), + + /** + * Callout 1 with Border and Accent Shape + * + */ + @XmlEnumValue("accentBorderCallout1") + ACCENT_BORDER_CALLOUT_1("accentBorderCallout1"), + + /** + * Callout 2 with Border and Accent Shape + * + */ + @XmlEnumValue("accentBorderCallout2") + ACCENT_BORDER_CALLOUT_2("accentBorderCallout2"), + + /** + * Callout 3 with Border and Accent Shape + * + */ + @XmlEnumValue("accentBorderCallout3") + ACCENT_BORDER_CALLOUT_3("accentBorderCallout3"), + + /** + * Callout Wedge Rectangle Shape + * + */ + @XmlEnumValue("wedgeRectCallout") + WEDGE_RECT_CALLOUT("wedgeRectCallout"), + + /** + * Callout Wedge Round Rectangle Shape + * + */ + @XmlEnumValue("wedgeRoundRectCallout") + WEDGE_ROUND_RECT_CALLOUT("wedgeRoundRectCallout"), + + /** + * Callout Wedge Ellipse Shape + * + */ + @XmlEnumValue("wedgeEllipseCallout") + WEDGE_ELLIPSE_CALLOUT("wedgeEllipseCallout"), + + /** + * Callout Cloud Shape + * + */ + @XmlEnumValue("cloudCallout") + CLOUD_CALLOUT("cloudCallout"), + + /** + * Cloud Shape + * + */ + @XmlEnumValue("cloud") + CLOUD("cloud"), + + /** + * Ribbon Shape + * + */ + @XmlEnumValue("ribbon") + RIBBON("ribbon"), + + /** + * Ribbon 2 Shape + * + */ + @XmlEnumValue("ribbon2") + RIBBON_2("ribbon2"), + + /** + * Ellipse Ribbon Shape + * + */ + @XmlEnumValue("ellipseRibbon") + ELLIPSE_RIBBON("ellipseRibbon"), + + /** + * Ellipse Ribbon 2 Shape + * + */ + @XmlEnumValue("ellipseRibbon2") + ELLIPSE_RIBBON_2("ellipseRibbon2"), + + /** + * Left Right Ribbon Shape + * + */ + @XmlEnumValue("leftRightRibbon") + LEFT_RIGHT_RIBBON("leftRightRibbon"), + + /** + * Vertical Scroll Shape + * + */ + @XmlEnumValue("verticalScroll") + VERTICAL_SCROLL("verticalScroll"), + + /** + * Horizontal Scroll Shape + * + */ + @XmlEnumValue("horizontalScroll") + HORIZONTAL_SCROLL("horizontalScroll"), + + /** + * Wave Shape + * + */ + @XmlEnumValue("wave") + WAVE("wave"), + + /** + * Double Wave Shape + * + */ + @XmlEnumValue("doubleWave") + DOUBLE_WAVE("doubleWave"), + + /** + * Plus Shape + * + */ + @XmlEnumValue("plus") + PLUS("plus"), + + /** + * Process Flow Shape + * + */ + @XmlEnumValue("flowChartProcess") + FLOW_CHART_PROCESS("flowChartProcess"), + + /** + * Decision Flow Shape + * + */ + @XmlEnumValue("flowChartDecision") + FLOW_CHART_DECISION("flowChartDecision"), + + /** + * Input Output Flow Shape + * + */ + @XmlEnumValue("flowChartInputOutput") + FLOW_CHART_INPUT_OUTPUT("flowChartInputOutput"), + + /** + * Predefined Process Flow Shape + * + */ + @XmlEnumValue("flowChartPredefinedProcess") + FLOW_CHART_PREDEFINED_PROCESS("flowChartPredefinedProcess"), + + /** + * Internal Storage Flow Shape + * + */ + @XmlEnumValue("flowChartInternalStorage") + FLOW_CHART_INTERNAL_STORAGE("flowChartInternalStorage"), + + /** + * Document Flow Shape + * + */ + @XmlEnumValue("flowChartDocument") + FLOW_CHART_DOCUMENT("flowChartDocument"), + + /** + * Multi-Document Flow Shape + * + */ + @XmlEnumValue("flowChartMultidocument") + FLOW_CHART_MULTIDOCUMENT("flowChartMultidocument"), + + /** + * Terminator Flow Shape + * + */ + @XmlEnumValue("flowChartTerminator") + FLOW_CHART_TERMINATOR("flowChartTerminator"), + + /** + * Preparation Flow Shape + * + */ + @XmlEnumValue("flowChartPreparation") + FLOW_CHART_PREPARATION("flowChartPreparation"), + + /** + * Manual Input Flow Shape + * + */ + @XmlEnumValue("flowChartManualInput") + FLOW_CHART_MANUAL_INPUT("flowChartManualInput"), + + /** + * Manual Operation Flow Shape + * + */ + @XmlEnumValue("flowChartManualOperation") + FLOW_CHART_MANUAL_OPERATION("flowChartManualOperation"), + + /** + * Connector Flow Shape + * + */ + @XmlEnumValue("flowChartConnector") + FLOW_CHART_CONNECTOR("flowChartConnector"), + + /** + * Punched Card Flow Shape + * + */ + @XmlEnumValue("flowChartPunchedCard") + FLOW_CHART_PUNCHED_CARD("flowChartPunchedCard"), + + /** + * Punched Tape Flow Shape + * + */ + @XmlEnumValue("flowChartPunchedTape") + FLOW_CHART_PUNCHED_TAPE("flowChartPunchedTape"), + + /** + * Summing Junction Flow Shape + * + */ + @XmlEnumValue("flowChartSummingJunction") + FLOW_CHART_SUMMING_JUNCTION("flowChartSummingJunction"), + + /** + * Or Flow Shape + * + */ + @XmlEnumValue("flowChartOr") + FLOW_CHART_OR("flowChartOr"), + + /** + * Collate Flow Shape + * + */ + @XmlEnumValue("flowChartCollate") + FLOW_CHART_COLLATE("flowChartCollate"), + + /** + * Sort Flow Shape + * + */ + @XmlEnumValue("flowChartSort") + FLOW_CHART_SORT("flowChartSort"), + + /** + * Extract Flow Shape + * + */ + @XmlEnumValue("flowChartExtract") + FLOW_CHART_EXTRACT("flowChartExtract"), + + /** + * Merge Flow Shape + * + */ + @XmlEnumValue("flowChartMerge") + FLOW_CHART_MERGE("flowChartMerge"), + + /** + * Offline Storage Flow Shape + * + */ + @XmlEnumValue("flowChartOfflineStorage") + FLOW_CHART_OFFLINE_STORAGE("flowChartOfflineStorage"), + + /** + * Online Storage Flow Shape + * + */ + @XmlEnumValue("flowChartOnlineStorage") + FLOW_CHART_ONLINE_STORAGE("flowChartOnlineStorage"), + + /** + * Magnetic Tape Flow Shape + * + */ + @XmlEnumValue("flowChartMagneticTape") + FLOW_CHART_MAGNETIC_TAPE("flowChartMagneticTape"), + + /** + * Magnetic Disk Flow Shape + * + */ + @XmlEnumValue("flowChartMagneticDisk") + FLOW_CHART_MAGNETIC_DISK("flowChartMagneticDisk"), + + /** + * Magnetic Drum Flow Shape + * + */ + @XmlEnumValue("flowChartMagneticDrum") + FLOW_CHART_MAGNETIC_DRUM("flowChartMagneticDrum"), + + /** + * Display Flow Shape + * + */ + @XmlEnumValue("flowChartDisplay") + FLOW_CHART_DISPLAY("flowChartDisplay"), + + /** + * Delay Flow Shape + * + */ + @XmlEnumValue("flowChartDelay") + FLOW_CHART_DELAY("flowChartDelay"), + + /** + * Alternate Process Flow Shape + * + */ + @XmlEnumValue("flowChartAlternateProcess") + FLOW_CHART_ALTERNATE_PROCESS("flowChartAlternateProcess"), + + /** + * Off-Page Connector Flow Shape + * + */ + @XmlEnumValue("flowChartOffpageConnector") + FLOW_CHART_OFFPAGE_CONNECTOR("flowChartOffpageConnector"), + + /** + * Blank Button Shape + * + */ + @XmlEnumValue("actionButtonBlank") + ACTION_BUTTON_BLANK("actionButtonBlank"), + + /** + * Home Button Shape + * + */ + @XmlEnumValue("actionButtonHome") + ACTION_BUTTON_HOME("actionButtonHome"), + + /** + * Help Button Shape + * + */ + @XmlEnumValue("actionButtonHelp") + ACTION_BUTTON_HELP("actionButtonHelp"), + + /** + * Information Button Shape + * + */ + @XmlEnumValue("actionButtonInformation") + ACTION_BUTTON_INFORMATION("actionButtonInformation"), + + /** + * Forward or Next Button Shape + * + */ + @XmlEnumValue("actionButtonForwardNext") + ACTION_BUTTON_FORWARD_NEXT("actionButtonForwardNext"), + + /** + * Back or Previous Button Shape + * + */ + @XmlEnumValue("actionButtonBackPrevious") + ACTION_BUTTON_BACK_PREVIOUS("actionButtonBackPrevious"), + + /** + * End Button Shape + * + */ + @XmlEnumValue("actionButtonEnd") + ACTION_BUTTON_END("actionButtonEnd"), + + /** + * Beginning Button Shape + * + */ + @XmlEnumValue("actionButtonBeginning") + ACTION_BUTTON_BEGINNING("actionButtonBeginning"), + + /** + * Return Button Shape + * + */ + @XmlEnumValue("actionButtonReturn") + ACTION_BUTTON_RETURN("actionButtonReturn"), + + /** + * Document Button Shape + * + */ + @XmlEnumValue("actionButtonDocument") + ACTION_BUTTON_DOCUMENT("actionButtonDocument"), + + /** + * Sound Button Shape + * + */ + @XmlEnumValue("actionButtonSound") + ACTION_BUTTON_SOUND("actionButtonSound"), + + /** + * Movie Button Shape + * + */ + @XmlEnumValue("actionButtonMovie") + ACTION_BUTTON_MOVIE("actionButtonMovie"), + + /** + * Gear 6 Shape + * + */ + @XmlEnumValue("gear6") + GEAR_6("gear6"), + + /** + * Gear 9 Shape + * + */ + @XmlEnumValue("gear9") + GEAR_9("gear9"), + + /** + * Funnel Shape + * + */ + @XmlEnumValue("funnel") + FUNNEL("funnel"), + + /** + * Plus Math Shape + * + */ + @XmlEnumValue("mathPlus") + MATH_PLUS("mathPlus"), + + /** + * Minus Math Shape + * + */ + @XmlEnumValue("mathMinus") + MATH_MINUS("mathMinus"), + + /** + * Multiply Math Shape + * + */ + @XmlEnumValue("mathMultiply") + MATH_MULTIPLY("mathMultiply"), + + /** + * Divide Math Shape + * + */ + @XmlEnumValue("mathDivide") + MATH_DIVIDE("mathDivide"), + + /** + * Equal Math Shape + * + */ + @XmlEnumValue("mathEqual") + MATH_EQUAL("mathEqual"), + + /** + * Not Equal Math Shape + * + */ + @XmlEnumValue("mathNotEqual") + MATH_NOT_EQUAL("mathNotEqual"), + + /** + * Corner Tabs Shape + * + */ + @XmlEnumValue("cornerTabs") + CORNER_TABS("cornerTabs"), + + /** + * Square Tabs Shape + * + */ + @XmlEnumValue("squareTabs") + SQUARE_TABS("squareTabs"), + + /** + * Plaque Tabs Shape + * + */ + @XmlEnumValue("plaqueTabs") + PLAQUE_TABS("plaqueTabs"), + + /** + * Chart X Shape + * + */ + @XmlEnumValue("chartX") + CHART_X("chartX"), + + /** + * Chart Star Shape + * + */ + @XmlEnumValue("chartStar") + CHART_STAR("chartStar"), + + /** + * Chart Plus Shape + * + */ + @XmlEnumValue("chartPlus") + CHART_PLUS("chartPlus"); + private final String value; + + STShapeType(String v) { + value = v; + } + + public String value() { + return value; + } + + public static STShapeType fromValue(String v) { + for (STShapeType c: STShapeType.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/STTextShapeType.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STTextShapeType.java new file mode 100644 index 0000000000..f3ed4b0cf7 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/STTextShapeType.java @@ -0,0 +1,389 @@ +/* ==================================================================== + 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.sl.draw.binding; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for ST_TextShapeType. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="ST_TextShapeType">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}token">
+ *     <enumeration value="textNoShape"/>
+ *     <enumeration value="textPlain"/>
+ *     <enumeration value="textStop"/>
+ *     <enumeration value="textTriangle"/>
+ *     <enumeration value="textTriangleInverted"/>
+ *     <enumeration value="textChevron"/>
+ *     <enumeration value="textChevronInverted"/>
+ *     <enumeration value="textRingInside"/>
+ *     <enumeration value="textRingOutside"/>
+ *     <enumeration value="textArchUp"/>
+ *     <enumeration value="textArchDown"/>
+ *     <enumeration value="textCircle"/>
+ *     <enumeration value="textButton"/>
+ *     <enumeration value="textArchUpPour"/>
+ *     <enumeration value="textArchDownPour"/>
+ *     <enumeration value="textCirclePour"/>
+ *     <enumeration value="textButtonPour"/>
+ *     <enumeration value="textCurveUp"/>
+ *     <enumeration value="textCurveDown"/>
+ *     <enumeration value="textCanUp"/>
+ *     <enumeration value="textCanDown"/>
+ *     <enumeration value="textWave1"/>
+ *     <enumeration value="textWave2"/>
+ *     <enumeration value="textDoubleWave1"/>
+ *     <enumeration value="textWave4"/>
+ *     <enumeration value="textInflate"/>
+ *     <enumeration value="textDeflate"/>
+ *     <enumeration value="textInflateBottom"/>
+ *     <enumeration value="textDeflateBottom"/>
+ *     <enumeration value="textInflateTop"/>
+ *     <enumeration value="textDeflateTop"/>
+ *     <enumeration value="textDeflateInflate"/>
+ *     <enumeration value="textDeflateInflateDeflate"/>
+ *     <enumeration value="textFadeRight"/>
+ *     <enumeration value="textFadeLeft"/>
+ *     <enumeration value="textFadeUp"/>
+ *     <enumeration value="textFadeDown"/>
+ *     <enumeration value="textSlantUp"/>
+ *     <enumeration value="textSlantDown"/>
+ *     <enumeration value="textCascadeUp"/>
+ *     <enumeration value="textCascadeDown"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "ST_TextShapeType", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") +@XmlEnum +public enum STTextShapeType { + + + /** + * No Text Shape + * + */ + @XmlEnumValue("textNoShape") + TEXT_NO_SHAPE("textNoShape"), + + /** + * Plain Text Shape + * + */ + @XmlEnumValue("textPlain") + TEXT_PLAIN("textPlain"), + + /** + * Stop Sign Text Shape + * + */ + @XmlEnumValue("textStop") + TEXT_STOP("textStop"), + + /** + * Triangle Text Shape + * + */ + @XmlEnumValue("textTriangle") + TEXT_TRIANGLE("textTriangle"), + + /** + * Inverted Triangle Text Shape + * + */ + @XmlEnumValue("textTriangleInverted") + TEXT_TRIANGLE_INVERTED("textTriangleInverted"), + + /** + * Chevron Text Shape + * + */ + @XmlEnumValue("textChevron") + TEXT_CHEVRON("textChevron"), + + /** + * Inverted Chevron Text Shape + * + */ + @XmlEnumValue("textChevronInverted") + TEXT_CHEVRON_INVERTED("textChevronInverted"), + + /** + * Inside Ring Text Shape + * + */ + @XmlEnumValue("textRingInside") + TEXT_RING_INSIDE("textRingInside"), + + /** + * Outside Ring Text Shape + * + */ + @XmlEnumValue("textRingOutside") + TEXT_RING_OUTSIDE("textRingOutside"), + + /** + * Upward Arch Text Shape + * + */ + @XmlEnumValue("textArchUp") + TEXT_ARCH_UP("textArchUp"), + + /** + * Downward Arch Text Shape + * + */ + @XmlEnumValue("textArchDown") + TEXT_ARCH_DOWN("textArchDown"), + + /** + * Circle Text Shape + * + */ + @XmlEnumValue("textCircle") + TEXT_CIRCLE("textCircle"), + + /** + * Button Text Shape + * + */ + @XmlEnumValue("textButton") + TEXT_BUTTON("textButton"), + + /** + * Upward Pour Arch Text Shape + * + */ + @XmlEnumValue("textArchUpPour") + TEXT_ARCH_UP_POUR("textArchUpPour"), + + /** + * Downward Pour Arch Text Shape + * + */ + @XmlEnumValue("textArchDownPour") + TEXT_ARCH_DOWN_POUR("textArchDownPour"), + + /** + * Circle Pour Text Shape + * + */ + @XmlEnumValue("textCirclePour") + TEXT_CIRCLE_POUR("textCirclePour"), + + /** + * Button Pour Text Shape + * + */ + @XmlEnumValue("textButtonPour") + TEXT_BUTTON_POUR("textButtonPour"), + + /** + * Upward Curve Text Shape + * + */ + @XmlEnumValue("textCurveUp") + TEXT_CURVE_UP("textCurveUp"), + + /** + * Downward Curve Text Shape + * + */ + @XmlEnumValue("textCurveDown") + TEXT_CURVE_DOWN("textCurveDown"), + + /** + * Upward Can Text Shape + * + */ + @XmlEnumValue("textCanUp") + TEXT_CAN_UP("textCanUp"), + + /** + * Downward Can Text Shape + * + */ + @XmlEnumValue("textCanDown") + TEXT_CAN_DOWN("textCanDown"), + + /** + * Wave 1 Text Shape + * + */ + @XmlEnumValue("textWave1") + TEXT_WAVE_1("textWave1"), + + /** + * Wave 2 Text Shape + * + */ + @XmlEnumValue("textWave2") + TEXT_WAVE_2("textWave2"), + + /** + * Double Wave 1 Text Shape + * + */ + @XmlEnumValue("textDoubleWave1") + TEXT_DOUBLE_WAVE_1("textDoubleWave1"), + + /** + * Wave 4 Text Shape + * + */ + @XmlEnumValue("textWave4") + TEXT_WAVE_4("textWave4"), + + /** + * Inflate Text Shape + * + */ + @XmlEnumValue("textInflate") + TEXT_INFLATE("textInflate"), + + /** + * Deflate Text Shape + * + */ + @XmlEnumValue("textDeflate") + TEXT_DEFLATE("textDeflate"), + + /** + * Bottom Inflate Text Shape + * + */ + @XmlEnumValue("textInflateBottom") + TEXT_INFLATE_BOTTOM("textInflateBottom"), + + /** + * Bottom Deflate Text Shape + * + */ + @XmlEnumValue("textDeflateBottom") + TEXT_DEFLATE_BOTTOM("textDeflateBottom"), + + /** + * Top Inflate Text Shape + * + */ + @XmlEnumValue("textInflateTop") + TEXT_INFLATE_TOP("textInflateTop"), + + /** + * Top Deflate Text Shape + * + */ + @XmlEnumValue("textDeflateTop") + TEXT_DEFLATE_TOP("textDeflateTop"), + + /** + * Deflate-Inflate Text Shape + * + */ + @XmlEnumValue("textDeflateInflate") + TEXT_DEFLATE_INFLATE("textDeflateInflate"), + + /** + * Deflate-Inflate-Deflate Text Shape + * + */ + @XmlEnumValue("textDeflateInflateDeflate") + TEXT_DEFLATE_INFLATE_DEFLATE("textDeflateInflateDeflate"), + + /** + * Right Fade Text Shape + * + */ + @XmlEnumValue("textFadeRight") + TEXT_FADE_RIGHT("textFadeRight"), + + /** + * Left Fade Text Shape + * + */ + @XmlEnumValue("textFadeLeft") + TEXT_FADE_LEFT("textFadeLeft"), + + /** + * Upward Fade Text Shape + * + */ + @XmlEnumValue("textFadeUp") + TEXT_FADE_UP("textFadeUp"), + + /** + * Downward Fade Text Shape + * + */ + @XmlEnumValue("textFadeDown") + TEXT_FADE_DOWN("textFadeDown"), + + /** + * Upward Slant Text Shape + * + */ + @XmlEnumValue("textSlantUp") + TEXT_SLANT_UP("textSlantUp"), + + /** + * Downward Slant Text Shape + * + */ + @XmlEnumValue("textSlantDown") + TEXT_SLANT_DOWN("textSlantDown"), + + /** + * Upward Cascade Text Shape + * + */ + @XmlEnumValue("textCascadeUp") + TEXT_CASCADE_UP("textCascadeUp"), + + /** + * Downward Cascade Text Shape + * + */ + @XmlEnumValue("textCascadeDown") + TEXT_CASCADE_DOWN("textCascadeDown"); + private final String value; + + STTextShapeType(String v) { + value = v; + } + + public String value() { + return value; + } + + public static STTextShapeType fromValue(String v) { + for (STTextShapeType c: STTextShapeType.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/AbsExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/AbsExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/AbsExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/AbsExpression.java index 5790e5383a..0f94e14b6a 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/AbsExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/AbsExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/AddDivideExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/AddDivideExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/AddDivideExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/AddDivideExpression.java index 7fe14e8b1d..2a01de449e 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/AddDivideExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/AddDivideExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/AddSubtractExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/AddSubtractExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/AddSubtractExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/AddSubtractExpression.java index bd7e47e16d..5d5f1e6357 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/AddSubtractExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/AddSubtractExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/AdjustValue.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/AdjustValue.java similarity index 93% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/AdjustValue.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/AdjustValue.java index 8df1d6f875..8a2f0a4566 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/AdjustValue.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/AdjustValue.java @@ -17,9 +17,9 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide; +import org.apache.poi.sl.draw.binding.CTGeomGuide; /** * Represents a shape adjust values (see section 20.1.9.5 in the spec) diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ArcTanExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ArcTanExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ArcTanExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/ArcTanExpression.java index 252c0fc62c..9044e8ad3a 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ArcTanExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ArcTanExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ArcToCommand.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ArcToCommand.java similarity index 95% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ArcToCommand.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/ArcToCommand.java index b1ea0defc8..0382d7f997 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ArcToCommand.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ArcToCommand.java @@ -17,9 +17,9 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DArcTo; +import org.apache.poi.sl.draw.binding.CTPath2DArcTo; import java.awt.geom.Arc2D; import java.awt.geom.GeneralPath; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ClosePathCommand.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ClosePathCommand.java similarity index 96% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ClosePathCommand.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/ClosePathCommand.java index b9a95404e1..9d29062806 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ClosePathCommand.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ClosePathCommand.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.awt.geom.GeneralPath; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Context.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Context.java similarity index 98% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Context.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/Context.java index ea86c51002..8fd5147ed2 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Context.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Context.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.awt.geom.Rectangle2D; import java.util.HashMap; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/CosExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/CosExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/CosExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/CosExpression.java index 47e38f162b..56373d9193 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/CosExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/CosExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/CosineArcTanExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/CosineArcTanExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/CosineArcTanExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/CosineArcTanExpression.java index cb9928b223..4bed9b72d1 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/CosineArcTanExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/CosineArcTanExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/CurveToCommand.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/CurveToCommand.java similarity index 94% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/CurveToCommand.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/CurveToCommand.java index 6f342d2ee7..02eeb2953e 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/CurveToCommand.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/CurveToCommand.java @@ -17,9 +17,9 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; -import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; +import org.apache.poi.sl.draw.binding.CTAdjPoint2D; import java.awt.geom.GeneralPath; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/CustomGeometry.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/CustomGeometry.java similarity index 69% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/CustomGeometry.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/CustomGeometry.java index 4e30ac90d9..ce1b26c498 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/CustomGeometry.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/CustomGeometry.java @@ -17,18 +17,11 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.*; -import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuideList; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomRect; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2D; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DList; +import org.apache.poi.sl.draw.binding.*; /** * Definition of a custom geometric shape @@ -41,25 +34,30 @@ public class CustomGeometry implements Iterable{ List paths = new ArrayList(); Path textBounds; - @SuppressWarnings("deprecation") public CustomGeometry(CTCustomGeometry2D geom) { CTGeomGuideList avLst = geom.getAvLst(); - if(avLst != null) for(CTGeomGuide gd : avLst.getGdArray()){ - adjusts.add(new AdjustValue(gd)); + if(avLst != null) { + for(CTGeomGuide gd : avLst.getGd()){ + adjusts.add(new AdjustValue(gd)); + } } CTGeomGuideList gdLst = geom.getGdLst(); - if(gdLst != null) for(CTGeomGuide gd : gdLst.getGdArray()){ - guides.add(new Guide(gd)); + if(gdLst != null) { + for(CTGeomGuide gd : gdLst.getGd()){ + guides.add(new Guide(gd)); + } } CTPath2DList pathLst = geom.getPathLst(); - if(pathLst != null) for(CTPath2D spPath : pathLst.getPathArray()){ - paths.add(new Path(spPath)); + if(pathLst != null) { + for(CTPath2D spPath : pathLst.getPath()){ + paths.add(new Path(spPath)); + } } - if(geom.isSetRect()) { - CTGeomRect rect = geom.getRect(); + CTGeomRect rect = geom.getRect(); + if(rect != null) { textBounds = new Path(); textBounds.addCommand( new MoveToCommand(rect.getL().toString(), rect.getT().toString())); @@ -73,9 +71,7 @@ public class CustomGeometry implements Iterable{ new ClosePathCommand()); } } - - - + public Iterator iterator() { return paths.iterator(); } diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Expression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Expression.java similarity index 96% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Expression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/Expression.java index 2b0f751f36..2403c85a05 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Expression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Expression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; /** * Date: 10/24/11 diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ExpressionParser.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ExpressionParser.java similarity index 98% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ExpressionParser.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/ExpressionParser.java index 699f995eab..f1f0193a89 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ExpressionParser.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ExpressionParser.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.HashMap; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Formula.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Formula.java similarity index 99% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Formula.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/Formula.java index 0d3b2bbba1..47453475af 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Formula.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Formula.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.awt.geom.Rectangle2D; import java.util.HashMap; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Guide.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Guide.java similarity index 93% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Guide.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/Guide.java index 584e22483d..f14213244b 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Guide.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Guide.java @@ -17,9 +17,9 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide; +import org.apache.poi.sl.draw.binding.CTGeomGuide; /** * Date: 10/24/11 diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/IAdjustableShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/IAdjustableShape.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/IAdjustableShape.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/IAdjustableShape.java index 44f5a562f7..920acb82d6 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/IAdjustableShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/IAdjustableShape.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; /** diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/IfElseExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/IfElseExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/IfElseExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/IfElseExpression.java index 3e16645f5a..443115a780 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/IfElseExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/IfElseExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/LineToCommand.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/LineToCommand.java similarity index 93% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/LineToCommand.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/LineToCommand.java index 5142dd234a..99c5a6b20c 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/LineToCommand.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/LineToCommand.java @@ -17,9 +17,9 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; -import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; +import org.apache.poi.sl.draw.binding.CTAdjPoint2D; import java.awt.geom.GeneralPath; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/LiteralValueExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/LiteralValueExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/LiteralValueExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/LiteralValueExpression.java index f84483cd55..ab3abc7fd5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/LiteralValueExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/LiteralValueExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/MaxExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/MaxExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/MaxExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/MaxExpression.java index 0c7ac3ecbe..88a9c60472 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/MaxExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/MaxExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/MinExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/MinExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/MinExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/MinExpression.java index 3e28cdd822..8c1864c5a4 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/MinExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/MinExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ModExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ModExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ModExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/ModExpression.java index cf17f0564e..ff20fc20f6 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ModExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/ModExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/MoveToCommand.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/MoveToCommand.java similarity index 93% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/MoveToCommand.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/MoveToCommand.java index 9d9575ace1..22ccd54092 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/MoveToCommand.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/MoveToCommand.java @@ -17,9 +17,9 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; -import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; +import org.apache.poi.sl.draw.binding.CTAdjPoint2D; import java.awt.geom.GeneralPath; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/MultiplyDivideExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/MultiplyDivideExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/MultiplyDivideExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/MultiplyDivideExpression.java index 17aca48d15..5af0ff12c0 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/MultiplyDivideExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/MultiplyDivideExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Outline.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Outline.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Outline.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/Outline.java index dbf9f1f9c9..b4ffc42573 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Outline.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Outline.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.awt.Shape; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Path.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Path.java similarity index 87% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Path.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/Path.java index 3f552a4cf9..b496e9fc96 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Path.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/Path.java @@ -17,15 +17,14 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; - -import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.*; +package org.apache.poi.sl.draw.geom; import java.awt.geom.GeneralPath; import java.util.ArrayList; import java.util.List; +import org.apache.poi.sl.draw.binding.*; + /** * Specifies a creation path consisting of a series of moves, lines and curves * that when combined forms a geometric shape @@ -51,12 +50,13 @@ public class Path { public Path(CTPath2D spPath){ _fill = spPath.getFill() != STPathFillMode.NONE; - _stroke = spPath.getStroke(); + _stroke = spPath.isStroke(); _w = spPath.isSetW() ? spPath.getW() : -1; _h = spPath.isSetH() ? spPath.getH() : -1; commands = new ArrayList(); - for(XmlObject ch : spPath.selectPath("*")){ + + for(Object ch : spPath.getCloseOrMoveToOrLnTo()){ if(ch instanceof CTPath2DMoveTo){ CTAdjPoint2D pt = ((CTPath2DMoveTo)ch).getPt(); commands.add(new MoveToCommand(pt)); @@ -68,14 +68,14 @@ public class Path { commands.add(new ArcToCommand(arc)); } else if (ch instanceof CTPath2DQuadBezierTo){ CTPath2DQuadBezierTo bez = ((CTPath2DQuadBezierTo)ch); - CTAdjPoint2D pt1 = bez.getPtArray(0); - CTAdjPoint2D pt2 = bez.getPtArray(1); + CTAdjPoint2D pt1 = bez.getPt().get(0); + CTAdjPoint2D pt2 = bez.getPt().get(1); commands.add(new QuadToCommand(pt1, pt2)); } else if (ch instanceof CTPath2DCubicBezierTo){ CTPath2DCubicBezierTo bez = ((CTPath2DCubicBezierTo)ch); - CTAdjPoint2D pt1 = bez.getPtArray(0); - CTAdjPoint2D pt2 = bez.getPtArray(1); - CTAdjPoint2D pt3 = bez.getPtArray(2); + CTAdjPoint2D pt1 = bez.getPt().get(0); + CTAdjPoint2D pt2 = bez.getPt().get(1); + CTAdjPoint2D pt3 = bez.getPt().get(2); commands.add(new CurveToCommand(pt1, pt2, pt3)); } else if (ch instanceof CTPath2DClose){ commands.add(new ClosePathCommand()); diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/PathCommand.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PathCommand.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/PathCommand.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/PathCommand.java index 7b3ec49379..3063ab81bc 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/PathCommand.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PathCommand.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.awt.geom.GeneralPath; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/PinExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PinExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/PinExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/PinExpression.java index c1b7fe4466..ee0d4e5107 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/PinExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PinExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java new file mode 100644 index 0000000000..d876d1512a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java @@ -0,0 +1,114 @@ +/* + * ==================================================================== + * 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.sl.draw.geom; + +import java.io.*; +import java.nio.charset.Charset; +import java.util.LinkedHashMap; + +import javax.xml.bind.*; +import javax.xml.stream.*; +import javax.xml.stream.events.StartElement; +import javax.xml.stream.events.XMLEvent; + +import org.apache.poi.sl.draw.binding.CTCustomGeometry2D; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; + +/** + * + */ +public class PresetGeometries extends LinkedHashMap { + private final static POILogger LOG = POILogFactory.getLogger(PresetGeometries.class); + protected final static String BINDING_PACKAGE = "org.apache.poi.sl.draw.binding"; + + protected static PresetGeometries _inst; + + protected PresetGeometries(){} + + @SuppressWarnings("unused") + public void init(InputStream is) throws XMLStreamException, JAXBException { + Reader xml = new InputStreamReader( is, Charset.forName("UTF-8") ); + + + // StAX: + EventFilter startElementFilter = new EventFilter() { + @Override + public boolean accept(XMLEvent event) { + return event.isStartElement(); + } + }; + + long cntElem = 0; + XMLInputFactory staxFactory = XMLInputFactory.newInstance(); + XMLEventReader staxReader = staxFactory.createXMLEventReader(xml); + XMLEventReader staxFiltRd = staxFactory.createFilteredReader(staxReader, startElementFilter); + // ignore StartElement: + XMLEvent evDoc = staxFiltRd.nextEvent(); + // JAXB: + JAXBContext jaxbContext = JAXBContext.newInstance(BINDING_PACKAGE); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + + while (staxFiltRd.peek() != null) { + StartElement evRoot = (StartElement)staxFiltRd.peek(); + String name = evRoot.getName().getLocalPart(); + JAXBElement el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class); + CTCustomGeometry2D cus = el.getValue(); + cntElem++; + + if(containsKey(name)) { + LOG.log(POILogger.WARN, "Duplicate definoition of " + name); + } + put(name, new CustomGeometry(cus)); + } + } + + /** + * Convert a single CustomGeometry object, i.e. from xmlbeans + */ + public static CustomGeometry convertCustomGeometry(XMLStreamReader staxReader) { + try { + JAXBContext jaxbContext = JAXBContext.newInstance(BINDING_PACKAGE); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + JAXBElement el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class); + return new CustomGeometry(el.getValue()); + } catch (JAXBException e) { + LOG.log(POILogger.ERROR, "Unable to parse single custom geometry", e); + return null; + } + } + + public static synchronized PresetGeometries getInstance(){ + if(_inst == null) { + _inst = new PresetGeometries(); + try { + InputStream is = PresetGeometries.class. + getResourceAsStream("presetShapeDefinitions.xml"); + _inst.init(is); + is.close(); + } catch (Exception e){ + throw new RuntimeException(e); + } + } + + return _inst; + } + +} diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/QuadToCommand.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/QuadToCommand.java similarity index 93% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/QuadToCommand.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/QuadToCommand.java index 65fd7d45e4..e9a9364b2d 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/QuadToCommand.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/QuadToCommand.java @@ -17,9 +17,9 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; -import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; +import org.apache.poi.sl.draw.binding.CTAdjPoint2D; import java.awt.geom.GeneralPath; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/SinArcTanExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/SinArcTanExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/SinArcTanExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/SinArcTanExpression.java index 8ac68e0c63..e14acb9e60 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/SinArcTanExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/SinArcTanExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/SinExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/SinExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/SinExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/SinExpression.java index 9e82f5abda..ca0c110ce5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/SinExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/SinExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/SqrtExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/SqrtExpression.java index d798e93a13..5cdd67cc57 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/SqrtExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/TanExpression.java similarity index 97% rename from src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java rename to src/scratchpad/src/org/apache/poi/sl/draw/geom/TanExpression.java index 3435f35603..7eebdcedfa 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/TanExpression.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.apache.poi.xslf.model.geom; +package org.apache.poi.sl.draw.geom; import java.util.regex.Matcher; diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java index ae2fb7c7da..0e0b1dbbe1 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java @@ -17,6 +17,6 @@ package org.apache.poi.sl.usermodel; -public interface AutoShape extends SimpleShape { +public interface AutoShape extends TextShape { public TextRun getTextRun(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ColorStyle.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ColorStyle.java new file mode 100644 index 0000000000..9be847b36c --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ColorStyle.java @@ -0,0 +1,69 @@ +/* ==================================================================== + 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.sl.usermodel; + +import java.awt.Color; + + +public interface ColorStyle { + Color getColor(); + + /** + * the opacity as expressed by a percentage value + * + * @return opacity in percents in the range [0..100000] + * or -1 if the value is not set + */ + int getAlpha(); + + /** + * the luminance shift as expressed by a percentage relative to the input color + * + * @return luminance shift in percents in the range [0..100000] + * or -1 if the value is not set + */ + int getLumOff(); + + /** + * the luminance as expressed by a percentage relative to the input color + * + * @return luminance in percents in the range [0..100000] + * or -1 if the value is not set + */ + int getLumMod(); + + /** + * specifies a darker version of its input color. + * A 10% shade is 10% of the input color combined with 90% black. + * + * @return the value of the shade specified as percents in the range [0..100000] + * with 0% indicating minimal shade and 100% indicating maximum + * or -1 if the value is not set + */ + int getShade(); + + /** + * specifies a lighter version of its input color. + * A 10% tint is 10% of the input color combined with 90% white. + * + * @return the value of the tint specified as percents in the range [0..100000] + * with 0% indicating minimal tint and 100% indicating maximum + * or -1 if the value is not set + */ + int getTint(); +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/LineStyle.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/FillStyle.java similarity index 92% rename from src/scratchpad/src/org/apache/poi/sl/usermodel/LineStyle.java rename to src/scratchpad/src/org/apache/poi/sl/usermodel/FillStyle.java index 43ef4a7b78..8414000b8b 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/LineStyle.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/FillStyle.java @@ -1,21 +1,22 @@ -/* ==================================================================== - 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.sl.usermodel; - -public interface LineStyle extends org.apache.poi.common.usermodel.LineStyle { -} +/* ==================================================================== + 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.sl.usermodel; + +public interface FillStyle { + PaintStyle getPaint(); +} diff --git a/src/java/org/apache/poi/common/usermodel/LineStyle.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java similarity index 89% rename from src/java/org/apache/poi/common/usermodel/LineStyle.java rename to src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java index db676f529a..4d2ffb67a1 100644 --- a/src/java/org/apache/poi/common/usermodel/LineStyle.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java @@ -1,21 +1,22 @@ -/* ==================================================================== - 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.common.usermodel; - -public interface LineStyle { - -} +/* ==================================================================== + 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.sl.usermodel; + +public interface FreeformShape extends AutoShape { + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/GradientPaint.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/GradientPaint.java new file mode 100644 index 0000000000..e16b430be3 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/GradientPaint.java @@ -0,0 +1,32 @@ +/* ==================================================================== + 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.sl.usermodel; + + +public interface GradientPaint extends PaintStyle { + enum GradientType { linear, circular, shape } + + /** + * @return the angle of the gradient + */ + double getGradientAngle(); + ColorStyle[] getGradientColors(); + float[] getGradientFractions(); + boolean isRotatedWithShape(); + GradientType getGradientType(); +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Insets2D.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Insets2D.java new file mode 100644 index 0000000000..04b4d77cf4 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Insets2D.java @@ -0,0 +1,146 @@ +/* ==================================================================== + 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.sl.usermodel; + +import java.awt.Insets; + +/** + * This is a replacement for {@link java.awt.Insets} which works on doubles + * instead of ints + */ +public class Insets2D { + + /** + * The inset from the top. + * This value is added to the Top of the rectangle + * to yield a new location for the Top. + */ + public double top; + + /** + * The inset from the left. + * This value is added to the Left of the rectangle + * to yield a new location for the Left edge. + */ + public double left; + + /** + * The inset from the bottom. + * This value is subtracted from the Bottom of the rectangle + * to yield a new location for the Bottom. + */ + public double bottom; + + /** + * The inset from the right. + * This value is subtracted from the Right of the rectangle + * to yield a new location for the Right edge. + */ + public double right; + + /** + * Creates and initializes a new Insets object with the + * specified top, left, bottom, and right insets. + * @param top the inset from the top. + * @param left the inset from the left. + * @param bottom the inset from the bottom. + * @param right the inset from the right. + */ + public Insets2D(double top, double left, double bottom, double right) { + this.top = top; + this.left = left; + this.bottom = bottom; + this.right = right; + } + + /** + * Set top, left, bottom, and right to the specified values + * + * @param top the inset from the top. + * @param left the inset from the left. + * @param bottom the inset from the bottom. + * @param right the inset from the right. + * @since 1.5 + */ + public void set(double top, double left, double bottom, double right) { + this.top = top; + this.left = left; + this.bottom = bottom; + this.right = right; + } + + /** + * Checks whether two insets objects are equal. Two instances + * of Insets are equal if the four integer values + * of the fields top, left, + * bottom, and right are all equal. + * @return true if the two insets are equal; + * otherwise false. + * @since JDK1.1 + */ + public boolean equals(Object obj) { + if (obj instanceof Insets) { + Insets insets = (Insets)obj; + return ((top == insets.top) && (left == insets.left) && + (bottom == insets.bottom) && (right == insets.right)); + } + return false; + } + + /** + * Returns the hash code for this Insets. + * + * @return a hash code for this Insets. + */ + public int hashCode() { + double sum1 = left + bottom; + double sum2 = right + top; + double val1 = sum1 * (sum1 + 1)/2 + left; + double val2 = sum2 * (sum2 + 1)/2 + top; + double sum3 = val1 + val2; + return (int)(sum3 * (sum3 + 1)/2 + val2); + } + + /** + * Returns a string representation of this Insets object. + * This method is intended to be used only for debugging purposes, and + * the content and format of the returned string may vary between + * implementations. The returned string may be empty but may not be + * null. + * + * @return a string representation of this Insets object. + */ + public String toString() { + return getClass().getName() + "[top=" + top + ",left=" + left + ",bottom=" + bottom + ",right=" + right + "]"; + } + + /** + * Create a copy of this object. + * @return a copy of this Insets2D object. + */ + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + // this shouldn't happen, since we are Cloneable + throw new InternalError(); + } + } + + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/LineDecoration.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/LineDecoration.java new file mode 100644 index 0000000000..e8cab55278 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/LineDecoration.java @@ -0,0 +1,69 @@ +/* ==================================================================== + 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.sl.usermodel; + +public interface LineDecoration { + /** + * Represents the shape decoration that appears at the ends of lines. + */ + enum DecorationShape { + NONE, + TRIANGLE, + STEALTH, + DIAMOND, + OVAL, + ARROW + } + + enum DecorationSize { + SMALL, + MEDIUM, + LARGE + } + + /** + * @return the line start shape + */ + DecorationShape getHeadShape(); + + /** + * @return the width of the start shape + */ + DecorationSize getHeadWidth(); + + /** + * @return the length of the start shape + */ + DecorationSize getHeadLength(); + + /** + * @return the line end shape + */ + DecorationShape getTailShape(); + + /** + * @return the width of the end shape + */ + DecorationSize getTailWidth(); + + /** + * @return the length of the end shape + */ + DecorationSize getTailLength(); + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Fill.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java similarity index 93% rename from src/scratchpad/src/org/apache/poi/sl/usermodel/Fill.java rename to src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java index e62b0480d6..e92e650bbf 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Fill.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java @@ -17,5 +17,9 @@ package org.apache.poi.sl.usermodel; -public interface Fill extends org.apache.poi.common.usermodel.Fill { + + +public interface PaintStyle { + + } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java new file mode 100644 index 0000000000..0535536d73 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java @@ -0,0 +1,39 @@ +/* ==================================================================== + 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.sl.usermodel; + +import java.awt.geom.Rectangle2D; + +public interface PlaceableShape { + Rectangle2D getAnchor(); + + FillStyle getFillStyle(); + + StrokeStyle getStrokeStyle(); + + /** + * Rotation angle in degrees + *

+ * Positive angles are clockwise (i.e., towards the positive y axis); + * negative angles are counter-clockwise (i.e., towards the negative y axis). + *

+ * + * @return rotation angle in degrees + */ + double getRotation(); +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Shadow.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shadow.java new file mode 100644 index 0000000000..589f095542 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shadow.java @@ -0,0 +1,47 @@ +/* ==================================================================== + 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.sl.usermodel; + +import java.awt.Color; + + +public interface Shadow { + /** + * @return the offset of this shadow in points + */ + double getDistance(); + + /** + * + * @return the direction to offset the shadow in angles + */ + double getAngle(); + + /** + * + * @return the blur radius of the shadow + * TODO: figure out how to make sense of this property when rendering shadows + */ + double getBlur(); + + /** + * @return the color of this shadow. + * Depending whether the parent shape is filled or stroked, this color is used to fill or stroke this shadow + */ + Color getColor(); +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java index 11c0bf6251..02cab6dbb3 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java @@ -19,13 +19,61 @@ package org.apache.poi.sl.usermodel; import java.awt.geom.Rectangle2D; -public interface Shape { - public int getShapeType(); +import org.apache.poi.sl.draw.geom.CustomGeometry; - public Rectangle2D getAnchor(); - public void setAnchor(Rectangle2D anchor); +public interface Shape extends PlaceableShape { + CustomGeometry getGeometry(); + + ShapeType getShapeType(); - public void moveTo(float x, float y); + void setAnchor(Rectangle2D anchor); - public Shape getParent(); + ShapeContainer getParent(); + + boolean isPlaceholder(); + + /** + * + * @return the sheet this shape belongs to + */ + Sheet getSheet(); + + /** + * Rotate this shape. + *

+ * Positive angles are clockwise (i.e., towards the positive y axis); + * negative angles are counter-clockwise (i.e., towards the negative y axis). + *

+ * + * @param theta the rotation angle in degrees. + */ + void setRotation(double theta); + + /** + * @param flip whether the shape is horizontally flipped + */ + void setFlipHorizontal(boolean flip); + + /** + * Whether the shape is vertically flipped + * + * @param flip whether the shape is vertically flipped + */ + void setFlipVertical(boolean flip); + + /** + * Whether the shape is horizontally flipped + * + * @return whether the shape is horizontally flipped + */ + boolean getFlipHorizontal(); + + /** + * Whether the shape is vertically flipped + * + * @return whether the shape is vertically flipped + */ + boolean getFlipVertical(); + + } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java index cabcf4bc89..faee9a1b89 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java @@ -17,8 +17,28 @@ package org.apache.poi.sl.usermodel; -public interface ShapeContainer { + +public interface ShapeContainer extends Iterable, PlaceableShape { + /** + * Returns an array containing all of the elements in this container in proper + * sequence (from first to last element). + * + * @return an array containing all of the elements in this container in proper + * sequence + */ public Shape[] getShapes(); + public void addShape(Shape shape); + + /** + * Removes the specified shape from this sheet, if it is present + * (optional operation). If this sheet does not contain the element, + * it is unchanged. + * + * @param xShape shape to be removed from this sheet, if present + * @return true if this sheet contained the specified element + * @throws IllegalArgumentException if the type of the specified shape + * is incompatible with this sheet (optional) + */ public boolean removeShape(Shape shape); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java new file mode 100644 index 0000000000..0c25f5be4c --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java @@ -0,0 +1,295 @@ +/* ==================================================================== + 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.sl.usermodel; + +/** + * known preset shape geometries in PresentationML + */ +public enum ShapeType { + NOT_PRIMITIVE(-1, 0, "NotPrimitive"), + LINE(1, 20, "Line"), + LINE_INV(2, -1, null), + TRIANGLE(3, 5, "IsocelesTriangle"), + RT_TRIANGLE(4, 6, "RightTriangle"), + RECT(5, 1, "Rectangle"), + DIAMOND(6, 4, "Diamond"), + PARALLELOGRAM(7, 7, "Parallelogram"), + TRAPEZOID(8, 8, "Trapezoid"), + NON_ISOSCELES_TRAPEZOID(9, -1, null), + PENTAGON(10, 56, "Pentagon"), + HEXAGON(11, 9, "Hexagon"), + HEPTAGON(12, -1, null), + OCTAGON(13, 10, "Octagon"), + DECAGON(14, -1, null), + DODECAGON(15, -1, null), + STAR_4(16, 187, "Star4"), + STAR_5(17, 12, "Star"), // aka star in native + STAR_6(18, -1, null), + STAR_7(19, -1, null), + STAR_8(20, 58, "Star8"), + STAR_10(21, -1, null), + STAR_12(22, -1, null), + STAR_16(23, 59, "Star16"), + SEAL(23, 18, "Seal"), // same as star_16, but twice in native + STAR_24(24, 92, "Star24"), + STAR_32(25, 60, "Star32"), + ROUND_RECT(26, 2, "RoundRectangle"), + ROUND_1_RECT(27, -1, null), + ROUND_2_SAME_RECT(28, -1, null), + ROUND_2_DIAG_RECT(29, -1, null), + SNIP_ROUND_RECT(30, -1, null), + SNIP_1_RECT(31, -1, null), + SNIP_2_SAME_RECT(32, -1, null), + SNIP_2_DIAG_RECT(33, -1, null), + PLAQUE(34, 21, "Plaque"), + ELLIPSE(35, 3, "Ellipse"), + TEARDROP(36, -1, null), + HOME_PLATE(37, 15, "HomePlate"), + CHEVRON(38, 55, "Chevron"), + PIE_WEDGE(39, -1, null), + PIE(40, -1, null), + BLOCK_ARC(41, 95, "BlockArc"), + DONUT(42, 23, "Donut"), + NO_SMOKING(43, 57, "NoSmoking"), + RIGHT_ARROW(44, 13, "Arrow"), // aka arrow in native + LEFT_ARROW(45, 66, "LeftArrow"), + UP_ARROW(46, 68, "UpArrow"), + DOWN_ARROW(47, 67, "DownArrow"), + STRIPED_RIGHT_ARROW(48, 93, "StripedRightArrow"), + NOTCHED_RIGHT_ARROW(49, 94, "NotchedRightArrow"), + BENT_UP_ARROW(50, 90, "BentUpArrow"), + LEFT_RIGHT_ARROW(51, 69, "LeftRightArrow"), + UP_DOWN_ARROW(52, 70, "UpDownArrow"), + LEFT_UP_ARROW(53, 89, "LeftUpArrow"), + LEFT_RIGHT_UP_ARROW(54, 182, "LeftRightUpArrow"), + QUAD_ARROW(55, 76, "QuadArrow"), + LEFT_ARROW_CALLOUT(56, 77, "LeftArrowCallout"), + RIGHT_ARROW_CALLOUT(57, 78, "RightArrowCallout"), + UP_ARROW_CALLOUT(58, 79, "UpArrowCallout"), + DOWN_ARROW_CALLOUT(59, 80, "DownArrowCallout"), + LEFT_RIGHT_ARROW_CALLOUT(60, 81, "LeftRightArrowCallout"), + UP_DOWN_ARROW_CALLOUT(61, 82, "UpDownArrowCallout"), + QUAD_ARROW_CALLOUT(62, 83, "QuadArrowCallout"), + BENT_ARROW(63, 91, "BentArrow"), + UTURN_ARROW(64, 101, "UturnArrow"), + CIRCULAR_ARROW(65, 99, "CircularArrow"), + LEFT_CIRCULAR_ARROW(66, -1, null), + LEFT_RIGHT_CIRCULAR_ARROW(67, -1, null), + CURVED_RIGHT_ARROW(68, 102, "CurvedRightArrow"), + CURVED_LEFT_ARROW(69, 103, "CurvedLeftArrow"), + CURVED_UP_ARROW(70, 104, "CurvedUpArrow"), + CURVED_DOWN_ARROW(71, 105, "CurvedDownArrow"), + SWOOSH_ARROW(72, -1, null), + CUBE(73, 16, "Cube"), + CAN(74, 22, "Can"), + LIGHTNING_BOLT(75, 73, "LightningBolt"), + HEART(76, 74, "Heart"), + SUN(77, 183, "Sun"), + MOON(78, 184, "Moon"), + SMILEY_FACE(79, 96, "SmileyFace"), + IRREGULAR_SEAL_1(80, 71, "IrregularSeal1"), + IRREGULAR_SEAL_2(81, 72, "IrregularSeal2"), + FOLDED_CORNER(82, 65, "FoldedCorner"), + BEVEL(83, 84, "Bevel"), + FRAME(84, 75, "PictureFrame"), + HALF_FRAME(85, -1, null), + CORNER(86, -1, null), + DIAG_STRIPE(87, -1, null), + CHORD(88, -1, null), + ARC(89, 19, "Arc"), + LEFT_BRACKET(90, 85, "LeftBracket"), + RIGHT_BRACKET(91, 86, "RightBracket"), + LEFT_BRACE(92, 87, "LeftBrace"), + RIGHT_BRACE(93, 88, "RightBrace"), + BRACKET_PAIR(94, 185, "BracketPair"), + BRACE_PAIR(95, 186, "BracePair"), + STRAIGHT_CONNECTOR_1(96, 32, "StraightConnector1"), + BENT_CONNECTOR_2(97, 33, "BentConnector2"), + BENT_CONNECTOR_3(98, 34, "BentConnector3"), + BENT_CONNECTOR_4(99, 35, "BentConnector4"), + BENT_CONNECTOR_5(100, 36, "BentConnector5"), + CURVED_CONNECTOR_2(101, 37, "CurvedConnector2"), + CURVED_CONNECTOR_3(102, 38, "CurvedConnector3"), + CURVED_CONNECTOR_4(103, 39, "CurvedConnector4"), + CURVED_CONNECTOR_5(104, 40, "CurvedConnector5"), + CALLOUT_1(105, 41, "Callout1"), + CALLOUT_2(106, 42, "Callout2"), + CALLOUT_3(107, 43, "Callout3"), + ACCENT_CALLOUT_1(108, 44, "AccentCallout1"), + ACCENT_CALLOUT_2(109, 45, "AccentCallout2"), + ACCENT_CALLOUT_3(110, 46, "AccentCallout3"), + BORDER_CALLOUT_1(111, 47, "BorderCallout1"), + BORDER_CALLOUT_2(112, 48, "BorderCallout2"), + BORDER_CALLOUT_3(113, 49, "BorderCallout3"), + ACCENT_BORDER_CALLOUT_1(114, 50, "AccentBorderCallout1"), + ACCENT_BORDER_CALLOUT_2(115, 51, "AccentBorderCallout2"), + ACCENT_BORDER_CALLOUT_3(116, 52, "AccentBorderCallout3"), + WEDGE_RECT_CALLOUT(117, 61, "WedgeRectCallout"), + WEDGE_ROUND_RECT_CALLOUT(118, 62, "WedgeRRectCallout"), + WEDGE_ELLIPSE_CALLOUT(119, 63, "WedgeEllipseCallout"), + CLOUD_CALLOUT(120, 106, "CloudCallout"), + CLOUD(121, -1, null), + RIBBON(122, 53, "Ribbon"), + RIBBON_2(123, 54, "Ribbon2"), + ELLIPSE_RIBBON(124, 107, "EllipseRibbon"), + ELLIPSE_RIBBON_2(125, 108, "EllipseRibbon2"), + LEFT_RIGHT_RIBBON(126, -1, null), + VERTICAL_SCROLL(127, 97, "VerticalScroll"), + HORIZONTAL_SCROLL(128, 98, "HorizontalScroll"), + WAVE(129, 64, "Wave"), + DOUBLE_WAVE(130, 188, "DoubleWave"), + PLUS(131, 11, "Plus"), + FLOW_CHART_PROCESS(132, 109, "FlowChartProcess"), + FLOW_CHART_DECISION(133, 110, "FlowChartDecision"), + FLOW_CHART_INPUT_OUTPUT(134, 111, "FlowChartInputOutput"), + FLOW_CHART_PREDEFINED_PROCESS(135, 112, "FlowChartPredefinedProcess"), + FLOW_CHART_INTERNAL_STORAGE(136, 113, "FlowChartInternalStorage"), + FLOW_CHART_DOCUMENT(137, 114, "FlowChartDocument"), + FLOW_CHART_MULTIDOCUMENT(138, 115, "FlowChartMultidocument"), + FLOW_CHART_TERMINATOR(139, 116, "FlowChartTerminator"), + FLOW_CHART_PREPARATION(140, 117, "FlowChartPreparation"), + FLOW_CHART_MANUAL_INPUT(141, 118, "FlowChartManualInput"), + FLOW_CHART_MANUAL_OPERATION(142, 119, "FlowChartManualOperation"), + FLOW_CHART_CONNECTOR(143, 120, "FlowChartConnector"), + FLOW_CHART_PUNCHED_CARD(144, 121, "FlowChartPunchedCard"), + FLOW_CHART_PUNCHED_TAPE(145, 122, "FlowChartPunchedTape"), + FLOW_CHART_SUMMING_JUNCTION(146, 123, "FlowChartSummingJunction"), + FLOW_CHART_OR(147, 124, "FlowChartOr"), + FLOW_CHART_COLLATE(148, 125, "FlowChartCollate"), + FLOW_CHART_SORT(149, 126, "FlowChartSort"), + FLOW_CHART_EXTRACT(150, 127, "FlowChartExtract"), + FLOW_CHART_MERGE(151, 128, "FlowChartMerge"), + FLOW_CHART_OFFLINE_STORAGE(152, 129, "FlowChartOfflineStorage"), + FLOW_CHART_ONLINE_STORAGE(153, 130, "FlowChartOnlineStorage"), + FLOW_CHART_MAGNETIC_TAPE(154, 131, "FlowChartMagneticTape"), + FLOW_CHART_MAGNETIC_DISK(155, 132, "FlowChartMagneticDisk"), + FLOW_CHART_MAGNETIC_DRUM(156, 133, "FlowChartMagneticDrum"), + FLOW_CHART_DISPLAY(157, 134, "FlowChartDisplay"), + FLOW_CHART_DELAY(158, 135, "FlowChartDelay"), + FLOW_CHART_ALTERNATE_PROCESS(159, 176, "FlowChartAlternateProcess"), + FLOW_CHART_OFFPAGE_CONNECTOR(160, 177, "FlowChartOffpageConnector"), + ACTION_BUTTON_BLANK(161, 189, "ActionButtonBlank"), + ACTION_BUTTON_HOME(162, 190, "ActionButtonHome"), + ACTION_BUTTON_HELP(163, 191, "ActionButtonHelp"), + ACTION_BUTTON_INFORMATION(164, 192, "ActionButtonInformation"), + ACTION_BUTTON_FORWARD_NEXT(165, 193, "ActionButtonForwardNext"), + ACTION_BUTTON_BACK_PREVIOUS(166, 194, "ActionButtonBackPrevious"), + ACTION_BUTTON_END(167, 195, "ActionButtonEnd"), + ACTION_BUTTON_BEGINNING(168, 196, "ActionButtonBeginning"), + ACTION_BUTTON_RETURN(169, 197, "ActionButtonReturn"), + ACTION_BUTTON_DOCUMENT(170, 198, "ActionButtonDocument"), + ACTION_BUTTON_SOUND(171, 199, "ActionButtonSound"), + ACTION_BUTTON_MOVIE(172, 200, "ActionButtonMovie"), + GEAR_6(173, -1, null), + GEAR_9(174, -1, null), + FUNNEL(175, -1, null), + MATH_PLUS(176, -1, null), + MATH_MINUS(177, -1, null), + MATH_MULTIPLY(178, -1, null), + MATH_DIVIDE(179, -1, null), + MATH_EQUAL(180, -1, null), + MATH_NOT_EQUAL(181, -1, null), + CORNER_TABS(182, -1, null), + SQUARE_TABS(183, -1, null), + PLAQUE_TABS(184, -1, null), + CHART_X(185, -1, null), + CHART_STAR(186, -1, null), + CHART_PLUS(187, -1, null), + // below are shape types only found in native + NOTCHED_CIRCULAR_ARROW(-1, 100, "NotchedCircularArrow"), + THICK_ARROW(-1, 14, "ThickArrow"), + BALLOON(-1, 17, "Balloon"), + TEXT_SIMPLE(-1, 24, "TextSimple"), + TEXT_OCTAGON(-1, 25, "TextOctagon"), + TEXT_HEXAGON(-1, 26, "TextHexagon"), + TEXT_CURVE(-1, 27, "TextCurve"), + TEXT_WAVE(-1, 28, "TextWave"), + TEXT_RING(-1, 29, "TextRing"), + TEXT_ON_CURVE(-1, 30, "TextOnCurve"), + TEXT_ON_RING(-1, 31, "TextOnRing"), + TEXT_PLAIN_TEXT(-1, 136, "TextPlainText"), + TEXT_STOP(-1, 137, "TextStop"), + TEXT_TRIANGLE(-1, 138, "TextTriangle"), + TEXT_TRIANGLE_INVERTED(-1, 139, "TextTriangleInverted"), + TEXT_CHEVRON(-1, 140, "TextChevron"), + TEXT_CHEVRON_INVERTED(-1, 141, "TextChevronInverted"), + TEXT_RING_INSIDE(-1, 142, "TextRingInside"), + TEXT_RING_OUTSIDE(-1, 143, "TextRingOutside"), + TEXT_ARCH_UP_CURVE(-1, 144, "TextArchUpCurve"), + TEXT_ARCH_DOWN_CURVE(-1, 145, "TextArchDownCurve"), + TEXT_CIRCLE_CURVE(-1, 146, "TextCircleCurve"), + TEXT_BUTTON_CURVE(-1, 147, "TextButtonCurve"), + TEXT_ARCH_UP_POUR(-1, 148, "TextArchUpPour"), + TEXT_ARCH_DOWN_POUR(-1, 149, "TextArchDownPour"), + TEXT_CIRCLE_POUR(-1, 150, "TextCirclePour"), + TEXT_BUTTON_POUR(-1, 151, "TextButtonPour"), + TEXT_CURVE_UP(-1, 152, "TextCurveUp"), + TEXT_CURVE_DOWN(-1, 153, "TextCurveDown"), + TEXT_CASCADE_UP(-1, 154, "TextCascadeUp"), + TEXT_CASCADE_DOWN(-1, 155, "TextCascadeDown"), + TEXT_WAVE_1(-1, 156, "TextWave1"), + TEXT_WAVE_2(-1, 157, "TextWave2"), + TEXT_WAVE_3(-1, 158, "TextWave3"), + TEXT_WAVE_4(-1, 159, "TextWave4"), + TEXT_INFLATE(-1, 160, "TextInflate"), + TEXT_DEFLATE(-1, 161, "TextDeflate"), + TEXT_INFLATE_BOTTOM(-1, 162, "TextInflateBottom"), + TEXT_DEFLATE_BOTTOM(-1, 163, "TextDeflateBottom"), + TEXT_INFLATE_TOP(-1, 164, "TextInflateTop"), + TEXT_DEFLATE_TOP(-1, 165, "TextDeflateTop"), + TEXT_DEFLATE_INFLATE(-1, 166, "TextDeflateInflate"), + TEXT_DEFLATE_INFLATE_DEFLATE(-1, 167, "TextDeflateInflateDeflate"), + TEXT_FADE_RIGHT(-1, 168, "TextFadeRight"), + TEXT_FADE_LEFT(-1, 169, "TextFadeLeft"), + TEXT_FADE_UP(-1, 170, "TextFadeUp"), + TEXT_FADE_DOWN(-1, 171, "TextFadeDown"), + TEXT_SLANT_UP(-1, 172, "TextSlantUp"), + TEXT_SLANT_DOWN(-1, 173, "TextSlantDown"), + TEXT_CAN_UP(-1, 174, "TextCanUp"), + TEXT_CAN_DOWN(-1, 175, "TextCanDown"), + CALLOUT_90(-1, 178, "Callout90"), + ACCENT_CALLOUT_90(-1, 179, "AccentCallout90"), + BORDER_CALLOUT_90(-1, 180, "BorderCallout90"), + ACCENT_BORDER_CALLOUT_90(-1, 181, "AccentBorderCallout90"), + HOST_CONTROL(-1, 201, "HostControl"), + TEXT_BOX(-1, 202, "TextBox") + ; + + /** Preset-ID for XML-based shapes */ + public final int ooxmlId; + + /** Preset-ID for binary-based shapes */ + public final int nativeId; + + /** POI-specific name for the binary-based type */ + public final String nativeName; + + ShapeType(int ooxmlId, int nativeId, String nativeName){ + this.ooxmlId = ooxmlId; + this.nativeId = nativeId; + this.nativeName = nativeName; + } + + public static ShapeType forId(int id, boolean isOoxmlId){ + for(ShapeType t : values()){ + if((isOoxmlId && t.ooxmlId == id) || + (!isOoxmlId && t.nativeId == id)) return t; + } + throw new IllegalArgumentException("Unknown shape type: " + id); + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeTypes.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeTypes.java deleted file mode 100644 index 69325fe13a..0000000000 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeTypes.java +++ /dev/null @@ -1,224 +0,0 @@ -/* ==================================================================== - 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.sl.usermodel; - -public interface ShapeTypes { - public static final int NotPrimitive = 0; - public static final int Rectangle = 1; - public static final int RoundRectangle = 2; - public static final int Ellipse = 3; - public static final int Diamond = 4; - public static final int IsocelesTriangle = 5; - public static final int RightTriangle = 6; - public static final int Parallelogram = 7; - public static final int Trapezoid = 8; - public static final int Hexagon = 9; - public static final int Octagon = 10; - public static final int Plus = 11; - public static final int Star = 12; - public static final int Arrow = 13; - public static final int ThickArrow = 14; - public static final int HomePlate = 15; - public static final int Cube = 16; - public static final int Balloon = 17; - public static final int Seal = 18; - public static final int Arc = 19; - public static final int Line = 20; - public static final int Plaque = 21; - public static final int Can = 22; - public static final int Donut = 23; - public static final int TextSimple = 24; - public static final int TextOctagon = 25; - public static final int TextHexagon = 26; - public static final int TextCurve = 27; - public static final int TextWave = 28; - public static final int TextRing = 29; - public static final int TextOnCurve = 30; - public static final int TextOnRing = 31; - public static final int StraightConnector1 = 32; - public static final int BentConnector2 = 33; - public static final int BentConnector3 = 34; - public static final int BentConnector4 = 35; - public static final int BentConnector5 = 36; - public static final int CurvedConnector2 = 37; - public static final int CurvedConnector3 = 38; - public static final int CurvedConnector4 = 39; - public static final int CurvedConnector5 = 40; - public static final int Callout1 = 41; - public static final int Callout2 = 42; - public static final int Callout3 = 43; - public static final int AccentCallout1 = 44; - public static final int AccentCallout2 = 45; - public static final int AccentCallout3 = 46; - public static final int BorderCallout1 = 47; - public static final int BorderCallout2 = 48; - public static final int BorderCallout3 = 49; - public static final int AccentBorderCallout1 = 50; - public static final int AccentBorderCallout2 = 51; - public static final int AccentBorderCallout3 = 52; - public static final int Ribbon = 53; - public static final int Ribbon2 = 54; - public static final int Chevron = 55; - public static final int Pentagon = 56; - public static final int NoSmoking = 57; - public static final int Star8 = 58; - public static final int Star16 = 59; - public static final int Star32 = 60; - public static final int WedgeRectCallout = 61; - public static final int WedgeRRectCallout = 62; - public static final int WedgeEllipseCallout = 63; - public static final int Wave = 64; - public static final int FoldedCorner = 65; - public static final int LeftArrow = 66; - public static final int DownArrow = 67; - public static final int UpArrow = 68; - public static final int LeftRightArrow = 69; - public static final int UpDownArrow = 70; - public static final int IrregularSeal1 = 71; - public static final int IrregularSeal2 = 72; - public static final int LightningBolt = 73; - public static final int Heart = 74; - public static final int PictureFrame = 75; - public static final int QuadArrow = 76; - public static final int LeftArrowCallout = 77; - public static final int RightArrowCallout = 78; - public static final int UpArrowCallout = 79; - public static final int DownArrowCallout = 80; - public static final int LeftRightArrowCallout = 81; - public static final int UpDownArrowCallout = 82; - public static final int QuadArrowCallout = 83; - public static final int Bevel = 84; - public static final int LeftBracket = 85; - public static final int RightBracket = 86; - public static final int LeftBrace = 87; - public static final int RightBrace = 88; - public static final int LeftUpArrow = 89; - public static final int BentUpArrow = 90; - public static final int BentArrow = 91; - public static final int Star24 = 92; - public static final int StripedRightArrow = 93; - public static final int NotchedRightArrow = 94; - public static final int BlockArc = 95; - public static final int SmileyFace = 96; - public static final int VerticalScroll = 97; - public static final int HorizontalScroll = 98; - public static final int CircularArrow = 99; - public static final int NotchedCircularArrow = 100; - public static final int UturnArrow = 101; - public static final int CurvedRightArrow = 102; - public static final int CurvedLeftArrow = 103; - public static final int CurvedUpArrow = 104; - public static final int CurvedDownArrow = 105; - public static final int CloudCallout = 106; - public static final int EllipseRibbon = 107; - public static final int EllipseRibbon2 = 108; - public static final int FlowChartProcess = 109; - public static final int FlowChartDecision = 110; - public static final int FlowChartInputOutput = 111; - public static final int FlowChartPredefinedProcess = 112; - public static final int FlowChartInternalStorage = 113; - public static final int FlowChartDocument = 114; - public static final int FlowChartMultidocument = 115; - public static final int FlowChartTerminator = 116; - public static final int FlowChartPreparation = 117; - public static final int FlowChartManualInput = 118; - public static final int FlowChartManualOperation = 119; - public static final int FlowChartConnector = 120; - public static final int FlowChartPunchedCard = 121; - public static final int FlowChartPunchedTape = 122; - public static final int FlowChartSummingJunction = 123; - public static final int FlowChartOr = 124; - public static final int FlowChartCollate = 125; - public static final int FlowChartSort = 126; - public static final int FlowChartExtract = 127; - public static final int FlowChartMerge = 128; - public static final int FlowChartOfflineStorage = 129; - public static final int FlowChartOnlineStorage = 130; - public static final int FlowChartMagneticTape = 131; - public static final int FlowChartMagneticDisk = 132; - public static final int FlowChartMagneticDrum = 133; - public static final int FlowChartDisplay = 134; - public static final int FlowChartDelay = 135; - public static final int TextPlainText = 136; - public static final int TextStop = 137; - public static final int TextTriangle = 138; - public static final int TextTriangleInverted = 139; - public static final int TextChevron = 140; - public static final int TextChevronInverted = 141; - public static final int TextRingInside = 142; - public static final int TextRingOutside = 143; - public static final int TextArchUpCurve = 144; - public static final int TextArchDownCurve = 145; - public static final int TextCircleCurve = 146; - public static final int TextButtonCurve = 147; - public static final int TextArchUpPour = 148; - public static final int TextArchDownPour = 149; - public static final int TextCirclePour = 150; - public static final int TextButtonPour = 151; - public static final int TextCurveUp = 152; - public static final int TextCurveDown = 153; - public static final int TextCascadeUp = 154; - public static final int TextCascadeDown = 155; - public static final int TextWave1 = 156; - public static final int TextWave2 = 157; - public static final int TextWave3 = 158; - public static final int TextWave4 = 159; - public static final int TextInflate = 160; - public static final int TextDeflate = 161; - public static final int TextInflateBottom = 162; - public static final int TextDeflateBottom = 163; - public static final int TextInflateTop = 164; - public static final int TextDeflateTop = 165; - public static final int TextDeflateInflate = 166; - public static final int TextDeflateInflateDeflate = 167; - public static final int TextFadeRight = 168; - public static final int TextFadeLeft = 169; - public static final int TextFadeUp = 170; - public static final int TextFadeDown = 171; - public static final int TextSlantUp = 172; - public static final int TextSlantDown = 173; - public static final int TextCanUp = 174; - public static final int TextCanDown = 175; - public static final int FlowChartAlternateProcess = 176; - public static final int FlowChartOffpageConnector = 177; - public static final int Callout90 = 178; - public static final int AccentCallout90 = 179; - public static final int BorderCallout90 = 180; - public static final int AccentBorderCallout90 = 181; - public static final int LeftRightUpArrow = 182; - public static final int Sun = 183; - public static final int Moon = 184; - public static final int BracketPair = 185; - public static final int BracePair = 186; - public static final int Star4 = 187; - public static final int DoubleWave = 188; - public static final int ActionButtonBlank = 189; - public static final int ActionButtonHome = 190; - public static final int ActionButtonHelp = 191; - public static final int ActionButtonInformation = 192; - public static final int ActionButtonForwardNext = 193; - public static final int ActionButtonBackPrevious = 194; - public static final int ActionButtonEnd = 195; - public static final int ActionButtonBeginning = 196; - public static final int ActionButtonReturn = 197; - public static final int ActionButtonDocument = 198; - public static final int ActionButtonSound = 199; - public static final int ActionButtonMovie = 200; - public static final int HostControl = 201; - public static final int TextBox = 202; -} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java index 7959838cc1..4da90a6a36 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java @@ -17,13 +17,21 @@ package org.apache.poi.sl.usermodel; + /** * Common parent of Slides, Notes and Masters */ public interface Sheet extends ShapeContainer { - public SlideShow getSlideShow(); + SlideShow getSlideShow(); - public MasterSheet getMasterSheet(); + /** + * @return whether shapes on the master sheet should be shown. By default master graphics is turned off. + * Sheets that support the notion of master (slide, slideLayout) should override it and + * check this setting in the sheet XML + */ + boolean getFollowMasterGraphics(); + + MasterSheet getMasterSheet(); - public Background getBackground(); + Background getBackground(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/SimpleShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/SimpleShape.java index 449433a7e8..7de02dbf62 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/SimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/SimpleShape.java @@ -17,10 +17,14 @@ package org.apache.poi.sl.usermodel; -public interface SimpleShape extends Shape { - public Fill getFill(); - public LineStyle getLineStyle(); +import org.apache.poi.sl.draw.geom.IAdjustableShape; - public Hyperlink getHyperlink(); - public void setHyperlink(Hyperlink hyperlink); + +public interface SimpleShape extends Shape, IAdjustableShape { + StrokeStyle getStrokeStyle(); + Shadow getShadow(); + LineDecoration getLineDecoration(); + + Hyperlink getHyperlink(); + void setHyperlink(Hyperlink hyperlink); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java index 8239bb91ff..4505ca5843 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java @@ -17,14 +17,22 @@ package org.apache.poi.sl.usermodel; +import java.awt.Dimension; import java.io.IOException; public interface SlideShow { - public Slide createSlide() throws IOException; - public MasterSheet createMasterSheet() throws IOException; + Slide createSlide() throws IOException; + MasterSheet createMasterSheet() throws IOException; - public Slide[] getSlides(); - public MasterSheet[] getMasterSheet(); + Slide[] getSlides(); + MasterSheet[] getMasterSheet(); - public Resources getResources(); + Resources getResources(); + + /** + * Returns the current page size + * + * @return the page size + */ + Dimension getPageSize(); } diff --git a/src/java/org/apache/poi/common/usermodel/Fill.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/SolidPaint.java similarity index 86% rename from src/java/org/apache/poi/common/usermodel/Fill.java rename to src/scratchpad/src/org/apache/poi/sl/usermodel/SolidPaint.java index 9e1ab4521b..dd0225d2d9 100644 --- a/src/java/org/apache/poi/common/usermodel/Fill.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/SolidPaint.java @@ -1,24 +1,23 @@ -/* ==================================================================== - 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.common.usermodel; - -import java.awt.Color; - -public interface Fill { - public Color getColor(); - public void setColor(Color color); -} +/* ==================================================================== + 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.sl.usermodel; + + +public interface SolidPaint extends PaintStyle { + ColorStyle getSolidColor(); +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java new file mode 100644 index 0000000000..c02e1a33f9 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java @@ -0,0 +1,59 @@ +/* ==================================================================== + 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.sl.usermodel; + +public interface StrokeStyle { + enum LineCap { + /** Rounded ends */ + ROUND, + /** Square protrudes by half line width */ + SQUARE, + /** Line ends at end point*/ + FLAT; + } + + /** + * The line dash with pattern. + * The pattern is derived empirically on PowerPoint 2010 and needs to be multiplied + * with actual line width + */ + enum LineDash { + SOLID(1), + DOT(1,1), + DASH(3,4), + LG_DASH(8,3), + DASH_DOT(4,3,1,3), + LG_DASH_DOT(8,3,1,3), + LG_DASH_DOT_DOT(8,3,1,3,1,3), + SYS_DASH(2,2), + SYS_DOT(1,1), + SYS_DASH_DOT, + SYS_DASH_DOT_DOT; + + public int pattern[]; + + LineDash(int... pattern) { + this.pattern = (pattern == null || pattern.length == 0) ? new int[]{1} : pattern; + } + } + + PaintStyle getPaint(); + LineCap getLineCap(); + LineDash getLineDash(); + double getLineWidth(); +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java new file mode 100644 index 0000000000..e0c0317edb --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java @@ -0,0 +1,132 @@ +/* ==================================================================== + 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.sl.usermodel; + +import java.awt.Color; + + +public interface TextParagraph extends Iterable { + /** + * Specified a list of text alignment types + */ + public enum TextAlign { + /** + * Align text to the left margin. + */ + LEFT, + /** + * Align text in the center. + */ + CENTER, + + /** + * Align text to the right margin. + */ + RIGHT, + + /** + * Align text so that it is justified across the whole line. It + * is smart in the sense that it will not justify sentences + * which are short + */ + JUSTIFY, + JUSTIFY_LOW, + DIST, + THAI_DIST + } + + public interface BulletStyle { + String getBulletCharacter(); + String getBulletFont(); + double getBulletFontSize(); + Color getBulletFontColor(); + } + + /** + * The amount of vertical white space before the paragraph + * This may be specified in two different ways, percentage spacing and font point spacing: + *

+ * If spaceBefore >= 0, then space is a percentage of normal line height. + * If spaceBefore < 0, the absolute value of linespacing is the spacing in points + *

+ * + * @return the vertical white space before the paragraph + */ + double getSpaceBefore(); + + /** + * The amount of vertical white space after the paragraph + * This may be specified in two different ways, percentage spacing and font point spacing: + *

+ * If spaceBefore >= 0, then space is a percentage of normal line height. + * If spaceBefore < 0, the absolute value of linespacing is the spacing in points + *

+ * + * @return the vertical white space after the paragraph + */ + double getSpaceAfter(); + + /** + * @return the left margin (in points) of the paragraph + */ + double getLeftMargin(); + + /** + * @return the right margin (in points) of the paragraph + */ + double getRightMargin(); + + /** + * @return the indent applied (in points) to the first line of text in the paragraph. + */ + double getIndent(); + + /** + * Returns the vertical line spacing that is to be used within a paragraph. + * This may be specified in two different ways, percentage spacing and font point spacing: + *

+ * If linespacing >= 0, then linespacing is a percentage of normal line height. + * If linespacing < 0, the absolute value of linespacing is the spacing in points + *

+ * + * @return the vertical line spacing. + */ + double getLineSpacing(); + + String getDefaultFontFamily(); + + /** + * @return the default font size, in case its not set in the textrun + */ + double getDefaultFontSize(); + + /** + * Returns the alignment that is applied to the paragraph. + * + * If this attribute is omitted, then a value of left is implied. + * @return ??? alignment that is applied to the paragraph + */ + TextAlign getTextAlign(); + + /** + * @return the bullet style of the paragraph, if {@code null} then no bullets are used + */ + BulletStyle getBulletStyle(); + + TextShape getParentShape(); +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java index ae1a134771..87758c105f 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java @@ -17,14 +17,38 @@ package org.apache.poi.sl.usermodel; +import java.awt.Color; + /** * Some text. * * TODO - decide on how we do rich text stuff */ public interface TextRun { - public String getText(); + enum TextCap { + NONE, + SMALL, + ALL + } + + public String getText(); public void setText(String text); - // TODO - rich text formatting stuff + TextCap getTextCap(); + + Color getFontColor(); + double getFontSize(); + String getFontFamily(); + + boolean isBold(); + boolean isItalic(); + boolean isUnderline(); + boolean isStrikethrough(); + boolean isSubscript(); + boolean isSuperscript(); + + /** + * @return the pitch and family id or -1 if not applicable + */ + byte getPitchAndFamily(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java new file mode 100644 index 0000000000..68fff47937 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java @@ -0,0 +1,116 @@ +/* ==================================================================== + 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.sl.usermodel; + + + +public interface TextShape extends SimpleShape, Iterable { + /** + * Vertical Text Types + */ + public enum TextDirection { + /** + * Horizontal text. This should be default. + */ + HORIZONTAL, + /** + * Vertical orientation. + * (each line is 90 degrees rotated clockwise, so it goes + * from top to bottom; each next line is to the left from + * the previous one). + */ + VERTICAL, + /** + * Vertical orientation. + * (each line is 270 degrees rotated clockwise, so it goes + * from bottom to top; each next line is to the right from + * the previous one). + */ + VERTICAL_270, + /** + * Determines if all of the text is vertical + * ("one letter on top of another"). + */ + STACKED; + } + + /** + * Specifies alist of auto-fit types. + *

+ * Autofit specofies that a shape should be auto-fit to fully contain the text described within it. + * Auto-fitting is when text within a shape is scaled in order to contain all the text inside + *

+ */ + public enum TextAutofit { + /** + * Specifies that text within the text body should not be auto-fit to the bounding box. + * Auto-fitting is when text within a text box is scaled in order to remain inside + * the text box. + */ + NONE, + /** + * Specifies that text within the text body should be normally auto-fit to the bounding box. + * Autofitting is when text within a text box is scaled in order to remain inside the text box. + * + *

+ * Example: Consider the situation where a user is building a diagram and needs + * to have the text for each shape that they are using stay within the bounds of the shape. + * An easy way this might be done is by using NORMAL autofit + *

+ */ + NORMAL, + /** + * Specifies that a shape should be auto-fit to fully contain the text described within it. + * Auto-fitting is when text within a shape is scaled in order to contain all the text inside. + * + *

+ * Example: Consider the situation where a user is building a diagram and needs to have + * the text for each shape that they are using stay within the bounds of the shape. + * An easy way this might be done is by using SHAPE autofit + *

+ */ + SHAPE + } + + /** + * @return text shape margin + */ + Insets2D getInsets(); + + /** + * Compute the cumulative height occupied by the text + */ + double getTextHeight(); + + /** + * Returns the type of vertical alignment for the text. + * + * @return the type of vertical alignment + */ + VerticalAlignment getVerticalAlignment(); + + /** + * @return whether to wrap words within the bounding rectangle + */ + boolean getWordWrap(); + + /** + * @return vertical orientation of the text + */ + TextDirection getTextDirection(); +} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineCap.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TexturePaint.java similarity index 72% rename from src/ooxml/java/org/apache/poi/xslf/usermodel/LineCap.java rename to src/scratchpad/src/org/apache/poi/sl/usermodel/TexturePaint.java index 55b4c8492f..135b69b263 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineCap.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TexturePaint.java @@ -14,25 +14,24 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ -package org.apache.poi.xslf.usermodel; -/** - * - * - * @author Yegor Kozlov - */ -public enum LineCap { +package org.apache.poi.sl.usermodel; + +import java.io.InputStream; + +public interface TexturePaint extends PaintStyle { /** - * Rounded ends + * @return the raw image stream */ - ROUND, - /** - * Square protrudes by half line width - */ - SQUARE, + InputStream getImageData(); /** - * Line ends at end point + * @return the content type of the image data */ - FLAT; -} \ No newline at end of file + String getContentType(); + + /** + * @return the alpha mask in percents [0..100000] + */ + int getAlpha(); +} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/VerticalAlignment.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/VerticalAlignment.java similarity index 95% rename from src/ooxml/java/org/apache/poi/xslf/usermodel/VerticalAlignment.java rename to src/scratchpad/src/org/apache/poi/sl/usermodel/VerticalAlignment.java index fd00a64e26..540bf2ed51 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/VerticalAlignment.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/VerticalAlignment.java @@ -16,7 +16,7 @@ * limitations under the License. * ==================================================================== */ -package org.apache.poi.xslf.usermodel; +package org.apache.poi.sl.usermodel; /** * Specifies a list of available anchoring types for text diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java index 41c5c58a3f..29bd16f8b7 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java @@ -35,6 +35,7 @@ import org.apache.poi.ddf.EscherSimpleProperty; import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.record.Document; import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.sl.usermodel.ShapeType; import org.junit.Test; @@ -59,7 +60,7 @@ public final class TestBackground { assertTrue(slide.getFollowMasterBackground()); assertEquals(Fill.FILL_SOLID, slide.getBackground().getFill().getFillType()); - Shape shape = new AutoShape(ShapeTypes.Rectangle); + Shape shape = new AutoShape(ShapeType.RECT); assertEquals(Fill.FILL_SOLID, shape.getFill().getFillType()); } @@ -114,7 +115,7 @@ public final class TestBackground { fill.setFillType(Fill.FILL_PICTURE); fill.setPictureData(idx); - shape = new AutoShape(ShapeTypes.Rectangle); + shape = new AutoShape(ShapeType.RECT); shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200)); fill = shape.getFill(); fill.setFillType(Fill.FILL_SOLID); @@ -130,7 +131,7 @@ public final class TestBackground { fill.setBackgroundColor(Color.green); fill.setForegroundColor(Color.red); - shape = new AutoShape(ShapeTypes.Rectangle); + shape = new AutoShape(ShapeType.RECT); shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200)); fill = shape.getFill(); fill.setFillType(Fill.FILL_BACKGROUND); @@ -144,7 +145,7 @@ public final class TestBackground { fill.setFillType(Fill.FILL_TEXTURE); fill.setPictureData(idx); - shape = new AutoShape(ShapeTypes.Rectangle); + shape = new AutoShape(ShapeType.RECT); shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200)); fill = shape.getFill(); fill.setFillType(Fill.FILL_PICTURE); @@ -160,7 +161,7 @@ public final class TestBackground { fill.setBackgroundColor(Color.white); fill.setForegroundColor(Color.darkGray); - shape = new AutoShape(ShapeTypes.Rectangle); + shape = new AutoShape(ShapeType.RECT); shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200)); fill = shape.getFill(); fill.setFillType(Fill.FILL_SHADE); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java index b3e4f6ac99..10ff88da6b 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java @@ -41,6 +41,7 @@ import org.apache.poi.ddf.EscherSimpleProperty; import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.usermodel.RichTextRun; import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.sl.usermodel.ShapeType; import org.junit.Before; import org.junit.Test; @@ -81,7 +82,7 @@ public final class TestShapes { line.setLineColor(Color.red); slide.addShape(line); - AutoShape ellipse = new AutoShape(ShapeTypes.Ellipse); + AutoShape ellipse = new AutoShape(ShapeType.ELLIPSE); java.awt.Rectangle ellipseAnchor = new Rectangle(320, 154, 55, 111); ellipse.setAnchor(ellipseAnchor); ellipse.setLineWidth(2); @@ -334,7 +335,7 @@ public final class TestShapes { @Test public void lineWidth() { - SimpleShape sh = new AutoShape(ShapeTypes.RightTriangle); + SimpleShape sh = new AutoShape(ShapeType.RT_TRIANGLE); EscherOptRecord opt = sh.getEscherOptRecord(); EscherSimpleProperty prop = SimpleShape.getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java index 48b6df54a6..928f1e4508 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java @@ -17,26 +17,38 @@ package org.apache.poi.hslf.model; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Map; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.hslf.record.TextHeaderAtom; import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.record.TextHeaderAtom; +import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.sl.usermodel.ShapeType; +import org.junit.Test; /** * Verify behavior of TextShape and its sub-classes * * @author Yegor Kozlov */ -public final class TestTextShape extends TestCase { +public final class TestTextShape { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); - public void testCreateAutoShape(){ - TextShape shape = new AutoShape(ShapeTypes.Trapezoid); + @Test + public void createAutoShape(){ + TextShape shape = new AutoShape(ShapeType.TRAPEZOID); assertNull(shape.getTextRun()); assertNull(shape.getText()); assertNull(shape.getEscherTextboxWrapper()); @@ -50,7 +62,8 @@ public final class TestTextShape extends TestCase { assertEquals(-1, run.getIndex()); } - public void testCreateTextBox(){ + @Test + public void createTextBox(){ TextShape shape = new TextBox(); TextRun run = shape.getTextRun(); assertNotNull(run); @@ -70,10 +83,11 @@ public final class TestTextShape extends TestCase { * - normal TextBox object * - text in auto-shapes */ - public void testRead() throws IOException { + @Test + public void read() throws IOException { SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("text_shapes.ppt")); - ArrayList lst1 = new ArrayList(); + List lst1 = new ArrayList(); Slide slide = ppt.getSlides()[0]; Shape[] shape = slide.getShapes(); for (int i = 0; i < shape.length; i++) { @@ -83,24 +97,24 @@ public final class TestTextShape extends TestCase { assertNotNull(run); int runType = run.getRunType(); - int type = shape[i].getShapeType(); + ShapeType type = shape[i].getShapeType(); switch (type){ - case ShapeTypes.TextBox: + case TEXT_BOX: assertEquals("Text in a TextBox", run.getText()); break; - case ShapeTypes.Rectangle: + case RECT: if(runType == TextHeaderAtom.OTHER_TYPE) assertEquals("Rectangle", run.getText()); else if(runType == TextHeaderAtom.TITLE_TYPE) assertEquals("Title Placeholder", run.getText()); break; - case ShapeTypes.Octagon: + case OCTAGON: assertEquals("Octagon", run.getText()); break; - case ShapeTypes.Ellipse: + case ELLIPSE: assertEquals("Ellipse", run.getText()); break; - case ShapeTypes.RoundRectangle: + case ROUND_RECT: assertEquals("RoundRectangle", run.getText()); break; default: @@ -110,7 +124,7 @@ public final class TestTextShape extends TestCase { lst1.add(run.getText()); } - ArrayList lst2 = new ArrayList(); + List lst2 = new ArrayList(); TextRun[] run = slide.getTextRuns(); for (int i = 0; i < run.length; i++) { lst2.add(run[i].getText()); @@ -119,7 +133,8 @@ public final class TestTextShape extends TestCase { assertTrue(lst1.containsAll(lst2)); } - public void testReadWrite() throws IOException { + @Test + public void readWrite() throws IOException { SlideShow ppt = new SlideShow(); Slide slide = ppt.createSlide(); @@ -130,7 +145,7 @@ public final class TestTextShape extends TestCase { shape1.moveTo(100, 100); - TextShape shape2 = new AutoShape(ShapeTypes.Arrow); + TextShape shape2 = new AutoShape(ShapeType.RIGHT_ARROW); TextRun run2 = shape2.createTextRun(); run2.setText("Testing TextShape"); slide.addShape(shape2); @@ -146,21 +161,22 @@ public final class TestTextShape extends TestCase { assertTrue(shape[0] instanceof TextShape); shape1 = (TextShape)shape[0]; - assertEquals(ShapeTypes.TextBox, shape1.getShapeType()); + assertEquals(ShapeType.TEXT_BOX, shape1.getShapeType()); assertEquals("Hello, World!", shape1.getTextRun().getText()); assertTrue(shape[1] instanceof TextShape); shape1 = (TextShape)shape[1]; - assertEquals(ShapeTypes.Arrow, shape1.getShapeType()); + assertEquals(ShapeType.RIGHT_ARROW, shape1.getShapeType()); assertEquals("Testing TextShape", shape1.getTextRun().getText()); } - public void testMargins() throws IOException { + @Test + public void margins() throws IOException { SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("text-margins.ppt")); Slide slide = ppt.getSlides()[0]; - HashMap map = new HashMap(); + Map map = new HashMap(); Shape[] shape = slide.getShapes(); for (int i = 0; i < shape.length; i++) { if(shape[i] instanceof TextShape){ @@ -171,32 +187,33 @@ public final class TestTextShape extends TestCase { TextShape tx; - tx = (TextShape)map.get("TEST1"); + tx = map.get("TEST1"); assertEquals(0.1, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.1, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.39, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.05, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - tx = (TextShape)map.get("TEST2"); + tx = map.get("TEST2"); assertEquals(0.1, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.1, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.05, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.39, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - tx = (TextShape)map.get("TEST3"); + tx = map.get("TEST3"); assertEquals(0.39, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.1, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.05, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.05, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - tx = (TextShape)map.get("TEST4"); + tx = map.get("TEST4"); assertEquals(0.1, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.39, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.05, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); assertEquals(0.05, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); } - public void test52599() throws IOException { + @Test + public void bug52599() throws IOException { SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("52599.ppt")); Slide slide = ppt.getSlides()[0]; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java index 67d250a4b6..6a2f3229c3 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java @@ -653,7 +653,7 @@ public final class TestBugs { for (byte data[] : ep) { EscherColorRef ecr = new EscherColorRef(data, 0, 4); int rgb[] = ecr.getRGB(); - double pos = Units.fixedPointToDecimal(LittleEndian.getInt(data, 4)); + double pos = Units.fixedPointToDouble(LittleEndian.getInt(data, 4)); assertEquals((int)exp[i][0], rgb[0]); assertEquals((int)exp[i][1], rgb[1]); assertEquals((int)exp[i][2], rgb[2]); diff --git a/src/types/definitions/dml-shapeGeometry.xjb b/src/types/definitions/dml-shapeGeometry.xjb new file mode 100644 index 0000000000..43a0c2a687 --- /dev/null +++ b/src/types/definitions/dml-shapeGeometry.xjb @@ -0,0 +1,7 @@ + + + From 7afac11f67ef21f520dc7b2e797e36f432624222 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sat, 7 Mar 2015 23:35:40 +0000 Subject: [PATCH 03/22] committing intermediate results - xslf now compiles - hslf needs to be migrated to common interface - drawing is not yet tested git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1664935 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hslf/examples/ApacheconEU08.java | 2 +- .../poi/hslf/examples/DataExtraction.java | 4 +- .../poi/hslf/examples/Graphics2DDemo.java | 2 +- .../apache/poi/hslf/examples/Hyperlinks.java | 4 +- .../apache/poi/hslf/examples/SoundFinder.java | 4 +- .../xslf/model/ParagraphPropertyFetcher.java | 4 +- .../poi/xslf/model/PropertyFetcher.java | 2 +- .../xslf/model/TextBodyPropertyFetcher.java | 4 +- .../poi/xslf/usermodel/LineDecoration.java | 29 - .../poi/xslf/usermodel/LineEndLength.java | 26 - .../poi/xslf/usermodel/LineEndWidth.java | 26 - .../poi/xslf/usermodel/RenderableShape.java | 632 ------------------ .../poi/xslf/usermodel/XMLSlideShow.java | 4 +- .../poi/xslf/usermodel/XSLFAutoShape.java | 4 +- .../poi/xslf/usermodel/XSLFBackground.java | 55 +- .../poi/xslf/usermodel/XSLFGraphicFrame.java | 54 +- .../poi/xslf/usermodel/XSLFGroupShape.java | 125 ++-- .../poi/xslf/usermodel/XSLFPictureData.java | 21 +- .../poi/xslf/usermodel/XSLFPictureShape.java | 21 +- .../apache/poi/xslf/usermodel/XSLFShadow.java | 85 +-- .../apache/poi/xslf/usermodel/XSLFShape.java | 620 ++++++++--------- .../xslf/usermodel/XSLFShapeContainer.java | 2 +- .../apache/poi/xslf/usermodel/XSLFSheet.java | 81 +-- .../poi/xslf/usermodel/XSLFSimpleShape.java | 430 ++++++------ .../apache/poi/xslf/usermodel/XSLFSlide.java | 28 +- .../poi/xslf/usermodel/XSLFSlideLayout.java | 2 +- .../poi/xslf/usermodel/XSLFSlideMaster.java | 2 +- .../poi/xslf/usermodel/XSLFTableCell.java | 279 ++++---- .../poi/xslf/usermodel/XSLFTextParagraph.java | 42 +- .../poi/xslf/usermodel/XSLFTextShape.java | 67 +- .../src/org/apache/poi/hslf/blip/EMF.java | 4 +- .../src/org/apache/poi/hslf/blip/PICT.java | 6 +- .../src/org/apache/poi/hslf/blip/WMF.java | 4 +- .../hslf/extractor/PowerPointExtractor.java | 6 +- .../apache/poi/hslf/model/ActiveXShape.java | 2 +- .../org/apache/poi/hslf/model/AutoShape.java | 6 +- .../org/apache/poi/hslf/model/AutoShapes.java | 40 +- .../org/apache/poi/hslf/model/Background.java | 4 +- .../src/org/apache/poi/hslf/model/Fill.java | 32 +- .../org/apache/poi/hslf/model/Freeform.java | 6 +- .../{ShapeGroup.java => HSLFGroupShape.java} | 28 +- .../hslf/model/{Shape.java => HSLFShape.java} | 8 +- .../org/apache/poi/hslf/model/Hyperlink.java | 2 +- .../src/org/apache/poi/hslf/model/Line.java | 6 +- .../apache/poi/hslf/model/MasterSheet.java | 2 +- .../org/apache/poi/hslf/model/MovieShape.java | 4 +- .../org/apache/poi/hslf/model/OLEShape.java | 4 +- .../apache/poi/hslf/model/PPGraphics2D.java | 6 +- .../org/apache/poi/hslf/model/Picture.java | 8 +- .../apache/poi/hslf/model/Placeholder.java | 4 +- .../org/apache/poi/hslf/model/Polygon.java | 6 +- .../apache/poi/hslf/model/ShapeFactory.java | 22 +- .../apache/poi/hslf/model/ShapeOutline.java | 2 +- .../src/org/apache/poi/hslf/model/Sheet.java | 26 +- .../apache/poi/hslf/model/SimpleShape.java | 16 +- .../src/org/apache/poi/hslf/model/Slide.java | 6 +- .../src/org/apache/poi/hslf/model/Table.java | 18 +- .../org/apache/poi/hslf/model/TableCell.java | 4 +- .../org/apache/poi/hslf/model/TextBox.java | 4 +- .../apache/poi/hslf/model/TextPainter.java | 12 +- .../org/apache/poi/hslf/model/TextShape.java | 6 +- .../poi/hslf/usermodel/RichTextRun.java | 10 +- .../apache/poi/hslf/usermodel/SlideShow.java | 12 +- .../org/apache/poi/sl/draw/DrawAutoShape.java | 2 +- .../apache/poi/sl/draw/DrawBackground.java | 41 ++ .../org/apache/poi/sl/draw/DrawFactory.java | 74 +- .../apache/poi/sl/draw/DrawFreeformShape.java | 2 +- .../apache/poi/sl/draw/DrawMasterSheet.java | 9 +- .../src/org/apache/poi/sl/draw/DrawPaint.java | 12 +- .../apache/poi/sl/draw/DrawPictureShape.java | 37 + .../src/org/apache/poi/sl/draw/DrawShape.java | 20 +- .../apache/poi/sl/draw/DrawShapeGroup.java | 60 ++ .../src/org/apache/poi/sl/draw/DrawSheet.java | 12 +- .../apache/poi/sl/draw/DrawSimpleShape.java | 7 +- .../src/org/apache/poi/sl/draw/DrawSlide.java | 24 + .../org/apache/poi/sl/draw/DrawTextBox.java | 2 +- .../apache/poi/sl/draw/DrawTextParagraph.java | 8 +- .../org/apache/poi/sl/draw/DrawTextShape.java | 8 +- .../org/apache/poi/sl/draw/ImageRenderer.java | 14 +- .../apache/poi/sl/usermodel/AutoShape.java | 3 +- .../apache/poi/sl/usermodel/Background.java | 2 +- .../poi/sl/usermodel/FreeformShape.java | 2 +- .../poi/sl/usermodel/GradientPaint.java | 32 - .../apache/poi/sl/usermodel/MasterSheet.java | 2 +- .../org/apache/poi/sl/usermodel/Notes.java | 2 +- .../apache/poi/sl/usermodel/PaintStyle.java | 33 + .../org/apache/poi/sl/usermodel/Picture.java | 22 - .../apache/poi/sl/usermodel/PictureData.java | 7 +- .../{SolidPaint.java => PictureShape.java} | 52 +- .../poi/sl/usermodel/PlaceableShape.java | 49 +- .../org/apache/poi/sl/usermodel/Shadow.java | 7 +- .../org/apache/poi/sl/usermodel/Shape.java | 49 +- .../poi/sl/usermodel/ShapeContainer.java | 8 +- .../apache/poi/sl/usermodel/ShapeGroup.java | 4 +- .../org/apache/poi/sl/usermodel/Sheet.java | 4 +- .../apache/poi/sl/usermodel/SimpleShape.java | 18 +- .../org/apache/poi/sl/usermodel/Slide.java | 6 +- .../org/apache/poi/sl/usermodel/TextBox.java | 2 +- .../poi/sl/usermodel/TextParagraph.java | 4 +- .../apache/poi/sl/usermodel/TextShape.java | 2 +- .../apache/poi/sl/usermodel/TexturePaint.java | 37 - .../apache/poi/hslf/model/TestBackground.java | 12 +- .../poi/hslf/model/TestOleEmbedding.java | 2 +- .../poi/hslf/model/TestPPGraphics2D.java | 8 +- .../org/apache/poi/hslf/model/TestShapes.java | 22 +- .../org/apache/poi/hslf/model/TestSheet.java | 2 +- .../org/apache/poi/hslf/model/TestTable.java | 2 +- .../apache/poi/hslf/model/TestTextRun.java | 6 +- .../apache/poi/hslf/model/TestTextShape.java | 40 +- .../apache/poi/hslf/usermodel/TestBugs.java | 52 +- .../poi/hslf/usermodel/TestPictures.java | 14 +- .../apache/poi/hslf/usermodel/TestTable.java | 4 +- 112 files changed, 1460 insertions(+), 2370 deletions(-) delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/LineDecoration.java delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndLength.java delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndWidth.java delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java rename src/scratchpad/src/org/apache/poi/hslf/model/{ShapeGroup.java => HSLFGroupShape.java} (93%) rename src/scratchpad/src/org/apache/poi/hslf/model/{Shape.java => HSLFShape.java} (98%) create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawPictureShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java delete mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/GradientPaint.java delete mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/Picture.java rename src/scratchpad/src/org/apache/poi/sl/usermodel/{SolidPaint.java => PictureShape.java} (80%) delete mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/TexturePaint.java diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java index 489ba22a14..7d013237ff 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java +++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java @@ -419,7 +419,7 @@ public final class ApacheconEU08 { Slide slide = ppt.createSlide(); - ShapeGroup group = new ShapeGroup(); + HSLFGroupShape group = new HSLFGroupShape(); //define position of the drawing in the slide Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300); group.setAnchor(bounds); diff --git a/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java b/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java index a278e894b6..e0f58741e1 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java +++ b/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java @@ -60,7 +60,7 @@ public final class DataExtraction { //extract embedded OLE documents Slide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { - Shape[] shape = slide[i].getShapes(); + HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { if (shape[j] instanceof OLEShape) { OLEShape ole = (OLEShape) shape[j]; @@ -102,7 +102,7 @@ public final class DataExtraction { //Pictures for (int i = 0; i < slide.length; i++) { - Shape[] shape = slide[i].getShapes(); + HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { if (shape[j] instanceof Picture) { Picture p = (Picture) shape[j]; diff --git a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java index 8d7921146a..a2f14ac41b 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java @@ -46,7 +46,7 @@ public final class Graphics2DDemo { Slide slide = ppt.createSlide(); - ShapeGroup group = new ShapeGroup(); + HSLFGroupShape group = new HSLFGroupShape(); //define position of the drawing in the slide Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300); group.setAnchor(bounds); diff --git a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java index 968426c513..a90b6a1df0 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java +++ b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java @@ -21,7 +21,7 @@ import org.apache.poi.hslf.usermodel.SlideShow; import org.apache.poi.hslf.model.Slide; import org.apache.poi.hslf.model.TextRun; import org.apache.poi.hslf.model.Hyperlink; -import org.apache.poi.hslf.model.Shape; +import org.apache.poi.hslf.model.HSLFShape; import java.io.FileInputStream; @@ -63,7 +63,7 @@ public final class Hyperlinks { //for example to a Line object. The code below demonstrates how to //read such hyperlinks System.out.println(" reading hyperlinks from the slide's shapes"); - Shape[] sh = slide[j].getShapes(); + HSLFShape[] sh = slide[j].getShapes(); for (int k = 0; k < sh.length; k++) { Hyperlink link = sh[k].getHyperlink(); if(link != null) { diff --git a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java index b31019db94..571c86a425 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java +++ b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java @@ -37,7 +37,7 @@ public class SoundFinder { Slide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { - Shape[] shape = slide[i].getShapes(); + HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { int soundRef = getSoundReference(shape[j]); if(soundRef != -1) { @@ -54,7 +54,7 @@ public class SoundFinder { * @return 0-based reference to a sound in the sound collection * or -1 if the shape is not associated with a sound */ - protected static int getSoundReference(Shape shape){ + protected static int getSoundReference(HSLFShape shape){ int soundRef = -1; //dive into the shape container and search for InteractiveInfoAtom EscherContainerRecord spContainer = shape.getSpContainer(); diff --git a/src/ooxml/java/org/apache/poi/xslf/model/ParagraphPropertyFetcher.java b/src/ooxml/java/org/apache/poi/xslf/model/ParagraphPropertyFetcher.java index 65c19e6d74..c6c583616c 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/ParagraphPropertyFetcher.java +++ b/src/ooxml/java/org/apache/poi/xslf/model/ParagraphPropertyFetcher.java @@ -19,7 +19,7 @@ package org.apache.poi.xslf.model; -import org.apache.poi.xslf.usermodel.XSLFSimpleShape; +import org.apache.poi.xslf.usermodel.XSLFShape; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; @@ -34,7 +34,7 @@ public abstract class ParagraphPropertyFetcher extends PropertyFetcher { _level = level; } - public boolean fetch(XSLFSimpleShape shape) { + public boolean fetch(XSLFShape shape) { XmlObject[] o = shape.getXmlObject().selectPath( "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + diff --git a/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java b/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java index ddb3f0745b..f9e8a780da 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java +++ b/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java @@ -36,7 +36,7 @@ public abstract class PropertyFetcher { * @param shape the shape being examined * @return true if the desired property was fetched */ - public abstract boolean fetch(XSLFShape shape) ; + public abstract boolean fetch(XSLFShape shape); public T getValue(){ return _value; diff --git a/src/ooxml/java/org/apache/poi/xslf/model/TextBodyPropertyFetcher.java b/src/ooxml/java/org/apache/poi/xslf/model/TextBodyPropertyFetcher.java index b66a1e5f7a..cc8486a33c 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/TextBodyPropertyFetcher.java +++ b/src/ooxml/java/org/apache/poi/xslf/model/TextBodyPropertyFetcher.java @@ -19,7 +19,7 @@ package org.apache.poi.xslf.model; -import org.apache.poi.xslf.usermodel.XSLFSimpleShape; +import org.apache.poi.xslf.usermodel.XSLFShape; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties; @@ -32,7 +32,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties; */ public abstract class TextBodyPropertyFetcher extends PropertyFetcher { - public boolean fetch(XSLFSimpleShape shape) { + public boolean fetch(XSLFShape shape) { XmlObject[] o = shape.getXmlObject().selectPath( "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDecoration.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDecoration.java deleted file mode 100644 index 72b28c0b34..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDecoration.java +++ /dev/null @@ -1,29 +0,0 @@ -/* ==================================================================== - 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.usermodel; - -/** - * Represents the shape decoration that appears at the ends of lines. - */ -public enum LineDecoration { - NONE, - TRIANGLE, - STEALTH, - DIAMOND, - OVAL, - ARROW -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndLength.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndLength.java deleted file mode 100644 index 43ccb566fa..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndLength.java +++ /dev/null @@ -1,26 +0,0 @@ -/* ==================================================================== - 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.usermodel; - -/** - * @author Yegor Kozlov - */ -public enum LineEndLength { - SMALL, - MEDIUM, - LARGE -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndWidth.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndWidth.java deleted file mode 100644 index cee716bff7..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndWidth.java +++ /dev/null @@ -1,26 +0,0 @@ -/* ==================================================================== - 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.usermodel; - -/** - * @author Yegor Kozlov - */ -public enum LineEndWidth { - SMALL, - MEDIUM, - LARGE -} \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java deleted file mode 100644 index 8a11c1cd17..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java +++ /dev/null @@ -1,632 +0,0 @@ -/* - * ==================================================================== - * 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.usermodel; - -import java.awt.AlphaComposite; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.GradientPaint; -import java.awt.Graphics2D; -import java.awt.Paint; -import java.awt.Shape; -import java.awt.Stroke; -import java.awt.TexturePaint; -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; - -import org.apache.poi.openxml4j.opc.PackagePart; -import org.apache.poi.openxml4j.opc.PackageRelationship; -import org.apache.poi.sl.usermodel.LineCap; -import org.apache.poi.sl.usermodel.LineDash; -import org.apache.poi.util.Internal; -import org.apache.poi.util.Units; -import org.apache.poi.xslf.model.PropertyFetcher; -import org.apache.poi.xslf.model.geom.Context; -import org.apache.poi.xslf.model.geom.CustomGeometry; -import org.apache.poi.xslf.model.geom.Guide; -import org.apache.poi.xslf.model.geom.IAdjustableShape; -import org.apache.poi.xslf.model.geom.Outline; -import org.apache.poi.xslf.model.geom.Path; -import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip; -import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGradientFillProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGradientStop; -import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTNoFillProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPathShadeProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D; -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.CTStyleMatrixReference; -import org.openxmlformats.schemas.drawingml.x2006.main.STPathShadeType; - -/** - * Encapsulates logic to translate DrawingML objects to Java2D - */ -@Internal -class RenderableShape { - public final static Color NO_PAINT = new Color(0xFF, 0xFF, 0xFF, 0); - - private XSLFSimpleShape _shape; - - public RenderableShape(XSLFSimpleShape shape){ - _shape = shape; - } - - /** - * Convert shape fill into java.awt.Paint. The result is either Color or - * TexturePaint or GradientPaint or null - * - * @param graphics the target graphics - * @param obj the xml to read. Must contain elements from the EG_ColorChoice group: - * - * a:scrgbClr RGB Color Model - Percentage Variant - * a:srgbClr RGB Color Model - Hex Variant - * a:hslClr Hue, Saturation, Luminance Color Model - * a:sysClr System Color - * a:schemeClr Scheme Color - * a:prstClr Preset Color - * - * - * @param phClr context color - * @param parentPart the parent package part. Any external references (images, etc.) are resolved relative to it. - * - * @return the applied Paint or null if none was applied - */ - public Paint selectPaint(Graphics2D graphics, XmlObject obj, CTSchemeColor phClr, PackagePart parentPart) { - XSLFTheme theme = _shape.getSheet().getTheme(); - - Paint paint = null; - if (obj instanceof CTNoFillProperties) { - paint = NO_PAINT; - - } - else if (obj instanceof CTSolidColorFillProperties) { - CTSolidColorFillProperties solidFill = (CTSolidColorFillProperties) obj; - XSLFColor c = new XSLFColor(solidFill, theme, phClr); - paint = c.getColor(); - } - else if (obj instanceof CTBlipFillProperties) { - CTBlipFillProperties blipFill = (CTBlipFillProperties)obj; - paint = createTexturePaint(blipFill, graphics, parentPart); - } - else if (obj instanceof CTGradientFillProperties) { - Rectangle2D anchor = getAnchor(graphics); - CTGradientFillProperties gradFill = (CTGradientFillProperties) obj; - if (gradFill.isSetLin()) { - paint = createLinearGradientPaint(graphics, gradFill, anchor, theme, phClr); - } else if (gradFill.isSetPath()){ - CTPathShadeProperties ps = gradFill.getPath(); - if(ps.getPath() == STPathShadeType.CIRCLE){ - paint = createRadialGradientPaint(gradFill, anchor, theme, phClr); - } else if (ps.getPath() == STPathShadeType.SHAPE){ - paint = toRadialGradientPaint(gradFill, anchor, theme, phClr); - } - } - } - - return paint; - } - - private Paint createTexturePaint(CTBlipFillProperties blipFill, Graphics2D graphics, - PackagePart parentPart){ - Paint paint = null; - CTBlip blip = blipFill.getBlip(); - String blipId = blip.getEmbed(); - PackageRelationship rel = parentPart.getRelationship(blipId); - if (rel != null) { - XSLFImageRenderer renderer = null; - if (graphics != null) - renderer = (XSLFImageRenderer) graphics.getRenderingHint(XSLFRenderingHint.IMAGE_RENDERER); - if (renderer == null) renderer = new XSLFImageRenderer(); - - try { - BufferedImage img = renderer.readImage(parentPart.getRelatedPart(rel)); - if (blip.sizeOfAlphaModFixArray() > 0) { - float alpha = blip.getAlphaModFixArray(0).getAmt() / 100000.f; - AlphaComposite ac = AlphaComposite.getInstance( - AlphaComposite.SRC_OVER, alpha); - if (graphics != null) graphics.setComposite(ac); - } - - if(img != null) { - paint = new TexturePaint( - img, new Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight())); - } - } - catch (Exception e) { - e.printStackTrace(); - } - } - return paint; - } - - private Paint createLinearGradientPaint( - Graphics2D graphics, - CTGradientFillProperties gradFill, Rectangle2D anchor, - XSLFTheme theme, CTSchemeColor phClr) { - double angle = gradFill.getLin().getAng() / 60000; - @SuppressWarnings("deprecation") - CTGradientStop[] gs = gradFill.getGsLst().getGsArray(); - - Arrays.sort(gs, new Comparator() { - public int compare(CTGradientStop o1, CTGradientStop o2) { - Integer pos1 = o1.getPos(); - Integer pos2 = o2.getPos(); - return pos1.compareTo(pos2); - } - }); - - Color[] colors = new Color[gs.length]; - float[] fractions = new float[gs.length]; - - AffineTransform at = AffineTransform.getRotateInstance( - Math.toRadians(angle), - anchor.getX() + anchor.getWidth() / 2, - anchor.getY() + anchor.getHeight() / 2); - - double diagonal = Math.sqrt(anchor.getHeight() * anchor.getHeight() + anchor.getWidth() * anchor.getWidth()); - Point2D p1 = new Point2D.Double(anchor.getX() + anchor.getWidth() / 2 - diagonal / 2, - anchor.getY() + anchor.getHeight() / 2); - p1 = at.transform(p1, null); - - Point2D p2 = new Point2D.Double(anchor.getX() + anchor.getWidth(), anchor.getY() + anchor.getHeight() / 2); - p2 = at.transform(p2, null); - - snapToAnchor(p1, anchor); - snapToAnchor(p2, anchor); - - for (int i = 0; i < gs.length; i++) { - CTGradientStop stop = gs[i]; - colors[i] = new XSLFColor(stop, theme, phClr).getColor(); - fractions[i] = stop.getPos() / 100000.f; - } - - AffineTransform grAt = new AffineTransform(); - if(gradFill.isSetRotWithShape() || !gradFill.getRotWithShape()) { - double rotation = _shape.getRotation(); - if (rotation != 0.) { - double centerX = anchor.getX() + anchor.getWidth() / 2; - double centerY = anchor.getY() + anchor.getHeight() / 2; - - grAt.translate(centerX, centerY); - grAt.rotate(Math.toRadians(-rotation)); - grAt.translate(-centerX, -centerY); - } - } - - // Trick to return GradientPaint on JDK 1.5 and LinearGradientPaint on JDK 1.6+ - Paint paint; - try { - Class clz = Class.forName("java.awt.LinearGradientPaint"); - Class clzCycleMethod = Class.forName("java.awt.MultipleGradientPaint$CycleMethod"); - Class clzColorSpaceType = Class.forName("java.awt.MultipleGradientPaint$ColorSpaceType"); - Constructor c = - clz.getConstructor(Point2D.class, Point2D.class, float[].class, Color[].class, - clzCycleMethod, clzColorSpaceType, AffineTransform.class); - paint = (Paint) c.newInstance(p1, p2, fractions, colors, - Enum.valueOf(clzCycleMethod, "NO_CYCLE"), - Enum.valueOf(clzColorSpaceType, "SRGB"), grAt); - } catch (ClassNotFoundException e) { - paint = new GradientPaint(p1, colors[0], p2, colors[colors.length - 1]); - } catch (Exception e) { - throw new RuntimeException(e); - } - return paint; - } - - /** - * gradients with type=shape are enot supported by Java graphics. - * We approximate it with a radial gradient. - */ - private static Paint toRadialGradientPaint( - CTGradientFillProperties gradFill, Rectangle2D anchor, - XSLFTheme theme, CTSchemeColor phClr) { - - @SuppressWarnings("deprecation") - CTGradientStop[] gs = gradFill.getGsLst().getGsArray(); - Arrays.sort(gs, new Comparator() { - public int compare(CTGradientStop o1, CTGradientStop o2) { - Integer pos1 = o1.getPos(); - Integer pos2 = o2.getPos(); - return pos1.compareTo(pos2); - } - }); - gs[1].setPos(50000); - - CTGradientFillProperties g = CTGradientFillProperties.Factory.newInstance(); - g.set(gradFill); - g.getGsLst().setGsArray(new CTGradientStop[]{gs[0], gs[1]}); - return createRadialGradientPaint(g, anchor, theme, phClr); - } - - private static Paint createRadialGradientPaint( - CTGradientFillProperties gradFill, Rectangle2D anchor, - XSLFTheme theme, CTSchemeColor phClr) { - @SuppressWarnings("deprecation") - CTGradientStop[] gs = gradFill.getGsLst().getGsArray(); - - Point2D pCenter = new Point2D.Double(anchor.getX() + anchor.getWidth()/2, - anchor.getY() + anchor.getHeight()/2); - - float radius = (float)Math.max(anchor.getWidth(), anchor.getHeight()); - - Arrays.sort(gs, new Comparator() { - public int compare(CTGradientStop o1, CTGradientStop o2) { - Integer pos1 = o1.getPos(); - Integer pos2 = o2.getPos(); - return pos1.compareTo(pos2); - } - }); - - Color[] colors = new Color[gs.length]; - float[] fractions = new float[gs.length]; - - - for (int i = 0; i < gs.length; i++) { - CTGradientStop stop = gs[i]; - colors[i] = new XSLFColor(stop, theme, phClr).getColor(); - fractions[i] = stop.getPos() / 100000.f; - } - - // Trick to return GradientPaint on JDK 1.5 and RadialGradientPaint on JDK 1.6+ - Paint paint; - try { - Class clz = Class.forName("java.awt.RadialGradientPaint"); - Constructor c = - clz.getConstructor(Point2D.class, float.class, - float[].class, Color[].class); - paint = (Paint) c.newInstance(pCenter, radius, fractions, colors); - } catch (ClassNotFoundException e) { - // the result on JDK 1.5 is incorrect, but it is better than nothing - paint = new GradientPaint( - new Point2D.Double(anchor.getX(), anchor.getY()), - colors[0], pCenter, colors[colors.length - 1]); - } catch (Exception e) { - throw new RuntimeException(e); - } - return paint; - } - - private static void snapToAnchor(Point2D p, Rectangle2D anchor) { - if (p.getX() < anchor.getX()) { - p.setLocation(anchor.getX(), p.getY()); - } else if (p.getX() > (anchor.getX() + anchor.getWidth())) { - p.setLocation(anchor.getX() + anchor.getWidth(), p.getY()); - } - - if (p.getY() < anchor.getY()) { - p.setLocation(p.getX(), anchor.getY()); - } else if (p.getY() > (anchor.getY() + anchor.getHeight())) { - p.setLocation(p.getX(), anchor.getY() + anchor.getHeight()); - } - } - - - Paint getPaint(Graphics2D graphics, XmlObject spPr, CTSchemeColor phClr) { - - Paint paint = null; - for (XmlObject obj : spPr.selectPath("*")) { - paint = selectPaint(graphics, obj, phClr, _shape.getSheet().getPackagePart()); - if(paint != null) break; - } - return paint == NO_PAINT ? null : paint; - } - - - /** - * fetch shape fill as a java.awt.Paint - * - * @return either Color or GradientPaint or TexturePaint or null - */ - Paint getFillPaint(final Graphics2D graphics) { - PropertyFetcher fetcher = new PropertyFetcher() { - public boolean fetch(XSLFSimpleShape shape) { - CTShapeProperties spPr = shape.getSpPr(); - if (spPr.isSetNoFill()) { - setValue(RenderableShape.NO_PAINT); // use it as 'nofill' value - return true; - } - Paint paint = getPaint(graphics, spPr, null); - if (paint != null) { - setValue(paint); - return true; - } - return false; - } - }; - _shape.fetchShapeProperty(fetcher); - - Paint paint = fetcher.getValue(); - if (paint == null) { - // fill color was not found, check if it is defined in the theme - CTShapeStyle style = _shape.getSpStyle(); - if (style != null) { - // get a reference to a fill style within the style matrix. - CTStyleMatrixReference fillRef = style.getFillRef(); - // The idx attribute refers to the index of a fill style or - // background fill style within the presentation's style matrix, defined by the fmtScheme element. - // value of 0 or 1000 indicates no background, - // values 1-999 refer to the index of a fill style within the fillStyleLst element - // values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element. - int idx = (int)fillRef.getIdx(); - CTSchemeColor phClr = fillRef.getSchemeClr(); - XSLFSheet sheet = _shape.getSheet(); - XSLFTheme theme = sheet.getTheme(); - XmlObject fillProps = null; - if(idx >= 1 && idx <= 999){ - fillProps = theme.getXmlObject(). - getThemeElements().getFmtScheme().getFillStyleLst().selectPath("*")[idx - 1]; - } else if (idx >= 1001 ){ - fillProps = theme.getXmlObject(). - getThemeElements().getFmtScheme().getBgFillStyleLst().selectPath("*")[idx - 1001]; - } - if(fillProps != null) { - paint = selectPaint(graphics, fillProps, phClr, sheet.getPackagePart()); - } - } - } - return paint == RenderableShape.NO_PAINT ? null : paint; - } - - public Paint getLinePaint(final Graphics2D graphics) { - PropertyFetcher fetcher = new PropertyFetcher() { - public boolean fetch(XSLFSimpleShape shape) { - CTLineProperties spPr = shape.getSpPr().getLn(); - if (spPr != null) { - if (spPr.isSetNoFill()) { - setValue(NO_PAINT); // use it as 'nofill' value - return true; - } - Paint paint = getPaint(graphics, spPr, null); - if (paint != null) { - setValue(paint); - return true; - } - } - return false; - - } - }; - _shape.fetchShapeProperty(fetcher); - - Paint paint = fetcher.getValue(); - if (paint == null) { - // line color was not found, check if it is defined in the theme - CTShapeStyle style = _shape.getSpStyle(); - if (style != null) { - // get a reference to a line style within the style matrix. - CTStyleMatrixReference lnRef = style.getLnRef(); - int idx = (int)lnRef.getIdx(); - CTSchemeColor phClr = lnRef.getSchemeClr(); - if(idx > 0){ - XSLFTheme theme = _shape.getSheet().getTheme(); - XmlObject lnProps = theme.getXmlObject(). - getThemeElements().getFmtScheme().getLnStyleLst().selectPath("*")[idx - 1]; - paint = getPaint(graphics, lnProps, phClr); - } - } - } - - return paint == NO_PAINT ? null : paint; - } - - /** - * convert PPT dash into java.awt.BasicStroke - * - * The mapping is derived empirically on PowerPoint 2010 - */ - private static float[] getDashPattern(LineDash lineDash, float lineWidth) { - float[] dash = null; - switch (lineDash) { - case SYS_DOT: - dash = new float[]{lineWidth, lineWidth}; - break; - case SYS_DASH: - dash = new float[]{2 * lineWidth, 2 * lineWidth}; - break; - case DASH: - dash = new float[]{3 * lineWidth, 4 * lineWidth}; - break; - case DASH_DOT: - dash = new float[]{4 * lineWidth, 3 * lineWidth, lineWidth, - 3 * lineWidth}; - break; - case LG_DASH: - dash = new float[]{8 * lineWidth, 3 * lineWidth}; - break; - case LG_DASH_DOT: - dash = new float[]{8 * lineWidth, 3 * lineWidth, lineWidth, - 3 * lineWidth}; - break; - case LG_DASH_DOT_DOT: - dash = new float[]{8 * lineWidth, 3 * lineWidth, lineWidth, - 3 * lineWidth, lineWidth, 3 * lineWidth}; - break; - } - return dash; - } - - - public Stroke applyStroke(Graphics2D graphics) { - - float lineWidth = (float) _shape.getLineWidth(); - if(lineWidth == 0.0f) lineWidth = 0.25f; // Both PowerPoint and OOo draw zero-length lines as 0.25pt - - LineDash lineDash = _shape.getLineDash(); - float[] dash = null; - float dash_phase = 0; - if (lineDash != null) { - dash = getDashPattern(lineDash, lineWidth); - } - - int cap = BasicStroke.CAP_BUTT; - LineCap lineCap = _shape.getLineCap(); - if (lineCap != null) { - switch (lineCap) { - case ROUND: - cap = BasicStroke.CAP_ROUND; - break; - case SQUARE: - cap = BasicStroke.CAP_SQUARE; - break; - default: - cap = BasicStroke.CAP_BUTT; - break; - } - } - - int meter = BasicStroke.JOIN_ROUND; - - Stroke stroke = new BasicStroke(lineWidth, cap, meter, Math.max(1, lineWidth), dash, - dash_phase); - graphics.setStroke(stroke); - return stroke; - } - - public void render(Graphics2D graphics){ - Collection elems = computeOutlines(graphics); - - // shadow - XSLFShadow shadow = _shape.getShadow(); - - // first fill - Paint fill = getFillPaint(graphics); - Paint line = getLinePaint(graphics); - applyStroke(graphics); // the stroke applies both to the shadow and the shape - - // first paint the shadow - if(shadow != null) for(Outline o : elems){ - if(o.getPath().isFilled()){ - if(fill != null) shadow.fill(graphics, o.getOutline()); - else if(line != null) shadow.draw(graphics, o.getOutline()); - } - } - // then fill the shape interior - if(fill != null) for(Outline o : elems){ - if(o.getPath().isFilled()){ - graphics.setPaint(fill); - graphics.fill(o.getOutline()); - } - } - - // then draw any content within this shape (text, image, etc.) - _shape.drawContent(graphics); - - // then stroke the shape outline - if(line != null) for(Outline o : elems){ - if(o.getPath().isStroked()){ - graphics.setPaint(line); - graphics.draw(o.getOutline()); - } - } - } - - @SuppressWarnings("deprecation") - private Collection computeOutlines(Graphics2D graphics) { - - Collection lst = new ArrayList(); - CustomGeometry geom = _shape.getGeometry(); - if(geom == null) { - return lst; - } - - Rectangle2D anchor = getAnchor(graphics); - for (Path p : geom) { - - double w = p.getW() == -1 ? anchor.getWidth() * Units.EMU_PER_POINT : p.getW(); - double h = p.getH() == -1 ? anchor.getHeight() * Units.EMU_PER_POINT : p.getH(); - - // the guides in the shape definitions are all defined relative to each other, - // so we build the path starting from (0,0). - final Rectangle2D pathAnchor = new Rectangle2D.Double( - 0, - 0, - w, - h - ); - - Context ctx = new Context(geom, pathAnchor, new IAdjustableShape() { - - public Guide getAdjustValue(String name) { - CTPresetGeometry2D prst = _shape.getSpPr().getPrstGeom(); - if (prst.isSetAvLst()) { - for (CTGeomGuide g : prst.getAvLst().getGdArray()) { - if (g.getName().equals(name)) { - return new Guide(g); - } - } - } - return null; - } - }) ; - - Shape gp = p.getPath(ctx); - - // translate the result to the canvas coordinates in points - AffineTransform at = new AffineTransform(); - at.translate(anchor.getX(), anchor.getY()); - - double scaleX, scaleY; - if (p.getW() != -1) { - scaleX = anchor.getWidth() / p.getW(); - } else { - scaleX = 1.0 / Units.EMU_PER_POINT; - } - if (p.getH() != -1) { - scaleY = anchor.getHeight() / p.getH(); - } else { - scaleY = 1.0 / Units.EMU_PER_POINT; - } - - at.scale(scaleX, scaleY); - - Shape canvasShape = at.createTransformedShape(gp); - - lst.add(new Outline(canvasShape, p)); - } - - return lst; - } - - public Rectangle2D getAnchor(Graphics2D graphics) { - Rectangle2D anchor = _shape.getAnchor(); - if(graphics == null) { - return anchor; - } - - AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM); - if(tx != null) { - anchor = tx.createTransformedShape(anchor).getBounds2D(); - } - return anchor; - } -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index 1c5f855db3..26780f9662 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -496,11 +496,11 @@ public class XMLSlideShow extends POIXMLDocument implements SlideShow { return null; } - public MasterSheet[] getMasterSheet() { + public XSLFSlideMaster[] getMasterSheet() { return getSlideMasters(); } - public MasterSheet createMasterSheet() throws IOException { + public MasterSheet createMasterSheet() throws IOException { // TODO: implement! throw new UnsupportedOperationException(); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java index 47bcace2f3..a87d91bd58 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java @@ -36,7 +36,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShapeNonVisual; * @author Yegor Kozlov */ @Beta -public class XSLFAutoShape extends XSLFTextShape implements AutoShape { +public class XSLFAutoShape extends XSLFTextShape implements AutoShape { /*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) { super(shape, sheet); @@ -72,7 +72,7 @@ public class XSLFAutoShape extends XSLFTextShape implements AutoShape { } protected CTTextBody getTextBody(boolean create){ - CTShape shape = (CTShape) getXmlObject(); + CTShape shape = (CTShape)getXmlObject(); CTTextBody txBody = shape.getTxBody(); if (txBody == null && create) { txBody = shape.addNewTxBody(); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java index 80c6a1acbe..bfa3f31ec0 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java @@ -20,9 +20,10 @@ package org.apache.poi.xslf.usermodel; import java.awt.*; import java.awt.geom.Rectangle2D; -import org.apache.poi.sl.usermodel.Background; -import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.*; +import org.apache.poi.sl.draw.DrawPaint; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D; import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground; /** @@ -42,48 +43,14 @@ public class XSLFBackground extends XSLFSimpleShape implements Background { return new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight()); } - public void draw(Graphics2D graphics) { - Rectangle2D anchor = getAnchor(); - - Paint fill = getPaint(graphics); - if(fill != null) { - graphics.setPaint(fill); - graphics.fill(anchor); - } - } - - /** - * @return the Paint object to fill - */ - Paint getPaint(Graphics2D graphics){ - RenderableShape rShape = new RenderableShape(this); - - Paint fill = null; - CTBackground bg = (CTBackground)getXmlObject(); - if(bg.isSetBgPr()){ - XmlObject spPr = bg.getBgPr(); - fill = rShape.getPaint(graphics, spPr, null); - } else if (bg.isSetBgRef()){ - CTStyleMatrixReference bgRef= bg.getBgRef(); - CTSchemeColor phClr = bgRef.getSchemeClr(); - - int idx = (int)bgRef.getIdx() - 1001; - XSLFTheme theme = getSheet().getTheme(); - CTBackgroundFillStyleList bgStyles = - theme.getXmlObject().getThemeElements().getFmtScheme().getBgFillStyleLst(); - - XmlObject bgStyle = bgStyles.selectPath("*")[idx]; - fill = rShape.selectPaint(graphics, bgStyle, phClr, theme.getPackagePart()); - } - - return fill; - } - @Override public Color getFillColor(){ - Paint p = getPaint(null); - if(p instanceof Color){ - return (Color)p; + FillStyle fs = getFillStyle(); + PaintStyle ps = fs.getPaint(); + if (ps instanceof SolidPaint) { + SolidPaint sp = (SolidPaint)ps; + ColorStyle cs = sp.getSolidColor(); + return DrawPaint.applyColorTransform(cs); } return null; } @@ -95,7 +62,7 @@ public class XSLFBackground extends XSLFSimpleShape implements Background { * @return dummy CTTransform2D bean */ @Override - CTTransform2D getXfrm() { + protected CTTransform2D getXfrm() { return CTTransform2D.Factory.newInstance(); } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java index 514c1bc90f..608cb3adba 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java @@ -19,6 +19,10 @@ package org.apache.poi.xslf.usermodel; +import java.awt.geom.Rectangle2D; + +import javax.xml.namespace.QName; + import org.apache.poi.POIXMLException; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.PackagePart; @@ -28,52 +32,24 @@ import org.apache.poi.util.Beta; import org.apache.poi.util.Units; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D; +import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; -import javax.xml.namespace.QName; - -import java.awt.Graphics2D; -import java.awt.geom.Rectangle2D; - /** * @author Yegor Kozlov */ @Beta public class XSLFGraphicFrame extends XSLFShape { - private final CTGraphicalObjectFrame _shape; - private final XSLFSheet _sheet; - /*package*/ XSLFGraphicFrame(CTGraphicalObjectFrame shape, XSLFSheet sheet){ - _shape = shape; - _sheet = sheet; - } - - public CTGraphicalObjectFrame getXmlObject(){ - return _shape; - } - - public XSLFSheet getSheet(){ - return _sheet; + super(shape,sheet); } public ShapeType getShapeType(){ throw new UnsupportedOperationException(); } - public int getShapeId(){ - return (int)_shape.getNvGraphicFramePr().getCNvPr().getId(); - } - - public String getShapeName(){ - return _shape.getNvGraphicFramePr().getCNvPr().getName(); - } - public Rectangle2D getAnchor(){ - CTTransform2D xfrm = _shape.getXfrm(); + CTTransform2D xfrm = ((CTGraphicalObjectFrame)getXmlObject()).getXfrm(); CTPoint2D off = xfrm.getOff(); long x = off.getX(); long y = off.getY(); @@ -86,7 +62,7 @@ public class XSLFGraphicFrame extends XSLFShape { } public void setAnchor(Rectangle2D anchor){ - CTTransform2D xfrm = _shape.getXfrm(); + CTTransform2D xfrm = ((CTGraphicalObjectFrame)getXmlObject()).getXfrm(); CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff(); long x = Units.toEMU(anchor.getX()); long y = Units.toEMU(anchor.getY()); @@ -157,15 +133,11 @@ public class XSLFGraphicFrame extends XSLFShape { return false; } - public void draw(Graphics2D graphics){ - - } - @Override void copy(XSLFShape sh){ super.copy(sh); - CTGraphicalObjectData data = _shape.getGraphic().getGraphicData(); + CTGraphicalObjectData data = ((CTGraphicalObjectFrame)getXmlObject()).getGraphic().getGraphicData(); String uri = data.getUri(); if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){ copyDiagram(data, (XSLFGraphicFrame)sh); @@ -187,22 +159,22 @@ public class XSLFGraphicFrame extends XSLFShape { String dm = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "dm")); PackageRelationship dmRel = sheet.getPackagePart().getRelationship(dm); PackagePart dmPart = sheet.getPackagePart().getRelatedPart(dmRel); - _sheet.importPart(dmRel, dmPart); + getSheet().importPart(dmRel, dmPart); String lo = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "lo")); PackageRelationship loRel = sheet.getPackagePart().getRelationship(lo); PackagePart loPart = sheet.getPackagePart().getRelatedPart(loRel); - _sheet.importPart(loRel, loPart); + getSheet().importPart(loRel, loPart); String qs = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "qs")); PackageRelationship qsRel = sheet.getPackagePart().getRelationship(qs); PackagePart qsPart = sheet.getPackagePart().getRelatedPart(qsRel); - _sheet.importPart(qsRel, qsPart); + getSheet().importPart(qsRel, qsPart); String cs = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "cs")); PackageRelationship csRel = sheet.getPackagePart().getRelationship(cs); PackagePart csPart = sheet.getPackagePart().getRelatedPart(csRel); - _sheet.importPart(csRel, csPart); + getSheet().importPart(csRel, csPart); } catch (InvalidFormatException e){ throw new POIXMLException(e); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java index f93fc803fb..57e96f8ee5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java @@ -29,15 +29,11 @@ import java.util.regex.Pattern; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.openxml4j.opc.TargetMode; -import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.usermodel.*; import org.apache.poi.util.Beta; import org.apache.poi.util.Units; import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D; -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.*; import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector; import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual; @@ -49,29 +45,33 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; * @author Yegor Kozlov */ @Beta -public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { - private final CTGroupShape _shape; - private final XSLFSheet _sheet; +public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, PlaceableShape { private final List _shapes; - private final CTGroupShapeProperties _spPr; + private final CTGroupShapeProperties _grpSpPr; private XSLFDrawing _drawing; - /*package*/ XSLFGroupShape(CTGroupShape shape, XSLFSheet sheet){ - _shape = shape; - _sheet = sheet; - - _shapes = _sheet.buildShapes(_shape); - _spPr = shape.getGrpSpPr(); + protected XSLFGroupShape(CTGroupShape shape, XSLFSheet sheet){ + super(shape,sheet); + _shapes = sheet.buildShapes(shape); + _grpSpPr = shape.getGrpSpPr(); } - @Override - public CTGroupShape getXmlObject(){ - return _shape; + protected CTGroupShapeProperties getGrpSpPr() { + return _grpSpPr; + } + + protected CTGroupTransform2D getSafeXfrm() { + CTGroupTransform2D xfrm = getXfrm(); + return (xfrm == null ? getGrpSpPr().addNewXfrm() : xfrm); + } + + protected CTGroupTransform2D getXfrm() { + return getGrpSpPr().getXfrm(); } @Override public Rectangle2D getAnchor(){ - CTGroupTransform2D xfrm = _spPr.getXfrm(); + CTGroupTransform2D xfrm = getXfrm(); CTPoint2D off = xfrm.getOff(); long x = off.getX(); long y = off.getY(); @@ -85,7 +85,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { @Override public void setAnchor(Rectangle2D anchor){ - CTGroupTransform2D xfrm = _spPr.isSetXfrm() ? _spPr.getXfrm() : _spPr.addNewXfrm(); + CTGroupTransform2D xfrm = getSafeXfrm(); CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff(); long x = Units.toEMU(anchor.getX()); long y = Units.toEMU(anchor.getY()); @@ -105,7 +105,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { * behavior of shapes placed within a group. */ public Rectangle2D getInteriorAnchor(){ - CTGroupTransform2D xfrm = _spPr.getXfrm(); + CTGroupTransform2D xfrm = getXfrm(); CTPoint2D off = xfrm.getChOff(); long x = off.getX(); long y = off.getY(); @@ -124,7 +124,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { * behavior of shapes placed within a group. */ public void setInteriorAnchor(Rectangle2D anchor){ - CTGroupTransform2D xfrm = _spPr.isSetXfrm() ? _spPr.getXfrm() : _spPr.addNewXfrm(); + CTGroupTransform2D xfrm = getSafeXfrm(); CTPoint2D off = xfrm.isSetChOff() ? xfrm.getChOff() : xfrm.addNewChOff(); long x = Units.toEMU(anchor.getX()); long y = Units.toEMU(anchor.getY()); @@ -159,28 +159,19 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { */ public boolean removeShape(XSLFShape xShape) { XmlObject obj = xShape.getXmlObject(); + CTGroupShape grpSp = (CTGroupShape)getXmlObject(); if(obj instanceof CTShape){ - _shape.getSpList().remove(obj); + grpSp.getSpList().remove(obj); } else if (obj instanceof CTGroupShape){ - _shape.getGrpSpList().remove(obj); + grpSp.getGrpSpList().remove(obj); } else if (obj instanceof CTConnector){ - _shape.getCxnSpList().remove(obj); + grpSp.getCxnSpList().remove(obj); } else { throw new IllegalArgumentException("Unsupported shape: " + xShape); } return _shapes.remove(xShape); } - @Override - public String getShapeName(){ - return _shape.getNvGrpSpPr().getCNvPr().getName(); - } - - @Override - public int getShapeId(){ - return (int)_shape.getNvGrpSpPr().getCNvPr().getId(); - } - /** * @param shapeId 1-based shapeId */ @@ -200,7 +191,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { // shape factory methods private XSLFDrawing getDrawing(){ if(_drawing == null) { - _drawing = new XSLFDrawing(_sheet, _shape); + _drawing = new XSLFDrawing(getSheet(), (CTGroupShape)getXmlObject()); } return _drawing; } @@ -242,7 +233,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { public XSLFPictureShape createPicture(int pictureIndex){ - List pics = _sheet.getPackagePart().getPackage() + List pics = getSheet().getPackagePart().getPackage() .getPartsByName(Pattern.compile("/ppt/media/image" + (pictureIndex + 1) + ".*?")); if(pics.size() == 0) { @@ -251,7 +242,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { PackagePart pic = pics.get(0); - PackageRelationship rel = _sheet.getPackagePart().addRelationship( + PackageRelationship rel = getSheet().getPackagePart().addRelationship( pic.getPartName(), TargetMode.INTERNAL, XSLFRelation.IMAGES.getRelation()); XSLFPictureShape sh = getDrawing().createPicture(rel.getId()); @@ -263,67 +254,35 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { @Override public void setFlipHorizontal(boolean flip){ - _spPr.getXfrm().setFlipH(flip); + getSafeXfrm().setFlipH(flip); } @Override public void setFlipVertical(boolean flip){ - _spPr.getXfrm().setFlipV(flip); + getSafeXfrm().setFlipV(flip); } @Override public boolean getFlipHorizontal(){ - return _spPr.getXfrm().getFlipH(); + CTGroupTransform2D xfrm = getXfrm(); + return (xfrm == null || !xfrm.isSetFlipH()) ? false : xfrm.getFlipH(); } @Override public boolean getFlipVertical(){ - return _spPr.getXfrm().getFlipV(); + CTGroupTransform2D xfrm = getXfrm(); + return (xfrm == null || !xfrm.isSetFlipV()) ? false : xfrm.getFlipV(); } @Override public void setRotation(double theta){ - _spPr.getXfrm().setRot((int)(theta*60000)); + getSafeXfrm().setRot((int) (theta * 60000)); } @Override public double getRotation(){ - return (double)_spPr.getXfrm().getRot()/60000; - } - - @Override - public void draw(Graphics2D graphics){ - - // the coordinate system of this group of shape - Rectangle2D interior = getInteriorAnchor(); - // anchor of this group relative to the parent shape - Rectangle2D exterior = getAnchor(); - - AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM); - AffineTransform tx0 = new AffineTransform(tx); - - double scaleX = interior.getWidth() == 0. ? 1.0 : exterior.getWidth() / interior.getWidth(); - double scaleY = interior.getHeight() == 0. ? 1.0 : exterior.getHeight() / interior.getHeight(); - - tx.translate(exterior.getX(), exterior.getY()); - tx.scale(scaleX, scaleY); - tx.translate(-interior.getX(), -interior.getY()); - - for (XSLFShape shape : getShapes()) { - // remember the initial transform and restore it after we are done with the drawing - AffineTransform at = graphics.getTransform(); - graphics.setRenderingHint(XSLFRenderingHint.GSAVE, true); - - shape.applyTransform(graphics); - shape.draw(graphics); - - // restore the coordinate system - graphics.setTransform(at); - graphics.setRenderingHint(XSLFRenderingHint.GRESTORE, true); - } - - graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, tx0); - + CTGroupTransform2D xfrm = getXfrm(); + return (xfrm == null || !xfrm.isSetRot()) ? 0 : (xfrm.getRot() / 60000.d); } @Override @@ -350,13 +309,9 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer { } } - public ShapeType getShapeType(){ - return null; - } - public void addShape(XSLFShape shape) { throw new UnsupportedOperationException( "Adding a shape from a different container is not supported -" - + " create it from scratch witht XSLFGroupShape.create* methods"); + + " create it from scratch with XSLFGroupShape.create* methods"); } } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java index 7ade4f948d..3b6053b0bd 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java @@ -20,12 +20,12 @@ package org.apache.poi.xslf.usermodel; import java.io.IOException; +import java.io.OutputStream; -import org.apache.poi.POIXMLDocumentPart; -import org.apache.poi.POIXMLException; -import org.apache.poi.POIXMLRelation; +import org.apache.poi.*; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.usermodel.PictureData; import org.apache.poi.util.Beta; import org.apache.poi.util.IOUtils; @@ -35,7 +35,7 @@ import org.apache.poi.util.IOUtils; * @author Yegor Kozlov */ @Beta -public final class XSLFPictureData extends POIXMLDocumentPart { +public final class XSLFPictureData extends POIXMLDocumentPart implements PictureData { /** * Extended windows meta file */ @@ -215,4 +215,17 @@ public final class XSLFPictureData extends POIXMLDocumentPart { protected void prepareForCommit() { // do not clear the part here } + + public String getContentType() { + POIXMLRelation rel = RELATIONS[getPictureType()]; + return (rel == null) ? null : rel.getContentType(); + } + + public void setData(byte[] data) throws IOException { + OutputStream os = getPackagePart().getOutputStream(); + os.write(data); + os.close(); + } + + } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java index a7e7e5e815..d0f75e0535 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java @@ -179,30 +179,13 @@ public class XSLFPictureShape extends XSLFSimpleShape { return id; } - public Insets getBlipClip(){ + public Insets getClipping(){ CTPicture ct = (CTPicture)getXmlObject(); CTRelativeRect r = ct.getBlipFill().getSrcRect(); return (r == null) ? null : new Insets(r.getT(), r.getL(), r.getB(), r.getR()); } - @Override - public void drawContent(Graphics2D graphics) { - - XSLFPictureData data = getPictureData(); - if(data == null) return; - - XSLFImageRenderer renderer = (XSLFImageRenderer)graphics.getRenderingHint(XSLFRenderingHint.IMAGE_RENDERER); - if(renderer == null) renderer = new XSLFImageRenderer(); - - RenderableShape rShape = new RenderableShape(this); - Rectangle2D anchor = rShape.getAnchor(graphics); - - Insets insets = getBlipClip(); - - renderer.drawImage(graphics, data, anchor, insets); - } - - + @SuppressWarnings("deprecation") @Override void copy(XSLFShape sh){ super.copy(sh); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java index fa4b192ec4..9004a6be5f 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java @@ -17,22 +17,22 @@ package org.apache.poi.xslf.usermodel; -import org.apache.poi.sl.usermodel.Shadow; +import java.awt.Color; +import java.awt.geom.Rectangle2D; + +import org.apache.poi.sl.draw.DrawPaint; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; import org.apache.poi.util.Units; import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect; import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor; -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.Shape; -import java.awt.geom.Rectangle2D; - /** * Represents a shadow of a shape. For now supports only outer shadows. * * @author Yegor Kozlov */ -public class XSLFShadow extends XSLFSimpleShape implements Shadow { +public class XSLFShadow extends XSLFShape implements Shadow { private XSLFSimpleShape _parent; @@ -42,54 +42,15 @@ public class XSLFShadow extends XSLFSimpleShape implements Shadow { _parent = parentShape; } - - public void fill(Graphics2D graphics, Shape outline) { - - double shapeRotation = _parent.getRotation(); - if(_parent.getFlipVertical()){ - shapeRotation += 180; - } - double angle = getAngle() - shapeRotation; - double dist = getDistance(); - double dx = dist * Math.cos(Math.toRadians(angle)); - double dy = dist * Math.sin(Math.toRadians(angle)); - - graphics.translate(dx, dy); - - Color fillColor = getFillColor(); - if (fillColor != null) { - graphics.setColor(fillColor); - graphics.fill(outline); - } - - graphics.translate(-dx, -dy); - } - - public void draw(Graphics2D graphics, Shape outline) { - - double angle = getAngle(); - double dist = getDistance(); - double dx = dist * Math.cos(Math.toRadians(angle)); - double dy = dist * Math.sin(Math.toRadians(angle)); - - graphics.translate(dx, dy); - - Color fillColor = getFillColor(); - if (fillColor != null) { - graphics.setColor(fillColor); - graphics.draw(outline); - } - - graphics.translate(-dx, -dy); - } - - @Override + public XSLFSimpleShape getShadowParent() { + return _parent; + } + public Rectangle2D getAnchor(){ return _parent.getAnchor(); } - @Override public void setAnchor(Rectangle2D anchor){ throw new IllegalStateException("You can't set anchor of a shadow"); } @@ -125,15 +86,25 @@ public class XSLFShadow extends XSLFSimpleShape implements Shadow { * @return the color of this shadow. * Depending whether the parent shape is filled or stroked, this color is used to fill or stroke this shadow */ - @Override public Color getFillColor() { + SolidPaint ps = getFillStyle(); + if (ps == TRANSPARENT_PAINT) return null; + Color col = DrawPaint.applyColorTransform(ps.getSolidColor()); + return col; + } + + @Override + public SolidPaint getFillStyle() { XSLFTheme theme = getSheet().getTheme(); CTOuterShadowEffect ct = (CTOuterShadowEffect)getXmlObject(); - if(ct == null) { - return null; - } else { - CTSchemeColor phClr = ct.getSchemeClr(); - return new XSLFColor(ct, theme, phClr).getColor(); - } + if(ct == null) return TRANSPARENT_PAINT; + + CTSchemeColor phClr = ct.getSchemeClr(); + final XSLFColor xc = new XSLFColor(ct, theme, phClr); + return new SolidPaint(){ + public ColorStyle getSolidColor() { + return xc.getColorStyle(); + } + }; } } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java index aa6e2c712f..5634838302 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java @@ -20,7 +20,6 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; -import java.awt.geom.Rectangle2D; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; @@ -30,14 +29,16 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.sl.draw.DrawPaint; -import org.apache.poi.sl.draw.geom.CustomGeometry; import org.apache.poi.sl.usermodel.*; -import org.apache.poi.util.*; +import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; +import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint; +import org.apache.poi.util.Beta; +import org.apache.poi.util.Internal; import org.apache.poi.xslf.model.PropertyFetcher; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.*; -import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; -import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; +import org.openxmlformats.schemas.presentationml.x2006.main.*; /** * Base super-class class for all shapes in PresentationML @@ -46,16 +47,16 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; */ @Beta public abstract class XSLFShape implements Shape { - protected final XmlObject _shape; - protected final XSLFSheet _sheet; - protected XSLFShapeContainer _parent; + private final XmlObject _shape; + private final XSLFSheet _sheet; + private XSLFShapeContainer _parent; private CTShapeProperties _spPr; private CTShapeStyle _spStyle; private CTNonVisualDrawingProps _nvPr; private CTPlaceholder _ph; - private static final PaintStyle TRANSPARENT_PAINT = new SolidPaint() { + protected static final SolidPaint TRANSPARENT_PAINT = new SolidPaint() { public ColorStyle getSolidColor() { return new ColorStyle(){ public Color getColor() { return DrawPaint.NO_PAINT; } @@ -68,24 +69,30 @@ public abstract class XSLFShape implements Shape { } }; - protected XSLFShape(XmlObject shape, XSLFSheet sheet) { _shape = shape; _sheet = sheet; } - /** * @return the xml bean holding this shape's data */ - public XmlObject getXmlObject() { + public final XmlObject getXmlObject() { + // it's final because the xslf inheritance hierarchy is not necessary the same as + // the (not existing) xmlbeans hierarchy and subclasses shouldn't narrow it's return value return _shape; } + public XSLFSheet getSheet() { + return _sheet; + } + /** * @return human-readable name of this shape, e.g. "Rectange 3" */ - public abstract String getShapeName(); + public String getShapeName(){ + return getCNvPr().getName(); + } /** * Returns a unique identifier for this shape within the current document. @@ -98,55 +105,9 @@ public abstract class XSLFShape implements Shape { * * @return unique id of this shape */ - public abstract int getShapeId(); - - /** - * Rotate this shape. - *

- * Positive angles are clockwise (i.e., towards the positive y axis); - * negative angles are counter-clockwise (i.e., towards the negative y axis). - *

- * - * @param theta the rotation angle in degrees. - */ - public abstract void setRotation(double theta); - - /** - * Rotation angle in degrees - *

- * Positive angles are clockwise (i.e., towards the positive y axis); - * negative angles are counter-clockwise (i.e., towards the negative y axis). - *

- * - * @return rotation angle in degrees - */ - public abstract double getRotation(); - - /** - * @param flip whether the shape is horizontally flipped - */ - public abstract void setFlipHorizontal(boolean flip); - - /** - * Whether the shape is vertically flipped - * - * @param flip whether the shape is vertically flipped - */ - public abstract void setFlipVertical(boolean flip); - - /** - * Whether the shape is horizontally flipped - * - * @return whether the shape is horizontally flipped - */ - public abstract boolean getFlipHorizontal(); - - /** - * Whether the shape is vertically flipped - * - * @return whether the shape is vertically flipped - */ - public abstract boolean getFlipVertical(); + public int getShapeId() { + return (int)getCNvPr().getId(); + } /** * Set the contents of this shape to be a copy of the source shape. @@ -162,7 +123,12 @@ public abstract class XSLFShape implements Shape { "Can't copy " + sh.getClass().getSimpleName() + " into " + getClass().getSimpleName()); } - setAnchor(sh.getAnchor()); + if (this instanceof PlaceableShape) { + PlaceableShape ps = (PlaceableShape)this; + ps.setAnchor(((PlaceableShape)sh).getAnchor()); + } + + } public void setParent(XSLFShapeContainer parent) { @@ -173,93 +139,148 @@ public abstract class XSLFShape implements Shape { return this._parent; } - public boolean isPlaceholder() { - return false; + protected PaintStyle getFillPaint() { + PropertyFetcher fetcher = new PropertyFetcher() { + public boolean fetch(XSLFShape shape) { + XmlObject pr = null; + try { + pr = shape.getSpPr(); + if (((CTShapeProperties)pr).isSetNoFill()) { + setValue(TRANSPARENT_PAINT); + return true; + } + } catch (IllegalStateException e) {} + // trying background properties now + if (pr == null) { + pr = shape.getBgPr(); + } + if (pr == null) { + pr = shape.getGrpSpPr(); + } + if (pr == null) { + setValue(TRANSPARENT_PAINT); + return true; + } + + PaintStyle paint = null; + for (XmlObject obj : pr.selectPath("*")) { + paint = selectPaint(obj, null, getSheet().getPackagePart()); + if (paint != null) break; + } + + if (paint == null) return false; + + setValue(paint); + return true; + } + }; + fetchShapeProperty(fetcher); + + PaintStyle paint = fetcher.getValue(); + if (paint != null) return paint; + + // fill color was not found, check if it is defined in the theme + // get a reference to a fill style within the style matrix. + CTStyleMatrixReference fillRef = null; + if (fillRef == null) { + CTShapeStyle style = getSpStyle(); + if (style != null) fillRef = style.getFillRef(); + } + if (fillRef == null) { + fillRef = getBgRef(); + } + if (fillRef == null) { + return TRANSPARENT_PAINT; + } + + // The idx attribute refers to the index of a fill style or + // background fill style within the presentation's style matrix, defined by the fmtScheme element. + // value of 0 or 1000 indicates no background, + // values 1-999 refer to the index of a fill style within the fillStyleLst element + // values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element. + int idx = (int)fillRef.getIdx(); + CTSchemeColor phClr = fillRef.getSchemeClr(); + XSLFSheet sheet = getSheet(); + XSLFTheme theme = sheet.getTheme(); + XmlObject fillProps = null; + CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme(); + if(idx >= 1 && idx <= 999){ + fillProps = matrix.getFillStyleLst().selectPath("*")[idx - 1]; + } else if (idx >= 1001 ){ + fillProps = matrix.getBgFillStyleLst().selectPath("*")[idx - 1001]; + } + if(fillProps != null) { + paint = selectPaint(fillProps, phClr, sheet.getPackagePart()); + } + + return paint == null ? TRANSPARENT_PAINT : paint; } - public StrokeStyle getStrokeStyle() { - // TODO Auto-generated method stub - return null; + protected CTBackgroundProperties getBgPr() { + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:bgPr"; + return selectProperty(CTBackgroundProperties.class, xquery); + } + + protected CTStyleMatrixReference getBgRef() { + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:bgRef"; + return selectProperty(CTStyleMatrixReference.class, xquery); + } + + protected CTGroupShapeProperties getGrpSpPr() { + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:grpSpPr"; + return selectProperty(CTGroupShapeProperties.class, xquery); + } + + protected CTNonVisualDrawingProps getCNvPr() { + if (_nvPr == null) { + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:cNvPr"; + _nvPr = selectProperty(CTNonVisualDrawingProps.class, xquery); + } + return _nvPr; } - public CustomGeometry getGeometry() { - // TODO Auto-generated method stub - return null; + protected CTShapeProperties getSpPr() { + if (_spPr == null) { + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:spPr"; + _spPr = selectProperty(CTShapeProperties.class, xquery); + } + if (_spPr == null) { + throw new IllegalStateException("CTShapeProperties was not found."); + } + return _spPr; } - public ShapeType getShapeType() { - // TODO Auto-generated method stub - return null; + protected CTShapeStyle getSpStyle() { + if (_spStyle == null) { + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:style"; + _spStyle = selectProperty(CTShapeStyle.class, xquery); + } + return _spStyle; } - public XSLFSheet getSheet() { - // TODO Auto-generated method stub - return null; + protected CTPlaceholder getCTPlaceholder() { + if (_ph == null) { + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph"; + _ph = selectProperty(CTPlaceholder.class, xquery); + } + return _ph; } /** - * fetch shape fill as a java.awt.Paint + * As there's no xmlbeans hierarchy, but XSLF works with subclassing, not all + * child classes work with a {@link CTShape} object, but often contain the same + * properties. This method is the generalized form of selecting and casting those + * properties. * - * @return either Color or GradientPaint or TexturePaint or null + * @param resultClass + * @param xquery + * @return */ - @Override - public FillStyle getFillStyle() { - return new FillStyle() { - public PaintStyle getPaint() { - PropertyFetcher fetcher = new PropertyFetcher() { - public boolean fetch(XSLFShape shape) { - CTShapeProperties spPr = shape.getSpPr(); - if (spPr.isSetNoFill()) { - setValue(TRANSPARENT_PAINT); - return true; - } - - PaintStyle paint = null; - for (XmlObject obj : spPr.selectPath("*")) { - paint = selectPaint(obj, null, getSheet().getPackagePart()); - if (paint != null) break; - } - - if (paint == null) return false; - - setValue(paint); - return true; - } - }; - fetchShapeProperty(fetcher); - - PaintStyle paint = fetcher.getValue(); - - if (paint != null) return paint; - - // fill color was not found, check if it is defined in the theme - CTShapeStyle style = getSpStyle(); - if (style != null) { - // get a reference to a fill style within the style matrix. - CTStyleMatrixReference fillRef = style.getFillRef(); - // The idx attribute refers to the index of a fill style or - // background fill style within the presentation's style matrix, defined by the fmtScheme element. - // value of 0 or 1000 indicates no background, - // values 1-999 refer to the index of a fill style within the fillStyleLst element - // values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element. - int idx = (int)fillRef.getIdx(); - CTSchemeColor phClr = fillRef.getSchemeClr(); - XSLFSheet sheet = _sheet; - XSLFTheme theme = sheet.getTheme(); - XmlObject fillProps = null; - CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme(); - if(idx >= 1 && idx <= 999){ - fillProps = matrix.getFillStyleLst().selectPath("*")[idx - 1]; - } else if (idx >= 1001 ){ - fillProps = matrix.getBgFillStyleLst().selectPath("*")[idx - 1001]; - } - if(fillProps != null) { - paint = selectPaint(fillProps, phClr, sheet.getPackagePart()); - } - } - return paint == RenderableShape.NO_PAINT ? null : paint; - } - }; + @SuppressWarnings("unchecked") + protected T selectProperty(Class resultClass, String xquery) { + XmlObject[] rs = getXmlObject().selectPath(xquery); + if (rs.length == 0) return null; + return (resultClass.isInstance(rs[0])) ? (T)rs[0] : null; } /** @@ -320,108 +341,15 @@ public abstract class XSLFShape implements Shape { return ok; } - protected CTPlaceholder getCTPlaceholder() { - if (_ph == null) { - XmlObject[] obj = _shape.selectPath( - "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph"); - if (obj.length == 1) { - _ph = (CTPlaceholder) obj[0]; - } + protected PaintStyle getPaint(XmlObject spPr, CTSchemeColor phClr) { + PaintStyle paint = null; + PackagePart pp = getSheet().getPackagePart(); + for (XmlObject obj : spPr.selectPath("*")) { + paint = selectPaint(obj, phClr, pp); + if(paint != null) break; } - return _ph; - } - - protected CTShapeStyle getSpStyle() { - if (_spStyle == null) { - for (XmlObject obj : _shape.selectPath("*")) { - if (obj instanceof CTShapeStyle) { - _spStyle = (CTShapeStyle) obj; - } - } - } - return _spStyle; - } - - protected CTNonVisualDrawingProps getNvPr() { - if (_nvPr == null) { - XmlObject[] rs = _shape - .selectPath("declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:cNvPr"); - if (rs.length != 0) { - _nvPr = (CTNonVisualDrawingProps) rs[0]; - } - } - return _nvPr; - } - - protected CTShapeProperties getSpPr() { - if (_spPr == null) { - for (XmlObject obj : _shape.selectPath("*")) { - if (obj instanceof CTShapeProperties) { - _spPr = (CTShapeProperties) obj; - } - } - } - if (_spPr == null) { - throw new IllegalStateException("CTShapeProperties was not found."); - } - return _spPr; - } - - CTTransform2D getXfrm() { - PropertyFetcher fetcher = new PropertyFetcher() { - public boolean fetch(XSLFShape shape) { - CTShapeProperties pr = shape.getSpPr(); - if (pr.isSetXfrm()) { - setValue(pr.getXfrm()); - return true; - } - return false; - } - }; - fetchShapeProperty(fetcher); - return fetcher.getValue(); - } - - /** - * @return the position of this shape within the drawing canvas. - * The coordinates are expressed in points - */ - public Rectangle2D getAnchor() { - CTTransform2D xfrm = getXfrm(); - if (xfrm == null) return null; - - CTPoint2D off = xfrm.getOff(); - long x = off.getX(); - long y = off.getY(); - CTPositiveSize2D ext = xfrm.getExt(); - long cx = ext.getCx(); - long cy = ext.getCy(); - return new Rectangle2D.Double( - Units.toPoints(x), Units.toPoints(y), - Units.toPoints(cx), Units.toPoints(cy)); - } - - /** - * @param anchor the position of this shape within the drawing canvas. - * The coordinates are expressed in points - */ - public void setAnchor(Rectangle2D anchor) { - CTShapeProperties spPr = getSpPr(); - if (spPr == null) return; - - CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm(); - CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff(); - long x = Units.toEMU(anchor.getX()); - long y = Units.toEMU(anchor.getY()); - off.setX(x); - off.setY(y); - CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm - .addNewExt(); - long cx = Units.toEMU(anchor.getWidth()); - long cy = Units.toEMU(anchor.getHeight()); - ext.setCx(cx); - ext.setCy(cy); - } + return paint == null ? TRANSPARENT_PAINT : paint; + } /** * Convert shape fill into java.awt.Paint. The result is either Color or @@ -444,122 +372,126 @@ public abstract class XSLFShape implements Shape { * @return the applied Paint or null if none was applied */ protected PaintStyle selectPaint(XmlObject obj, final CTSchemeColor phClr, final PackagePart parentPart) { - final XSLFTheme theme = getSheet().getTheme(); - if (obj instanceof CTNoFillProperties) { return TRANSPARENT_PAINT; + } else if (obj instanceof CTSolidColorFillProperties) { + return selectPaint((CTSolidColorFillProperties)obj, phClr, parentPart); + } else if (obj instanceof CTBlipFillProperties) { + return selectPaint((CTBlipFillProperties)obj, phClr, parentPart); + } else if (obj instanceof CTGradientFillProperties) { + return selectPaint((CTGradientFillProperties) obj, phClr, parentPart); + } else { + return null; } - - if (obj instanceof CTSolidColorFillProperties) { - CTSolidColorFillProperties solidFill = (CTSolidColorFillProperties) obj; - final XSLFColor c = new XSLFColor(solidFill, theme, phClr); - return new SolidPaint() { - public ColorStyle getSolidColor() { - return c.getColorStyle(); + } + + protected PaintStyle selectPaint(final CTSolidColorFillProperties solidFill, final CTSchemeColor phClr, final PackagePart parentPart) { + final XSLFTheme theme = getSheet().getTheme(); + final XSLFColor c = new XSLFColor(solidFill, theme, phClr); + return new SolidPaint() { + public ColorStyle getSolidColor() { + return c.getColorStyle(); + } + }; + } + + protected PaintStyle selectPaint(final CTBlipFillProperties blipFill, final CTSchemeColor phClr, final PackagePart parentPart) { + final CTBlip blip = blipFill.getBlip(); + return new TexturePaint() { + private PackagePart getPart() { + try { + String blipId = blip.getEmbed(); + PackageRelationship rel = parentPart.getRelationship(blipId); + return parentPart.getRelatedPart(rel); + } catch (InvalidFormatException e) { + throw new RuntimeException(e); } - }; + } + + public InputStream getImageData() { + try { + return getPart().getInputStream(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public String getContentType() { + /* TOOD: map content-type */ + return getPart().getContentType(); + } + + public int getAlpha() { + return (blip.sizeOfAlphaModFixArray() > 0) + ? blip.getAlphaModFixArray(0).getAmt() + : 0; + } + }; + } + + protected PaintStyle selectPaint(final CTGradientFillProperties gradFill, final CTSchemeColor phClr, final PackagePart parentPart) { + + @SuppressWarnings("deprecation") + final CTGradientStop[] gs = gradFill.getGsLst().getGsArray(); + + Arrays.sort(gs, new Comparator() { + public int compare(CTGradientStop o1, CTGradientStop o2) { + Integer pos1 = o1.getPos(); + Integer pos2 = o2.getPos(); + return pos1.compareTo(pos2); + } + }); + + final ColorStyle cs[] = new ColorStyle[gs.length]; + final float fractions[] = new float[gs.length]; + XSLFTheme theme = getSheet().getTheme(); + + int i=0; + for (CTGradientStop cgs : gs) { + cs[i] = new XSLFColor(cgs, theme, phClr).getColorStyle(); + fractions[i] = cgs.getPos() / 100000.f; } - if (obj instanceof CTBlipFillProperties) { - CTBlipFillProperties blipFill = (CTBlipFillProperties)obj; - final CTBlip blip = blipFill.getBlip(); - return new TexturePaint() { - private PackagePart getPart() { - try { - String blipId = blip.getEmbed(); - PackageRelationship rel = parentPart.getRelationship(blipId); - return parentPart.getRelatedPart(rel); - } catch (InvalidFormatException e) { - throw new RuntimeException(e); + return new GradientPaint() { + + public double getGradientAngle() { + return (gradFill.isSetLin()) + ? gradFill.getLin().getAng() / 60000.d + : 0; + } + + public ColorStyle[] getGradientColors() { + return cs; + } + + public float[] getGradientFractions() { + return fractions; + } + + public boolean isRotatedWithShape() { + // TODO: is this correct??? + return (gradFill.isSetRotWithShape() || !gradFill.getRotWithShape()); + } + + public GradientType getGradientType() { + if (gradFill.isSetLin()) { + return GradientType.linear; + } + + if (gradFill.isSetPath()) { + /* TODO: handle rect path */ + STPathShadeType.Enum ps = gradFill.getPath().getPath(); + if (ps == STPathShadeType.CIRCLE) { + return GradientType.circular; + } else if (ps == STPathShadeType.SHAPE) { + return GradientType.shape; } } - public InputStream getImageData() { - try { - return getPart().getInputStream(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public String getContentType() { - /* TOOD: map content-type */ - return getPart().getContentType(); - } - - public int getAlpha() { - return (blip.sizeOfAlphaModFixArray() > 0) - ? blip.getAlphaModFixArray(0).getAmt() - : 0; - } - }; - } - - if (obj instanceof CTGradientFillProperties) { - final CTGradientFillProperties gradFill = (CTGradientFillProperties) obj; - - @SuppressWarnings("deprecation") - final CTGradientStop[] gs = gradFill.getGsLst().getGsArray(); - - Arrays.sort(gs, new Comparator() { - public int compare(CTGradientStop o1, CTGradientStop o2) { - Integer pos1 = o1.getPos(); - Integer pos2 = o2.getPos(); - return pos1.compareTo(pos2); - } - }); - - final ColorStyle cs[] = new ColorStyle[gs.length]; - final float fractions[] = new float[gs.length]; - - int i=0; - for (CTGradientStop cgs : gs) { - cs[i] = new XSLFColor(cgs, theme, phClr).getColorStyle(); - fractions[i] = cgs.getPos() / 100000.f; + return GradientType.linear; } - - return new GradientPaint() { - - public double getGradientAngle() { - return (gradFill.isSetLin()) - ? gradFill.getLin().getAng() / 60000.d - : 0; - } - - public ColorStyle[] getGradientColors() { - return cs; - } - - public float[] getGradientFractions() { - return fractions; - } - - public boolean isRotatedWithShape() { - // TODO: is this correct??? - return (gradFill.isSetRotWithShape() || !gradFill.getRotWithShape()); - } - - public GradientType getGradientType() { - if (gradFill.isSetLin()) { - return GradientType.linear; - } - - if (gradFill.isSetPath()) { - /* TODO: handle rect path */ - STPathShadeType.Enum ps = gradFill.getPath().getPath(); - if (ps == STPathShadeType.CIRCLE) { - return GradientType.circular; - } else if (ps == STPathShadeType.SHAPE) { - return GradientType.shape; - } - } - - return GradientType.linear; - } - }; - } - - return TRANSPARENT_PAINT; + }; } + } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java index d839a49d37..e1d00c58d4 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java @@ -24,7 +24,7 @@ import org.apache.poi.sl.usermodel.ShapeContainer; /** * Common interface for shape containers, e.g. sheets or groups of shapes */ -public interface XSLFShapeContainer extends ShapeContainer { +public interface XSLFShapeContainer extends ShapeContainer { /** * create a new shape with a predefined geometry and add it to this shape container diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index c9694e2185..163d8a65aa 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -16,47 +16,28 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import org.apache.poi.POIXMLDocumentPart; -import org.apache.poi.POIXMLException; -import org.apache.poi.openxml4j.opc.OPCPackage; -import org.apache.poi.openxml4j.opc.PackagePart; -import org.apache.poi.openxml4j.opc.PackageRelationship; -import org.apache.poi.openxml4j.opc.TargetMode; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.sl.usermodel.MasterSheet; -import org.apache.poi.sl.usermodel.Sheet; -import org.apache.poi.util.Beta; -import org.apache.poi.util.IOUtils; -import org.apache.poi.util.Internal; -import org.apache.xmlbeans.XmlObject; -import org.apache.xmlbeans.XmlOptions; -import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId; -import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData; -import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector; -import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; -import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; -import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture; -import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; -import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; - -import com.sun.org.apache.xml.internal.utils.UnImplNode; +import java.awt.Graphics2D; +import java.io.*; +import java.util.*; +import java.util.regex.Pattern; import javax.xml.namespace.QName; -import java.awt.Graphics2D; -import java.awt.geom.AffineTransform; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; +import org.apache.poi.POIXMLDocumentPart; +import org.apache.poi.POIXMLException; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.openxml4j.opc.*; +import org.apache.poi.sl.draw.DrawFactory; +import org.apache.poi.sl.draw.Drawable; +import org.apache.poi.sl.usermodel.Sheet; +import org.apache.poi.util.*; +import org.apache.xmlbeans.XmlObject; +import org.apache.xmlbeans.XmlOptions; +import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId; +import org.openxmlformats.schemas.presentationml.x2006.main.*; @Beta -public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet { +public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet { private XSLFCommonSlideData _commonSlideData; private XSLFDrawing _drawing; private List _shapes; @@ -498,31 +479,9 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC * @param graphics */ public void draw(Graphics2D graphics){ - XSLFSheet master = (XSLFSheet)getMasterSheet(); - if(getFollowMasterGraphics() && master != null) master.draw(graphics); - - graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, new AffineTransform()); - for(XSLFShape shape : getShapeList()) { - if(!canDraw(shape)) continue; - - // remember the initial transform and restore it after we are done with drawing - AffineTransform at = graphics.getTransform(); - - // concrete implementations can make sense of this hint, - // for example PSGraphics2D or PDFGraphics2D would call gsave() / grestore - graphics.setRenderingHint(XSLFRenderingHint.GSAVE, true); - - // apply rotation and flipping - shape.applyTransform(graphics); - // draw stuff - shape.draw(graphics); - - // restore the coordinate system - graphics.setTransform(at); - - graphics.setRenderingHint(XSLFRenderingHint.GRESTORE, true); - - } + DrawFactory drawFact = DrawFactory.getInstance(graphics); + Drawable draw = drawFact.getDrawable(this); + draw.draw(graphics); } /** diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java index ca548dd636..ffe0fc823d 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java @@ -19,17 +19,18 @@ package org.apache.poi.xslf.usermodel; -import java.awt.*; -import java.awt.Shape; -import java.awt.geom.*; -import java.util.ArrayList; -import java.util.List; +import java.awt.Color; +import java.awt.geom.Rectangle2D; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import org.apache.poi.sl.draw.DrawPaint; import org.apache.poi.sl.draw.geom.*; import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.LineDecoration.DecorationShape; +import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; import org.apache.poi.sl.usermodel.StrokeStyle.LineCap; import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.util.Beta; @@ -37,7 +38,7 @@ import org.apache.poi.util.Units; import org.apache.poi.xslf.model.PropertyFetcher; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.*; -import org.openxmlformats.schemas.presentationml.x2006.main.*; +import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; /** * Represents a single (non-group) shape in a .pptx slide show @@ -52,77 +53,106 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { super(shape,sheet); } - /** - * - * @return the sheet this shape belongs to - */ - public XSLFSheet getSheet() { - return _sheet; - } - /** * * @param type */ public void setShapeType(ShapeType type){ - CTShape shape = (CTShape) getXmlObject(); STShapeType.Enum geom = STShapeType.Enum.forInt(type.ooxmlId); - shape.getSpPr().getPrstGeom().setPrst(geom); + getSpPr().getPrstGeom().setPrst(geom); } public ShapeType getShapeType(){ - CTShape shape = (CTShape) getXmlObject(); - STShapeType.Enum geom = shape.getSpPr().getPrstGeom().getPrst(); + STShapeType.Enum geom = getSpPr().getPrstGeom().getPrst(); return ShapeType.forId(geom.intValue(), true); } - - @Override - public String getShapeName() { - return getNvPr().getName(); + + protected CTTransform2D getSafeXfrm() { + CTTransform2D xfrm = getXfrm(); + return (xfrm == null ? getSpPr().addNewXfrm() : xfrm); + } + + protected CTTransform2D getXfrm() { + PropertyFetcher fetcher = new PropertyFetcher() { + public boolean fetch(XSLFShape shape) { + CTShapeProperties pr = getSpPr(); + if (pr.isSetXfrm()) { + setValue(pr.getXfrm()); + return true; + } + return false; + } + }; + fetchShapeProperty(fetcher); + return fetcher.getValue(); } @Override - public int getShapeId() { - return (int) getNvPr().getId(); + public Rectangle2D getAnchor() { + + CTTransform2D xfrm = getXfrm(); + + CTPoint2D off = xfrm.getOff(); + long x = off.getX(); + long y = off.getY(); + CTPositiveSize2D ext = xfrm.getExt(); + long cx = ext.getCx(); + long cy = ext.getCy(); + return new Rectangle2D.Double( + Units.toPoints(x), Units.toPoints(y), + Units.toPoints(cx), Units.toPoints(cy)); } + @Override + public void setAnchor(Rectangle2D anchor) { + CTTransform2D xfrm = getSafeXfrm(); + CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff(); + long x = Units.toEMU(anchor.getX()); + long y = Units.toEMU(anchor.getY()); + off.setX(x); + off.setY(y); + CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm + .addNewExt(); + long cx = Units.toEMU(anchor.getWidth()); + long cy = Units.toEMU(anchor.getHeight()); + ext.setCx(cx); + ext.setCy(cy); + } + @Override public void setRotation(double theta) { - CTShapeProperties spPr = getSpPr(); - CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm(); - xfrm.setRot((int) (theta * 60000)); + getSafeXfrm().setRot((int) (theta * 60000)); } @Override public double getRotation() { CTTransform2D xfrm = getXfrm(); - return (double) xfrm.getRot() / 60000; + return (xfrm == null || !xfrm.isSetRot()) ? 0 : (xfrm.getRot() / 60000.d); } @Override public void setFlipHorizontal(boolean flip) { - CTShapeProperties spPr = getSpPr(); - CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm(); - xfrm.setFlipH(flip); + getSafeXfrm().setFlipH(flip); } @Override public void setFlipVertical(boolean flip) { - CTShapeProperties spPr = getSpPr(); - CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm(); - xfrm.setFlipV(flip); + getSafeXfrm().setFlipV(flip); } @Override public boolean getFlipHorizontal() { - return getXfrm().getFlipH(); + CTTransform2D xfrm = getXfrm(); + return (xfrm == null || !xfrm.isSetFlipH()) ? false : getXfrm().getFlipH(); } @Override public boolean getFlipVertical() { - return getXfrm().getFlipV(); + CTTransform2D xfrm = getXfrm(); + return (xfrm == null || !xfrm.isSetFlipV()) ? false : getXfrm().getFlipV(); } + /** * Get default line properties defined in the theme (if any). * Used internally to resolve shape properties. @@ -135,7 +165,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (style != null) { // 1-based index of a line style within the style matrix int idx = (int) style.getLnRef().getIdx(); - CTStyleMatrix styleMatrix = _sheet.getTheme().getXmlObject().getThemeElements().getFmtScheme(); + CTStyleMatrix styleMatrix = getSheet().getTheme().getXmlObject().getThemeElements().getFmtScheme(); ln = styleMatrix.getLnStyleLst().getLnArray(idx - 1); } return ln; @@ -175,14 +205,57 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { * if outline is turned off */ public Color getLineColor() { - RenderableShape rShape = new RenderableShape(this); - Paint paint = rShape.getLinePaint(null); - if (paint instanceof Color) { - return (Color) paint; + PaintStyle ps = getLinePaint(); + if (ps == null || ps == TRANSPARENT_PAINT) return null; + if (ps instanceof SolidPaint) { + Color col = ((SolidPaint)ps).getSolidColor().getColor(); + return (col == DrawPaint.NO_PAINT) ? null : col; } return null; } + protected PaintStyle getLinePaint() { + PropertyFetcher fetcher = new PropertyFetcher() { + public boolean fetch(XSLFShape shape) { + CTLineProperties spPr = shape.getSpPr().getLn(); + if (spPr != null) { + if (spPr.isSetNoFill()) { + setValue(TRANSPARENT_PAINT); // use it as 'nofill' value + return true; + } + PaintStyle paint = getPaint(spPr, null); + if (paint != null) { + setValue(paint); + return true; + } + } + return false; + + } + }; + fetchShapeProperty(fetcher); + + PaintStyle paint = fetcher.getValue(); + if (paint != null) return paint; + + // line color was not found, check if it is defined in the theme + CTShapeStyle style = getSpStyle(); + if (style == null) return TRANSPARENT_PAINT; + + // get a reference to a line style within the style matrix. + CTStyleMatrixReference lnRef = style.getLnRef(); + int idx = (int)lnRef.getIdx(); + CTSchemeColor phClr = lnRef.getSchemeClr(); + if(idx > 0){ + XSLFTheme theme = getSheet().getTheme(); + XmlObject lnProps = theme.getXmlObject(). + getThemeElements().getFmtScheme().getLnStyleLst().selectPath("*")[idx - 1]; + paint = getPaint(lnProps, phClr); + } + + return paint == null ? TRANSPARENT_PAINT : paint; + } + /** * * @param width line width in points. 0 means no line @@ -377,10 +450,11 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { * is not solid (pattern or gradient) */ public Color getFillColor() { - RenderableShape rShape = new RenderableShape(this); - Paint paint = rShape.getFillPaint(null); - if (paint instanceof Color) { - return (Color) paint; + PaintStyle ps = getFillPaint(); + if (ps == null || ps == TRANSPARENT_PAINT) return null; + if (ps instanceof SolidPaint) { + Color col = ((SolidPaint)ps).getSolidColor().getColor(); + return (col == DrawPaint.NO_PAINT) ? null : col; } return null; } @@ -410,7 +484,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { // 1-based index of a shadow style within the style matrix int idx = (int) style.getEffectRef().getIdx(); if(idx != 0) { - CTStyleMatrix styleMatrix = _sheet.getTheme().getXmlObject().getThemeElements().getFmtScheme(); + CTStyleMatrix styleMatrix = getSheet().getTheme().getXmlObject().getThemeElements().getFmtScheme(); CTEffectStyleItem ef = styleMatrix.getEffectStyleLst().getEffectStyleArray(idx - 1); obj = ef.getEffectLst().getOuterShdw(); } @@ -493,7 +567,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { /** * Specifies the line end decoration, such as a triangle or arrowhead. */ - public void setLineHeadDecoration(LineDecoration style) { + public void setLineHeadDecoration(DecorationShape style) { CTLineProperties ln = getSpPr().getLn(); CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd(); if (style == null) { @@ -503,18 +577,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { } } - public LineDecoration getLineHeadDecoration() { + public DecorationShape getLineHeadDecoration() { CTLineProperties ln = getSpPr().getLn(); - if (ln == null || !ln.isSetHeadEnd()) return LineDecoration.NONE; + if (ln == null || !ln.isSetHeadEnd()) return DecorationShape.NONE; STLineEndType.Enum end = ln.getHeadEnd().getType(); - return end == null ? LineDecoration.NONE : LineDecoration.values()[end.intValue() - 1]; + return end == null ? DecorationShape.NONE : DecorationShape.values()[end.intValue() - 1]; } /** * specifies decorations which can be added to the head of a line. */ - public void setLineHeadWidth(LineEndWidth style) { + public void setLineHeadWidth(DecorationSize style) { CTLineProperties ln = getSpPr().getLn(); CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd(); if (style == null) { @@ -524,18 +598,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { } } - public LineEndWidth getLineHeadWidth() { + public DecorationSize getLineHeadWidth() { CTLineProperties ln = getSpPr().getLn(); - if (ln == null || !ln.isSetHeadEnd()) return LineEndWidth.MEDIUM; + if (ln == null || !ln.isSetHeadEnd()) return DecorationSize.MEDIUM; STLineEndWidth.Enum w = ln.getHeadEnd().getW(); - return w == null ? LineEndWidth.MEDIUM : LineEndWidth.values()[w.intValue() - 1]; + return w == null ? DecorationSize.MEDIUM : DecorationSize.values()[w.intValue() - 1]; } /** * Specifies the line end width in relation to the line width. */ - public void setLineHeadLength(LineEndLength style) { + public void setLineHeadLength(DecorationSize style) { CTLineProperties ln = getSpPr().getLn(); CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd(); @@ -546,18 +620,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { } } - public LineEndLength getLineHeadLength() { + public DecorationSize getLineHeadLength() { CTLineProperties ln = getSpPr().getLn(); - if (ln == null || !ln.isSetHeadEnd()) return LineEndLength.MEDIUM; + if (ln == null || !ln.isSetHeadEnd()) return DecorationSize.MEDIUM; STLineEndLength.Enum len = ln.getHeadEnd().getLen(); - return len == null ? LineEndLength.MEDIUM : LineEndLength.values()[len.intValue() - 1]; + return len == null ? DecorationSize.MEDIUM : DecorationSize.values()[len.intValue() - 1]; } /** * Specifies the line end decoration, such as a triangle or arrowhead. */ - public void setLineTailDecoration(LineDecoration style) { + public void setLineTailDecoration(DecorationShape style) { CTLineProperties ln = getSpPr().getLn(); CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd(); if (style == null) { @@ -567,18 +641,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { } } - public LineDecoration getLineTailDecoration() { + public DecorationShape getLineTailDecoration() { CTLineProperties ln = getSpPr().getLn(); - if (ln == null || !ln.isSetTailEnd()) return LineDecoration.NONE; + if (ln == null || !ln.isSetTailEnd()) return DecorationShape.NONE; STLineEndType.Enum end = ln.getTailEnd().getType(); - return end == null ? LineDecoration.NONE : LineDecoration.values()[end.intValue() - 1]; + return end == null ? DecorationShape.NONE : DecorationShape.values()[end.intValue() - 1]; } /** * specifies decorations which can be added to the tail of a line. */ - public void setLineTailWidth(LineEndWidth style) { + public void setLineTailWidth(DecorationSize style) { CTLineProperties ln = getSpPr().getLn(); CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd(); if (style == null) { @@ -588,18 +662,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { } } - public LineEndWidth getLineTailWidth() { + public DecorationSize getLineTailWidth() { CTLineProperties ln = getSpPr().getLn(); - if (ln == null || !ln.isSetTailEnd()) return LineEndWidth.MEDIUM; + if (ln == null || !ln.isSetTailEnd()) return DecorationSize.MEDIUM; STLineEndWidth.Enum w = ln.getTailEnd().getW(); - return w == null ? LineEndWidth.MEDIUM : LineEndWidth.values()[w.intValue() - 1]; + return w == null ? DecorationSize.MEDIUM : DecorationSize.values()[w.intValue() - 1]; } /** * Specifies the line end width in relation to the line width. */ - public void setLineTailLength(LineEndLength style) { + public void setLineTailLength(DecorationSize style) { CTLineProperties ln = getSpPr().getLn(); CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd(); @@ -610,142 +684,12 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { } } - public LineEndLength getLineTailLength() { + public DecorationSize getLineTailLength() { CTLineProperties ln = getSpPr().getLn(); - if (ln == null || !ln.isSetTailEnd()) return LineEndLength.MEDIUM; + if (ln == null || !ln.isSetTailEnd()) return DecorationSize.MEDIUM; STLineEndLength.Enum len = ln.getTailEnd().getLen(); - return len == null ? LineEndLength.MEDIUM : LineEndLength.values()[len.intValue() - 1]; - } - - Outline getTailDecoration(Graphics2D graphics) { - LineEndLength tailLength = getLineTailLength(); - LineEndWidth tailWidth = getLineTailWidth(); - - double lineWidth = Math.max(2.5, getLineWidth()); - - Rectangle2D anchor = new RenderableShape(this).getAnchor(graphics); - double x2 = anchor.getX() + anchor.getWidth(), - y2 = anchor.getY() + anchor.getHeight(); - - double alpha = Math.atan(anchor.getHeight() / anchor.getWidth()); - - AffineTransform at = new AffineTransform(); - Shape shape = null; - Path p = null; - Rectangle2D bounds; - double scaleY = Math.pow(2, tailWidth.ordinal()); - double scaleX = Math.pow(2, tailLength.ordinal()); - switch (getLineTailDecoration()) { - case OVAL: - p = new Path(); - shape = new Ellipse2D.Double(0, 0, lineWidth * scaleX, lineWidth * scaleY); - bounds = shape.getBounds2D(); - at.translate(x2 - bounds.getWidth() / 2, y2 - bounds.getHeight() / 2); - at.rotate(alpha, bounds.getX() + bounds.getWidth() / 2, bounds.getY() + bounds.getHeight() / 2); - break; - case ARROW: - p = new Path(); - GeneralPath arrow = new GeneralPath(); - arrow.moveTo((float) (-lineWidth * 3), (float) (-lineWidth * 2)); - arrow.lineTo(0, 0); - arrow.lineTo((float) (-lineWidth * 3), (float) (lineWidth * 2)); - shape = arrow; - at.translate(x2, y2); - at.rotate(alpha); - break; - case TRIANGLE: - p = new Path(); - scaleY = tailWidth.ordinal() + 1; - scaleX = tailLength.ordinal() + 1; - GeneralPath triangle = new GeneralPath(); - triangle.moveTo((float) (-lineWidth * scaleX), (float) (-lineWidth * scaleY / 2)); - triangle.lineTo(0, 0); - triangle.lineTo((float) (-lineWidth * scaleX), (float) (lineWidth * scaleY / 2)); - triangle.closePath(); - shape = triangle; - at.translate(x2, y2); - at.rotate(alpha); - break; - default: - break; - } - - if (shape != null) { - shape = at.createTransformedShape(shape); - } - return shape == null ? null : new Outline(shape, p); - } - - Outline getHeadDecoration(Graphics2D graphics) { - LineEndLength headLength = getLineHeadLength(); - LineEndWidth headWidth = getLineHeadWidth(); - - double lineWidth = Math.max(2.5, getLineWidth()); - - Rectangle2D anchor = new RenderableShape(this).getAnchor(graphics); - double x1 = anchor.getX(), - y1 = anchor.getY(); - - double alpha = Math.atan(anchor.getHeight() / anchor.getWidth()); - - AffineTransform at = new AffineTransform(); - Shape shape = null; - Path p = null; - Rectangle2D bounds; - double scaleY = 1; - double scaleX = 1; - switch (getLineHeadDecoration()) { - case OVAL: - p = new Path(); - 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: - p = new Path(false, true); - GeneralPath arrow = new GeneralPath(); - arrow.moveTo((float) (lineWidth * 3 * scaleX), (float) (-lineWidth * scaleY * 2)); - arrow.lineTo(0, 0); - arrow.lineTo((float) (lineWidth * 3 * scaleX), (float) (lineWidth * scaleY * 2)); - shape = arrow; - at.translate(x1, y1); - at.rotate(alpha); - break; - case TRIANGLE: - p = new Path(); - scaleY = headWidth.ordinal() + 1; - scaleX = headLength.ordinal() + 1; - GeneralPath triangle = new GeneralPath(); - triangle.moveTo((float) (lineWidth * scaleX), (float) (-lineWidth * scaleY / 2)); - triangle.lineTo(0, 0); - triangle.lineTo((float) (lineWidth * scaleX), (float) (lineWidth * scaleY / 2)); - triangle.closePath(); - shape = triangle; - at.translate(x1, y1); - at.rotate(alpha); - break; - default: - break; - } - - if (shape != null) { - shape = at.createTransformedShape(shape); - } - return shape == null ? null : new Outline(shape, p); - } - - private List getDecorationOutlines(Graphics2D graphics){ - List lst = new ArrayList(); - - Outline head = getHeadDecoration(graphics); - if(head != null) lst.add(head); - - Outline tail = getTailDecoration(graphics); - if(tail != null) lst.add(tail); - return lst; + return len == null ? DecorationSize.MEDIUM : DecorationSize.values()[len.intValue() - 1]; } public boolean isPlaceholder() { @@ -753,25 +697,79 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { return ph != null; } - public Hyperlink getHyperlink() { - // TODO Auto-generated method stub - return null; - } - - public void setHyperlink(Hyperlink hyperlink) { - // TODO Auto-generated method stub - - } - + @SuppressWarnings("deprecation") public Guide getAdjustValue(String name) { - // TODO Auto-generated method stub + CTPresetGeometry2D prst = getSpPr().getPrstGeom(); + if (prst.isSetAvLst()) { + for (CTGeomGuide g : prst.getAvLst().getGdArray()) { + if (g.getName().equals(name)) { + return new Guide(g.getName(), g.getFmla()); + } + } + } + return null; } - public org.apache.poi.sl.usermodel.LineDecoration getLineDecoration() { - // TODO Auto-generated method stub - return null; + public LineDecoration getLineDecoration() { + return new LineDecoration() { + public DecorationShape getHeadShape() { + return getLineHeadDecoration(); + } + + public DecorationSize getHeadWidth() { + return getLineHeadWidth(); + } + + public DecorationSize getHeadLength() { + return getLineHeadLength(); + } + + public DecorationShape getTailShape() { + return getLineTailDecoration(); + } + + public DecorationSize getTailWidth() { + return getLineTailWidth(); + } + + public DecorationSize getTailLength() { + return getLineTailLength(); + } + }; + } + + /** + * fetch shape fill as a java.awt.Paint + * + * @return either Color or GradientPaint or TexturePaint or null + */ + public FillStyle getFillStyle() { + return new FillStyle() { + public PaintStyle getPaint() { + return XSLFSimpleShape.this.getFillPaint(); + } + }; + } + + public StrokeStyle getStrokeStyle() { + return new StrokeStyle() { + public PaintStyle getPaint() { + return XSLFSimpleShape.this.getLinePaint(); + } + + public LineCap getLineCap() { + return XSLFSimpleShape.this.getLineCap(); + } + + public LineDash getLineDash() { + return XSLFSimpleShape.this.getLineDash(); + } + + public double getLineWidth() { + return XSLFSimpleShape.this.getLineWidth(); + } + + }; } - - } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index af80a57ffc..795daa30b5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -16,7 +16,6 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import java.awt.Graphics2D; import java.io.IOException; import org.apache.poi.POIXMLDocumentPart; @@ -26,21 +25,11 @@ import org.apache.poi.sl.usermodel.Notes; import org.apache.poi.sl.usermodel.Slide; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; -import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D; -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.presentationml.x2006.main.CTBackground; -import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData; -import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; -import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual; -import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide; -import org.openxmlformats.schemas.presentationml.x2006.main.SldDocument; +import org.openxmlformats.schemas.drawingml.x2006.main.*; +import org.openxmlformats.schemas.presentationml.x2006.main.*; @Beta -public final class XSLFSlide extends XSLFSheet implements Slide { +public final class XSLFSlide extends XSLFSheet implements Slide { private final CTSlide _slide; private XSLFSlideLayout _layout; private XSLFComments _comments; @@ -220,17 +209,6 @@ public final class XSLFSlide extends XSLFSheet implements Slide { setFollowMasterGraphics(follow); } - - @Override - public void draw(Graphics2D graphics){ - - XSLFBackground bg = getBackground(); - if(bg != null) bg.draw(graphics); - - super.draw(graphics); - } - - @Override public XSLFSlide importContent(XSLFSheet src){ super.importContent(src); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java index 2373641354..bd6c38ca46 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java @@ -31,7 +31,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.SldLayoutDocument; import java.io.IOException; @Beta -public class XSLFSlideLayout extends XSLFSheet implements MasterSheet { +public class XSLFSlideLayout extends XSLFSheet implements MasterSheet { private CTSlideLayout _layout; private XSLFSlideMaster _master; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java index ebeec01efb..0b64306fd1 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java @@ -54,7 +54,7 @@ import java.util.Map; * @author Yegor Kozlov */ @Beta - public class XSLFSlideMaster extends XSLFSheet implements MasterSheet { + public class XSLFSlideMaster extends XSLFSheet implements MasterSheet { private CTSlideMaster _slide; private Map _layouts; private XSLFTheme _theme; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java index a21b9d5e37..fcd28a8b10 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java @@ -23,42 +23,22 @@ import java.awt.Color; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.util.Units; -import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCellProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; -import org.openxmlformats.schemas.drawingml.x2006.main.STCompoundLine; -import org.openxmlformats.schemas.drawingml.x2006.main.STLineCap; -import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndLength; -import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndType; -import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndWidth; -import org.openxmlformats.schemas.drawingml.x2006.main.STPenAlignment; -import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType; +import org.openxmlformats.schemas.drawingml.x2006.main.*; /** * Represents a cell of a table in a .pptx presentation - * - * @author Yegor Kozlov */ public class XSLFTableCell extends XSLFTextShape { static double defaultBorderWidth = 1.0; + private CTTableCellProperties _tcPr = null; /*package*/ XSLFTableCell(CTTableCell cell, XSLFSheet sheet){ super(cell, sheet); } - @Override - public CTTableCell getXmlObject(){ - return (CTTableCell)super.getXmlObject(); - } - @Override protected CTTextBody getTextBody(boolean create){ - CTTableCell cell = getXmlObject(); + CTTableCell cell = (CTTableCell)getXmlObject(); CTTextBody txBody = cell.getTxBody(); if (txBody == null && create) { txBody = cell.addNewTxBody(); @@ -78,135 +58,72 @@ public class XSLFTableCell extends XSLFTextShape { return cell; } + protected CTTableCellProperties getCellProperties(boolean create) { + if (_tcPr == null) { + CTTableCell cell = (CTTableCell)getXmlObject(); + _tcPr = cell.getTcPr(); + if (_tcPr == null && create) { + _tcPr = cell.addNewTcPr(); + } + } + return _tcPr; + } + @Override public void setLeftInset(double margin){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - if(pr == null) pr = getXmlObject().addNewTcPr(); - + CTTableCellProperties pr = getCellProperties(true); pr.setMarL(Units.toEMU(margin)); } @Override public void setRightInset(double margin){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - if(pr == null) pr = getXmlObject().addNewTcPr(); - + CTTableCellProperties pr = getCellProperties(true); pr.setMarR(Units.toEMU(margin)); } @Override public void setTopInset(double margin){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - if(pr == null) pr = getXmlObject().addNewTcPr(); - + CTTableCellProperties pr = getCellProperties(true); pr.setMarT(Units.toEMU(margin)); } @Override public void setBottomInset(double margin){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - if(pr == null) pr = getXmlObject().addNewTcPr(); - + CTTableCellProperties pr = getCellProperties(true); pr.setMarB(Units.toEMU(margin)); } - public void setBorderLeft(double width){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - - CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL(); + private CTLineProperties getCTLine(char bltr, boolean create) { + CTTableCellProperties pr = getCellProperties(create); + if (pr == null) return null; + + switch (bltr) { + case 'b': + return (pr.isSetLnB()) ? pr.getLnB() : (create ? pr.addNewLnB() : null); + case 'l': + return (pr.isSetLnL()) ? pr.getLnL() : (create ? pr.addNewLnL() : null); + case 't': + return (pr.isSetLnT()) ? pr.getLnT() : (create ? pr.addNewLnT() : null); + case 'r': + return (pr.isSetLnR()) ? pr.getLnR() : (create ? pr.addNewLnR() : null); + default: + return null; + } + } + + private void setBorderWidth(char bltr, double width) { + CTLineProperties ln = getCTLine(bltr, true); ln.setW(Units.toEMU(width)); } - public double getBorderLeft(){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - - CTLineProperties ln = pr.getLnL(); - return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW()); + private double getBorderWidth(char bltr) { + CTLineProperties ln = getCTLine(bltr, false); + return (ln == null) ? defaultBorderWidth : Units.toPoints(ln.getW()); } - public void setBorderLeftColor(Color color){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL(); - setLineColor(ln, color); - } + private void setBorderColor(char bltr, Color color) { + CTLineProperties ln = getCTLine(bltr, true); - public Color getBorderLeftColor(){ - return getLineColor(getXmlObject().getTcPr().getLnL()); - } - - public void setBorderRight(double width){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - - CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR(); - ln.setW(Units.toEMU(width)); - } - - public double getBorderRight(){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - - CTLineProperties ln = pr.getLnR(); - return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW()); - } - - public void setBorderRightColor(Color color){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR(); - setLineColor(ln, color); - } - - public Color getBorderRightColor(){ - return getLineColor(getXmlObject().getTcPr().getLnR()); - } - - public void setBorderTop(double width){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - - CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT(); - ln.setW(Units.toEMU(width)); - } - - public double getBorderTop(){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - - CTLineProperties ln = pr.getLnT(); - return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW()); - } - - public void setBorderTopColor(Color color){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT(); - setLineColor(ln, color); - } - - public Color getBorderTopColor(){ - return getLineColor(getXmlObject().getTcPr().getLnT()); - } - - public void setBorderBottom(double width){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - - CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB(); - ln.setW(Units.toEMU(width)); - } - - public double getBorderBottom(){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - - CTLineProperties ln = pr.getLnB(); - return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW()); - } - - public void setBorderBottomColor(Color color){ - CTTableCellProperties pr = getXmlObject().getTcPr(); - CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB(); - setLineColor(ln, color); - } - - public Color getBorderBottomColor(){ - return getLineColor(getXmlObject().getTcPr().getLnB()); - } - - private void setLineColor(CTLineProperties ln, Color color){ if(color == null){ ln.addNewNoFill(); if(ln.isSetSolidFill()) ln.unsetSolidFill(); @@ -233,19 +150,85 @@ public class XSLFTableCell extends XSLFTextShape { rgb.setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()}); ln.addNewSolidFill().setSrgbClr(rgb); } - } - - private Color getLineColor(CTLineProperties ln){ - if(ln == null || ln.isSetNoFill() || !ln.isSetSolidFill()) return null; + } + + private Color getBorderColor(char bltr) { + CTLineProperties ln = getCTLine(bltr,false); + if (ln == null || ln.isSetNoFill() || !ln.isSetSolidFill()) return null; CTSolidColorFillProperties fill = ln.getSolidFill(); - if(!fill.isSetSrgbClr()) { + if (!fill.isSetSrgbClr()) { // TODO for now return null for all colors except explicit RGB return null; } byte[] val = fill.getSrgbClr().getVal(); return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]); + } + + public void setBorderLeft(double width) { + setBorderWidth('l', width); } + + public double getBorderLeft() { + return getBorderWidth('l'); + } + + public void setBorderLeftColor(Color color) { + setBorderColor('l', color); + } + + public Color getBorderLeftColor() { + return getBorderColor('l'); + } + + public void setBorderRight(double width) { + setBorderWidth('r', width); + } + + public double getBorderRight() { + return getBorderWidth('r'); + } + + public void setBorderRightColor(Color color) { + setBorderColor('r', color); + } + + public Color getBorderRightColor() { + return getBorderColor('r'); + } + + public void setBorderTop(double width) { + setBorderWidth('t', width); + } + + public double getBorderTop() { + return getBorderWidth('t'); + } + + public void setBorderTopColor(Color color) { + setBorderColor('t', color); + } + + public Color getBorderTopColor() { + return getBorderColor('t'); + } + + public void setBorderBottom(double width) { + setBorderWidth('b', width); + } + + public double getBorderBottom() { + return getBorderWidth('b'); + } + + public void setBorderBottomColor(Color color) { + setBorderColor('b', color); + } + + public Color getBorderBottomColor(){ + return getBorderColor('b'); + } + /** * Specifies a solid color fill. The shape is filled entirely with the specified color. * @@ -254,7 +237,7 @@ public class XSLFTableCell extends XSLFTextShape { */ @Override public void setFillColor(Color color) { - CTTableCellProperties spPr = getXmlObject().getTcPr(); + CTTableCellProperties spPr = getCellProperties(true); if (color == null) { if(spPr.isSetSolidFill()) spPr.unsetSolidFill(); } @@ -274,11 +257,11 @@ public class XSLFTableCell extends XSLFTextShape { */ @Override public Color getFillColor(){ - CTTableCellProperties spPr = getXmlObject().getTcPr(); - if(!spPr.isSetSolidFill() ) return null; + CTTableCellProperties spPr = getCellProperties(false); + if (spPr == null || !spPr.isSetSolidFill()) return null; CTSolidColorFillProperties fill = spPr.getSolidFill(); - if(!fill.isSetSrgbClr()) { + if (!fill.isSetSrgbClr()) { // TODO for now return null for all colors except explicit RGB return null; } @@ -287,38 +270,36 @@ public class XSLFTableCell extends XSLFTextShape { } void setGridSpan(int gridSpan_) { - getXmlObject().setGridSpan(gridSpan_); + ((CTTableCell)getXmlObject()).setGridSpan(gridSpan_); } void setRowSpan(int rowSpan_) { - getXmlObject().setRowSpan(rowSpan_); + ((CTTableCell)getXmlObject()).setRowSpan(rowSpan_); } void setHMerge(boolean merge_) { - getXmlObject().setHMerge(merge_); + ((CTTableCell)getXmlObject()).setHMerge(merge_); } void setVMerge(boolean merge_) { - getXmlObject().setVMerge(merge_); + ((CTTableCell)getXmlObject()).setVMerge(merge_); } @Override public void setVerticalAlignment(VerticalAlignment anchor){ - CTTableCellProperties cellProps = getXmlObject().getTcPr(); - if(cellProps != null) { - if(anchor == null) { - if(cellProps.isSetAnchor()) { - cellProps.unsetAnchor(); - } - } else { - cellProps.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1)); + CTTableCellProperties cellProps = getCellProperties(true); + if(anchor == null) { + if(cellProps.isSetAnchor()) { + cellProps.unsetAnchor(); } - } + } else { + cellProps.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1)); + } } @Override public VerticalAlignment getVerticalAlignment(){ - CTTableCellProperties cellProps = getXmlObject().getTcPr(); + CTTableCellProperties cellProps = getCellProperties(false); VerticalAlignment align = VerticalAlignment.TOP; if(cellProps != null && cellProps.isSetAnchor()) { diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java index 869421e5c0..6f6dad8ee8 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -17,8 +17,6 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.geom.Rectangle2D; import java.util.*; import org.apache.poi.sl.usermodel.TextParagraph; @@ -37,7 +35,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; * @since POI-3.8 */ @Beta -public class XSLFTextParagraph implements TextParagraph { +public class XSLFTextParagraph implements TextParagraph { private final CTTextParagraph _p; private final List _runs; private final XSLFTextShape _shape; @@ -697,44 +695,6 @@ public class XSLFTextParagraph implements TextParagraph { return "[" + getClass() + "]" + getText(); } - /** - * Returns wrapping width to break lines in this paragraph - * - * @param firstLine whether the first line is breaking - * - * @return wrapping width in points - */ - double getWrappingWidth(boolean firstLine, Graphics2D graphics){ - // internal margins for the text box - double leftInset = _shape.getLeftInset(); - double rightInset = _shape.getRightInset(); - - RenderableShape rShape = new RenderableShape(_shape); - Rectangle2D anchor = rShape.getAnchor(graphics); - - double leftMargin = getLeftMargin(); - double indent = getIndent(); - - double width; - if(!_shape.getWordWrap()) { - // if wordWrap == false then we return the advance to the right border of the sheet - width = _shape.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX(); - } else { - width = anchor.getWidth() - leftInset - rightInset - leftMargin; - if(firstLine) { - if(isBullet()){ - if(indent > 0) width -= indent; - } else { - if(indent > 0) width -= indent; // first line indentation - else if (indent < 0) { // hanging indentation: the first line start at the left margin - width += leftMargin; - } - } - } - } - - return width; - } CTTextParagraphProperties getDefaultMasterStyle(){ CTPlaceholder ph = _shape.getCTPlaceholder(); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java index b4308c46c9..ac482a981f 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java @@ -19,17 +19,13 @@ package org.apache.poi.xslf.usermodel; -import java.awt.Graphics2D; -import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; import java.util.*; import org.apache.poi.POIXMLException; import org.apache.poi.sl.draw.DrawFactory; -import org.apache.poi.sl.draw.geom.Guide; +import org.apache.poi.sl.draw.DrawTextShape; import org.apache.poi.sl.usermodel.*; -import org.apache.poi.sl.usermodel.LineDecoration; import org.apache.poi.util.Beta; import org.apache.poi.util.Units; import org.apache.poi.xslf.model.PropertyFetcher; @@ -40,18 +36,11 @@ import org.openxmlformats.schemas.presentationml.x2006.main.*; /** * Represents a shape that can hold text. - * - * @author Yegor Kozlov */ @Beta -public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape { +public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape { private final List _paragraphs; - /** - * whether the text was broken into lines. - */ - private boolean _isTextBroken; - @SuppressWarnings("deprecation") /*package*/ XSLFTextShape(XmlObject shape, XSLFSheet sheet) { super(shape, sheet); @@ -66,7 +55,7 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape } public Iterator iterator(){ - return _paragraphs.iterator(); + return getTextParagraphs().iterator(); } /** @@ -408,22 +397,15 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape return textBody == null ? null : textBody.getBodyPr(); } - protected abstract CTTextBody getTextBody(boolean create); public Placeholder getTextType(){ - CTPlaceholder ph; - XmlObject[] obj = getXmlObject().selectPath( - "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph"); - if(obj.length == 1){ - ph = (CTPlaceholder)obj[0]; - int val = ph.getType().intValue(); - return Placeholder.values()[val - 1]; - } - else { - return null; - } + CTPlaceholder ph = getCTPlaceholder(); + if (ph == null) return null; + + int val = ph.getType().intValue(); + return Placeholder.values()[val - 1]; } @@ -437,10 +419,11 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape * @param placeholder */ public void setPlaceholder(Placeholder placeholder){ - CTShape sh = (CTShape)getXmlObject(); - CTApplicationNonVisualDrawingProps nv = sh.getNvSpPr().getNvPr(); + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr"; + CTApplicationNonVisualDrawingProps nv = selectProperty(CTApplicationNonVisualDrawingProps.class, xquery); + if (nv == null) return; if(placeholder == null) { - if(nv.isSetPh()) nv.unsetPh(); + if (nv.isSetPh()) nv.unsetPh(); } else { nv.addNewPh().setType(STPlaceholderType.Enum.forInt(placeholder.ordinal() + 1)); } @@ -450,14 +433,9 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape * Compute the cumulative height occupied by the text */ public double getTextHeight(){ - // dry-run in a 1x1 image and return the vertical advance - BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); - Graphics2D graphics = img.createGraphics(); - DrawFactory fact = DrawFactory.getInstance(graphics); - fact.getDrawable(this); - - breakText(graphics); - return drawParagraphs(graphics, 0, 0); + DrawFactory drawFact = DrawFactory.getInstance(null); + DrawTextShape dts = drawFact.getDrawable(this); + return dts.getTextHeight(); } /** @@ -521,19 +499,4 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape } } - - public LineDecoration getLineDecoration() { - // TODO Auto-generated method stub - return null; - } - - public FillStyle getFillStyle() { - // TODO Auto-generated method stub - return null; - } - - public Guide getAdjustValue(String name) { - // TODO Auto-generated method stub - return null; - } } \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java index 182e96a44e..7ad569aa8d 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.blip; import org.apache.poi.hslf.model.Picture; -import org.apache.poi.hslf.model.Shape; +import org.apache.poi.hslf.model.HSLFShape; import org.apache.poi.hslf.exceptions.HSLFException; import java.io.ByteArrayOutputStream; @@ -67,7 +67,7 @@ public final class EMF extends Metafile { header.wmfsize = data.length; //we don't have a EMF reader in java, have to set default image size 200x200 header.bounds = new java.awt.Rectangle(0, 0, 200, 200); - header.size = new java.awt.Dimension(header.bounds.width*Shape.EMU_PER_POINT, header.bounds.height*Shape.EMU_PER_POINT); + header.size = new java.awt.Dimension(header.bounds.width*HSLFShape.EMU_PER_POINT, header.bounds.height*HSLFShape.EMU_PER_POINT); header.zipsize = compressed.length; byte[] checksum = getChecksum(data); diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java index 0796db8555..4b401518ee 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java @@ -24,7 +24,7 @@ import java.util.zip.InflaterInputStream; import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.hslf.model.Picture; -import org.apache.poi.hslf.model.Shape; +import org.apache.poi.hslf.model.HSLFShape; /** * Represents Macintosh PICT picture data. @@ -86,8 +86,8 @@ public final class PICT extends Metafile { header.wmfsize = data.length - 512; //we don't have a PICT reader in java, have to set default image size 200x200 header.bounds = new java.awt.Rectangle(0, 0, 200, 200); - header.size = new java.awt.Dimension(header.bounds.width*Shape.EMU_PER_POINT, - header.bounds.height*Shape.EMU_PER_POINT); + header.size = new java.awt.Dimension(header.bounds.width*HSLFShape.EMU_PER_POINT, + header.bounds.height*HSLFShape.EMU_PER_POINT); header.zipsize = compressed.length; byte[] checksum = getChecksum(data); diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java index 4400c95594..76f680eafd 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java @@ -20,7 +20,7 @@ package org.apache.poi.hslf.blip; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.POILogger; import org.apache.poi.hslf.model.Picture; -import org.apache.poi.hslf.model.Shape; +import org.apache.poi.hslf.model.HSLFShape; import org.apache.poi.hslf.exceptions.HSLFException; import java.io.*; @@ -78,7 +78,7 @@ public final class WMF extends Metafile { header.wmfsize = data.length - aldus.getSize(); header.bounds = new java.awt.Rectangle((short)aldus.left, (short)aldus.top, (short)aldus.right-(short)aldus.left, (short)aldus.bottom-(short)aldus.top); //coefficient to translate from WMF dpi to 96pdi - int coeff = 96*Shape.EMU_PER_POINT/aldus.inch; + int coeff = 96*HSLFShape.EMU_PER_POINT/aldus.inch; header.size = new java.awt.Dimension(header.bounds.width*coeff, header.bounds.height*coeff); header.zipsize = compressed.length; diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java index d96e2243d1..e870e5d0f8 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java +++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java @@ -192,7 +192,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { for (int i = 0; i < _slides.length; i++) { Slide slide = _slides[i]; - Shape[] shapes = slide.getShapes(); + HSLFShape[] shapes = slide.getShapes(); for (int j = 0; j < shapes.length; j++) { if (shapes[j] instanceof OLEShape) { list.add((OLEShape) shapes[j]); @@ -221,7 +221,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { if (getSlideText) { if (getMasterText) { for (SlideMaster master : _show.getSlidesMasters()) { - for(Shape sh : master.getShapes()){ + for(HSLFShape sh : master.getShapes()){ if(sh instanceof TextShape){ if(MasterSheet.isPlaceholder(sh)) { // don't bother about boiler @@ -255,7 +255,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { textRunsToText(ret, slide.getTextRuns()); // Table text - for (Shape shape : slide.getShapes()){ + for (HSLFShape shape : slide.getShapes()){ if (shape instanceof Table){ extractTableText(ret, (Table)shape); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java index 8036695285..f1c90130db 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java @@ -65,7 +65,7 @@ public final class ActiveXShape extends Picture { * this picture in the Slide * @param parent the parent shape of this picture */ - protected ActiveXShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected ActiveXShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java index ccb302d715..0cadd7c0d9 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java @@ -35,13 +35,13 @@ import java.awt.geom.Rectangle2D; */ public class AutoShape extends TextShape { - protected AutoShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected AutoShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } - public AutoShape(ShapeType type, ShapeContainer parent){ + public AutoShape(ShapeType type, ShapeContainer parent){ super(null, parent); - _escherContainer = createSpContainer(type, parent instanceof ShapeGroup); + _escherContainer = createSpContainer(type, parent instanceof HSLFGroupShape); } public AutoShape(ShapeType type){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java index 25a68dfcd8..0afc71076b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java @@ -70,14 +70,14 @@ public final class AutoShapes { shapes = new ShapeOutline[255]; shapes[ShapeType.RECT.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ Rectangle2D path = new Rectangle2D.Float(0, 0, 21600, 21600); return path; } }; shapes[ShapeType.ROUND_RECT.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); RoundRectangle2D path = new RoundRectangle2D.Float(0, 0, 21600, 21600, adjval, adjval); return path; @@ -85,14 +85,14 @@ public final class AutoShapes { }; shapes[ShapeType.ELLIPSE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ Ellipse2D path = new Ellipse2D.Float(0, 0, 21600, 21600); return path; } }; shapes[ShapeType.DIAMOND.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ GeneralPath path = new GeneralPath(); path.moveTo(10800, 0); path.lineTo(21600, 10800); @@ -105,7 +105,7 @@ public final class AutoShapes { //m@0,l,21600r21600 shapes[ShapeType.TRIANGLE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 10800); GeneralPath path = new GeneralPath(); path.moveTo(adjval, 0); @@ -117,7 +117,7 @@ public final class AutoShapes { }; shapes[ShapeType.RT_TRIANGLE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ GeneralPath path = new GeneralPath(); path.moveTo(0, 0); path.lineTo(21600, 21600); @@ -128,7 +128,7 @@ public final class AutoShapes { }; shapes[ShapeType.PARALLELOGRAM.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); GeneralPath path = new GeneralPath(); @@ -142,7 +142,7 @@ public final class AutoShapes { }; shapes[ShapeType.TRAPEZOID.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); GeneralPath path = new GeneralPath(); @@ -156,7 +156,7 @@ public final class AutoShapes { }; shapes[ShapeType.HEXAGON.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); GeneralPath path = new GeneralPath(); @@ -172,7 +172,7 @@ public final class AutoShapes { }; shapes[ShapeType.OCTAGON.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 6326); GeneralPath path = new GeneralPath(); @@ -190,7 +190,7 @@ public final class AutoShapes { }; shapes[ShapeType.PLUS.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); GeneralPath path = new GeneralPath(); @@ -212,7 +212,7 @@ public final class AutoShapes { }; shapes[ShapeType.PENTAGON.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ GeneralPath path = new GeneralPath(); path.moveTo(10800, 0); @@ -226,7 +226,7 @@ public final class AutoShapes { }; shapes[ShapeType.DOWN_ARROW.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ //m0@0 l@1@0 @1,0 @2,0 @2@0,21600@0,10800,21600xe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200); int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400); @@ -244,7 +244,7 @@ public final class AutoShapes { }; shapes[ShapeType.UP_ARROW.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ //m0@0 l@1@0 @1,21600@2,21600@2@0,21600@0,10800,xe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400); @@ -262,7 +262,7 @@ public final class AutoShapes { }; shapes[ShapeType.RIGHT_ARROW.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ //m@0, l@0@1 ,0@1,0@2@0@2@0,21600,21600,10800xe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200); int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400); @@ -280,7 +280,7 @@ public final class AutoShapes { }; shapes[ShapeType.LEFT_ARROW.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ //m@0, l@0@1,21600@1,21600@2@0@2@0,21600,,10800xe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400); @@ -298,7 +298,7 @@ public final class AutoShapes { }; shapes[ShapeType.CAN.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ //m10800,qx0@1l0@2qy10800,21600,21600@2l21600@1qy10800,xem0@1qy10800@0,21600@1nfe int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); @@ -322,7 +322,7 @@ public final class AutoShapes { }; shapes[ShapeType.LEFT_BRACE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ //m21600,qx10800@0l10800@2qy0@11,10800@3l10800@1qy21600,21600e int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800); int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800); @@ -350,7 +350,7 @@ public final class AutoShapes { }; shapes[ShapeType.RIGHT_BRACE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ //m,qx10800@0 l10800@2qy21600@11,10800@3l10800@1qy,21600e int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800); int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800); @@ -378,7 +378,7 @@ public final class AutoShapes { }; shapes[ShapeType.STRAIGHT_CONNECTOR_1.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(Shape shape){ + public java.awt.Shape getOutline(HSLFShape shape){ return new Line2D.Float(0, 0, 21600, 21600); } }; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Background.java b/src/scratchpad/src/org/apache/poi/hslf/model/Background.java index 12070cdf62..1b172bdb8f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Background.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Background.java @@ -38,9 +38,9 @@ import org.apache.poi.util.POILogger; * * @author Yegor Kozlov */ -public final class Background extends Shape { +public final class Background extends HSLFShape { - protected Background(EscherContainerRecord escherRecord, ShapeContainer parent) { + protected Background(EscherContainerRecord escherRecord, ShapeContainer parent) { super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java b/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java index 5302e267d0..a394cac474 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java @@ -98,7 +98,7 @@ public final class Fill { /** * The shape this background applies to */ - protected Shape shape; + protected HSLFShape shape; /** * Construct a Fill object for a shape. @@ -106,7 +106,7 @@ public final class Fill { * * @param shape the shape this background applies to */ - public Fill(Shape shape){ + public Fill(HSLFShape shape){ this.shape = shape; } @@ -118,7 +118,7 @@ public final class Fill { */ public int getFillType(){ EscherOptRecord opt = shape.getEscherOptRecord(); - EscherSimpleProperty prop = Shape.getEscherProperty(opt, EscherProperties.FILL__FILLTYPE); + EscherSimpleProperty prop = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__FILLTYPE); return prop == null ? FILL_SOLID : prop.getPropertyValue(); } @@ -126,7 +126,7 @@ public final class Fill { */ protected void afterInsert(Sheet sh){ EscherOptRecord opt = shape.getEscherOptRecord(); - EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); + EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); if(p != null) { int idx = p.getPropertyValue(); EscherBSERecord bse = getEscherBSERecord(idx); @@ -143,7 +143,7 @@ public final class Fill { SlideShow ppt = sheet.getSlideShow(); Document doc = ppt.getDocumentRecord(); EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer(); - EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); + EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); if(bstore == null) { logger.log(POILogger.DEBUG, "EscherContainerRecord.BSTORE_CONTAINER was not found "); return null; @@ -160,7 +160,7 @@ public final class Fill { */ public void setFillType(int type){ EscherOptRecord opt = shape.getEscherOptRecord(); - Shape.setEscherProperty(opt, EscherProperties.FILL__FILLTYPE, type); + HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLTYPE, type); } /** @@ -168,7 +168,7 @@ public final class Fill { */ public Color getForegroundColor(){ EscherOptRecord opt = shape.getEscherOptRecord(); - EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST); + EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST); if(p != null && (p.getPropertyValue() & 0x10) == 0) return null; @@ -182,12 +182,12 @@ public final class Fill { public void setForegroundColor(Color color){ EscherOptRecord opt = shape.getEscherOptRecord(); if (color == null) { - Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150000); + HSLFShape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150000); } else { int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB(); - Shape.setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, rgb); - Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150011); + HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, rgb); + HSLFShape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150011); } } @@ -196,7 +196,7 @@ public final class Fill { */ public Color getBackgroundColor(){ EscherOptRecord opt = shape.getEscherOptRecord(); - EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST); + EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST); if(p != null && (p.getPropertyValue() & 0x10) == 0) return null; @@ -209,11 +209,11 @@ public final class Fill { public void setBackgroundColor(Color color){ EscherOptRecord opt = shape.getEscherOptRecord(); if (color == null) { - Shape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, -1); + HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, -1); } else { int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB(); - Shape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, rgb); + HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, rgb); } } @@ -222,7 +222,7 @@ public final class Fill { */ public PictureData getPictureData(){ EscherOptRecord opt = shape.getEscherOptRecord(); - EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); + EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); if (p == null) return null; SlideShow ppt = shape.getSheet().getSlideShow(); @@ -230,7 +230,7 @@ public final class Fill { Document doc = ppt.getDocumentRecord(); EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer(); - EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); + EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); java.util.List lst = bstore.getChildRecords(); int idx = p.getPropertyValue(); @@ -255,7 +255,7 @@ public final class Fill { */ public void setPictureData(int idx){ EscherOptRecord opt = shape.getEscherOptRecord(); - Shape.setEscherProperty(opt, (short)(EscherProperties.FILL__PATTERNTEXTURE + 0x4000), idx); + HSLFShape.setEscherProperty(opt, (short)(EscherProperties.FILL__PATTERNTEXTURE + 0x4000), idx); if( idx != 0 ) { if( shape.getSheet() != null ) { EscherBSERecord bse = getEscherBSERecord(idx); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java b/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java index 187bfd0ca2..6bf232af46 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java @@ -62,7 +62,7 @@ public final class Freeform extends AutoShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected Freeform(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected Freeform(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -73,9 +73,9 @@ public final class Freeform extends AutoShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public Freeform(ShapeContainer parent){ + public Freeform(ShapeContainer parent){ super((EscherContainerRecord)null, parent); - _escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof ShapeGroup); + _escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof HSLFGroupShape); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFGroupShape.java similarity index 93% rename from src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFGroupShape.java index f18701a0e4..336f11743a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFGroupShape.java @@ -40,13 +40,13 @@ import org.apache.poi.util.POILogger; * * @author Yegor Kozlov */ -public class ShapeGroup extends Shape implements ShapeContainer { +public class HSLFGroupShape extends HSLFShape implements ShapeContainer { /** * Create a new ShapeGroup. This constructor is used when a new shape is created. * */ - public ShapeGroup(){ + public HSLFGroupShape(){ this(null, null); _escherContainer = createSpContainer(false); } @@ -57,16 +57,16 @@ public class ShapeGroup extends Shape implements ShapeContainer { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected ShapeGroup(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected HSLFGroupShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } /** * @return the shapes contained in this group container */ - public Shape[] getShapes() { - List shapeList = getShapeList(); - Shape[] shapes = shapeList.toArray(new Shape[shapeList.size()]); + public HSLFShape[] getShapes() { + List shapeList = getShapeList(); + HSLFShape[] shapes = shapeList.toArray(new HSLFShape[shapeList.size()]); return shapes; } @@ -174,7 +174,7 @@ public class ShapeGroup extends Shape implements ShapeContainer { * * @param shape - the Shape to add */ - public void addShape(Shape shape){ + public void addShape(HSLFShape shape){ _escherContainer.addChildRecord(shape.getSpContainer()); Sheet sheet = getSheet(); @@ -196,7 +196,7 @@ public class ShapeGroup extends Shape implements ShapeContainer { anchor.translate(dx, dy); setAnchor(anchor); - Shape[] shape = getShapes(); + HSLFShape[] shape = getShapes(); for (int i = 0; i < shape.length; i++) { java.awt.Rectangle chanchor = shape[i].getAnchor(); chanchor.translate(dx, dy); @@ -257,7 +257,7 @@ public class ShapeGroup extends Shape implements ShapeContainer { AffineTransform at = graphics.getTransform(); - Shape[] sh = getShapes(); + HSLFShape[] sh = getShapes(); for (int i = 0; i < sh.length; i++) { sh[i].draw(graphics); } @@ -271,11 +271,11 @@ public class ShapeGroup extends Shape implements ShapeContainer { return groupInfoContainer.getChildById((short)recordId); } - public Iterator iterator() { + public Iterator iterator() { return getShapeList().iterator(); } - public boolean removeShape(Shape shape) { + public boolean removeShape(HSLFShape shape) { // TODO: implement! throw new UnsupportedOperationException(); } @@ -283,7 +283,7 @@ public class ShapeGroup extends Shape implements ShapeContainer { /** * @return the shapes contained in this group container */ - protected List getShapeList() { + protected List getShapeList() { // Out escher container record should contain several // SpContainers, the first of which is the group shape itself Iterator iter = _escherContainer.getChildIterator(); @@ -292,13 +292,13 @@ public class ShapeGroup extends Shape implements ShapeContainer { if (iter.hasNext()) { iter.next(); } - List shapeList = new ArrayList(); + List shapeList = new ArrayList(); while (iter.hasNext()) { EscherRecord r = iter.next(); if(r instanceof EscherContainerRecord) { // Create the Shape for it EscherContainerRecord container = (EscherContainerRecord)r; - Shape shape = ShapeFactory.createShape(container, this); + HSLFShape shape = ShapeFactory.createShape(container, this); shape.setSheet(getSheet()); shapeList.add( shape ); } else { diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java similarity index 98% rename from src/scratchpad/src/org/apache/poi/hslf/model/Shape.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java index 67da50097f..c673cae2de 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java @@ -45,7 +45,7 @@ import java.awt.geom.Rectangle2D; * * @author Yegor Kozlov */ -public abstract class Shape implements org.apache.poi.sl.usermodel.Shape { +public abstract class HSLFShape implements org.apache.poi.sl.usermodel.Shape { // For logging protected POILogger logger = POILogFactory.getLogger(this.getClass()); @@ -85,7 +85,7 @@ public abstract class Shape implements org.apache.poi.sl.usermodel.Shape * Parent of this shape. * null for the topmost shapes. */ - protected ShapeContainer _parent; + protected ShapeContainer _parent; /** * The Sheet this shape belongs to @@ -103,7 +103,7 @@ public abstract class Shape implements org.apache.poi.sl.usermodel.Shape * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of this Shape */ - protected Shape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected HSLFShape(EscherContainerRecord escherRecord, ShapeContainer parent){ _escherContainer = escherRecord; _parent = parent; } @@ -116,7 +116,7 @@ public abstract class Shape implements org.apache.poi.sl.usermodel.Shape /** * @return the parent of this shape */ - public ShapeContainer getParent(){ + public ShapeContainer getParent(){ return _parent; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java b/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java index d317b6ad56..df207e6716 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java @@ -176,7 +176,7 @@ public final class Hyperlink { * @param shape Shape to lookup hyperlink in * @return found hyperlink or null */ - protected static Hyperlink find(Shape shape){ + protected static Hyperlink find(HSLFShape shape){ List lst = new ArrayList(); SlideShow ppt = shape.getSheet().getSlideShow(); //document-level container which stores info about all links in a presentation diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java index 3c078ec5a0..e811aeb6bf 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java @@ -97,13 +97,13 @@ public final class Line extends SimpleShape { public static final int LINE_TRIPLE = 4; - protected Line(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected Line(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } - public Line(ShapeContainer parent){ + public Line(ShapeContainer parent){ super(null, parent); - _escherContainer = createSpContainer(parent instanceof ShapeGroup); + _escherContainer = createSpContainer(parent instanceof HSLFGroupShape); } public Line(){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java b/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java index c3cfaba90f..5f7bd1a592 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java @@ -46,7 +46,7 @@ public abstract class MasterSheet extends Sheet { * * @return true if the shape is a placeholder */ - public static boolean isPlaceholder(Shape shape){ + public static boolean isPlaceholder(HSLFShape shape){ if(!(shape instanceof TextShape)) return false; TextShape tx = (TextShape)shape; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java index 6b5225e925..834dc870e4 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java @@ -55,7 +55,7 @@ public final class MovieShape extends Picture { * @param idx the index of the picture * @param parent the parent shape */ - public MovieShape(int movieIdx, int idx, ShapeContainer parent) { + public MovieShape(int movieIdx, int idx, ShapeContainer parent) { super(idx, parent); setMovieIndex(movieIdx); } @@ -67,7 +67,7 @@ public final class MovieShape extends Picture { * this picture in the Slide * @param parent the parent shape of this picture */ - protected MovieShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected MovieShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java index c4e560a91f..a1e9c94e08 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java @@ -52,7 +52,7 @@ public final class OLEShape extends Picture { * @param idx the index of the picture * @param parent the parent shape */ - public OLEShape(int idx, ShapeContainer parent) { + public OLEShape(int idx, ShapeContainer parent) { super(idx, parent); } @@ -63,7 +63,7 @@ public final class OLEShape extends Picture { * this picture in the Slide * @param parent the parent shape of this picture */ - protected OLEShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected OLEShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java index e592d77f8f..f775addac3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java @@ -43,7 +43,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { protected POILogger log = POILogFactory.getLogger(this.getClass()); //The ppt object to write into. - private ShapeGroup _group; + private HSLFGroupShape _group; private AffineTransform _transform; private Stroke _stroke; @@ -58,7 +58,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { * * @param group The shape group to write the graphics calls into. */ - public PPGraphics2D(ShapeGroup group){ + public PPGraphics2D(HSLFGroupShape group){ this._group = group; _transform = new AffineTransform(); @@ -73,7 +73,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { /** * @return the shape group being used for drawing */ - public ShapeGroup getShapeGroup(){ + public HSLFGroupShape getShapeGroup(){ return _group; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java b/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java index f57ced0ac4..8c3b2b6399 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java @@ -98,9 +98,9 @@ public class Picture extends SimpleShape { * @param idx the index of the picture * @param parent the parent shape */ - public Picture(int idx, ShapeContainer parent) { + public Picture(int idx, ShapeContainer parent) { super(null, parent); - _escherContainer = createSpContainer(idx, parent instanceof ShapeGroup); + _escherContainer = createSpContainer(idx, parent instanceof HSLFGroupShape); } /** @@ -110,7 +110,7 @@ public class Picture extends SimpleShape { * this picture in the Slide * @param parent the parent shape of this picture */ - protected Picture(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected Picture(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -205,7 +205,7 @@ public class Picture extends SimpleShape { SlideShow ppt = getSheet().getSlideShow(); Document doc = ppt.getDocumentRecord(); EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer(); - EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); + EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); if(bstore == null) { logger.log(POILogger.DEBUG, "EscherContainerRecord.BSTORE_CONTAINER was not found "); return null; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java index 4b30c110e4..0e6052e969 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java @@ -31,11 +31,11 @@ import java.io.ByteArrayOutputStream; */ public final class Placeholder extends TextBox { - protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } - public Placeholder(ShapeContainer parent){ + public Placeholder(ShapeContainer parent){ super(parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java index b7ea9c8356..2d67c03fdc 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java @@ -36,7 +36,7 @@ public final class Polygon extends AutoShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected Polygon(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected Polygon(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -47,9 +47,9 @@ public final class Polygon extends AutoShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public Polygon(ShapeContainer parent){ + public Polygon(ShapeContainer parent){ super((EscherContainerRecord)null, parent); - _escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof ShapeGroup); + _escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof HSLFGroupShape); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java index e9c2172649..01ac53855c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java @@ -51,16 +51,16 @@ public final class ShapeFactory { /** * Create a new shape from the data provided. */ - public static Shape createShape(EscherContainerRecord spContainer, ShapeContainer parent){ + public static HSLFShape createShape(EscherContainerRecord spContainer, ShapeContainer parent){ if (spContainer.getRecordId() == EscherContainerRecord.SPGR_CONTAINER){ return createShapeGroup(spContainer, parent); } return createSimpeShape(spContainer, parent); } - public static ShapeGroup createShapeGroup(EscherContainerRecord spContainer, ShapeContainer parent){ - ShapeGroup group = null; - EscherRecord opt = Shape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122); + public static HSLFGroupShape createShapeGroup(EscherContainerRecord spContainer, ShapeContainer parent){ + HSLFGroupShape group = null; + EscherRecord opt = HSLFShape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122); if(opt != null){ try { EscherPropertyFactory f = new EscherPropertyFactory(); @@ -69,21 +69,21 @@ public final class ShapeFactory { if(p.getPropertyNumber() == 0x39F && p.getPropertyValue() == 1){ group = new Table(spContainer, parent); } else { - group = new ShapeGroup(spContainer, parent); + group = new HSLFGroupShape(spContainer, parent); } } catch (Exception e){ logger.log(POILogger.WARN, e.getMessage()); - group = new ShapeGroup(spContainer, parent); + group = new HSLFGroupShape(spContainer, parent); } } else { - group = new ShapeGroup(spContainer, parent); + group = new HSLFGroupShape(spContainer, parent); } return group; } - public static Shape createSimpeShape(EscherContainerRecord spContainer, ShapeContainer parent){ - Shape shape = null; + public static HSLFShape createSimpeShape(EscherContainerRecord spContainer, ShapeContainer parent){ + HSLFShape shape = null; EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID); ShapeType type = ShapeType.forId(spRecord.getShapeType(), false); @@ -117,8 +117,8 @@ public final class ShapeFactory { shape = new Line(spContainer, parent); break; case NOT_PRIMITIVE: { - EscherOptRecord opt = Shape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID); - EscherProperty prop = Shape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES); + EscherOptRecord opt = HSLFShape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID); + EscherProperty prop = HSLFShape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES); if(prop != null) shape = new Freeform(spContainer, parent); else { diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java index 591bb55523..52e5a86bb1 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java @@ -23,6 +23,6 @@ package org.apache.poi.hslf.model; * @author Yegor Kozlov */ public interface ShapeOutline { - java.awt.Shape getOutline(Shape shape); + java.awt.Shape getOutline(HSLFShape shape); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java b/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java index c3383f4d69..197043fa65 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java @@ -57,7 +57,7 @@ import org.apache.poi.util.POILogger; * @author Yegor Kozlov */ -public abstract class Sheet implements ShapeContainer { +public abstract class Sheet implements ShapeContainer { private static POILogger logger = POILogFactory.getLogger(Sheet.class); /** @@ -272,9 +272,9 @@ public abstract class Sheet implements ShapeContainer { * * @return all shapes contained in this Sheet (Slide or Notes) */ - public Shape[] getShapes() { - List shapeList = getShapeList(); - return shapeList.toArray(new Shape[shapeList.size()]); + public HSLFShape[] getShapes() { + List shapeList = getShapeList(); + return shapeList.toArray(new HSLFShape[shapeList.size()]); } /** @@ -282,11 +282,11 @@ public abstract class Sheet implements ShapeContainer { * * @param shape - the Shape to add */ - public void addShape(Shape shape) { + public void addShape(HSLFShape shape) { PPDrawing ppdrawing = getPPDrawing(); EscherContainerRecord dgContainer = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; - EscherContainerRecord spgr = (EscherContainerRecord) Shape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER); + EscherContainerRecord spgr = (EscherContainerRecord) HSLFShape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER); spgr.addChildRecord(shape.getSpContainer()); shape.setSheet(this); @@ -339,7 +339,7 @@ public abstract class Sheet implements ShapeContainer { * @param shape shape to be removed from this sheet, if present. * @return true if the shape was deleted. */ - public boolean removeShape(Shape shape) { + public boolean removeShape(HSLFShape shape) { PPDrawing ppdrawing = getPPDrawing(); EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; @@ -427,7 +427,7 @@ public abstract class Sheet implements ShapeContainer { * @return TextShape or null */ public TextShape getPlaceholderByTextType(int type){ - Shape[] shape = getShapes(); + HSLFShape[] shape = getShapes(); for (int i = 0; i < shape.length; i++) { if(shape[i] instanceof TextShape){ TextShape tx = (TextShape)shape[i]; @@ -447,7 +447,7 @@ public abstract class Sheet implements ShapeContainer { * @return TextShape or null */ public TextShape getPlaceholder(int type){ - Shape[] shape = getShapes(); + HSLFShape[] shape = getShapes(); for (int i = 0; i < shape.length; i++) { if(shape[i] instanceof TextShape){ TextShape tx = (TextShape)shape[i]; @@ -497,7 +497,7 @@ public abstract class Sheet implements ShapeContainer { } - public Iterator iterator() { + public Iterator iterator() { return getShapeList().iterator(); } @@ -507,7 +507,7 @@ public abstract class Sheet implements ShapeContainer { * * @return all shapes contained in this Sheet (Slide or Notes) */ - protected List getShapeList() { + protected List getShapeList() { PPDrawing ppdrawing = getPPDrawing(); EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; @@ -524,7 +524,7 @@ public abstract class Sheet implements ShapeContainer { throw new IllegalStateException("spgr not found"); } - List shapeList = new ArrayList(); + List shapeList = new ArrayList(); Iterator it = spgr.getChildIterator(); if (it.hasNext()) { // skip first item @@ -532,7 +532,7 @@ public abstract class Sheet implements ShapeContainer { } for (; it.hasNext();) { EscherContainerRecord sp = (EscherContainerRecord) it.next(); - Shape sh = ShapeFactory.createShape(sp, null); + HSLFShape sh = ShapeFactory.createShape(sp, null); sh.setSheet(this); shapeList.add(sh); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java index 7694cacba2..bfe6a1d95a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java @@ -47,7 +47,7 @@ import org.apache.poi.util.LittleEndian; * * @author Yegor Kozlov */ -public abstract class SimpleShape extends Shape { +public abstract class SimpleShape extends HSLFShape { public final static double DEFAULT_LINE_WIDTH = 0.75; @@ -63,7 +63,7 @@ public abstract class SimpleShape extends Shape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected SimpleShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected SimpleShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -223,15 +223,15 @@ public abstract class SimpleShape extends Shape { //if it is a groupped shape see if we need to transform the coordinates if (getParent() != null){ - ArrayList lst = new ArrayList(); - for (ShapeContainer parent=this.getParent(); - parent instanceof ShapeGroup; - parent = ((ShapeGroup)parent).getParent()) { - lst.add(0, (ShapeGroup)parent); + ArrayList lst = new ArrayList(); + for (ShapeContainer parent=this.getParent(); + parent instanceof HSLFGroupShape; + parent = ((HSLFGroupShape)parent).getParent()) { + lst.add(0, (HSLFGroupShape)parent); } AffineTransform tx = new AffineTransform(); - for(ShapeGroup prnt : lst) { + for(HSLFGroupShape prnt : lst) { Rectangle2D exterior = prnt.getAnchor2D(); Rectangle2D interior = prnt.getCoordinates(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java b/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java index f5342534a5..1db3173e6a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java @@ -149,7 +149,7 @@ public final class Slide extends Sheet { //initialize drawing group id EscherDggRecord dgg = getSlideShow().getDocumentRecord().getPPDrawingGroup().getEscherDggRecord(); EscherContainerRecord dgContainer = (EscherContainerRecord)getSheetContainer().getPPDrawing().getEscherRecords()[0]; - EscherDgRecord dg = (EscherDgRecord) Shape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID); + EscherDgRecord dg = (EscherDgRecord) HSLFShape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID); int dgId = dgg.getMaxDrawingGroupId() + 1; dg.setOptions((short)(dgId << 4)); dgg.setDrawingsSaved(dgg.getDrawingsSaved() + 1); @@ -428,7 +428,7 @@ public final class Slide extends Sheet { if(bg != null)bg.draw(graphics); if(getFollowMasterObjects()){ - Shape[] sh = master.getShapes(); + HSLFShape[] sh = master.getShapes(); for (int i = 0; i < sh.length; i++) { if(MasterSheet.isPlaceholder(sh[i])) continue; @@ -436,7 +436,7 @@ public final class Slide extends Sheet { } } - Shape[] sh = getShapes(); + HSLFShape[] sh = getShapes(); for (int i = 0; i < sh.length; i++) { sh[i].draw(graphics); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java index 266e6d913b..f94bd7f5b6 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java @@ -30,7 +30,7 @@ import java.awt.*; * * @author Yegor Kozlov */ -public final class Table extends ShapeGroup { +public final class Table extends HSLFGroupShape { protected static final int BORDER_TOP = 1; protected static final int BORDER_RIGHT = 2; @@ -93,7 +93,7 @@ public final class Table extends ShapeGroup { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - public Table(EscherContainerRecord escherRecord, ShapeContainer parent) { + public Table(EscherContainerRecord escherRecord, ShapeContainer parent) { super(escherRecord, parent); } @@ -150,9 +150,9 @@ public final class Table extends ShapeGroup { } protected void initTable(){ - List shapeList = getShapeList(); - Collections.sort(shapeList, new Comparator(){ - public int compare( Shape o1, Shape o2 ) { + List shapeList = getShapeList(); + Collections.sort(shapeList, new Comparator(){ + public int compare( HSLFShape o1, HSLFShape o2 ) { Rectangle anchor1 = o1.getAnchor(); Rectangle anchor2 = o2.getAnchor(); int delta = anchor1.y - anchor2.y; @@ -162,14 +162,14 @@ public final class Table extends ShapeGroup { }); int y0 = -1; int maxrowlen = 0; - List> lst = new ArrayList>(); - List row = null; - for (Shape sh : shapeList) { + List> lst = new ArrayList>(); + List row = null; + for (HSLFShape sh : shapeList) { if(sh instanceof TextShape){ Rectangle anchor = sh.getAnchor(); if(anchor.y != y0){ y0 = anchor.y; - row = new ArrayList(); + row = new ArrayList(); lst.add(row); } row.add(sh); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java b/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java index 15854bb50a..715181cfad 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java @@ -45,7 +45,7 @@ public final class TableCell extends TextBox { * @param escherRecord {@link EscherSpContainer} container which holds information about this shape * @param parent the parent of the shape */ - protected TableCell(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected TableCell(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -55,7 +55,7 @@ public final class TableCell extends TextBox { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public TableCell(ShapeContainer parent){ + public TableCell(ShapeContainer parent){ super(parent); setShapeType(ShapeType.RECT); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java index 267102aa52..dc5ac94104 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java @@ -38,7 +38,7 @@ public class TextBox extends TextShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected TextBox(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected TextBox(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -49,7 +49,7 @@ public class TextBox extends TextShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public TextBox(ShapeContainer parent){ + public TextBox(ShapeContainer parent){ super(parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java index 6d0dbc82d0..4b8805c266 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java @@ -270,8 +270,8 @@ public final class TextPainter { TextRulerAtom ruler = run.getTextRuler(); if(ruler != null) { - int bullet_val = ruler.getBulletOffsets()[indent]*Shape.POINT_DPI/Shape.MASTER_DPI; - int text_val = ruler.getTextOffsets()[indent]*Shape.POINT_DPI/Shape.MASTER_DPI; + int bullet_val = ruler.getBulletOffsets()[indent]*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; + int text_val = ruler.getTextOffsets()[indent]*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; if(bullet_val > text_val){ int a = bullet_val; bullet_val = text_val; @@ -309,7 +309,7 @@ public final class TextPainter { if(linespacing >= 0){ el.ascent = textLayout.getAscent()*linespacing/100; } else { - el.ascent = -linespacing*Shape.POINT_DPI/Shape.MASTER_DPI; + el.ascent = -linespacing*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; } el._align = rt.getAlignment(); @@ -325,7 +325,7 @@ public final class TextPainter { if(sp >= 0){ spaceBefore = lineHeight * sp/100; } else { - spaceBefore = -sp*Shape.POINT_DPI/Shape.MASTER_DPI; + spaceBefore = -sp*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; } el.ascent += spaceBefore; } @@ -334,7 +334,7 @@ public final class TextPainter { if(linespacing >= 0){ descent = (textLayout.getDescent() + textLayout.getLeading())*linespacing/100; } else { - descent = -linespacing*Shape.POINT_DPI/Shape.MASTER_DPI; + descent = -linespacing*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; } if (prStart){ int sp = rt.getSpaceAfter(); @@ -342,7 +342,7 @@ public final class TextPainter { if(sp >= 0){ spaceAfter = lineHeight * sp/100; } else { - spaceAfter = -sp*Shape.POINT_DPI/Shape.MASTER_DPI; + spaceAfter = -sp*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; } el.ascent += spaceAfter; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java index e1e053e397..3f47ae6a5b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java @@ -111,7 +111,7 @@ public abstract class TextShape extends SimpleShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected TextShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected TextShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -122,9 +122,9 @@ public abstract class TextShape extends SimpleShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public TextShape(ShapeContainer parent){ + public TextShape(ShapeContainer parent){ super(null, parent); - _escherContainer = createSpContainer(parent instanceof ShapeGroup); + _escherContainer = createSpContainer(parent instanceof HSLFGroupShape); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java index a02d82ce06..878f8c12eb 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java @@ -20,7 +20,7 @@ package org.apache.poi.hslf.usermodel; import java.awt.Color; import org.apache.poi.hslf.model.MasterSheet; -import org.apache.poi.hslf.model.Shape; +import org.apache.poi.hslf.model.HSLFShape; import org.apache.poi.hslf.model.Sheet; import org.apache.poi.hslf.model.TextRun; import org.apache.poi.hslf.model.textproperties.BitMaskTextProp; @@ -618,28 +618,28 @@ public final class RichTextRun { * Sets the bullet offset */ public void setBulletOffset(int offset) { - setParaTextPropVal("bullet.offset", offset*Shape.MASTER_DPI/Shape.POINT_DPI); + setParaTextPropVal("bullet.offset", offset*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); } /** * Returns the bullet offset */ public int getBulletOffset() { - return getParaTextPropVal("bullet.offset")*Shape.POINT_DPI/Shape.MASTER_DPI; + return getParaTextPropVal("bullet.offset")*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; } /** * Sets the text offset */ public void setTextOffset(int offset) { - setParaTextPropVal("text.offset", offset*Shape.MASTER_DPI/Shape.POINT_DPI); + setParaTextPropVal("text.offset", offset*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); } /** * Returns the text offset */ public int getTextOffset() { - return getParaTextPropVal("text.offset")*Shape.POINT_DPI/Shape.MASTER_DPI; + return getParaTextPropVal("text.offset")*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java index 22aa0b61d0..d6829b4b4e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java @@ -46,7 +46,7 @@ import org.apache.poi.hslf.model.MovieShape; import org.apache.poi.hslf.model.Notes; import org.apache.poi.hslf.model.PPFont; import org.apache.poi.hslf.model.Picture; -import org.apache.poi.hslf.model.Shape; +import org.apache.poi.hslf.model.HSLFShape; import org.apache.poi.hslf.model.Slide; import org.apache.poi.hslf.model.SlideMaster; import org.apache.poi.hslf.model.TitleMaster; @@ -532,8 +532,8 @@ public final class SlideShow { */ public Dimension getPageSize() { DocumentAtom docatom = _documentRecord.getDocumentAtom(); - int pgx = (int) docatom.getSlideSizeX() * Shape.POINT_DPI / Shape.MASTER_DPI; - int pgy = (int) docatom.getSlideSizeY() * Shape.POINT_DPI / Shape.MASTER_DPI; + int pgx = (int) docatom.getSlideSizeX() * HSLFShape.POINT_DPI / HSLFShape.MASTER_DPI; + int pgy = (int) docatom.getSlideSizeY() * HSLFShape.POINT_DPI / HSLFShape.MASTER_DPI; return new Dimension(pgx, pgy); } @@ -545,8 +545,8 @@ public final class SlideShow { */ public void setPageSize(Dimension pgsize) { DocumentAtom docatom = _documentRecord.getDocumentAtom(); - docatom.setSlideSizeX(pgsize.width * Shape.MASTER_DPI / Shape.POINT_DPI); - docatom.setSlideSizeY(pgsize.height * Shape.MASTER_DPI / Shape.POINT_DPI); + docatom.setSlideSizeX(pgsize.width * HSLFShape.MASTER_DPI / HSLFShape.POINT_DPI); + docatom.setSlideSizeY(pgsize.height * HSLFShape.MASTER_DPI / HSLFShape.POINT_DPI); } /** @@ -784,7 +784,7 @@ public final class SlideShow { EscherContainerRecord bstore; EscherContainerRecord dggContainer = _documentRecord.getPPDrawingGroup().getDggContainer(); - bstore = (EscherContainerRecord) Shape.getEscherChild(dggContainer, + bstore = (EscherContainerRecord) HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); if (bstore == null) { bstore = new EscherContainerRecord(); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java index a8dcca5958..f28c2cbfd4 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java @@ -3,7 +3,7 @@ package org.apache.poi.sl.draw; import org.apache.poi.sl.usermodel.*; -public class DrawAutoShape extends DrawTextShape { +public class DrawAutoShape> extends DrawTextShape { public DrawAutoShape(T shape) { super(shape); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java new file mode 100644 index 0000000000..30b3386266 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java @@ -0,0 +1,41 @@ +package org.apache.poi.sl.draw; + +import java.awt.*; +import java.awt.geom.Rectangle2D; + +import org.apache.poi.sl.usermodel.*; + + +public class DrawBackground extends DrawShape { + public DrawBackground(T shape) { + super(shape); + } + + public void draw(Graphics2D graphics) { + Dimension pg = shape.getSheet().getSlideShow().getPageSize(); + final Rectangle2D anchor = new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight()); + + PlaceableShape ps = new PlaceableShape(){ + public Rectangle2D getAnchor() { return anchor; } + public void setAnchor(Rectangle2D anchor) {} + public double getRotation() { return 0; } + public void setRotation(double theta) {} + public void setFlipHorizontal(boolean flip) {} + public void setFlipVertical(boolean flip) {} + public boolean getFlipHorizontal() { return false; } + public boolean getFlipVertical() { return false; } + }; + + DrawFactory drawFact = DrawFactory.getInstance(graphics); + DrawPaint dp = drawFact.getPaint(ps); + Paint fill = dp.getPaint(graphics, shape.getFillStyle().getPaint()); + Rectangle2D anchor2 = getAnchor(graphics, anchor); + + if(fill != null) { + graphics.setPaint(fill); + graphics.fill(anchor2); + } + } + + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java index 9270091a1d..80b95ee5f6 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java @@ -40,8 +40,13 @@ public class DrawFactory { } public static DrawFactory getInstance(Graphics2D graphics) { - // first try to find the factory over the rendering hing - DrawFactory factory = (DrawFactory)graphics.getRenderingHint(DRAW_FACTORY); + // first try to find the factory over the rendering hint + DrawFactory factory = null; + boolean isHint = false; + if (graphics != null) { + factory = (DrawFactory)graphics.getRenderingHint(DRAW_FACTORY); + isHint = true; + } // secondly try the thread local default if (factory == null) { factory = defaultFactory.get(); @@ -49,43 +54,78 @@ public class DrawFactory { // and at last, use the default factory if (factory == null) { factory = new DrawFactory(); + } + if (graphics != null && !isHint) { graphics.setRenderingHint(DRAW_FACTORY, factory); } return factory; } - public Drawable getDrawable(Sheet sheet) { - return new DrawSheet(sheet); - } - - public Drawable getDrawable(MasterSheet sheet) { - return new DrawMasterSheet(sheet); - } - @SuppressWarnings("unchecked") public Drawable getDrawable(Shape shape) { if (shape instanceof TextBox) { - return getDrawable((TextBox)shape); + return getDrawable((TextBox>)shape); } else if (shape instanceof FreeformShape) { - return getDrawable((FreeformShape)shape); + return getDrawable((FreeformShape>)shape); + } else if (shape instanceof TextShape) { + return getDrawable((TextShape>)shape); + } else if (shape instanceof ShapeGroup) { + return getDrawable((ShapeGroup)shape); + } else if (shape instanceof PictureShape) { + return getDrawable((PictureShape)shape); + } else if (shape instanceof Background) { + return getDrawable((Background)shape); + } else if (shape instanceof Slide) { + return getDrawable((Slide)shape); + } else if (shape instanceof MasterSheet) { + return getDrawable((MasterSheet)shape); + } else if (shape instanceof Sheet) { + return getDrawable((Sheet)shape); } throw new IllegalArgumentException("Unsupported shape type: "+shape.getClass()); } - public DrawTextBox getDrawable(T shape) { + public > DrawSlide getDrawable(T sheet) { + return new DrawSlide(sheet); + } + + public > DrawSheet getDrawable(T sheet) { + return new DrawSheet(sheet); + } + + public > DrawMasterSheet getDrawable(T sheet) { + return new DrawMasterSheet(sheet); + } + + public >> DrawTextBox getDrawable(T shape) { return new DrawTextBox(shape); } - public DrawFreeformShape getDrawable(T shape) { + public >> DrawFreeformShape getDrawable(T shape) { return new DrawFreeformShape(shape); } - - public DrawTextParagraph getDrawable(TextParagraph paragraph) { - return new DrawTextParagraph(paragraph); + public >> DrawTextShape getDrawable(T shape) { + return new DrawTextShape(shape); } + public > DrawShapeGroup getDrawable(T shape) { + return new DrawShapeGroup(shape); + } + + public DrawPictureShape getDrawable(T shape) { + return new DrawPictureShape(shape); + } + + public DrawTextParagraph getDrawable(TextParagraph paragraph) { + return new DrawTextParagraph(paragraph); + } + + public DrawBackground getDrawable(T shape) { + return new DrawBackground(shape); + } + public DrawTextFragment getTextFragment(TextLayout layout, AttributedString str) { return new DrawTextFragment(layout, str); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java index 666b85a1c7..ed237997a6 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java @@ -2,7 +2,7 @@ package org.apache.poi.sl.draw; import org.apache.poi.sl.usermodel.*; -public class DrawFreeformShape extends DrawAutoShape { +public class DrawFreeformShape>> extends DrawAutoShape { public DrawFreeformShape(T shape) { super(shape); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java index c4afeb35e6..7a89828ede 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java @@ -1,12 +1,11 @@ package org.apache.poi.sl.draw; -import org.apache.poi.sl.usermodel.MasterSheet; -import org.apache.poi.sl.usermodel.Shape; +import org.apache.poi.sl.usermodel.*; -public class DrawMasterSheet extends DrawSheet { +public class DrawMasterSheet> extends DrawSheet { - public DrawMasterSheet(MasterSheet sheet) { + public DrawMasterSheet(T sheet) { super(sheet); } @@ -17,6 +16,6 @@ public class DrawMasterSheet extends DrawSheet { * for instance, slide masters and layouts don't display placeholders */ protected boolean canDraw(Shape shape){ - return !shape.isPlaceholder(); + return !(shape instanceof SimpleShape) || !((SimpleShape)shape).isPlaceholder(); } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java index c608ec3b05..77a0da740a 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java @@ -27,8 +27,9 @@ import java.io.IOException; import java.io.InputStream; import org.apache.poi.sl.usermodel.*; -import org.apache.poi.sl.usermodel.GradientPaint; -import org.apache.poi.sl.usermodel.TexturePaint; +import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; +import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -142,7 +143,6 @@ public class DrawPaint { float red,green,blue; - Color color; if (lumOff > 0) { float flumOff = lumOff / 100000.f; red = (255.f - r) * (1.f - flumOff) + r; @@ -150,9 +150,9 @@ public class DrawPaint { blue = (255.f - b) * flumOff + b; } else { float flumMod = lumMod / 100000.f; - red = r * lumMod; - green = g * lumMod; - blue = b * lumMod; + red = r * flumMod; + green = g * flumMod; + blue = b * flumMod; } return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha()); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPictureShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPictureShape.java new file mode 100644 index 0000000000..72a59b8b60 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPictureShape.java @@ -0,0 +1,37 @@ +package org.apache.poi.sl.draw; + +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.geom.Rectangle2D; +import java.io.IOException; + +import org.apache.poi.sl.usermodel.PictureData; +import org.apache.poi.sl.usermodel.PictureShape; + + +public class DrawPictureShape extends DrawSimpleShape { + public DrawPictureShape(T shape) { + super(shape); + } + + @Override + public void drawContent(Graphics2D graphics) { + PictureData data = shape.getPictureData(); + if(data == null) return; + + ImageRenderer renderer = (ImageRenderer)graphics.getRenderingHint(Drawable.IMAGE_RENDERER); + if (renderer == null) renderer = new ImageRenderer(); + + Rectangle2D anchor = getAnchor(graphics, shape); + + Insets insets = shape.getClipping(); + + try { + renderer.loadImage(data.getData(), data.getContentType()); + renderer.drawImage(graphics, anchor, insets); + } catch (IOException e) { + // TODO: draw specific runtime exception? + throw new RuntimeException(e); + } + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java index f2510a0cc1..6cb60c9b01 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java @@ -22,14 +22,17 @@ public class DrawShape implements Drawable { * @param graphics the graphics whos transform matrix will be modified */ public void applyTransform(Graphics2D graphics) { - Rectangle2D anchor = shape.getAnchor(); + if (!(shape instanceof PlaceableShape)) return; + + PlaceableShape ps = (PlaceableShape)shape; + Rectangle2D anchor = ps.getAnchor(); AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM); if(tx != null) { anchor = tx.createTransformedShape(anchor).getBounds2D(); } // rotation - double rotation = shape.getRotation(); + double rotation = ps.getRotation(); if (rotation != 0.) { // PowerPoint rotates shapes relative to the geometric center double centerX = anchor.getCenterX(); @@ -59,7 +62,7 @@ public class DrawShape implements Drawable { txs.rotate(Math.toRadians(-quadrant*90)); txs.translate(-centerX, -centerY); txg.concatenate(txs); - Rectangle2D anchor2 = txg.createTransformedShape(shape.getAnchor()).getBounds2D(); + Rectangle2D anchor2 = txg.createTransformedShape(ps.getAnchor()).getBounds2D(); scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth(); scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight(); } @@ -73,14 +76,14 @@ public class DrawShape implements Drawable { } //flip horizontal - if (shape.getFlipHorizontal()) { + if (ps.getFlipHorizontal()) { graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY()); graphics.scale(-1, 1); graphics.translate(-anchor.getX(), -anchor.getY()); } //flip vertical - if (shape.getFlipVertical()) { + if (ps.getFlipVertical()) { graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight()); graphics.scale(1, -1); graphics.translate(-anchor.getX(), -anchor.getY()); @@ -93,9 +96,12 @@ public class DrawShape implements Drawable { public void drawContent(Graphics2D context) { } - + public static Rectangle2D getAnchor(Graphics2D graphics, PlaceableShape shape) { - Rectangle2D anchor = shape.getAnchor(); + return getAnchor(graphics, shape.getAnchor()); + } + + public static Rectangle2D getAnchor(Graphics2D graphics, Rectangle2D anchor) { if(graphics == null) { return anchor; } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java new file mode 100644 index 0000000000..238bb1a116 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java @@ -0,0 +1,60 @@ +package org.apache.poi.sl.draw; + +import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; + +import org.apache.poi.sl.usermodel.*; + + +public class DrawShapeGroup> implements Drawable { + + protected final T shape; + + public DrawShapeGroup(T shape) { + this.shape = shape; + } + + public void applyTransform(Graphics2D context) { + } + + public void draw(Graphics2D graphics) { + + // the coordinate system of this group of shape + Rectangle2D interior = shape.getInteriorAnchor(); + // anchor of this group relative to the parent shape + Rectangle2D exterior = shape.getAnchor(); + + AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM); + AffineTransform tx0 = new AffineTransform(tx); + + double scaleX = interior.getWidth() == 0. ? 1.0 : exterior.getWidth() / interior.getWidth(); + double scaleY = interior.getHeight() == 0. ? 1.0 : exterior.getHeight() / interior.getHeight(); + + tx.translate(exterior.getX(), exterior.getY()); + tx.scale(scaleX, scaleY); + tx.translate(-interior.getX(), -interior.getY()); + + DrawFactory drawFact = DrawFactory.getInstance(graphics); + + for (Shape child : shape) { + // remember the initial transform and restore it after we are done with the drawing + AffineTransform at = graphics.getTransform(); + graphics.setRenderingHint(Drawable.GSAVE, true); + + Drawable draw = drawFact.getDrawable(child); + draw.applyTransform(graphics); + draw.draw(graphics); + + // restore the coordinate system + graphics.setTransform(at); + graphics.setRenderingHint(Drawable.GRESTORE, true); + } + + graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, tx0); + + } + + public void drawContent(Graphics2D context) { + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java index 7598d21420..d3901b39b3 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java @@ -3,16 +3,14 @@ package org.apache.poi.sl.draw; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; -import org.apache.poi.sl.usermodel.MasterSheet; -import org.apache.poi.sl.usermodel.Shape; -import org.apache.poi.sl.usermodel.Sheet; +import org.apache.poi.sl.usermodel.*; -public class DrawSheet implements Drawable { +public class DrawSheet> implements Drawable { - protected final Sheet sheet; + protected final T sheet; - public DrawSheet(Sheet sheet) { + public DrawSheet(T sheet) { this.sheet = sheet; } @@ -23,7 +21,7 @@ public class DrawSheet implements Drawable { public void draw(Graphics2D graphics) { DrawFactory drawFact = DrawFactory.getInstance(graphics); - MasterSheet master = sheet.getMasterSheet(); + MasterSheet master = sheet.getMasterSheet(); if(sheet.getFollowMasterGraphics() && master != null) { Drawable drawer = drawFact.getDrawable(master); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java index 5bb6f34c39..c5e5b4244c 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java @@ -17,6 +17,7 @@ import org.apache.poi.sl.draw.binding.CTCustomGeometry2D; import org.apache.poi.sl.draw.geom.*; import org.apache.poi.sl.usermodel.*; import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.util.Units; @@ -257,6 +258,9 @@ public class DrawSimpleShape extends DrawShape { Shadow shadow = shape.getShadow(); if (shadow == null || (fill == null && line == null)) return; + SolidPaint shadowPaint = shadow.getFillStyle(); + Color shadowColor = DrawPaint.applyColorTransform(shadowPaint.getSolidColor()); + double shapeRotation = shape.getRotation(); if(shape.getFlipVertical()) { shapeRotation += 180; @@ -272,12 +276,11 @@ public class DrawSimpleShape extends DrawShape { java.awt.Shape s = o.getOutline(); Path p = o.getPath(); graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s); + graphics.setPaint(shadowColor); if(fill != null && p.isFilled()){ - graphics.setPaint(fill); graphics.fill(s); } else if (line != null && p.isStroked()) { - graphics.setPaint(line); graphics.draw(s); } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java new file mode 100644 index 0000000000..8bc4eaf686 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java @@ -0,0 +1,24 @@ +package org.apache.poi.sl.draw; + +import java.awt.Graphics2D; + +import org.apache.poi.sl.usermodel.*; + + +public class DrawSlide> extends DrawSheet { + + public DrawSlide(T slide) { + super(slide); + } + + public void draw(Graphics2D graphics) { + Background bg = sheet.getBackground(); + if(bg != null) { + DrawFactory drawFact = DrawFactory.getInstance(graphics); + DrawBackground db = drawFact.getDrawable(bg); + db.draw(graphics); + } + + super.draw(graphics); + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java index 42f5316447..3c228686f1 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java @@ -2,7 +2,7 @@ package org.apache.poi.sl.draw; import org.apache.poi.sl.usermodel.*; -public class DrawTextBox extends DrawAutoShape { +public class DrawTextBox>> extends DrawAutoShape { public DrawTextBox(T shape) { super(shape); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java index f116f1b5b2..700edf0eb0 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java @@ -13,8 +13,8 @@ import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle; import org.apache.poi.sl.usermodel.TextRun.TextCap; import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; -public class DrawTextParagraph implements Drawable { - protected TextParagraph paragraph; +public class DrawTextParagraph implements Drawable { + protected TextParagraph paragraph; double x, y; protected Insets2D insets = new Insets2D(0,0,0,0); protected List lines = new ArrayList(); @@ -26,7 +26,7 @@ public class DrawTextParagraph implements Drawable { */ protected double maxLineHeight; - public DrawTextParagraph(TextParagraph paragraph) { + public DrawTextParagraph(TextParagraph paragraph) { this.paragraph = paragraph; } @@ -275,7 +275,7 @@ public class DrawTextParagraph implements Drawable { double indent = paragraph.getIndent(); double width; - TextShape ts = paragraph.getParentShape(); + TextShape> ts = paragraph.getParentShape(); if (!ts.getWordWrap()) { // if wordWrap == false then we return the advance to the right border of the sheet width = ts.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX(); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java index c71c1082d9..cda6a1a88f 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java @@ -8,7 +8,7 @@ import java.util.Iterator; import org.apache.poi.sl.usermodel.*; -public class DrawTextShape extends DrawSimpleShape { +public class DrawTextShape> extends DrawSimpleShape { public DrawTextShape(T shape) { super(shape); @@ -84,7 +84,7 @@ public class DrawTextShape extends DrawSimpleShape { Insets2D shapePadding = shape.getInsets(); double y0 = y; - Iterator paragraphs = shape.iterator(); + Iterator paragraphs = shape.iterator(); boolean isFirstLine = true; while (paragraphs.hasNext()){ @@ -129,12 +129,10 @@ public class DrawTextShape extends DrawSimpleShape { /** * Compute the cumulative height occupied by the text */ - protected double getTextHeight(){ + public double getTextHeight(){ // dry-run in a 1x1 image and return the vertical advance BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = img.createGraphics(); return drawParagraphs(graphics, 0, 0); } - - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java b/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java index 74ac997ab5..9704c2c0a7 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java @@ -23,8 +23,7 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import javax.imageio.ImageIO; @@ -73,6 +72,17 @@ public class ImageRenderer { img = ImageIO.read(data); } + /** + * Load and buffer the image + * + * @param data the raw image stream + * @param contentType the content type + */ + public void loadImage(byte data[], String contentType) throws IOException { + img = ImageIO.read(new ByteArrayInputStream(data)); + } + + /** * @return the buffered image */ diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java index 0e0b1dbbe1..21c3a507fd 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java @@ -17,6 +17,5 @@ package org.apache.poi.sl.usermodel; -public interface AutoShape extends TextShape { - public TextRun getTextRun(); +public interface AutoShape extends TextShape { } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Background.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Background.java index f67c57b95a..8d868b8600 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Background.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Background.java @@ -18,5 +18,5 @@ package org.apache.poi.sl.usermodel; public interface Background extends Shape { - + FillStyle getFillStyle(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java index 4d2ffb67a1..09d61989df 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java @@ -17,6 +17,6 @@ package org.apache.poi.sl.usermodel; -public interface FreeformShape extends AutoShape { +public interface FreeformShape extends AutoShape { } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/GradientPaint.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/GradientPaint.java deleted file mode 100644 index e16b430be3..0000000000 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/GradientPaint.java +++ /dev/null @@ -1,32 +0,0 @@ -/* ==================================================================== - 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.sl.usermodel; - - -public interface GradientPaint extends PaintStyle { - enum GradientType { linear, circular, shape } - - /** - * @return the angle of the gradient - */ - double getGradientAngle(); - ColorStyle[] getGradientColors(); - float[] getGradientFractions(); - boolean isRotatedWithShape(); - GradientType getGradientType(); -} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/MasterSheet.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/MasterSheet.java index 61792cd5bb..8ba80156bd 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/MasterSheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/MasterSheet.java @@ -17,6 +17,6 @@ package org.apache.poi.sl.usermodel; -public interface MasterSheet extends Sheet { +public interface MasterSheet extends Sheet { } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java index 5d5ba98e7e..c16774c298 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java @@ -17,6 +17,6 @@ package org.apache.poi.sl.usermodel; -public interface Notes extends Sheet { +public interface Notes extends Sheet { public TextRun getTextRun(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java index e92e650bbf..9dcd495e40 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java @@ -17,9 +17,42 @@ package org.apache.poi.sl.usermodel; +import java.io.InputStream; + public interface PaintStyle { + public interface SolidPaint extends PaintStyle { + ColorStyle getSolidColor(); + } + public interface GradientPaint extends PaintStyle { + enum GradientType { linear, circular, shape } + + /** + * @return the angle of the gradient + */ + double getGradientAngle(); + ColorStyle[] getGradientColors(); + float[] getGradientFractions(); + boolean isRotatedWithShape(); + GradientType getGradientType(); + } + public interface TexturePaint extends PaintStyle { + /** + * @return the raw image stream + */ + InputStream getImageData(); + + /** + * @return the content type of the image data + */ + String getContentType(); + + /** + * @return the alpha mask in percents [0..100000] + */ + int getAlpha(); + } } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Picture.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Picture.java deleted file mode 100644 index 9a55313963..0000000000 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Picture.java +++ /dev/null @@ -1,22 +0,0 @@ -/* ==================================================================== - 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.sl.usermodel; - -public interface Picture extends SimpleShape { - public PictureData getPictureData(); -} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureData.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureData.java index e325e5a8db..8697d33965 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureData.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureData.java @@ -17,10 +17,11 @@ package org.apache.poi.sl.usermodel; +import java.io.IOException; + public interface PictureData { - public int getType(); - public byte[] getUID(); + public String getContentType(); public byte[] getData(); - public void setData(byte[] data); + public void setData(byte[] data) throws IOException; } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/SolidPaint.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureShape.java similarity index 80% rename from src/scratchpad/src/org/apache/poi/sl/usermodel/SolidPaint.java rename to src/scratchpad/src/org/apache/poi/sl/usermodel/PictureShape.java index dd0225d2d9..970f04353c 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/SolidPaint.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureShape.java @@ -1,23 +1,29 @@ -/* ==================================================================== - 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.sl.usermodel; - - -public interface SolidPaint extends PaintStyle { - ColorStyle getSolidColor(); -} +/* ==================================================================== + 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.sl.usermodel; + +import java.awt.Insets; + +public interface PictureShape extends SimpleShape { + PictureData getPictureData(); + + /** + * @return the clipping rectangle, which is given in percent in relation to the image width/height + */ + Insets getClipping(); +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java index 0535536d73..a265e869d7 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java @@ -20,11 +20,17 @@ package org.apache.poi.sl.usermodel; import java.awt.geom.Rectangle2D; public interface PlaceableShape { + /** + * @return the position of this shape within the drawing canvas. + * The coordinates are expressed in points + */ Rectangle2D getAnchor(); - FillStyle getFillStyle(); - - StrokeStyle getStrokeStyle(); + /** + * @param anchor the position of this shape within the drawing canvas. + * The coordinates are expressed in points + */ + void setAnchor(Rectangle2D anchor); /** * Rotation angle in degrees @@ -36,4 +42,41 @@ public interface PlaceableShape { * @return rotation angle in degrees */ double getRotation(); + + /** + * Rotate this shape. + *

+ * Positive angles are clockwise (i.e., towards the positive y axis); + * negative angles are counter-clockwise (i.e., towards the negative y axis). + *

+ * + * @param theta the rotation angle in degrees. + */ + void setRotation(double theta); + + /** + * @param flip whether the shape is horizontally flipped + */ + void setFlipHorizontal(boolean flip); + + /** + * Whether the shape is vertically flipped + * + * @param flip whether the shape is vertically flipped + */ + void setFlipVertical(boolean flip); + + /** + * Whether the shape is horizontally flipped + * + * @return whether the shape is horizontally flipped + */ + boolean getFlipHorizontal(); + + /** + * Whether the shape is vertically flipped + * + * @return whether the shape is vertically flipped + */ + boolean getFlipVertical(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Shadow.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shadow.java index 589f095542..430dbe3840 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Shadow.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shadow.java @@ -17,10 +17,13 @@ package org.apache.poi.sl.usermodel; -import java.awt.Color; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; + public interface Shadow { + SimpleShape getShadowParent(); + /** * @return the offset of this shadow in points */ @@ -43,5 +46,5 @@ public interface Shadow { * @return the color of this shadow. * Depending whether the parent shape is filled or stroked, this color is used to fill or stroke this shadow */ - Color getColor(); + SolidPaint getFillStyle(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java index 02cab6dbb3..6ad149b489 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java @@ -17,63 +17,16 @@ package org.apache.poi.sl.usermodel; -import java.awt.geom.Rectangle2D; - -import org.apache.poi.sl.draw.geom.CustomGeometry; - -public interface Shape extends PlaceableShape { - CustomGeometry getGeometry(); - - ShapeType getShapeType(); - - void setAnchor(Rectangle2D anchor); +public interface Shape { ShapeContainer getParent(); - boolean isPlaceholder(); - /** * * @return the sheet this shape belongs to */ Sheet getSheet(); - /** - * Rotate this shape. - *

- * Positive angles are clockwise (i.e., towards the positive y axis); - * negative angles are counter-clockwise (i.e., towards the negative y axis). - *

- * - * @param theta the rotation angle in degrees. - */ - void setRotation(double theta); - - /** - * @param flip whether the shape is horizontally flipped - */ - void setFlipHorizontal(boolean flip); - - /** - * Whether the shape is vertically flipped - * - * @param flip whether the shape is vertically flipped - */ - void setFlipVertical(boolean flip); - - /** - * Whether the shape is horizontally flipped - * - * @return whether the shape is horizontally flipped - */ - boolean getFlipHorizontal(); - - /** - * Whether the shape is vertically flipped - * - * @return whether the shape is vertically flipped - */ - boolean getFlipVertical(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java index faee9a1b89..11a5039c66 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java @@ -18,7 +18,7 @@ package org.apache.poi.sl.usermodel; -public interface ShapeContainer extends Iterable, PlaceableShape { +public interface ShapeContainer extends Iterable { /** * Returns an array containing all of the elements in this container in proper * sequence (from first to last element). @@ -26,9 +26,9 @@ public interface ShapeContainer extends Iterable, PlaceableShape { * @return an array containing all of the elements in this container in proper * sequence */ - public Shape[] getShapes(); + public T[] getShapes(); - public void addShape(Shape shape); + public void addShape(T shape); /** * Removes the specified shape from this sheet, if it is present @@ -40,5 +40,5 @@ public interface ShapeContainer extends Iterable, PlaceableShape { * @throws IllegalArgumentException if the type of the specified shape * is incompatible with this sheet (optional) */ - public boolean removeShape(Shape shape); + public boolean removeShape(T shape); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java index 3c2ff6b8cd..8de1dbcb06 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java @@ -17,6 +17,8 @@ package org.apache.poi.sl.usermodel; -public interface ShapeGroup extends ShapeContainer { +import java.awt.geom.Rectangle2D; +public interface ShapeGroup extends ShapeContainer, PlaceableShape { + Rectangle2D getInteriorAnchor(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java index 4da90a6a36..64b53a3014 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java @@ -21,7 +21,7 @@ package org.apache.poi.sl.usermodel; /** * Common parent of Slides, Notes and Masters */ -public interface Sheet extends ShapeContainer { +public interface Sheet extends ShapeContainer { SlideShow getSlideShow(); /** @@ -31,7 +31,7 @@ public interface Sheet extends ShapeContainer { */ boolean getFollowMasterGraphics(); - MasterSheet getMasterSheet(); + MasterSheet getMasterSheet(); Background getBackground(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/SimpleShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/SimpleShape.java index 7de02dbf62..e4e8efe3a1 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/SimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/SimpleShape.java @@ -17,14 +17,20 @@ package org.apache.poi.sl.usermodel; +import org.apache.poi.sl.draw.geom.CustomGeometry; import org.apache.poi.sl.draw.geom.IAdjustableShape; -public interface SimpleShape extends Shape, IAdjustableShape { - StrokeStyle getStrokeStyle(); +public interface SimpleShape extends Shape, IAdjustableShape, PlaceableShape { + FillStyle getFillStyle(); + LineDecoration getLineDecoration(); + StrokeStyle getStrokeStyle(); + + CustomGeometry getGeometry(); + + ShapeType getShapeType(); + + boolean isPlaceholder(); + Shadow getShadow(); - LineDecoration getLineDecoration(); - - Hyperlink getHyperlink(); - void setHyperlink(Hyperlink hyperlink); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java index d3c4af25a4..243d9a8174 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java @@ -17,9 +17,9 @@ package org.apache.poi.sl.usermodel; -public interface Slide extends Sheet { - public Notes getNotes(); - public void setNotes(Notes notes); +public interface Slide extends Sheet { + public Notes getNotes(); + public void setNotes(Notes notes); public boolean getFollowMasterBackground(); public void setFollowMasterBackground(boolean follow); diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextBox.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextBox.java index 5a88815ee7..9ac61d526a 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextBox.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextBox.java @@ -17,5 +17,5 @@ package org.apache.poi.sl.usermodel; -public interface TextBox extends AutoShape { +public interface TextBox extends AutoShape { } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java index e0c0317edb..348cc703d6 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java @@ -20,7 +20,7 @@ package org.apache.poi.sl.usermodel; import java.awt.Color; -public interface TextParagraph extends Iterable { +public interface TextParagraph extends Iterable { /** * Specified a list of text alignment types */ @@ -128,5 +128,5 @@ public interface TextParagraph extends Iterable { */ BulletStyle getBulletStyle(); - TextShape getParentShape(); + TextShape> getParentShape(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java index 68fff47937..f9b1833610 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java @@ -19,7 +19,7 @@ package org.apache.poi.sl.usermodel; -public interface TextShape extends SimpleShape, Iterable { +public interface TextShape> extends SimpleShape, Iterable { /** * Vertical Text Types */ diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TexturePaint.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TexturePaint.java deleted file mode 100644 index 135b69b263..0000000000 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TexturePaint.java +++ /dev/null @@ -1,37 +0,0 @@ -/* ==================================================================== - 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.sl.usermodel; - -import java.io.InputStream; - -public interface TexturePaint extends PaintStyle { - /** - * @return the raw image stream - */ - InputStream getImageData(); - - /** - * @return the content type of the image data - */ - String getContentType(); - - /** - * @return the alpha mask in percents [0..100000] - */ - int getAlpha(); -} diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java index 29bd16f8b7..8838561501 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java @@ -60,7 +60,7 @@ public final class TestBackground { assertTrue(slide.getFollowMasterBackground()); assertEquals(Fill.FILL_SOLID, slide.getBackground().getFill().getFillType()); - Shape shape = new AutoShape(ShapeType.RECT); + HSLFShape shape = new AutoShape(ShapeType.RECT); assertEquals(Fill.FILL_SOLID, shape.getFill().getFillType()); } @@ -71,7 +71,7 @@ public final class TestBackground { public void readBackground() throws Exception { SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("backgrounds.ppt")); Fill fill; - Shape shape; + HSLFShape shape; Slide[] slide = ppt.getSlides(); @@ -104,7 +104,7 @@ public final class TestBackground { SlideShow ppt = new SlideShow(); Slide slide; Fill fill; - Shape shape; + HSLFShape shape; int idx; //slide 1 @@ -202,9 +202,9 @@ public final class TestBackground { } - private int getFillPictureRefCount(Shape shape, Fill fill) { + private int getFillPictureRefCount(HSLFShape shape, Fill fill) { EscherOptRecord opt = shape.getEscherOptRecord(); - EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); + EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); if(p != null) { int idx = p.getPropertyValue(); @@ -212,7 +212,7 @@ public final class TestBackground { SlideShow ppt = sheet.getSlideShow(); Document doc = ppt.getDocumentRecord(); EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer(); - EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); + EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); List lst = bstore.getChildRecords(); return ((EscherBSERecord)lst.get(idx-1)).getRef(); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java index 8ecb14f7ad..249c4ee964 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java @@ -64,7 +64,7 @@ public final class TestOleEmbedding extends TestCase { SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("ole2-embedding-2003.ppt")); Slide slide = ppt.getSlides()[0]; - Shape[] sh = slide.getShapes(); + HSLFShape[] sh = slide.getShapes(); int cnt = 0; for (int i = 0; i < sh.length; i++) { if(sh[i] instanceof OLEShape){ diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java index b89383c302..b58dbadecf 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java @@ -49,7 +49,7 @@ public final class TestPPGraphics2D extends TestCase { assertEquals(1, ppt.getSlides().length); // Add some stuff into it - ShapeGroup group = new ShapeGroup(); + HSLFGroupShape group = new HSLFGroupShape(); Dimension pgsize = ppt.getPageSize(); java.awt.Rectangle bounds = new java.awt.Rectangle(0, 0, (int)pgsize.getWidth(), (int)pgsize.getHeight()); group.setAnchor(bounds); @@ -77,12 +77,12 @@ public final class TestPPGraphics2D extends TestCase { assertEquals(1, ppt.getSlides().length); slide = ppt.getSlides()[0]; - Shape[] shape = slide.getShapes(); + HSLFShape[] shape = slide.getShapes(); assertEquals(shape.length, 1); //group shape - assertTrue(shape[0] instanceof ShapeGroup); //group shape + assertTrue(shape[0] instanceof HSLFGroupShape); //group shape - group = (ShapeGroup)shape[0]; + group = (HSLFGroupShape)shape[0]; shape = group.getShapes(); assertEquals(shape.length, 3); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java index 10ff88da6b..700b758a1e 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java @@ -101,7 +101,7 @@ public final class TestShapes { assertEquals(1, ppt.getSlides().length); slide = ppt.getSlides()[0]; - Shape[] shape = slide.getShapes(); + HSLFShape[] shape = slide.getShapes(); assertEquals(2, shape.length); assertTrue(shape[0] instanceof Line); //group shape @@ -119,7 +119,7 @@ public final class TestShapes { public void textBoxRead() throws Exception { ppt = new SlideShow(_slTests.openResourceAsStream("with_textbox.ppt")); Slide sl = ppt.getSlides()[0]; - Shape[] sh = sl.getShapes(); + HSLFShape[] sh = sl.getShapes(); for (int i = 0; i < sh.length; i++) { assertTrue(sh[i] instanceof TextBox); TextBox txtbox = (TextBox)sh[i]; @@ -241,7 +241,7 @@ public final class TestShapes { } ArrayList lst2 = new ArrayList(); - Shape[] sh = sl[k].getShapes(); + HSLFShape[] sh = sl[k].getShapes(); for (int i = 0; i < sh.length; i++) { if (sh[i] instanceof TextShape){ TextShape tbox = (TextShape)sh[i]; @@ -263,7 +263,7 @@ public final class TestShapes { Slide slide = ppt.createSlide(); Dimension pgsize = ppt.getPageSize(); - ShapeGroup group = new ShapeGroup(); + HSLFGroupShape group = new HSLFGroupShape(); group.setAnchor(new Rectangle(0, 0, (int)pgsize.getWidth(), (int)pgsize.getHeight())); slide.addShape(group); @@ -288,12 +288,12 @@ public final class TestShapes { slide = ppt.getSlides()[0]; - Shape[] shape = slide.getShapes(); + HSLFShape[] shape = slide.getShapes(); assertEquals(1, shape.length); - assertTrue(shape[0] instanceof ShapeGroup); + assertTrue(shape[0] instanceof HSLFGroupShape); - group = (ShapeGroup)shape[0]; - Shape[] grshape = group.getShapes(); + group = (HSLFGroupShape)shape[0]; + HSLFShape[] grshape = group.getShapes(); assertEquals(2, grshape.length); assertTrue(grshape[0] instanceof Picture); assertTrue(grshape[1] instanceof Line); @@ -313,7 +313,7 @@ public final class TestShapes { String file = "with_textbox.ppt"; SlideShow ppt = new SlideShow(_slTests.openResourceAsStream(file)); Slide sl = ppt.getSlides()[0]; - Shape[] sh = sl.getShapes(); + HSLFShape[] sh = sl.getShapes(); assertEquals("expected four shaped in " + file, 4, sh.length); //remove all for (int i = 0; i < sh.length; i++) { @@ -352,7 +352,7 @@ public final class TestShapes { public void shapeId() { SlideShow ppt = new SlideShow(); Slide slide = ppt.createSlide(); - Shape shape = null; + HSLFShape shape = null; //EscherDgg is a document-level record which keeps track of the drawing groups EscherDggRecord dgg = ppt.getDocumentRecord().getPPDrawingGroup().getEscherDggRecord(); @@ -401,7 +401,7 @@ public final class TestShapes { @Test public void lineColor() throws IOException { SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("51731.ppt")); - Shape[] shape = ppt.getSlides()[0].getShapes(); + HSLFShape[] shape = ppt.getSlides()[0].getShapes(); assertEquals(4, shape.length); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java index 4bed9ee186..a22e7eb3f9 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java @@ -87,7 +87,7 @@ public final class TestSheet extends TestCase { assertNotNull(txt[i].getSheet()); } - Shape[] shape = sheet.getShapes(); + HSLFShape[] shape = sheet.getShapes(); if (shape == null) { throw new AssertionFailedError("no shapes"); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java index e8f246bbd6..480fd8ab65 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java @@ -70,7 +70,7 @@ public final class TestTable extends TestCase { public void test45889(){ SlideShow ppt = new SlideShow(); Slide slide = ppt.createSlide(); - Shape[] shapes; + HSLFShape[] shapes; Table tbl1 = new Table(1, 5); assertEquals(5, tbl1.getNumberOfColumns()); assertEquals(1, tbl1.getNumberOfRows()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java index a82e551994..1b0119307a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java @@ -477,7 +477,7 @@ public final class TestTextRun extends TestCase { assertSame(run2, runs[1]); //as getShapes() - Shape[] sh = slide.getShapes(); + HSLFShape[] sh = slide.getShapes(); assertEquals(2, sh.length); assertTrue(sh[0] instanceof TextBox); TextBox box1 = (TextBox)sh[0]; @@ -498,7 +498,7 @@ public final class TestTextRun extends TestCase { public void test48916() throws IOException { SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("SampleShow.ppt")); for(Slide slide : ppt.getSlides()){ - for(Shape sh : slide.getShapes()){ + for(HSLFShape sh : slide.getShapes()){ if(sh instanceof TextShape){ TextShape tx = (TextShape)sh; TextRun run = tx.getTextRun(); @@ -519,7 +519,7 @@ public final class TestTextRun extends TestCase { ppt.write(out); ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); for(Slide slide : ppt.getSlides()){ - for(Shape sh : slide.getShapes()){ + for(HSLFShape sh : slide.getShapes()){ if(sh instanceof TextShape){ TextShape tx = (TextShape)sh; TextRun run = tx.getTextRun(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java index 928f1e4508..542d608d8e 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java @@ -89,7 +89,7 @@ public final class TestTextShape { List lst1 = new ArrayList(); Slide slide = ppt.getSlides()[0]; - Shape[] shape = slide.getShapes(); + HSLFShape[] shape = slide.getShapes(); for (int i = 0; i < shape.length; i++) { assertTrue("Expected TextShape but found " + shape[i].getClass().getName(), shape[i] instanceof TextShape); TextShape tx = (TextShape)shape[i]; @@ -157,7 +157,7 @@ public final class TestTextShape { ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); slide = ppt.getSlides()[0]; - Shape[] shape = slide.getShapes(); + HSLFShape[] shape = slide.getShapes(); assertTrue(shape[0] instanceof TextShape); shape1 = (TextShape)shape[0]; @@ -177,7 +177,7 @@ public final class TestTextShape { Slide slide = ppt.getSlides()[0]; Map map = new HashMap(); - Shape[] shape = slide.getShapes(); + HSLFShape[] shape = slide.getShapes(); for (int i = 0; i < shape.length; i++) { if(shape[i] instanceof TextShape){ TextShape tx = (TextShape)shape[i]; @@ -188,28 +188,28 @@ public final class TestTextShape { TextShape tx; tx = map.get("TEST1"); - assertEquals(0.1, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.1, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.39, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getMarginLeft()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getMarginRight()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.39, tx.getMarginTop()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getMarginBottom()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); tx = map.get("TEST2"); - assertEquals(0.1, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.1, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.39, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getMarginLeft()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getMarginRight()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getMarginTop()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.39, tx.getMarginBottom()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); tx = map.get("TEST3"); - assertEquals(0.39, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.1, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); + assertEquals(0.39, tx.getMarginLeft()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getMarginRight()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getMarginTop()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getMarginBottom()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); tx = map.get("TEST4"); - assertEquals(0.1, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.39, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getMarginLeft()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.39, tx.getMarginRight()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getMarginTop()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getMarginBottom()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); } @Test @@ -217,7 +217,7 @@ public final class TestTextShape { SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("52599.ppt")); Slide slide = ppt.getSlides()[0]; - Shape[] sh = slide.getShapes(); + HSLFShape[] sh = slide.getShapes(); assertEquals(3, sh.length); TextShape sh0 = (TextShape)sh[0]; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java index 6a2f3229c3..b834792d5f 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java @@ -51,8 +51,8 @@ import org.apache.poi.hslf.model.HeadersFooters; import org.apache.poi.hslf.model.MasterSheet; import org.apache.poi.hslf.model.Notes; import org.apache.poi.hslf.model.Picture; -import org.apache.poi.hslf.model.Shape; -import org.apache.poi.hslf.model.ShapeGroup; +import org.apache.poi.hslf.model.HSLFShape; +import org.apache.poi.hslf.model.HSLFGroupShape; import org.apache.poi.hslf.model.Slide; import org.apache.poi.hslf.model.SlideMaster; import org.apache.poi.hslf.model.TextBox; @@ -165,11 +165,11 @@ public final class TestBugs { HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42485.ppt")); SlideShow ppt = new SlideShow(hslf); - Shape[] shape = ppt.getSlides()[0].getShapes(); + HSLFShape[] shape = ppt.getSlides()[0].getShapes(); for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof ShapeGroup){ - ShapeGroup group = (ShapeGroup)shape[i]; - Shape[] sh = group.getShapes(); + if(shape[i] instanceof HSLFGroupShape){ + HSLFGroupShape group = (HSLFGroupShape)shape[i]; + HSLFShape[] sh = group.getShapes(); for (int j = 0; j < sh.length; j++) { if( sh[j] instanceof TextBox){ TextBox txt = (TextBox)sh[j]; @@ -188,12 +188,12 @@ public final class TestBugs { HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42485.ppt")); SlideShow ppt = new SlideShow(hslf); - Shape[] shape = ppt.getSlides()[0].getShapes(); + HSLFShape[] shape = ppt.getSlides()[0].getShapes(); for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof ShapeGroup){ - ShapeGroup group = (ShapeGroup)shape[i]; + if(shape[i] instanceof HSLFGroupShape){ + HSLFGroupShape group = (HSLFGroupShape)shape[i]; assertNotNull(group.getAnchor()); - Shape[] sh = group.getShapes(); + HSLFShape[] sh = group.getShapes(); for (int j = 0; j < sh.length; j++) { assertNotNull(sh[j].getAnchor()); } @@ -233,7 +233,7 @@ public final class TestBugs { Slide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { @SuppressWarnings("unused") - Shape[] shape = slide[i].getShapes(); + HSLFShape[] shape = slide[i].getShapes(); } assertTrue("No Exceptions while reading file", true); @@ -250,12 +250,12 @@ public final class TestBugs { //walk down the tree and see if there were no errors while reading Slide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { - Shape[] shape = slide[i].getShapes(); + HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { assertNotNull(shape[j].getShapeName()); - if (shape[j] instanceof ShapeGroup){ - ShapeGroup group = (ShapeGroup)shape[j]; - Shape[] comps = group.getShapes(); + if (shape[j] instanceof HSLFGroupShape){ + HSLFGroupShape group = (HSLFGroupShape)shape[j]; + HSLFShape[] comps = group.getShapes(); for (int k = 0; k < comps.length; k++) { assertNotNull(comps[k].getShapeName()); } @@ -277,20 +277,20 @@ public final class TestBugs { SlideShow ppt = new SlideShow(hslf); //test case from the bug report - ShapeGroup shapeGroup = (ShapeGroup)ppt.getSlides()[11].getShapes()[10]; + HSLFGroupShape shapeGroup = (HSLFGroupShape)ppt.getSlides()[11].getShapes()[10]; Picture picture = (Picture)shapeGroup.getShapes()[0]; picture.getPictureData(); //walk down the tree and see if there were no errors while reading Slide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { - Shape[] shape = slide[i].getShapes(); + HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { - if (shape[j] instanceof ShapeGroup){ - ShapeGroup group = (ShapeGroup)shape[j]; - Shape[] comps = group.getShapes(); + if (shape[j] instanceof HSLFGroupShape){ + HSLFGroupShape group = (HSLFGroupShape)shape[j]; + HSLFShape[] comps = group.getShapes(); for (int k = 0; k < comps.length; k++) { - Shape comp = comps[k]; + HSLFShape comp = comps[k]; if (comp instanceof Picture){ @SuppressWarnings("unused") PictureData pict = ((Picture)comp).getPictureData(); @@ -355,7 +355,7 @@ public final class TestBugs { // Check the shape based text runs List lst = new ArrayList(); - Shape[] shape = slide.getShapes(); + HSLFShape[] shape = slide.getShapes(); for (int i = 0; i < shape.length; i++) { if( shape[i] instanceof TextShape){ TextRun textRun = ((TextShape)shape[i]).getTextRun(); @@ -413,7 +413,7 @@ public final class TestBugs { SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("41071.ppt")); Slide slide = ppt.getSlides()[0]; - Shape[] sh = slide.getShapes(); + HSLFShape[] sh = slide.getShapes(); assertEquals(1, sh.length); assertTrue(sh[0] instanceof TextShape); TextShape tx = (TextShape)sh[0]; @@ -492,7 +492,7 @@ public final class TestBugs { // get slides for (Slide slide : ppt.getSlides()) { - for (Shape shape : slide.getShapes()) { + for (HSLFShape shape : slide.getShapes()) { if (!(shape instanceof TextBox)) continue; TextBox tb = (TextBox) shape; // work with TextBox @@ -595,7 +595,7 @@ public final class TestBugs { try { SlideShow slideShow = new SlideShow(inputStream); Slide slide = slideShow.getSlides()[0]; - ShapeGroup sg = (ShapeGroup)slide.getShapes()[0]; + HSLFGroupShape sg = (HSLFGroupShape)slide.getShapes()[0]; TextBox tb = (TextBox)sg.getShapes()[0]; String text = StringUtil.mapMsCodepointString(tb.getText()); assertEquals("\u226575 years", text); @@ -640,7 +640,7 @@ public final class TestBugs { SlideShow slideShow = new SlideShow(inputStream); AutoShape as = (AutoShape)slideShow.getSlides()[0].getShapes()[0]; EscherOptRecord opt = as.getEscherOptRecord(); - EscherArrayProperty ep = Shape.getEscherProperty(opt, EscherProperties.FILL__SHADECOLORS); + EscherArrayProperty ep = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__SHADECOLORS); double exp[][] = { // r, g, b, position { 94, 158, 255, 0 }, diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java index 45d0390a74..ff25f34aa1 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java @@ -34,7 +34,7 @@ import org.apache.poi.hslf.blip.PICT; import org.apache.poi.hslf.blip.PNG; import org.apache.poi.hslf.blip.WMF; import org.apache.poi.hslf.model.Picture; -import org.apache.poi.hslf.model.Shape; +import org.apache.poi.hslf.model.HSLFShape; import org.apache.poi.hslf.model.Slide; /** @@ -68,7 +68,7 @@ public final class TestPictures extends TestCase{ ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); //make sure we can read this picture shape and it refers to the correct picture data - Shape[] sh = ppt.getSlides()[0].getShapes(); + HSLFShape[] sh = ppt.getSlides()[0].getShapes(); assertEquals(1, sh.length); pict = (Picture)sh[0]; assertEquals(idx, pict.getPictureIndex()); @@ -113,7 +113,7 @@ public final class TestPictures extends TestCase{ ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); //make sure we can read this picture shape and it refers to the correct picture data - Shape[] sh = ppt.getSlides()[0].getShapes(); + HSLFShape[] sh = ppt.getSlides()[0].getShapes(); assertEquals(1, sh.length); pict = (Picture)sh[0]; assertEquals(idx, pict.getPictureIndex()); @@ -159,7 +159,7 @@ public final class TestPictures extends TestCase{ ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); //make sure we can get this picture shape and it refers to the correct picture data - Shape[] sh = ppt.getSlides()[0].getShapes(); + HSLFShape[] sh = ppt.getSlides()[0].getShapes(); assertEquals(1, sh.length); pict = (Picture)sh[0]; assertEquals(idx, pict.getPictureIndex()); @@ -198,7 +198,7 @@ public final class TestPictures extends TestCase{ ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); //make sure we can read this picture shape and it refers to the correct picture data - Shape[] sh = ppt.getSlides()[0].getShapes(); + HSLFShape[] sh = ppt.getSlides()[0].getShapes(); assertEquals(1, sh.length); pict = (Picture)sh[0]; assertEquals(idx, pict.getPictureIndex()); @@ -238,7 +238,7 @@ public final class TestPictures extends TestCase{ ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); //make sure we can read this picture shape and it refers to the correct picture data - Shape[] sh = ppt.getSlides()[0].getShapes(); + HSLFShape[] sh = ppt.getSlides()[0].getShapes(); assertEquals(1, sh.length); pict = (Picture)sh[0]; assertEquals(idx, pict.getPictureIndex()); @@ -277,7 +277,7 @@ public final class TestPictures extends TestCase{ ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); //make sure we can read this picture shape and it refers to the correct picture data - Shape[] sh = ppt.getSlides()[0].getShapes(); + HSLFShape[] sh = ppt.getSlides()[0].getShapes(); assertEquals(1, sh.length); pict = (Picture)sh[0]; assertEquals(idx, pict.getPictureIndex()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java index 0851ff4be1..24d5d6f554 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java @@ -21,7 +21,7 @@ package org.apache.poi.hslf.usermodel; import junit.framework.TestCase; -import org.apache.poi.hslf.model.Shape; +import org.apache.poi.hslf.model.HSLFShape; import org.apache.poi.hslf.model.Slide; import org.apache.poi.hslf.model.Table; import org.apache.poi.hslf.model.TextRun; @@ -58,7 +58,7 @@ public final class TestTable extends TestCase { assertEquals("Dummy text", textRuns[1].getRawText()); - final Shape[] shapes = s.getShapes(); + final HSLFShape[] shapes = s.getShapes(); assertNotNull(shapes); assertEquals(3, shapes.length); assertTrue(shapes[2] instanceof Table); From 9a85a2e76bc5317617119f8644c7c6303a0e97dd Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Thu, 19 Mar 2015 23:44:23 +0000 Subject: [PATCH 04/22] Snapshot commit - still lots of errors, xslf rendering works, started work on hslf git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1667902 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hslf/examples/ApacheconEU08.java | 192 +-- .../apache/poi/hslf/examples/BulletsDemo.java | 16 +- .../poi/hslf/examples/CreateHyperlink.java | 14 +- .../poi/hslf/examples/DataExtraction.java | 26 +- .../poi/hslf/examples/Graphics2DDemo.java | 6 +- .../poi/hslf/examples/HeadersFootersDemo.java | 8 +- .../apache/poi/hslf/examples/Hyperlinks.java | 12 +- .../org/apache/poi/hslf/examples/PPT2PNG.java | 4 +- .../apache/poi/hslf/examples/SoundFinder.java | 6 +- .../apache/poi/hslf/examples/TableDemo.java | 22 +- .../usermodel/examples/EmeddedObjects.java | 6 +- .../poi/xslf/usermodel/DataExtraction.java | 1 - .../apache/poi/xslf/usermodel/Tutorial4.java | 4 +- .../usermodel/examples/EmbeddedObjects.java | 4 +- .../apache/poi/stress/HSLFFileHandler.java | 4 +- .../poi/xslf/usermodel/XSLFGroupShape.java | 16 +- .../apache/poi/xslf/usermodel/XSLFNotes.java | 23 +- .../poi/xslf/usermodel/XSLFNotesMaster.java | 4 +- .../poi/xslf/usermodel/XSLFPictureShape.java | 18 +- .../apache/poi/xslf/usermodel/XSLFShadow.java | 4 +- .../apache/poi/xslf/usermodel/XSLFShape.java | 37 +- .../apache/poi/xslf/usermodel/XSLFSheet.java | 39 +- .../poi/xslf/usermodel/XSLFSimpleShape.java | 63 +- .../apache/poi/xslf/usermodel/XSLFSlide.java | 4 +- .../poi/xslf/usermodel/XSLFSlideLayout.java | 2 +- .../poi/xslf/usermodel/XSLFSlideMaster.java | 4 +- .../poi/xslf/usermodel/TestXSLFAutoShape.java | 7 +- .../usermodel/TestXSLFConnectorShape.java | 81 +- .../xslf/usermodel/TestXSLFSimpleShape.java | 12 +- .../poi/xslf/usermodel/TestXSLFTable.java | 10 +- .../xslf/usermodel/TestXSLFTextParagraph.java | 168 +- .../poi/xslf/usermodel/TestXSLFTextShape.java | 11 +- .../{ => geom}/presetShapeDefinitions.xml | 0 .../src/org/apache/poi/hslf/blip/Bitmap.java | 4 +- .../apache/poi/hslf/blip/BitmapPainter.java | 6 +- .../src/org/apache/poi/hslf/blip/DIB.java | 10 +- .../src/org/apache/poi/hslf/blip/EMF.java | 8 +- .../apache/poi/hslf/blip/ImagePainter.java | 6 +- .../src/org/apache/poi/hslf/blip/JPEG.java | 10 +- .../org/apache/poi/hslf/blip/Metafile.java | 4 +- .../src/org/apache/poi/hslf/blip/PICT.java | 10 +- .../src/org/apache/poi/hslf/blip/PNG.java | 16 +- .../src/org/apache/poi/hslf/blip/WMF.java | 9 +- .../poi/hslf/dev/PPDrawingTextListing.java | 3 +- .../org/apache/poi/hslf/dev/SLWTListing.java | 4 +- .../apache/poi/hslf/dev/SLWTTextListing.java | 3 +- .../hslf/dev/SlideAndNotesAtomListing.java | 3 +- .../apache/poi/hslf/dev/SlideIdListing.java | 8 +- .../poi/hslf/dev/SlideShowRecordDumper.java | 7 +- .../apache/poi/hslf/dev/TextStyleListing.java | 3 +- .../hslf/dev/UserEditAndPersistListing.java | 4 +- .../poi/hslf/extractor/ImageExtractor.java | 26 +- .../hslf/extractor/PowerPointExtractor.java | 33 +- .../QuickButCruddyTextExtractor.java | 8 +- .../apache/poi/hslf/model/ActiveXShape.java | 6 +- .../org/apache/poi/hslf/model/Background.java | 81 - .../{AutoShape.java => HSLFAutoShape.java} | 23 +- .../apache/poi/hslf/model/HSLFBackground.java | 38 + .../hslf/model/{Fill.java => HSLFFill.java} | 77 +- .../{Freeform.java => HSLFFreeformShape.java} | 8 +- .../apache/poi/hslf/model/HSLFGroupShape.java | 2 +- ...{MasterSheet.java => HSLFMasterSheet.java} | 10 +- .../hslf/model/{Notes.java => HSLFNotes.java} | 65 +- .../{Picture.java => HSLFPictureShape.java} | 26 +- .../org/apache/poi/hslf/model/HSLFShape.java | 57 +- .../hslf/model/{Sheet.java => HSLFSheet.java} | 109 +- ...{SimpleShape.java => HSLFSimpleShape.java} | 72 +- .../hslf/model/{Slide.java => HSLFSlide.java} | 70 +- .../HSLFSlideShowEncrypted.java} | 10 +- .../HSLFSlideShowImpl.java} | 62 +- .../model/{TextBox.java => HSLFTextBox.java} | 12 +- .../{TextRun.java => HSLFTextParagraph.java} | 1490 ++++++++--------- .../{TextShape.java => HSLFTextShape.java} | 78 +- .../apache/poi/hslf/model/HeadersFooters.java | 18 +- .../org/apache/poi/hslf/model/Hyperlink.java | 10 +- .../src/org/apache/poi/hslf/model/Line.java | 69 +- .../org/apache/poi/hslf/model/MovieShape.java | 8 +- .../org/apache/poi/hslf/model/OLEShape.java | 16 +- .../apache/poi/hslf/model/PPGraphics2D.java | 23 +- .../apache/poi/hslf/model/Placeholder.java | 2 +- .../org/apache/poi/hslf/model/Polygon.java | 2 +- .../apache/poi/hslf/model/ShapeFactory.java | 10 +- .../apache/poi/hslf/model/ShapePainter.java | 2 +- .../apache/poi/hslf/model/SlideMaster.java | 20 +- .../src/org/apache/poi/hslf/model/Table.java | 8 +- .../org/apache/poi/hslf/model/TableCell.java | 2 +- .../apache/poi/hslf/model/TextPainter.java | 32 +- .../apache/poi/hslf/model/TitleMaster.java | 10 +- .../{ObjectData.java => HSLFObjectData.java} | 4 +- ...{PictureData.java => HSLFPictureData.java} | 36 +- .../{SlideShow.java => HSLFSlideShow.java} | 91 +- .../{SoundData.java => HSLFSoundData.java} | 12 +- .../{RichTextRun.java => HSLFTextRun.java} | 77 +- .../org/apache/poi/sl/draw/DrawAutoShape.java | 2 +- .../org/apache/poi/sl/draw/DrawFactory.java | 14 +- .../apache/poi/sl/draw/DrawMasterSheet.java | 2 +- .../src/org/apache/poi/sl/draw/DrawPaint.java | 26 +- .../apache/poi/sl/draw/DrawShapeGroup.java | 12 +- .../src/org/apache/poi/sl/draw/DrawSheet.java | 14 +- .../apache/poi/sl/draw/DrawSimpleShape.java | 15 +- .../src/org/apache/poi/sl/draw/DrawSlide.java | 2 +- .../apache/poi/sl/draw/DrawTextFragment.java | 10 +- .../org/apache/poi/sl/draw/DrawTextShape.java | 10 +- .../poi/sl/draw/geom/PresetGeometries.java | 4 +- .../apache/poi/sl/usermodel/AutoShape.java | 2 +- .../poi/sl/usermodel/FreeformShape.java | 2 +- .../apache/poi/sl/usermodel/MasterSheet.java | 2 +- .../org/apache/poi/sl/usermodel/Notes.java | 6 +- .../apache/poi/sl/usermodel/PaintStyle.java | 5 + .../org/apache/poi/sl/usermodel/Shape.java | 7 +- .../apache/poi/sl/usermodel/ShapeGroup.java | 2 +- .../org/apache/poi/sl/usermodel/Sheet.java | 6 +- .../org/apache/poi/sl/usermodel/Slide.java | 6 +- .../apache/poi/sl/usermodel/SlideShow.java | 8 +- .../apache/poi/sl/usermodel/StrokeStyle.java | 78 +- .../org/apache/poi/sl/usermodel/TextBox.java | 2 +- .../apache/poi/sl/usermodel/TextShape.java | 2 +- .../apache/poi/TestPOIDocumentScratchpad.java | 5 +- .../apache/poi/hslf/HSLFTestDataSamples.java | 11 +- .../apache/poi/hslf/TestEncryptedFile.java | 9 +- .../org/apache/poi/hslf/TestReWrite.java | 23 +- .../apache/poi/hslf/TestReWriteSanity.java | 9 +- .../org/apache/poi/hslf/TestRecordCounts.java | 6 +- .../poi/hslf/extractor/TestExtractor.java | 28 +- .../apache/poi/hslf/model/TestBackground.java | 101 +- .../apache/poi/hslf/model/TestFreeform.java | 8 +- .../poi/hslf/model/TestHeadersFooters.java | 22 +- .../apache/poi/hslf/model/TestHyperlink.java | 8 +- .../poi/hslf/model/TestImagePainter.java | 16 +- .../org/apache/poi/hslf/model/TestLine.java | 6 +- .../apache/poi/hslf/model/TestMovieShape.java | 10 +- .../poi/hslf/model/TestOleEmbedding.java | 31 +- .../org/apache/poi/hslf/model/TestPPFont.java | 4 +- .../poi/hslf/model/TestPPGraphics2D.java | 13 +- .../apache/poi/hslf/model/TestPicture.java | 39 +- .../poi/hslf/model/TestSetBoldItalic.java | 24 +- .../org/apache/poi/hslf/model/TestShapes.java | 107 +- .../org/apache/poi/hslf/model/TestSheet.java | 18 +- .../poi/hslf/model/TestSlideChangeNotes.java | 15 +- .../poi/hslf/model/TestSlideMaster.java | 49 +- .../org/apache/poi/hslf/model/TestSlides.java | 38 +- .../org/apache/poi/hslf/model/TestTable.java | 14 +- .../apache/poi/hslf/model/TestTextRun.java | 160 +- .../poi/hslf/model/TestTextRunReWrite.java | 22 +- .../apache/poi/hslf/model/TestTextShape.java | 82 +- .../poi/hslf/model/TextPainterTest.java | 14 +- .../poi/hslf/record/TestCurrentUserAtom.java | 4 +- .../apache/poi/hslf/record/TestDocument.java | 6 +- .../hslf/record/TestDocumentEncryption.java | 34 +- .../poi/hslf/record/TestExHyperlink.java | 8 +- .../apache/poi/hslf/record/TestExObjList.java | 8 +- .../poi/hslf/record/TestRecordContainer.java | 4 +- .../apache/poi/hslf/record/TestSlideAtom.java | 8 +- .../org/apache/poi/hslf/record/TestSound.java | 4 +- .../hslf/record/TestTxMasterStyleAtom.java | 6 +- .../poi/hslf/usermodel/TestAddingSlides.java | 69 +- .../apache/poi/hslf/usermodel/TestBugs.java | 201 +-- .../apache/poi/hslf/usermodel/TestCounts.java | 11 +- .../poi/hslf/usermodel/TestFontRendering.java | 6 +- .../hslf/usermodel/TestMostRecentRecords.java | 10 +- .../poi/hslf/usermodel/TestNotesText.java | 11 +- .../poi/hslf/usermodel/TestNumberedList.java | 20 +- .../poi/hslf/usermodel/TestNumberedList2.java | 20 +- .../poi/hslf/usermodel/TestNumberedList3.java | 16 +- .../poi/hslf/usermodel/TestPictures.java | 201 ++- .../hslf/usermodel/TestReOrderingSlides.java | 73 +- .../poi/hslf/usermodel/TestRecordSetup.java | 10 +- .../poi/hslf/usermodel/TestRichTextRun.java | 179 +- .../poi/hslf/usermodel/TestSheetText.java | 17 +- .../poi/hslf/usermodel/TestSlideOrdering.java | 27 +- .../poi/hslf/usermodel/TestSoundData.java | 4 +- .../apache/poi/hslf/usermodel/TestTable.java | 16 +- 172 files changed, 2973 insertions(+), 2892 deletions(-) rename src/resources/scratchpad/org/apache/poi/sl/draw/{ => geom}/presetShapeDefinitions.xml (100%) delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/Background.java rename src/scratchpad/src/org/apache/poi/hslf/model/{AutoShape.java => HSLFAutoShape.java} (86%) create mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/HSLFBackground.java rename src/scratchpad/src/org/apache/poi/hslf/model/{Fill.java => HSLFFill.java} (75%) rename src/scratchpad/src/org/apache/poi/hslf/model/{Freeform.java => HSLFFreeformShape.java} (97%) rename src/scratchpad/src/org/apache/poi/hslf/model/{MasterSheet.java => HSLFMasterSheet.java} (83%) rename src/scratchpad/src/org/apache/poi/hslf/model/{Notes.java => HSLFNotes.java} (50%) rename src/scratchpad/src/org/apache/poi/hslf/model/{Picture.java => HSLFPictureShape.java} (93%) rename src/scratchpad/src/org/apache/poi/hslf/model/{Sheet.java => HSLFSheet.java} (84%) rename src/scratchpad/src/org/apache/poi/hslf/model/{SimpleShape.java => HSLFSimpleShape.java} (89%) rename src/scratchpad/src/org/apache/poi/hslf/model/{Slide.java => HSLFSlide.java} (88%) rename src/scratchpad/src/org/apache/poi/hslf/{EncryptedSlideShow.java => model/HSLFSlideShowEncrypted.java} (98%) rename src/scratchpad/src/org/apache/poi/hslf/{HSLFSlideShow.java => model/HSLFSlideShowImpl.java} (93%) rename src/scratchpad/src/org/apache/poi/hslf/model/{TextBox.java => HSLFTextBox.java} (89%) rename src/scratchpad/src/org/apache/poi/hslf/model/{TextRun.java => HSLFTextParagraph.java} (90%) rename src/scratchpad/src/org/apache/poi/hslf/model/{TextShape.java => HSLFTextShape.java} (90%) rename src/scratchpad/src/org/apache/poi/hslf/usermodel/{ObjectData.java => HSLFObjectData.java} (96%) rename src/scratchpad/src/org/apache/poi/hslf/usermodel/{PictureData.java => HSLFPictureData.java} (88%) rename src/scratchpad/src/org/apache/poi/hslf/usermodel/{SlideShow.java => HSLFSlideShow.java} (94%) rename src/scratchpad/src/org/apache/poi/hslf/usermodel/{SoundData.java => HSLFSoundData.java} (89%) rename src/scratchpad/src/org/apache/poi/hslf/usermodel/{RichTextRun.java => HSLFTextRun.java} (90%) diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java index 7d013237ff..7a4b20c187 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java +++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java @@ -34,7 +34,7 @@ import java.awt.*; public final class ApacheconEU08 { public static void main(String[] args) throws IOException { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); ppt.setPageSize(new Dimension(720, 540)); slide1(ppt); @@ -56,27 +56,27 @@ public final class ApacheconEU08 { } - public static void slide1(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide1(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box1 = new TextBox(); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE); tr1.setText("POI-HSLF"); box1.setAnchor(new Rectangle(54, 78, 612, 115)); slide.addShape(box1); - TextBox box2 = new TextBox(); - TextRun tr2 = box2.getTextRun(); + HSLFTextBox box2 = new HSLFTextBox(); + HSLFTextParagraph tr2 = box2.getTextParagraph(); tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE); tr2.setText("Java API To Access Microsoft PowerPoint Format Files"); box2.setAnchor(new Rectangle(108, 204, 504, 138)); slide.addShape(box2); - TextBox box3 = new TextBox(); - TextRun tr3 = box3.getTextRun(); + HSLFTextBox box3 = new HSLFTextBox(); + HSLFTextParagraph tr3 = box3.getTextParagraph(); tr3.getRichTextRuns()[0].setFontSize(32); - box3.setHorizontalAlignment(TextBox.AlignCenter); + box3.setHorizontalAlignment(HSLFTextBox.AlignCenter); tr3.setText( "Yegor Kozlov\r" + "yegor - apache - org"); @@ -84,18 +84,18 @@ public final class ApacheconEU08 { slide.addShape(box3); } - public static void slide2(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide2(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box1 = new TextBox(); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("What is HSLF?"); box1.setAnchor(new Rectangle(36, 21, 648, 90)); slide.addShape(box1); - TextBox box2 = new TextBox(); - TextRun tr2 = box2.getTextRun(); + HSLFTextBox box2 = new HSLFTextBox(); + HSLFTextParagraph tr2 = box2.getTextParagraph(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); tr2.setText("HorribleSLideshowFormat is the POI Project's pure Java implementation " + "of the Powerpoint binary file format. \r" + @@ -107,18 +107,18 @@ public final class ApacheconEU08 { } - public static void slide3(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide3(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box1 = new TextBox(); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF in a Nutshell"); box1.setAnchor(new Rectangle(36, 15, 648, 65)); slide.addShape(box1); - TextBox box2 = new TextBox(); - TextRun tr2 = box2.getTextRun(); + HSLFTextBox box2 = new HSLFTextBox(); + HSLFTextParagraph tr2 = box2.getTextParagraph(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); tr2.setText( "HSLF provides a way to read, create and modify MS PowerPoint presentations\r" + @@ -128,8 +128,8 @@ public final class ApacheconEU08 { box2.setAnchor(new Rectangle(36, 80, 648, 200)); slide.addShape(box2); - TextBox box3 = new TextBox(); - TextRun tr3 = box3.getTextRun(); + HSLFTextBox box3 = new HSLFTextBox(); + HSLFTextParagraph tr3 = box3.getTextParagraph(); tr3.setRunType(TextHeaderAtom.BODY_TYPE); tr3.setText( "Rich text\r" + @@ -142,16 +142,16 @@ public final class ApacheconEU08 { box3.setAnchor(new Rectangle(36, 265, 648, 150)); slide.addShape(box3); - TextBox box4 = new TextBox(); - TextRun tr4 = box4.getTextRun(); + HSLFTextBox box4 = new HSLFTextBox(); + HSLFTextParagraph tr4 = box4.getTextParagraph(); tr4.setRunType(TextHeaderAtom.BODY_TYPE); tr4.setText("Access to low level data structures"); box4.setAnchor(new Rectangle(36, 430, 648, 50)); slide.addShape(box4); } - public static void slide4(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide4(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); String[][] txt1 = { {"Note"}, @@ -162,8 +162,8 @@ public final class ApacheconEU08 { for (int j = 0; j < txt1[i].length; j++) { TableCell cell = table1.getCell(i, j); cell.setText(txt1[i][j]); - cell.getTextRun().getRichTextRuns()[0].setFontSize(10); - RichTextRun rt = cell.getTextRun().getRichTextRuns()[0]; + cell.getTextParagraph().getRichTextRuns()[0].setFontSize(10); + HSLFTextRun rt = cell.getTextParagraph().getRichTextRuns()[0]; rt.setFontName("Arial"); rt.setBold(true); if(i == 0){ @@ -174,7 +174,7 @@ public final class ApacheconEU08 { rt.setFontSize(28); cell.getFill().setForegroundColor(new Color(235, 239, 241)); } - cell.setVerticalAlignment(TextBox.AnchorMiddle); + cell.setVerticalAlignment(HSLFTextBox.AnchorMiddle); } } @@ -195,30 +195,30 @@ public final class ApacheconEU08 { table1.moveTo(100, 100); - TextBox box1 = new TextBox(); - box1.setHorizontalAlignment(TextBox.AlignCenter); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + box1.setHorizontalAlignment(HSLFTextBox.AlignCenter); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setText("The source code is available at\r" + "http://people.apache.org/~yegor/apachecon_eu08/"); - RichTextRun rt = tr1.getRichTextRuns()[0]; + HSLFTextRun rt = tr1.getRichTextRuns()[0]; rt.setFontSize(24); box1.setAnchor(new Rectangle(80, 356, 553, 65)); slide.addShape(box1); } - public static void slide5(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide5(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box1 = new TextBox(); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF in Action - 1\rData Extraction"); box1.setAnchor(new Rectangle(36, 21, 648, 100)); slide.addShape(box1); - TextBox box2 = new TextBox(); - TextRun tr2 = box2.getTextRun(); + HSLFTextBox box2 = new HSLFTextBox(); + HSLFTextParagraph tr2 = box2.getTextParagraph(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); tr2.setText( "Text from slides and notes\r" + @@ -230,26 +230,26 @@ public final class ApacheconEU08 { } - public static void slide6(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide6(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box1 = new TextBox(); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF in Action - 2"); box1.setAnchor(new Rectangle(36, 20, 648, 90)); slide.addShape(box1); - TextBox box2 = new TextBox(); - TextRun tr2 = box2.getTextRun(); + HSLFTextBox box2 = new HSLFTextBox(); + HSLFTextParagraph tr2 = box2.getTextParagraph(); tr2.getRichTextRuns()[0].setFontSize(18); tr2.setText("Creating a simple presentation from scratch"); box2.setAnchor(new Rectangle(170, 100, 364, 30)); slide.addShape(box2); - TextBox box3 = new TextBox(); - TextRun tr3 = box3.getTextRun(); - RichTextRun rt3 = tr3.getRichTextRuns()[0]; + HSLFTextBox box3 = new HSLFTextBox(); + HSLFTextParagraph tr3 = box3.getTextParagraph(); + HSLFTextRun rt3 = tr3.getRichTextRuns()[0]; rt3.setFontName("Courier New"); rt3.setFontSize(8); tr3.setText( @@ -290,30 +290,30 @@ public final class ApacheconEU08 { slide.addShape(box3); } - public static void slide7(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide7(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box2 = new TextBox(); - box2.setHorizontalAlignment(TextBox.AlignCenter); - box2.setVerticalAlignment(TextBox.AnchorMiddle); - box2.getTextRun().setText("Java Code"); + HSLFTextBox box2 = new HSLFTextBox(); + box2.setHorizontalAlignment(HSLFTextBox.AlignCenter); + box2.setVerticalAlignment(HSLFTextBox.AnchorMiddle); + box2.getTextParagraph().setText("Java Code"); box2.getFill().setForegroundColor(new Color(187, 224, 227)); box2.setLineColor(Color.black); box2.setLineWidth(0.75); box2.setAnchor(new Rectangle(66, 243, 170, 170)); slide.addShape(box2); - TextBox box3 = new TextBox(); - box3.setHorizontalAlignment(TextBox.AlignCenter); - box3.setVerticalAlignment(TextBox.AnchorMiddle); - box3.getTextRun().setText("*.ppt file"); + HSLFTextBox box3 = new HSLFTextBox(); + box3.setHorizontalAlignment(HSLFTextBox.AlignCenter); + box3.setVerticalAlignment(HSLFTextBox.AnchorMiddle); + box3.getTextParagraph().setText("*.ppt file"); box3.setLineWidth(0.75); box3.setLineColor(Color.black); box3.getFill().setForegroundColor(new Color(187, 224, 227)); box3.setAnchor(new Rectangle(473, 243, 170, 170)); slide.addShape(box3); - AutoShape box4 = new AutoShape(ShapeType.RIGHT_ARROW); + HSLFAutoShape box4 = new HSLFAutoShape(ShapeType.RIGHT_ARROW); box4.getFill().setForegroundColor(new Color(187, 224, 227)); box4.setLineWidth(0.75); box4.setLineColor(Color.black); @@ -321,18 +321,18 @@ public final class ApacheconEU08 { slide.addShape(box4); } - public static void slide8(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide8(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box1 = new TextBox(); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("Wait, there is more!"); box1.setAnchor(new Rectangle(36, 21, 648, 90)); slide.addShape(box1); - TextBox box2 = new TextBox(); - TextRun tr2 = box2.getTextRun(); + HSLFTextBox box2 = new HSLFTextBox(); + HSLFTextParagraph tr2 = box2.getTextParagraph(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); tr2.setText( "Rich text\r" + @@ -343,26 +343,26 @@ public final class ApacheconEU08 { slide.addShape(box2); } - public static void slide9(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide9(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box1 = new TextBox(); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF in Action - 3"); box1.setAnchor(new Rectangle(36, 20, 648, 50)); slide.addShape(box1); - TextBox box2 = new TextBox(); - TextRun tr2 = box2.getTextRun(); + HSLFTextBox box2 = new HSLFTextBox(); + HSLFTextParagraph tr2 = box2.getTextParagraph(); tr2.getRichTextRuns()[0].setFontSize(18); tr2.setText("PPGraphics2D: PowerPoint Graphics2D driver"); box2.setAnchor(new Rectangle(178, 70, 387, 30)); slide.addShape(box2); - TextBox box3 = new TextBox(); - TextRun tr3 = box3.getTextRun(); - RichTextRun rt3 = tr3.getRichTextRuns()[0]; + HSLFTextBox box3 = new HSLFTextBox(); + HSLFTextParagraph tr3 = box3.getTextParagraph(); + HSLFTextRun rt3 = tr3.getRichTextRuns()[0]; rt3.setFontName("Courier New"); rt3.setFontSize(8); tr3.setText( @@ -408,7 +408,7 @@ public final class ApacheconEU08 { slide.addShape(box3); } - public static void slide10(SlideShow ppt) throws IOException { + public static void slide10(HSLFSlideShow ppt) throws IOException { //bar chart data. The first value is the bar color, the second is the width Object[] def = new Object[]{ Color.yellow, new Integer(100), @@ -417,7 +417,7 @@ public final class ApacheconEU08 { Color.red, new Integer(200), }; - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); HSLFGroupShape group = new HSLFGroupShape(); //define position of the drawing in the slide @@ -445,18 +445,18 @@ public final class ApacheconEU08 { } - public static void slide11(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide11(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box1 = new TextBox(); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF Development Plans"); box1.setAnchor(new Rectangle(36, 21, 648, 90)); slide.addShape(box1); - TextBox box2 = new TextBox(); - TextRun tr2 = box2.getTextRun(); + HSLFTextBox box2 = new HSLFTextBox(); + HSLFTextParagraph tr2 = box2.getTextParagraph(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); tr2.getRichTextRuns()[0].setFontSize(32); tr2.setText( @@ -465,8 +465,8 @@ public final class ApacheconEU08 { box2.setAnchor(new Rectangle(36, 126, 648, 100)); slide.addShape(box2); - TextBox box3 = new TextBox(); - TextRun tr3 = box3.getTextRun(); + HSLFTextBox box3 = new HSLFTextBox(); + HSLFTextParagraph tr3 = box3.getTextParagraph(); tr3.setRunType(TextHeaderAtom.BODY_TYPE); tr3.getRichTextRuns()[0].setIndentLevel(1); tr3.setText( @@ -474,8 +474,8 @@ public final class ApacheconEU08 { box3.setAnchor(new Rectangle(36, 220, 648, 70)); slide.addShape(box3); - TextBox box4 = new TextBox(); - TextRun tr4 = box4.getTextRun(); + HSLFTextBox box4 = new HSLFTextBox(); + HSLFTextParagraph tr4 = box4.getTextParagraph(); tr4.setRunType(TextHeaderAtom.BODY_TYPE); tr4.getRichTextRuns()[0].setFontSize(32); tr4.setText( @@ -483,8 +483,8 @@ public final class ApacheconEU08 { box4.setAnchor(new Rectangle(36, 290, 648, 90)); slide.addShape(box4); - TextBox box5 = new TextBox(); - TextRun tr5 = box5.getTextRun(); + HSLFTextBox box5 = new HSLFTextBox(); + HSLFTextParagraph tr5 = box5.getTextParagraph(); tr5.setRunType(TextHeaderAtom.BODY_TYPE); tr5.getRichTextRuns()[0].setIndentLevel(1); tr5.setText( @@ -494,18 +494,18 @@ public final class ApacheconEU08 { slide.addShape(box5); } - public static void slide12(SlideShow ppt) throws IOException { - Slide slide = ppt.createSlide(); + public static void slide12(HSLFSlideShow ppt) throws IOException { + HSLFSlide slide = ppt.createSlide(); - TextBox box1 = new TextBox(); - TextRun tr1 = box1.getTextRun(); + HSLFTextBox box1 = new HSLFTextBox(); + HSLFTextParagraph tr1 = box1.getTextParagraph(); tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE); tr1.setText("Questions?"); box1.setAnchor(new Rectangle(54, 167, 612, 115)); slide.addShape(box1); - TextBox box2 = new TextBox(); - TextRun tr2 = box2.getTextRun(); + HSLFTextBox box2 = new HSLFTextBox(); + HSLFTextParagraph tr2 = box2.getTextParagraph(); tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE); tr2.setText( "http://poi.apache.org/hslf/\r" + diff --git a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java index 3a97b61aa0..ed6dd1231d 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java @@ -17,10 +17,10 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.hslf.usermodel.RichTextRun; -import org.apache.poi.hslf.model.Slide; -import org.apache.poi.hslf.model.TextBox; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFTextRun; +import org.apache.poi.hslf.model.HSLFSlide; +import org.apache.poi.hslf.model.HSLFTextBox; import java.io.FileOutputStream; @@ -34,12 +34,12 @@ public final class BulletsDemo { public static void main(String[] args) throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); - TextBox shape = new TextBox(); - RichTextRun rt = shape.getTextRun().getRichTextRuns()[0]; + HSLFTextBox shape = new HSLFTextBox(); + HSLFTextRun rt = shape.getTextParagraph().getRichTextRuns()[0]; shape.setText( "January\r" + "February\r" + diff --git a/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java b/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java index 0aa8db32de..99c5d7d31f 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java +++ b/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hslf.model.*; import java.io.FileOutputStream; @@ -31,14 +31,14 @@ import java.awt.*; public final class CreateHyperlink { public static void main(String[] args) throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - Slide slideA = ppt.createSlide(); - Slide slideB = ppt.createSlide(); - Slide slideC = ppt.createSlide(); + HSLFSlide slideA = ppt.createSlide(); + HSLFSlide slideB = ppt.createSlide(); + HSLFSlide slideC = ppt.createSlide(); // link to a URL - TextBox textBox1 = new TextBox(); + HSLFTextBox textBox1 = new HSLFTextBox(); textBox1.setText("Apache POI"); textBox1.setAnchor(new Rectangle(100, 100, 200, 50)); @@ -54,7 +54,7 @@ public final class CreateHyperlink { slideA.addShape(textBox1); // link to another slide - TextBox textBox2 = new TextBox(); + HSLFTextBox textBox2 = new HSLFTextBox(); textBox2.setText("Go to slide #3"); textBox2.setAnchor(new Rectangle(100, 300, 200, 50)); diff --git a/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java b/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java index e0f58741e1..d4028d7c67 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java +++ b/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java @@ -41,11 +41,11 @@ public final class DataExtraction { } FileInputStream is = new FileInputStream(args[0]); - SlideShow ppt = new SlideShow(is); + HSLFSlideShow ppt = new HSLFSlideShow(is); is.close(); //extract all sound files embedded in this presentation - SoundData[] sound = ppt.getSoundData(); + HSLFSoundData[] sound = ppt.getSoundData(); for (int i = 0; i < sound.length; i++) { String type = sound[i].getSoundType(); //*.wav String name = sound[i].getSoundName(); //typically file name @@ -58,13 +58,13 @@ public final class DataExtraction { } //extract embedded OLE documents - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { if (shape[j] instanceof OLEShape) { OLEShape ole = (OLEShape) shape[j]; - ObjectData data = ole.getObjectData(); + HSLFObjectData data = ole.getObjectData(); String name = ole.getInstanceName(); if ("Worksheet".equals(name)) { @@ -104,29 +104,29 @@ public final class DataExtraction { for (int i = 0; i < slide.length; i++) { HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { - if (shape[j] instanceof Picture) { - Picture p = (Picture) shape[j]; - PictureData data = p.getPictureData(); + if (shape[j] instanceof HSLFPictureShape) { + HSLFPictureShape p = (HSLFPictureShape) shape[j]; + HSLFPictureData data = p.getPictureData(); String name = p.getPictureName(); int type = data.getType(); String ext; switch (type) { - case Picture.JPEG: + case HSLFPictureShape.JPEG: ext = ".jpg"; break; - case Picture.PNG: + case HSLFPictureShape.PNG: ext = ".png"; break; - case Picture.WMF: + case HSLFPictureShape.WMF: ext = ".wmf"; break; - case Picture.EMF: + case HSLFPictureShape.EMF: ext = ".emf"; break; - case Picture.PICT: + case HSLFPictureShape.PICT: ext = ".pict"; break; - case Picture.DIB: + case HSLFPictureShape.DIB: ext = ".dib"; break; default: diff --git a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java index a2f14ac41b..4e678ba64d 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hslf.model.*; import java.awt.*; @@ -34,7 +34,7 @@ public final class Graphics2DDemo { * A simple bar chart demo */ public static void main(String[] args) throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); //bar chart data. The first value is the bar color, the second is the width Object[] def = new Object[]{ @@ -44,7 +44,7 @@ public final class Graphics2DDemo { Color.red, new Integer(80), }; - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); HSLFGroupShape group = new HSLFGroupShape(); //define position of the drawing in the slide diff --git a/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java b/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java index 3ebcecc90f..068d675347 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java @@ -16,9 +16,9 @@ ==================================================================== */ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hslf.model.HeadersFooters; -import org.apache.poi.hslf.model.Slide; +import org.apache.poi.hslf.model.HSLFSlide; import java.io.FileOutputStream; @@ -29,7 +29,7 @@ import java.io.FileOutputStream; */ public class HeadersFootersDemo { public static void main(String[] args) throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); HeadersFooters slideHeaders = ppt.getSlideHeadersFooters(); slideHeaders.setFootersText("Created by POI-HSLF"); @@ -40,7 +40,7 @@ public class HeadersFootersDemo { notesHeaders.setFootersText("My notes footers"); notesHeaders.setHeaderText("My notes header"); - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); FileOutputStream out = new FileOutputStream("headers_footers.ppt"); ppt.write(out); diff --git a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java index a90b6a1df0..89dcb636af 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java +++ b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java @@ -17,9 +17,9 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.hslf.model.Slide; -import org.apache.poi.hslf.model.TextRun; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlide; +import org.apache.poi.hslf.model.HSLFTextParagraph; import org.apache.poi.hslf.model.Hyperlink; import org.apache.poi.hslf.model.HSLFShape; @@ -35,16 +35,16 @@ public final class Hyperlinks { public static void main(String[] args) throws Exception { for (int i = 0; i < args.length; i++) { FileInputStream is = new FileInputStream(args[i]); - SlideShow ppt = new SlideShow(is); + HSLFSlideShow ppt = new HSLFSlideShow(is); is.close(); - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); for (int j = 0; j < slide.length; j++) { System.out.println("slide " + slide[j].getSlideNumber()); //read hyperlinks from the slide's text runs System.out.println("reading hyperlinks from the text runs"); - TextRun[] txt = slide[j].getTextRuns(); + HSLFTextParagraph[] txt = slide[j].getTextRuns(); for (int k = 0; k < txt.length; k++) { String text = txt[k].getText(); Hyperlink[] links = txt[k].getHyperlinks(); diff --git a/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java b/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java index 99037d3264..373f942844 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java +++ b/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java @@ -62,14 +62,14 @@ public final class PPT2PNG { } FileInputStream is = new FileInputStream(file); - SlideShow ppt = new SlideShow(is); + HSLFSlideShow ppt = new HSLFSlideShow(is); is.close(); Dimension pgsize = ppt.getPageSize(); int width = (int)(pgsize.width*scale); int height = (int)(pgsize.height*scale); - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { if (slidenum != -1 && slidenum != (i+1)) continue; diff --git a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java index 571c86a425..765ba3ef49 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java +++ b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java @@ -32,10 +32,10 @@ import java.util.List; */ public class SoundFinder { public static void main(String[] args) throws Exception { - SlideShow ppt = new SlideShow(new FileInputStream(args[0])); - SoundData[] sounds = ppt.getSoundData(); + HSLFSlideShow ppt = new HSLFSlideShow(new FileInputStream(args[0])); + HSLFSoundData[] sounds = ppt.getSoundData(); - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { diff --git a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java index 44935c05ac..5dd1edea06 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java @@ -17,8 +17,8 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.hslf.usermodel.RichTextRun; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFTextRun; import org.apache.poi.hslf.model.*; import java.awt.*; @@ -43,9 +43,9 @@ public final class TableDemo { {"Total PO History Spend", "$10,172,038"} }; - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); //six rows, two columns Table table1 = new Table(6, 2); @@ -53,7 +53,7 @@ public final class TableDemo { for (int j = 0; j < txt1[i].length; j++) { TableCell cell = table1.getCell(i, j); cell.setText(txt1[i][j]); - RichTextRun rt = cell.getTextRun().getRichTextRuns()[0]; + HSLFTextRun rt = cell.getTextParagraph().getRichTextRuns()[0]; rt.setFontName("Arial"); rt.setFontSize(10); if(i == 0){ @@ -61,8 +61,8 @@ public final class TableDemo { } else { rt.setBold(true); } - cell.setVerticalAlignment(TextBox.AnchorMiddle); - cell.setHorizontalAlignment(TextBox.AlignCenter); + cell.setVerticalAlignment(HSLFTextBox.AnchorMiddle); + cell.setHorizontalAlignment(HSLFTextBox.AlignCenter); } } @@ -92,7 +92,7 @@ public final class TableDemo { for (int j = 0; j < txt2[i].length; j++) { TableCell cell = table2.getCell(i, j); cell.setText(txt2[i][j]); - RichTextRun rt = cell.getTextRun().getRichTextRuns()[0]; + HSLFTextRun rt = cell.getTextParagraph().getRichTextRuns()[0]; rt.setFontSize(10); rt.setFontName("Arial"); if(i == 0){ @@ -100,13 +100,13 @@ public final class TableDemo { rt.setFontColor(Color.white); rt.setBold(true); rt.setFontSize(14); - cell.setHorizontalAlignment(TextBox.AlignCenter); + cell.setHorizontalAlignment(HSLFTextBox.AlignCenter); } else { rt.setBullet(true); rt.setFontSize(12); - cell.setHorizontalAlignment(TextBox.AlignLeft); + cell.setHorizontalAlignment(HSLFTextBox.AlignLeft); } - cell.setVerticalAlignment(TextBox.AnchorMiddle); + cell.setVerticalAlignment(HSLFTextBox.AnchorMiddle); } } table2.setColumnWidth(0, 300); diff --git a/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java b/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java index bb6f19d0a5..caf96a84c8 100644 --- a/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java +++ b/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java @@ -21,8 +21,8 @@ import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.Entry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.hwpf.HWPFDocument; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import java.io.FileInputStream; import java.util.Iterator; @@ -47,7 +47,7 @@ public class EmeddedObjects { //System.out.println(entry.getName() + ": " + embeddedWordDocument.getRange().text()); } else if (oleName.equals("Presentation")) { DirectoryNode dn = (DirectoryNode) obj.getDirectory(); - SlideShow embeddedPowerPointDocument = new SlideShow(new HSLFSlideShow(dn)); + HSLFSlideShow embeddedPowerPointDocument = new HSLFSlideShow(new HSLFSlideShowImpl(dn)); //System.out.println(entry.getName() + ": " + embeddedPowerPointDocument.getSlides().length); } else { if(obj.hasDirectoryEntry()){ diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/DataExtraction.java b/src/examples/src/org/apache/poi/xslf/usermodel/DataExtraction.java index b7e08fc6f1..5437b5dea4 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/DataExtraction.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/DataExtraction.java @@ -76,7 +76,6 @@ public final class DataExtraction { Dimension pageSize = ppt.getPageSize(); // size of the canvas in points for(XSLFSlide slide : ppt.getSlides()) { for(XSLFShape shape : slide){ - Rectangle2D anchor = shape.getAnchor(); // position on the canvas if(shape instanceof XSLFTextShape) { XSLFTextShape txShape = (XSLFTextShape)shape; System.out.println(txShape.getText()); diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial4.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial4.java index 2e810e1d45..926bc0d4bf 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial4.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial4.java @@ -19,12 +19,12 @@ package org.apache.poi.xslf.usermodel; -import java.awt.*; +import java.awt.Color; import java.awt.geom.Rectangle2D; import java.io.FileOutputStream; import java.io.IOException; -import org.apache.poi.sl.usermodel.TextAlign; +import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; /** * PPTX Tables diff --git a/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java b/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java index b50e959460..ea3a5b28e1 100644 --- a/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java +++ b/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java @@ -20,7 +20,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.xslf.XSLFSlideShow; import org.apache.poi.hssf.usermodel.HSSFWorkbook; @@ -54,7 +54,7 @@ public class EmbeddedObjects { } // PowerPoint Document - binary file format else if (contentType.equals("application/vnd.ms-powerpoint")) { - HSLFSlideShow slideShow = new HSLFSlideShow(pPart.getInputStream()); + HSLFSlideShowImpl slideShow = new HSLFSlideShowImpl(pPart.getInputStream()); } // PowerPoint Document - OpenXML file format else if (contentType.equals("application/vnd.openxmlformats-officedocument.presentationml.presentation")) { diff --git a/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java b/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java index 51e54f6eb2..6b2ee5f09e 100644 --- a/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java +++ b/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java @@ -22,14 +22,14 @@ import static org.junit.Assert.assertTrue; import java.io.FileInputStream; import java.io.InputStream; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.Record; import org.junit.Test; public class HSLFFileHandler extends POIFSFileHandler { @Override public void handleFile(InputStream stream) throws Exception { - HSLFSlideShow slide = new HSLFSlideShow(stream); + HSLFSlideShowImpl slide = new HSLFSlideShowImpl(stream); assertNotNull(slide.getCurrentUserAtom()); assertNotNull(slide.getEmbeddedObjects()); assertNotNull(slide.getUnderlyingBytes()); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java index 57e96f8ee5..9a58a5128a 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java @@ -19,25 +19,19 @@ package org.apache.poi.xslf.usermodel; -import java.awt.Graphics2D; -import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; -import org.apache.poi.openxml4j.opc.PackagePart; -import org.apache.poi.openxml4j.opc.PackageRelationship; -import org.apache.poi.openxml4j.opc.TargetMode; -import org.apache.poi.sl.usermodel.*; +import org.apache.poi.openxml4j.opc.*; +import org.apache.poi.sl.usermodel.PlaceableShape; +import org.apache.poi.sl.usermodel.ShapeGroup; import org.apache.poi.util.Beta; import org.apache.poi.util.Units; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.*; -import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector; -import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; -import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual; -import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; +import org.openxmlformats.schemas.presentationml.x2006.main.*; /** * Represents a group shape that consists of many shapes grouped together. @@ -45,7 +39,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; * @author Yegor Kozlov */ @Beta -public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, PlaceableShape { +public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, ShapeGroup { private final List _shapes; private final CTGroupShapeProperties _grpSpPr; private XSLFDrawing _drawing; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java index 62f9cc4ad6..a953e2013e 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java @@ -17,20 +17,19 @@ package org.apache.poi.xslf.usermodel; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.sl.usermodel.Notes; -import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; -import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData; -import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesSlide; -import org.openxmlformats.schemas.presentationml.x2006.main.NotesDocument; +import org.openxmlformats.schemas.presentationml.x2006.main.*; @Beta -public final class XSLFNotes extends XSLFSheet implements Notes { +public final class XSLFNotes extends XSLFSheet implements Notes { private CTNotesSlide _notes; /** @@ -91,19 +90,15 @@ public final class XSLFNotes extends XSLFSheet implements Notes { return null; } - public TextRun getTextRun() { + @Override + public List getTextParagraphs() { + List tp = new ArrayList(); for (XSLFShape sh : super.getShapes()) { if (sh instanceof XSLFTextShape) { XSLFTextShape txt = (XSLFTextShape)sh; - for (XSLFTextParagraph p : txt.getTextParagraphs()) { - for (XSLFTextRun r : p.getTextRuns()) { - return r; - } - } + tp.addAll(txt.getTextParagraphs()); } } - return null; + return tp; } - - } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java index c5de537677..aeea5cc521 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java @@ -47,7 +47,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument; * @author Yegor Kozlov */ @Beta - public class XSLFNotesMaster extends XSLFSheet implements MasterSheet { + public class XSLFNotesMaster extends XSLFSheet implements MasterSheet { private CTNotesMaster _slide; private XSLFTheme _theme; @@ -94,7 +94,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument; } @Override - public MasterSheet getMasterSheet() { + public MasterSheet getMasterSheet() { return null; } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java index d0f75e0535..b815e00d42 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java @@ -19,7 +19,6 @@ package org.apache.poi.xslf.usermodel; -import java.awt.Graphics2D; import java.awt.Insets; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; @@ -32,27 +31,18 @@ import javax.xml.namespace.QName; import org.apache.poi.POIXMLException; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.usermodel.PictureShape; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip; -import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; -import org.openxmlformats.schemas.drawingml.x2006.main.CTOfficeArtExtension; -import org.openxmlformats.schemas.drawingml.x2006.main.CTOfficeArtExtensionList; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D; -import org.openxmlformats.schemas.drawingml.x2006.main.CTRelativeRect; -import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType; -import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps; -import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture; -import org.openxmlformats.schemas.presentationml.x2006.main.CTPictureNonVisual; +import org.openxmlformats.schemas.drawingml.x2006.main.*; +import org.openxmlformats.schemas.presentationml.x2006.main.*; /** * Represents a picture shape */ @Beta -public class XSLFPictureShape extends XSLFSimpleShape { +public class XSLFPictureShape extends XSLFSimpleShape implements PictureShape { private XSLFPictureData _data; /*package*/ XSLFPictureShape(CTPicture shape, XSLFSheet sheet) { diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java index 9004a6be5f..0b0e4f0aad 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java @@ -88,7 +88,7 @@ public class XSLFShadow extends XSLFShape implements Shadow { */ public Color getFillColor() { SolidPaint ps = getFillStyle(); - if (ps == TRANSPARENT_PAINT) return null; + if (ps == PaintStyle.TRANSPARENT_PAINT) return null; Color col = DrawPaint.applyColorTransform(ps.getSolidColor()); return col; } @@ -97,7 +97,7 @@ public class XSLFShadow extends XSLFShape implements Shadow { public SolidPaint getFillStyle() { XSLFTheme theme = getSheet().getTheme(); CTOuterShadowEffect ct = (CTOuterShadowEffect)getXmlObject(); - if(ct == null) return TRANSPARENT_PAINT; + if(ct == null) return PaintStyle.TRANSPARENT_PAINT; CTSchemeColor phClr = ct.getSchemeClr(); final XSLFColor xc = new XSLFColor(ct, theme, phClr); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java index 5634838302..0f2ba25834 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java @@ -19,7 +19,6 @@ package org.apache.poi.xslf.usermodel; -import java.awt.Color; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; @@ -28,7 +27,6 @@ import java.util.Comparator; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; -import org.apache.poi.sl.draw.DrawPaint; import org.apache.poi.sl.usermodel.*; import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint; import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; @@ -56,19 +54,6 @@ public abstract class XSLFShape implements Shape { private CTNonVisualDrawingProps _nvPr; private CTPlaceholder _ph; - protected static final SolidPaint TRANSPARENT_PAINT = new SolidPaint() { - public ColorStyle getSolidColor() { - return new ColorStyle(){ - public Color getColor() { return DrawPaint.NO_PAINT; } - public int getAlpha() { return -1; } - public int getLumOff() { return -1; } - public int getLumMod() { return -1; } - public int getShade() { return -1; } - public int getTint() { return -1; } - }; - } - }; - protected XSLFShape(XmlObject shape, XSLFSheet sheet) { _shape = shape; _sheet = sheet; @@ -146,7 +131,7 @@ public abstract class XSLFShape implements Shape { try { pr = shape.getSpPr(); if (((CTShapeProperties)pr).isSetNoFill()) { - setValue(TRANSPARENT_PAINT); + setValue(PaintStyle.TRANSPARENT_PAINT); return true; } } catch (IllegalStateException e) {} @@ -158,7 +143,7 @@ public abstract class XSLFShape implements Shape { pr = shape.getGrpSpPr(); } if (pr == null) { - setValue(TRANSPARENT_PAINT); + setValue(PaintStyle.TRANSPARENT_PAINT); return true; } @@ -190,7 +175,7 @@ public abstract class XSLFShape implements Shape { fillRef = getBgRef(); } if (fillRef == null) { - return TRANSPARENT_PAINT; + return PaintStyle.TRANSPARENT_PAINT; } // The idx attribute refers to the index of a fill style or @@ -213,21 +198,21 @@ public abstract class XSLFShape implements Shape { paint = selectPaint(fillProps, phClr, sheet.getPackagePart()); } - return paint == null ? TRANSPARENT_PAINT : paint; + return paint == null ? PaintStyle.TRANSPARENT_PAINT : paint; } protected CTBackgroundProperties getBgPr() { - String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:bgPr"; + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:bgPr"; return selectProperty(CTBackgroundProperties.class, xquery); } protected CTStyleMatrixReference getBgRef() { - String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:bgRef"; + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:bgRef"; return selectProperty(CTStyleMatrixReference.class, xquery); } protected CTGroupShapeProperties getGrpSpPr() { - String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:grpSpPr"; + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:grpSpPr"; return selectProperty(CTGroupShapeProperties.class, xquery); } @@ -241,7 +226,7 @@ public abstract class XSLFShape implements Shape { protected CTShapeProperties getSpPr() { if (_spPr == null) { - String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:spPr"; + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:spPr"; _spPr = selectProperty(CTShapeProperties.class, xquery); } if (_spPr == null) { @@ -252,7 +237,7 @@ public abstract class XSLFShape implements Shape { protected CTShapeStyle getSpStyle() { if (_spStyle == null) { - String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:style"; + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:style"; _spStyle = selectProperty(CTShapeStyle.class, xquery); } return _spStyle; @@ -348,7 +333,7 @@ public abstract class XSLFShape implements Shape { paint = selectPaint(obj, phClr, pp); if(paint != null) break; } - return paint == null ? TRANSPARENT_PAINT : paint; + return paint == null ? PaintStyle.TRANSPARENT_PAINT : paint; } /** @@ -373,7 +358,7 @@ public abstract class XSLFShape implements Shape { */ protected PaintStyle selectPaint(XmlObject obj, final CTSchemeColor phClr, final PackagePart parentPart) { if (obj instanceof CTNoFillProperties) { - return TRANSPARENT_PAINT; + return PaintStyle.TRANSPARENT_PAINT; } else if (obj instanceof CTSolidColorFillProperties) { return selectPaint((CTSolidColorFillProperties)obj, phClr, parentPart); } else if (obj instanceof CTBlipFillProperties) { diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index 163d8a65aa..38dea1b462 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -37,7 +37,7 @@ import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelations import org.openxmlformats.schemas.presentationml.x2006.main.*; @Beta -public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet { +public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet { private XSLFCommonSlideData _commonSlideData; private XSLFDrawing _drawing; private List _shapes; @@ -516,25 +516,26 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC * Import a package part into this sheet. */ PackagePart importPart(PackageRelationship srcRel, PackagePart srcPafrt) { - - OPCPackage pkg = getPackagePart().getPackage(); - if(!pkg.containPart(srcPafrt.getPartName())){ - PackageRelationship rel = getPackagePart().addRelationship( - srcPafrt.getPartName(), TargetMode.INTERNAL, srcRel.getRelationshipType()); - - PackagePart part = pkg.createPart(srcPafrt.getPartName(), srcPafrt.getContentType()); - OutputStream out = part.getOutputStream(); - try { - InputStream is = srcPafrt.getInputStream(); - IOUtils.copy(is, out); - out.close(); - } catch (IOException e){ - throw new POIXMLException(e); - } - return part; - } else { + PackagePart destPP = getPackagePart(); + PackagePartName srcPPName = srcPafrt.getPartName(); + + OPCPackage pkg = destPP.getPackage(); + if(pkg.containPart(srcPPName)){ // already exists - return pkg.getPart(srcPafrt.getPartName()); + return pkg.getPart(srcPPName); + } + + destPP.addRelationship(srcPPName, TargetMode.INTERNAL, srcRel.getRelationshipType()); + + PackagePart part = pkg.createPart(srcPPName, srcPafrt.getContentType()); + OutputStream out = part.getOutputStream(); + try { + InputStream is = srcPafrt.getInputStream(); + IOUtils.copy(is, out); + out.close(); + } catch (IOException e){ + throw new POIXMLException(e); } + return part; } } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java index ffe0fc823d..fb97180605 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java @@ -19,19 +19,21 @@ package org.apache.poi.xslf.usermodel; +import static org.apache.poi.sl.usermodel.PaintStyle.TRANSPARENT_PAINT; + import java.awt.Color; import java.awt.geom.Rectangle2D; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; -import org.apache.poi.sl.draw.DrawPaint; import org.apache.poi.sl.draw.geom.*; import org.apache.poi.sl.usermodel.*; import org.apache.poi.sl.usermodel.LineDecoration.DecorationShape; import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize; import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; import org.apache.poi.sl.usermodel.StrokeStyle.LineCap; +import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound; import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.util.Beta; import org.apache.poi.util.Units; @@ -208,8 +210,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { PaintStyle ps = getLinePaint(); if (ps == null || ps == TRANSPARENT_PAINT) return null; if (ps instanceof SolidPaint) { - Color col = ((SolidPaint)ps).getSolidColor().getColor(); - return (col == DrawPaint.NO_PAINT) ? null : col; + return ((SolidPaint)ps).getSolidColor().getColor(); } return null; } @@ -273,7 +274,6 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { } /** - * * @return line width in points. 0 means no line. */ public double getLineWidth() { @@ -310,6 +310,54 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { return lineWidth; } + /** + * @return the line compound + */ + public LineCompound getLineCompound() { + PropertyFetcher fetcher = new PropertyFetcher() { + public boolean fetch(XSLFShape shape) { + CTShapeProperties spPr = shape.getSpPr(); + CTLineProperties ln = spPr.getLn(); + if (ln != null) { + STCompoundLine.Enum stCmpd = ln.getCmpd(); + if (stCmpd != null) { + setValue(stCmpd.intValue()); + return true; + } + } + return false; + } + }; + fetchShapeProperty(fetcher); + + Integer cmpd = fetcher.getValue(); + if (cmpd == null) { + CTLineProperties defaultLn = getDefaultLineProperties(); + if (defaultLn != null) { + STCompoundLine.Enum stCmpd = defaultLn.getCmpd(); + if (stCmpd != null) { + cmpd = stCmpd.intValue(); + } + } + } + + if (cmpd == null) return null; + + switch (cmpd) { + default: + case STCompoundLine.INT_SNG: + return LineCompound.SINGLE; + case STCompoundLine.INT_DBL: + return LineCompound.DOUBLE; + case STCompoundLine.INT_THICK_THIN: + return LineCompound.THICK_THIN; + case STCompoundLine.INT_THIN_THICK: + return LineCompound.THIN_THICK; + case STCompoundLine.INT_TRI: + return LineCompound.TRIPLE; + } + } + /** * * @param dash a preset line dashing scheme to stroke thr shape outline @@ -453,8 +501,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { PaintStyle ps = getFillPaint(); if (ps == null || ps == TRANSPARENT_PAINT) return null; if (ps instanceof SolidPaint) { - Color col = ((SolidPaint)ps).getSolidColor().getColor(); - return (col == DrawPaint.NO_PAINT) ? null : col; + return ((SolidPaint)ps).getSolidColor().getColor(); } return null; } @@ -769,6 +816,10 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { public double getLineWidth() { return XSLFSimpleShape.this.getLineWidth(); } + + public LineCompound getLineCompound() { + return XSLFSimpleShape.this.getLineCompound(); + } }; } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index 795daa30b5..ee62ee9d79 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -29,7 +29,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.*; @Beta -public final class XSLFSlide extends XSLFSheet implements Slide { +public final class XSLFSlide extends XSLFSheet implements Slide { private final CTSlide _slide; private XSLFSlideLayout _layout; private XSLFComments _comments; @@ -245,7 +245,7 @@ public final class XSLFSlide extends XSLFSheet implements Slide { throw new UnsupportedOperationException(); } - public void setNotes(Notes notes) { + public void setNotes(Notes notes) { // TODO Auto-generated method stub } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java index bd6c38ca46..65487bd45b 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java @@ -31,7 +31,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.SldLayoutDocument; import java.io.IOException; @Beta -public class XSLFSlideLayout extends XSLFSheet implements MasterSheet { +public class XSLFSlideLayout extends XSLFSheet implements MasterSheet { private CTSlideLayout _layout; private XSLFSlideMaster _master; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java index 0b64306fd1..830a531a24 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java @@ -54,7 +54,7 @@ import java.util.Map; * @author Yegor Kozlov */ @Beta - public class XSLFSlideMaster extends XSLFSheet implements MasterSheet { + public class XSLFSlideMaster extends XSLFSheet implements MasterSheet { private CTSlideMaster _slide; private Map _layouts; private XSLFTheme _theme; @@ -83,7 +83,7 @@ import java.util.Map; } @Override - public MasterSheet getMasterSheet() { + public MasterSheet getMasterSheet() { return null; } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java index e3dad561b6..5b7109059f 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java @@ -18,9 +18,10 @@ package org.apache.poi.xslf.usermodel; import junit.framework.TestCase; -import org.apache.poi.sl.usermodel.ShapeType; -import org.apache.poi.sl.usermodel.TextAlign; -import org.apache.poi.sl.usermodel.VerticalAlignment; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; +import org.apache.poi.sl.usermodel.TextShape.TextAutofit; +import org.apache.poi.sl.usermodel.TextShape.TextDirection; import org.apache.poi.util.Units; import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType; import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType; diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java index ae7de8d5c0..0dc9c4d6f7 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java @@ -16,14 +16,17 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; +import java.awt.Color; +import java.awt.Rectangle; + import junit.framework.TestCase; -import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.usermodel.LineDecoration.DecorationShape; +import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize; +import org.apache.poi.sl.usermodel.*; import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector; -import java.awt.*; - /** * @author Yegor Kozlov */ @@ -40,70 +43,70 @@ public class TestXSLFConnectorShape extends TestCase { assertFalse(shape.getSpPr().getLn().isSetTailEnd()); // line decorations - assertEquals(LineDecoration.NONE, shape.getLineHeadDecoration()); - assertEquals(LineDecoration.NONE, shape.getLineTailDecoration()); + assertEquals(DecorationShape.NONE, shape.getLineHeadDecoration()); + assertEquals(DecorationShape.NONE, shape.getLineTailDecoration()); shape.setLineHeadDecoration(null); shape.setLineTailDecoration(null); - assertEquals(LineDecoration.NONE, shape.getLineHeadDecoration()); - assertEquals(LineDecoration.NONE, shape.getLineTailDecoration()); + assertEquals(DecorationShape.NONE, shape.getLineHeadDecoration()); + assertEquals(DecorationShape.NONE, shape.getLineTailDecoration()); assertFalse(shape.getSpPr().getLn().getHeadEnd().isSetType()); assertFalse(shape.getSpPr().getLn().getTailEnd().isSetType()); - shape.setLineHeadDecoration(LineDecoration.ARROW); - shape.setLineTailDecoration(LineDecoration.DIAMOND); - assertEquals(LineDecoration.ARROW, shape.getLineHeadDecoration()); - assertEquals(LineDecoration.DIAMOND, shape.getLineTailDecoration()); + shape.setLineHeadDecoration(DecorationShape.ARROW); + shape.setLineTailDecoration(DecorationShape.DIAMOND); + assertEquals(DecorationShape.ARROW, shape.getLineHeadDecoration()); + assertEquals(DecorationShape.DIAMOND, shape.getLineTailDecoration()); assertEquals(STLineEndType.ARROW, shape.getSpPr().getLn().getHeadEnd().getType()); assertEquals(STLineEndType.DIAMOND, shape.getSpPr().getLn().getTailEnd().getType()); - shape.setLineHeadDecoration(LineDecoration.DIAMOND); - shape.setLineTailDecoration(LineDecoration.ARROW); - assertEquals(LineDecoration.DIAMOND, shape.getLineHeadDecoration()); - assertEquals(LineDecoration.ARROW, shape.getLineTailDecoration()); + shape.setLineHeadDecoration(DecorationShape.DIAMOND); + shape.setLineTailDecoration(DecorationShape.ARROW); + assertEquals(DecorationShape.DIAMOND, shape.getLineHeadDecoration()); + assertEquals(DecorationShape.ARROW, shape.getLineTailDecoration()); assertEquals(STLineEndType.DIAMOND, shape.getSpPr().getLn().getHeadEnd().getType()); assertEquals(STLineEndType.ARROW, shape.getSpPr().getLn().getTailEnd().getType()); // line end width - assertEquals(LineEndWidth.MEDIUM, shape.getLineHeadWidth()); - assertEquals(LineEndWidth.MEDIUM, shape.getLineTailWidth()); + assertEquals(DecorationSize.MEDIUM, shape.getLineHeadWidth()); + assertEquals(DecorationSize.MEDIUM, shape.getLineTailWidth()); shape.setLineHeadWidth(null); shape.setLineHeadWidth(null); - assertEquals(LineEndWidth.MEDIUM, shape.getLineHeadWidth()); - assertEquals(LineEndWidth.MEDIUM, shape.getLineTailWidth()); + assertEquals(DecorationSize.MEDIUM, shape.getLineHeadWidth()); + assertEquals(DecorationSize.MEDIUM, shape.getLineTailWidth()); assertFalse(shape.getSpPr().getLn().getHeadEnd().isSetW()); assertFalse(shape.getSpPr().getLn().getTailEnd().isSetW()); - shape.setLineHeadWidth(LineEndWidth.LARGE); - shape.setLineTailWidth(LineEndWidth.MEDIUM); - assertEquals(LineEndWidth.LARGE, shape.getLineHeadWidth()); - assertEquals(LineEndWidth.MEDIUM, shape.getLineTailWidth()); + shape.setLineHeadWidth(DecorationSize.LARGE); + shape.setLineTailWidth(DecorationSize.MEDIUM); + assertEquals(DecorationSize.LARGE, shape.getLineHeadWidth()); + assertEquals(DecorationSize.MEDIUM, shape.getLineTailWidth()); assertEquals(STLineEndWidth.LG, shape.getSpPr().getLn().getHeadEnd().getW()); assertEquals(STLineEndWidth.MED, shape.getSpPr().getLn().getTailEnd().getW()); - shape.setLineHeadWidth(LineEndWidth.MEDIUM); - shape.setLineTailWidth(LineEndWidth.LARGE); - assertEquals(LineEndWidth.MEDIUM, shape.getLineHeadWidth()); - assertEquals(LineEndWidth.LARGE, shape.getLineTailWidth()); + shape.setLineHeadWidth(DecorationSize.MEDIUM); + shape.setLineTailWidth(DecorationSize.LARGE); + assertEquals(DecorationSize.MEDIUM, shape.getLineHeadWidth()); + assertEquals(DecorationSize.LARGE, shape.getLineTailWidth()); assertEquals(STLineEndWidth.MED, shape.getSpPr().getLn().getHeadEnd().getW()); assertEquals(STLineEndWidth.LG, shape.getSpPr().getLn().getTailEnd().getW()); // line end length - assertEquals(LineEndLength.MEDIUM, shape.getLineHeadLength()); - assertEquals(LineEndLength.MEDIUM, shape.getLineTailLength()); + assertEquals(DecorationSize.MEDIUM, shape.getLineHeadLength()); + assertEquals(DecorationSize.MEDIUM, shape.getLineTailLength()); shape.setLineHeadLength(null); shape.setLineTailLength(null); - assertEquals(LineEndLength.MEDIUM, shape.getLineHeadLength()); - assertEquals(LineEndLength.MEDIUM, shape.getLineTailLength()); + assertEquals(DecorationSize.MEDIUM, shape.getLineHeadLength()); + assertEquals(DecorationSize.MEDIUM, shape.getLineTailLength()); assertFalse(shape.getSpPr().getLn().getHeadEnd().isSetLen()); assertFalse(shape.getSpPr().getLn().getTailEnd().isSetLen()); - shape.setLineHeadLength(LineEndLength.LARGE); - shape.setLineTailLength(LineEndLength.MEDIUM); - assertEquals(LineEndLength.LARGE, shape.getLineHeadLength()); - assertEquals(LineEndLength.MEDIUM, shape.getLineTailLength()); + shape.setLineHeadLength(DecorationSize.LARGE); + shape.setLineTailLength(DecorationSize.MEDIUM); + assertEquals(DecorationSize.LARGE, shape.getLineHeadLength()); + assertEquals(DecorationSize.MEDIUM, shape.getLineTailLength()); assertEquals(STLineEndLength.LG, shape.getSpPr().getLn().getHeadEnd().getLen()); assertEquals(STLineEndLength.MED, shape.getSpPr().getLn().getTailEnd().getLen()); - shape.setLineHeadLength(LineEndLength.MEDIUM); - shape.setLineTailLength(LineEndLength.LARGE); - assertEquals(LineEndLength.MEDIUM, shape.getLineHeadLength()); - assertEquals(LineEndLength.LARGE, shape.getLineTailLength()); + shape.setLineHeadLength(DecorationSize.MEDIUM); + shape.setLineTailLength(DecorationSize.LARGE); + assertEquals(DecorationSize.MEDIUM, shape.getLineHeadLength()); + assertEquals(DecorationSize.LARGE, shape.getLineTailLength()); assertEquals(STLineEndLength.MED, shape.getSpPr().getLn().getHeadEnd().getLen()); assertEquals(STLineEndLength.LG, shape.getSpPr().getLn().getTailEnd().getLen()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java index 2153ceb26f..b3a5fc211e 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java @@ -20,17 +20,11 @@ import java.awt.Color; import junit.framework.TestCase; -import org.apache.poi.sl.usermodel.LineCap; -import org.apache.poi.sl.usermodel.LineDash; +import org.apache.poi.sl.usermodel.StrokeStyle.LineCap; +import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.util.Units; import org.apache.poi.xslf.XSLFTestDataSamples; -import org.openxmlformats.schemas.drawingml.x2006.main.CTEffectStyleItem; -import org.openxmlformats.schemas.drawingml.x2006.main.CTEffectStyleList; -import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrix; -import org.openxmlformats.schemas.drawingml.x2006.main.STLineCap; -import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal; +import org.openxmlformats.schemas.drawingml.x2006.main.*; /** * @author Yegor Kozlov diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java index 505703bcaa..80a52fd2cc 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java @@ -20,6 +20,7 @@ import junit.framework.TestCase; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.XSLFTestDataSamples; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell; import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; import java.awt.Color; @@ -99,10 +100,11 @@ public class TestXSLFTable extends TestCase { XSLFTableCell cell0 = row0.addCell(); assertNotNull(cell0.getXmlObject()); // by default table cell has no borders - assertTrue(cell0.getXmlObject().getTcPr().getLnB().isSetNoFill()); - assertTrue(cell0.getXmlObject().getTcPr().getLnT().isSetNoFill()); - assertTrue(cell0.getXmlObject().getTcPr().getLnL().isSetNoFill()); - assertTrue(cell0.getXmlObject().getTcPr().getLnR().isSetNoFill()); + CTTableCell tc = (CTTableCell)cell0.getXmlObject(); + assertTrue(tc.getTcPr().getLnB().isSetNoFill()); + assertTrue(tc.getTcPr().getLnT().isSetNoFill()); + assertTrue(tc.getTcPr().getLnL().isSetNoFill()); + assertTrue(tc.getTcPr().getLnR().isSetNoFill()); assertSame(cell0, row0.getCells().get(0)); assertEquals(1, tbl.getNumberOfColumns()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index 45bc30286e..fb906ed3a1 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -16,25 +16,46 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; - -import org.apache.poi.sl.draw.TextFragment; -import org.apache.poi.sl.usermodel.TextAlign; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; -import org.apache.poi.xslf.XSLFTestDataSamples; +import static org.junit.Assert.*; import java.awt.*; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.util.List; +import org.apache.poi.sl.draw.DrawTextFragment; +import org.apache.poi.sl.draw.DrawTextParagraph; +import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; +import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; + /** * @author Yegor Kozlov */ -public class TestXSLFTextParagraph extends TestCase { +public class TestXSLFTextParagraph { private static POILogger _logger = POILogFactory.getLogger(XSLFTextParagraph.class); + static class DrawTextParagraphProxy extends DrawTextParagraph { + DrawTextParagraphProxy(XSLFTextParagraph p) { + super(p); + } + + public void breakText(Graphics2D graphics) { + super.breakText(graphics); + } + + public double getWrappingWidth(boolean firstLine, Graphics2D graphics) { + return super.getWrappingWidth(firstLine, graphics); + } + + public List getLines() { + return lines; + } + } + + @Test public void testWrappingWidth() throws Exception { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -49,45 +70,47 @@ public class TestXSLFTextParagraph extends TestCase { Rectangle2D anchor = new Rectangle(50, 50, 300, 200); sh.setAnchor(anchor); + + DrawTextParagraphProxy dtp = new DrawTextParagraphProxy(p); double leftInset = sh.getLeftInset(); double rightInset = sh.getRightInset(); - assertEquals(7.2, leftInset); - assertEquals(7.2, rightInset); + assertEquals(7.2, leftInset, 0); + assertEquals(7.2, rightInset, 0); double leftMargin = p.getLeftMargin(); - assertEquals(0.0, leftMargin); + assertEquals(0.0, leftMargin, 0); double indent = p.getIndent(); - assertEquals(0.0, indent); // default + assertEquals(0.0, indent, 0); // default double expectedWidth; // Case 1: bullet=false, leftMargin=0, indent=0. expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; - assertEquals(285.6, expectedWidth); // 300 - 7.2 - 7.2 - 0 - assertEquals(expectedWidth, p.getWrappingWidth(true, null)); - assertEquals(expectedWidth, p.getWrappingWidth(false, null)); + assertEquals(285.6, expectedWidth, 0); // 300 - 7.2 - 7.2 - 0 + assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0); + assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0); p.setLeftMargin(36); // 0.5" leftMargin = p.getLeftMargin(); - assertEquals(36.0, leftMargin); + assertEquals(36.0, leftMargin, 0); expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; assertEquals(249.6, expectedWidth, 1E-5); // 300 - 7.2 - 7.2 - 36 - assertEquals(expectedWidth, p.getWrappingWidth(true, null)); - assertEquals(expectedWidth, p.getWrappingWidth(false, null)); + assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0); + assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0); // increase insets, the wrapping width should get smaller sh.setLeftInset(10); sh.setRightInset(10); leftInset = sh.getLeftInset(); rightInset = sh.getRightInset(); - assertEquals(10.0, leftInset); - assertEquals(10.0, rightInset); + assertEquals(10.0, leftInset, 0); + assertEquals(10.0, rightInset, 0); expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; - assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36 - assertEquals(expectedWidth, p.getWrappingWidth(true, null)); - assertEquals(expectedWidth, p.getWrappingWidth(false, null)); + assertEquals(244.0, expectedWidth, 0); // 300 - 10 - 10 - 36 + assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0); + assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0); // set a positive indent of a 0.5 inch. This means "First Line" indentation: // |<--- indent -->|Here goes first line of the text @@ -95,34 +118,35 @@ public class TestXSLFTextParagraph extends TestCase { p.setIndent(36.0); // 0.5" indent = p.getIndent(); - assertEquals(36.0, indent); + assertEquals(36.0, indent, 0); expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin - indent; - assertEquals(208.0, expectedWidth); // 300 - 10 - 10 - 36 - 6.4 - assertEquals(expectedWidth, p.getWrappingWidth(true, null)); // first line is indented + assertEquals(208.0, expectedWidth, 0); // 300 - 10 - 10 - 36 - 6.4 + assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0); // first line is indented // other lines are not indented expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; - assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36 - assertEquals(expectedWidth, p.getWrappingWidth(false, null)); + assertEquals(244.0, expectedWidth, 0); // 300 - 10 - 10 - 36 + assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0); // set a negative indent of a 1 inch. This means "Hanging" indentation: // Here goes first line of the text // |<--- indent -->|Here go other lines (second and subsequent) p.setIndent(-72.0); // 1" indent = p.getIndent(); - assertEquals(-72.0, indent); + assertEquals(-72.0, indent, 0); expectedWidth = anchor.getWidth() - leftInset - rightInset; - assertEquals(280.0, expectedWidth); // 300 - 10 - 10 - assertEquals(expectedWidth, p.getWrappingWidth(true, null)); // first line is NOT indented + assertEquals(280.0, expectedWidth, 0); // 300 - 10 - 10 + assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0); // first line is NOT indented // other lines are indented by leftMargin (the value of indent is not used) expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; - assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36 - assertEquals(expectedWidth, p.getWrappingWidth(false, null)); + assertEquals(244.0, expectedWidth, 0); // 300 - 10 - 10 - 36 + assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0); } /** * test breaking test into lines. * This test requires that the Arial font is available and will run only on windows */ + @Test public void testBreakLines(){ String os = System.getProperty("os.name"); if(os == null || !os.contains("Windows")) { @@ -144,44 +168,52 @@ public class TestXSLFTextParagraph extends TestCase { "residing within the corresponding paragraph."); sh.setAnchor(new Rectangle(50, 50, 300, 200)); + DrawTextParagraphProxy dtp = new DrawTextParagraphProxy(p); BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = img.createGraphics(); - List lines; - lines = p.breakText(graphics); + List lines; + dtp.breakText(graphics); + lines = dtp.getLines(); assertEquals(4, lines.size()); // descrease the shape width from 300 pt to 100 pt sh.setAnchor(new Rectangle(50, 50, 100, 200)); - lines = p.breakText(graphics); + dtp.breakText(graphics); + lines = dtp.getLines(); assertEquals(12, lines.size()); // descrease the shape width from 300 pt to 100 pt sh.setAnchor(new Rectangle(50, 50, 600, 200)); - lines = p.breakText(graphics); + dtp.breakText(graphics); + lines = dtp.getLines(); assertEquals(2, lines.size()); // set left and right margins to 200pt. This leaves 200pt for wrapping text sh.setLeftInset(200); sh.setRightInset(200); - lines = p.breakText(graphics); + dtp.breakText(graphics); + lines = dtp.getLines(); assertEquals(5, lines.size()); r.setText("Apache POI"); - lines = p.breakText(graphics); + dtp.breakText(graphics); + lines = dtp.getLines(); assertEquals(1, lines.size()); assertEquals("Apache POI", lines.get(0).getString()); r.setText("Apache\nPOI"); - lines = p.breakText(graphics); + dtp.breakText(graphics); + lines = dtp.getLines(); assertEquals(2, lines.size()); assertEquals("Apache", lines.get(0).getString()); assertEquals("POI", lines.get(1).getString()); // trailing newlines are ignored r.setText("Apache\nPOI\n"); - lines = p.breakText(graphics); + dtp.breakText(graphics); + lines = dtp.getLines(); assertEquals(2, lines.size()); assertEquals("Apache", lines.get(0).getString()); assertEquals("POI", lines.get(1).getString()); @@ -197,7 +229,8 @@ public class TestXSLFTextParagraph extends TestCase { r3.setFontFamily("serif"); // this should always be available r3.setFontSize(10); r3.setText("POI"); - lines = p2.breakText(graphics); + dtp.breakText(graphics); + lines = dtp.getLines(); assertEquals(2, lines.size()); assertEquals("Apache", lines.get(0).getString()); assertEquals("POI", lines.get(1).getString()); @@ -206,6 +239,7 @@ public class TestXSLFTextParagraph extends TestCase { } + @Test public void testThemeInheritance(){ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("prProps.pptx"); XSLFShape[] shapes = ppt.getSlides()[0].getShapes(); @@ -220,6 +254,7 @@ public class TestXSLFTextParagraph extends TestCase { assertEquals(TextAlign.CENTER, sh3.getTextParagraphs().get(0).getTextAlign()); } + @Test public void testParagraphProperties(){ XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -242,25 +277,25 @@ public class TestXSLFTextParagraph extends TestCase { p.setBulletFontColor(Color.red); assertEquals(Color.red, p.getBulletFontColor()); - assertEquals(100.0, p.getBulletFontSize()); + assertEquals(100.0, p.getBulletFontSize(), 0); p.setBulletFontSize(200.); - assertEquals(200., p.getBulletFontSize()); + assertEquals(200., p.getBulletFontSize(), 0); p.setBulletFontSize(-20.); - assertEquals(-20.0, p.getBulletFontSize()); + assertEquals(-20.0, p.getBulletFontSize(), 0); - assertEquals(72.0, p.getDefaultTabSize()); + assertEquals(72.0, p.getDefaultTabSize(), 0); - assertEquals(0.0, p.getIndent()); + assertEquals(0.0, p.getIndent(), 0); p.setIndent(72.0); - assertEquals(72.0, p.getIndent()); + assertEquals(72.0, p.getIndent(), 0); p.setIndent(-1.0); // the value of -1.0 resets to the defaults - assertEquals(0.0, p.getIndent()); + assertEquals(0.0, p.getIndent(), 0); - assertEquals(0.0, p.getLeftMargin()); + assertEquals(0.0, p.getLeftMargin(), 0); p.setLeftMargin(72.0); - assertEquals(72.0, p.getLeftMargin()); + assertEquals(72.0, p.getLeftMargin(), 0); p.setLeftMargin(-1.0); // the value of -1.0 resets to the defaults - assertEquals(0.0, p.getLeftMargin()); + assertEquals(0.0, p.getLeftMargin(), 0); assertEquals(0, p.getLevel()); p.setLevel(1); @@ -268,23 +303,23 @@ public class TestXSLFTextParagraph extends TestCase { p.setLevel(2); assertEquals(2, p.getLevel()); - assertEquals(100., p.getLineSpacing()); + assertEquals(100., p.getLineSpacing(), 0); p.setLineSpacing(200.); - assertEquals(200.0, p.getLineSpacing()); + assertEquals(200.0, p.getLineSpacing(), 0); p.setLineSpacing(-15.); - assertEquals(-15.0, p.getLineSpacing()); + assertEquals(-15.0, p.getLineSpacing(), 0); - assertEquals(0., p.getSpaceAfter()); + assertEquals(0., p.getSpaceAfter(), 0); p.setSpaceAfter(200.); - assertEquals(200.0, p.getSpaceAfter()); + assertEquals(200.0, p.getSpaceAfter(), 0); p.setSpaceAfter(-15.); - assertEquals(-15.0, p.getSpaceAfter()); + assertEquals(-15.0, p.getSpaceAfter(), 0); - assertEquals(0., p.getSpaceBefore()); + assertEquals(0., p.getSpaceBefore(), 0); p.setSpaceBefore(200.); - assertEquals(200.0, p.getSpaceBefore()); + assertEquals(200.0, p.getSpaceBefore(), 0); p.setSpaceBefore(-15.); - assertEquals(-15.0, p.getSpaceBefore()); + assertEquals(-15.0, p.getSpaceBefore(), 0); assertEquals(TextAlign.LEFT, p.getTextAlign()); p.setTextAlign(TextAlign.RIGHT); @@ -296,15 +331,16 @@ public class TestXSLFTextParagraph extends TestCase { p.setBulletAutoNumber(ListAutoNumber.ALPHA_LC_PARENT_BOTH, 1); double tabStop = p.getTabStop(0); - assertEquals(0.0, tabStop); + assertEquals(0.0, tabStop, 0); p.addTabStop(100.); - assertEquals(100., p.getTabStop(0)); + assertEquals(100., p.getTabStop(0), 0); - assertEquals(72.0, p.getDefaultTabSize()); + assertEquals(72.0, p.getDefaultTabSize(), 0); } + @Test public void testLineBreak(){ XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -316,12 +352,12 @@ public class TestXSLFTextParagraph extends TestCase { XSLFTextRun r2 = p.addLineBreak(); assertEquals("\n", r2.getText()); r2.setFontSize(10.0); - assertEquals(10.0, r2.getFontSize()); + assertEquals(10.0, r2.getFontSize(), 0); XSLFTextRun r3 = p.addNewTextRun(); r3.setText("World!"); r3.setFontSize(20.0); XSLFTextRun r4 = p.addLineBreak(); - assertEquals(20.0, r4.getFontSize()); + assertEquals(20.0, r4.getFontSize(), 0); assertEquals("Hello,\nWorld!\n",sh.getText()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java index f217c58278..f9232a1733 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java @@ -16,20 +16,17 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; +import java.awt.Color; + import junit.framework.TestCase; -import org.apache.poi.sl.usermodel.TextAlign; +import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.XSLFTestDataSamples; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType; +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.Color; - /** * @author Yegor Kozlov */ diff --git a/src/resources/scratchpad/org/apache/poi/sl/draw/presetShapeDefinitions.xml b/src/resources/scratchpad/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml similarity index 100% rename from src/resources/scratchpad/org/apache/poi/sl/draw/presetShapeDefinitions.xml rename to src/resources/scratchpad/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java b/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java index 9f59de4a86..4c9e9ceaf6 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.usermodel.PictureData; +import org.apache.poi.hslf.usermodel.HSLFPictureData; import java.io.IOException; import java.io.ByteArrayOutputStream; @@ -28,7 +28,7 @@ import java.io.ByteArrayOutputStream; * * @author Yegor Kozlov */ -public abstract class Bitmap extends PictureData { +public abstract class Bitmap extends HSLFPictureData { public byte[] getData(){ byte[] rawdata = getRawData(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java b/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java index aae83bf6e1..6795601a6c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java @@ -17,8 +17,8 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.usermodel.HSLFPictureData; +import org.apache.poi.hslf.model.HSLFPictureShape; import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogFactory; @@ -56,7 +56,7 @@ import java.io.ByteArrayInputStream; public final class BitmapPainter implements ImagePainter { protected POILogger logger = POILogFactory.getLogger(this.getClass()); - public void paint(Graphics2D graphics, PictureData pict, Picture parent) { + public void paint(Graphics2D graphics, HSLFPictureData pict, HSLFPictureShape parent) { BufferedImage img; try { img = ImageIO.read(new ByteArrayInputStream(pict.getData())); diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java index 21ea072ff7..401ac43476 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.HSLFPictureShape; import org.apache.poi.util.LittleEndian; import java.io.IOException; @@ -35,10 +35,10 @@ public final class DIB extends Bitmap { /** * @return type of this picture - * @see org.apache.poi.hslf.model.Picture#DIB + * @see org.apache.poi.hslf.model.HSLFPictureShape#DIB */ public int getType(){ - return Picture.DIB; + return HSLFPictureShape.DIB; } /** @@ -89,4 +89,8 @@ public final class DIB extends Bitmap { System.arraycopy(data, HEADER_SIZE, dib, 0, dib.length); super.setData(dib); } + + public String getContentType() { + return "image/bmp"; + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java index 7ad569aa8d..5fe55f1819 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.HSLFPictureShape; import org.apache.poi.hslf.model.HSLFShape; import org.apache.poi.hslf.exceptions.HSLFException; @@ -80,7 +80,7 @@ public final class EMF extends Metafile { } public int getType(){ - return Picture.EMF; + return HSLFPictureShape.EMF; } /** @@ -91,4 +91,8 @@ public final class EMF extends Metafile { public int getSignature(){ return 0x3D40; } + + public String getContentType() { + return "image/x-emf"; + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java b/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java index 2c35007048..0f1afecb98 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java @@ -17,8 +17,8 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.model.Picture; -import org.apache.poi.hslf.usermodel.PictureData; +import org.apache.poi.hslf.model.HSLFPictureShape; +import org.apache.poi.hslf.usermodel.HSLFPictureData; import java.awt.*; @@ -68,5 +68,5 @@ public interface ImagePainter { * @param pict the data to paint * @param parent the shapes that owns the picture data */ - public void paint(Graphics2D graphics, PictureData pict, Picture parent); + public void paint(Graphics2D graphics, HSLFPictureData pict, HSLFPictureShape parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java b/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java index 65ade3ee38..567fc996ee 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.HSLFPictureShape; /** * Represents a JPEG picture data in a PPT file @@ -28,10 +28,10 @@ public final class JPEG extends Bitmap { /** * @return type of this picture - * @see org.apache.poi.hslf.model.Picture#JPEG + * @see org.apache.poi.hslf.model.HSLFPictureShape#JPEG */ public int getType(){ - return Picture.JPEG; + return HSLFPictureShape.JPEG; } /** @@ -42,4 +42,8 @@ public final class JPEG extends Bitmap { public int getSignature(){ return 0x46A0; } + + public String getContentType() { + return "image/jpeg"; + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java b/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java index c05d19acb0..535e206410 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.blip; import org.apache.poi.util.LittleEndian; -import org.apache.poi.hslf.usermodel.PictureData; +import org.apache.poi.hslf.usermodel.HSLFPictureData; import java.awt.*; import java.io.*; @@ -30,7 +30,7 @@ import java.util.zip.DeflaterOutputStream; * * @author Yegor Kozlov */ -public abstract class Metafile extends PictureData { +public abstract class Metafile extends HSLFPictureData { /** * A structure which represents a 34-byte header preceeding the compressed metafile data diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java index 4b401518ee..9b2df64262 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java @@ -23,7 +23,7 @@ import java.io.IOException; import java.util.zip.InflaterInputStream; import org.apache.poi.hslf.exceptions.HSLFException; -import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.HSLFPictureShape; import org.apache.poi.hslf.model.HSLFShape; /** @@ -102,10 +102,10 @@ public final class PICT extends Metafile { } /** - * @see org.apache.poi.hslf.model.Picture#PICT + * @see org.apache.poi.hslf.model.HSLFPictureShape#PICT */ public int getType(){ - return Picture.PICT; + return HSLFPictureShape.PICT; } /** @@ -117,4 +117,8 @@ public final class PICT extends Metafile { return 0x5430; } + public String getContentType() { + return "image/x-pict"; + } + } diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java b/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java index 12b98f1802..a1d9aa50a9 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java @@ -17,14 +17,8 @@ package org.apache.poi.hslf.blip; +import org.apache.poi.hslf.model.HSLFPictureShape; import org.apache.poi.util.PngUtils; -import org.apache.poi.hslf.model.Picture; -import org.apache.poi.hslf.exceptions.HSLFException; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.IOException; /** * Represents a PNG picture data in a PPT file @@ -52,10 +46,10 @@ public final class PNG extends Bitmap { /** * @return type of this picture - * @see org.apache.poi.hslf.model.Picture#PNG + * @see org.apache.poi.hslf.model.HSLFPictureShape#PNG */ public int getType(){ - return Picture.PNG; + return HSLFPictureShape.PNG; } /** @@ -66,4 +60,8 @@ public final class PNG extends Bitmap { public int getSignature(){ return 0x6E00; } + + public String getContentType() { + return "image/png"; + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java index 76f680eafd..3270b32596 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java @@ -19,7 +19,7 @@ package org.apache.poi.hslf.blip; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.POILogger; -import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.HSLFPictureShape; import org.apache.poi.hslf.model.HSLFShape; import org.apache.poi.hslf.exceptions.HSLFException; @@ -95,7 +95,7 @@ public final class WMF extends Metafile { * We are of type Picture.WMF */ public int getType(){ - return Picture.WMF; + return HSLFPictureShape.WMF; } /** @@ -188,4 +188,9 @@ public final class WMF extends Metafile { } } + + public String getContentType() { + return "image/x-wmf"; + } + } diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java index f46906f73c..e437f9504e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java @@ -18,6 +18,7 @@ package org.apache.poi.hslf.dev; import org.apache.poi.hslf.*; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; @@ -33,7 +34,7 @@ public final class PPDrawingTextListing { System.exit(1); } - HSLFSlideShow ss = new HSLFSlideShow(args[0]); + HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]); // Find PPDrawings at any second level position Record[] records = ss.getRecords(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java index 490e3e2055..d0ab5ec98f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.dev; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.Document; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; @@ -35,7 +35,7 @@ public final class SLWTListing { System.exit(1); } - HSLFSlideShow ss = new HSLFSlideShow(args[0]); + HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]); // Find the documents, and then their SLWT Record[] records = ss.getRecords(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java index 16858aa3db..fc9b224801 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java @@ -18,6 +18,7 @@ package org.apache.poi.hslf.dev; import org.apache.poi.hslf.*; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; /** @@ -32,7 +33,7 @@ public final class SLWTTextListing { System.exit(1); } - HSLFSlideShow ss = new HSLFSlideShow(args[0]); + HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]); // Find the documents, and then their SLWT Record[] records = ss.getRecords(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java index 2dd32a4af0..2a69c17d81 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java @@ -18,6 +18,7 @@ package org.apache.poi.hslf.dev; import org.apache.poi.hslf.*; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; @@ -34,7 +35,7 @@ public final class SlideAndNotesAtomListing { System.exit(1); } - HSLFSlideShow ss = new HSLFSlideShow(args[0]); + HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]); System.out.println(""); // Find either Slides or Notes diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java index 010f424c33..b4f487ab8a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java @@ -20,7 +20,7 @@ package org.apache.poi.hslf.dev; import java.io.ByteArrayOutputStream; import java.util.Map; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.Document; import org.apache.poi.hslf.record.Notes; import org.apache.poi.hslf.record.NotesAtom; @@ -31,7 +31,7 @@ import org.apache.poi.hslf.record.Slide; import org.apache.poi.hslf.record.SlideAtom; import org.apache.poi.hslf.record.SlideListWithText; import org.apache.poi.hslf.record.SlidePersistAtom; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.util.LittleEndian; /** @@ -50,8 +50,8 @@ public final class SlideIdListing { // Create the slideshow object, for normal working with - HSLFSlideShow hss = new HSLFSlideShow(args[0]); - SlideShow ss = new SlideShow(hss); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(args[0]); + HSLFSlideShow ss = new HSLFSlideShow(hss); // Grab the base contents fileContents = hss.getUnderlyingBytes(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java index f2e7b36dc2..77415ff2dc 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java @@ -19,10 +19,9 @@ package org.apache.poi.hslf.dev; import java.io.ByteArrayOutputStream; import java.io.IOException; - import java.util.Iterator; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.Record; import org.apache.poi.util.HexDump; import org.apache.poi.ddf.DefaultEscherRecordFactory; @@ -44,7 +43,7 @@ import org.apache.poi.hslf.record.StyleTextPropAtom; public final class SlideShowRecordDumper { private boolean optVerbose; private boolean optEscher; - private HSLFSlideShow doc; + private HSLFSlideShowImpl doc; /** * right now this function takes one parameter: a ppt file, and outputs @@ -103,7 +102,7 @@ public final class SlideShowRecordDumper { { optVerbose = verbose; optEscher = escher; - doc = new HSLFSlideShow(fileName); + doc = new HSLFSlideShowImpl(fileName); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java index a919f61cdd..d7fcbc6fd1 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java @@ -18,6 +18,7 @@ package org.apache.poi.hslf.dev; import org.apache.poi.hslf.*; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.model.textproperties.BitMaskTextProp; import org.apache.poi.hslf.model.textproperties.TextProp; import org.apache.poi.hslf.model.textproperties.TextPropCollection; @@ -36,7 +37,7 @@ public final class TextStyleListing { System.exit(1); } - HSLFSlideShow ss = new HSLFSlideShow(args[0]); + HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]); // Find the documents, and then their SLWT Record[] records = ss.getRecords(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/UserEditAndPersistListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/UserEditAndPersistListing.java index 749cfa9484..c7c8057171 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/UserEditAndPersistListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/UserEditAndPersistListing.java @@ -20,7 +20,7 @@ package org.apache.poi.hslf.dev; import java.io.ByteArrayOutputStream; import java.util.Map; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.CurrentUserAtom; import org.apache.poi.hslf.record.PersistPtrHolder; import org.apache.poi.hslf.record.PositionDependentRecord; @@ -44,7 +44,7 @@ public final class UserEditAndPersistListing { // Create the slideshow object, for normal working with - HSLFSlideShow ss = new HSLFSlideShow(args[0]); + HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]); fileContents = ss.getUnderlyingBytes(); System.out.println(""); diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java index 24d6d9096e..268eb3b2fb 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java +++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java @@ -17,10 +17,10 @@ package org.apache.poi.hslf.extractor; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFPictureData; +import org.apache.poi.hslf.model.HSLFPictureShape; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import java.io.IOException; import java.io.FileOutputStream; @@ -37,12 +37,12 @@ public final class ImageExtractor { System.err.println("\tImageExtractor "); return; } - SlideShow ppt = new SlideShow(new HSLFSlideShow(args[0])); + HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl(args[0])); //extract all pictures contained in the presentation - PictureData[] pdata = ppt.getPictureData(); + HSLFPictureData[] pdata = ppt.getPictureData(); for (int i = 0; i < pdata.length; i++) { - PictureData pict = pdata[i]; + HSLFPictureData pict = pdata[i]; // picture data byte[] data = pict.getData(); @@ -50,22 +50,22 @@ public final class ImageExtractor { int type = pict.getType(); String ext; switch (type) { - case Picture.JPEG: + case HSLFPictureShape.JPEG: ext = ".jpg"; break; - case Picture.PNG: + case HSLFPictureShape.PNG: ext = ".png"; break; - case Picture.WMF: + case HSLFPictureShape.WMF: ext = ".wmf"; break; - case Picture.EMF: + case HSLFPictureShape.EMF: ext = ".emf"; break; - case Picture.PICT: + case HSLFPictureShape.PICT: ext = ".pict"; break; - case Picture.DIB: + case HSLFPictureShape.DIB: ext = ".dib"; break; default: diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java index e870e5d0f8..621d2b6fcd 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java +++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java @@ -25,9 +25,8 @@ import java.util.List; import java.util.ArrayList; import org.apache.poi.POIOLE2TextExtractor; -import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.model.*; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; import org.apache.poi.poifs.filesystem.POIFSFileSystem; @@ -39,9 +38,9 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem; * @author Nick Burch */ public final class PowerPointExtractor extends POIOLE2TextExtractor { - private HSLFSlideShow _hslfshow; - private SlideShow _show; - private Slide[] _slides; + private HSLFSlideShowImpl _hslfshow; + private HSLFSlideShow _show; + private HSLFSlide[] _slides; private boolean _slidesByDefault = true; private boolean _notesByDefault = false; @@ -120,7 +119,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { * @param dir the POIFS Directory containing the PowerPoint document */ public PowerPointExtractor(DirectoryNode dir) throws IOException { - this(new HSLFSlideShow(dir)); + this(new HSLFSlideShowImpl(dir)); } /** @@ -128,7 +127,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { */ @Deprecated public PowerPointExtractor(DirectoryNode dir, POIFSFileSystem fs) throws IOException { - this(new HSLFSlideShow(dir, fs)); + this(new HSLFSlideShowImpl(dir, fs)); } /** @@ -136,10 +135,10 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { * * @param ss the HSLFSlideShow to extract text from */ - public PowerPointExtractor(HSLFSlideShow ss) { + public PowerPointExtractor(HSLFSlideShowImpl ss) { super(ss); _hslfshow = ss; - _show = new SlideShow(_hslfshow); + _show = new HSLFSlideShow(_hslfshow); _slides = _show.getSlides(); } @@ -190,7 +189,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { List list = new ArrayList(); for (int i = 0; i < _slides.length; i++) { - Slide slide = _slides[i]; + HSLFSlide slide = _slides[i]; HSLFShape[] shapes = slide.getShapes(); for (int j = 0; j < shapes.length; j++) { @@ -222,14 +221,14 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { if (getMasterText) { for (SlideMaster master : _show.getSlidesMasters()) { for(HSLFShape sh : master.getShapes()){ - if(sh instanceof TextShape){ - if(MasterSheet.isPlaceholder(sh)) { + if(sh instanceof HSLFTextShape){ + if(HSLFMasterSheet.isPlaceholder(sh)) { // don't bother about boiler // plate text on master // sheets continue; } - TextShape tsh = (TextShape)sh; + HSLFTextShape tsh = (HSLFTextShape)sh; String text = tsh.getText(); if (text != null){ ret.append(text); @@ -243,7 +242,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { } for (int i = 0; i < _slides.length; i++) { - Slide slide = _slides[i]; + HSLFSlide slide = _slides[i]; // Slide header, if set HeadersFooters hf = slide.getHeadersFooters(); @@ -286,7 +285,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { HeadersFooters hf = _show.getNotesHeadersFooters(); for (int i = 0; i < _slides.length; i++) { - Notes notes = _slides[i].getNotesSheet(); + HSLFNotes notes = _slides[i].getNotesSheet(); if (notes == null) { continue; } @@ -331,13 +330,13 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { ret.append('\n'); } } - private void textRunsToText(StringBuffer ret, TextRun[] runs) { + private void textRunsToText(StringBuffer ret, HSLFTextParagraph[] runs) { if (runs==null) { return; } for (int j = 0; j < runs.length; j++) { - TextRun run = runs[j]; + HSLFTextParagraph run = runs[j]; if (run != null) { String text = run.getText(); ret.append(text); diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java index e449a555e8..9c92c5c591 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java +++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java @@ -23,7 +23,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; -import org.apache.poi.hslf.model.TextRun; +import org.apache.poi.hslf.model.HSLFTextParagraph; import org.apache.poi.hslf.record.CString; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; @@ -175,17 +175,17 @@ public final class QuickButCruddyTextExtractor { // Otherwise, check the type to see if it's text long type = LittleEndian.getUShort(pptContents,startPos+2); - TextRun trun = null; + HSLFTextParagraph trun = null; // TextBytesAtom if(type == RecordTypes.TextBytesAtom.typeID) { TextBytesAtom tba = (TextBytesAtom)Record.createRecordForType(type, pptContents, startPos, len+8); - trun = new TextRun((TextHeaderAtom)null,tba,(StyleTextPropAtom)null); + trun = new HSLFTextParagraph((TextHeaderAtom)null,tba,(StyleTextPropAtom)null); } // TextCharsAtom if(type == RecordTypes.TextCharsAtom.typeID) { TextCharsAtom tca = (TextCharsAtom)Record.createRecordForType(type, pptContents, startPos, len+8); - trun = new TextRun((TextHeaderAtom)null,tca,(StyleTextPropAtom)null); + trun = new HSLFTextParagraph((TextHeaderAtom)null,tca,(StyleTextPropAtom)null); } // CString (doesn't go via a TextRun) diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java index f1c90130db..95f83a3834 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java @@ -45,7 +45,7 @@ import org.apache.poi.util.StringUtil; * TODO: finish * @author Yegor Kozlov */ -public final class ActiveXShape extends Picture { +public final class ActiveXShape extends HSLFPictureShape { public static final int DEFAULT_ACTIVEX_THUMBNAIL = -1; /** @@ -108,7 +108,7 @@ public final class ActiveXShape extends Picture { /** * Assign a control to this shape * - * @see org.apache.poi.hslf.usermodel.SlideShow#addMovie(String, int) + * @see org.apache.poi.hslf.usermodel.HSLFSlideShow#addMovie(String, int) * @param idx the index of the movie */ public void setActiveXIndex(int idx){ @@ -164,7 +164,7 @@ public final class ActiveXShape extends Picture { return ctrl; } - protected void afterInsert(Sheet sheet){ + protected void afterInsert(HSLFSheet sheet){ ExControl ctrl = getExControl(); ctrl.getExControlAtom().setSlideId(sheet._getSheetNumber()); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Background.java b/src/scratchpad/src/org/apache/poi/hslf/model/Background.java deleted file mode 100644 index 1b172bdb8f..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Background.java +++ /dev/null @@ -1,81 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Rectangle; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; - -import javax.imageio.ImageIO; - -import org.apache.poi.ddf.EscherContainerRecord; -import org.apache.poi.hslf.blip.Bitmap; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.sl.usermodel.ShapeContainer; -import org.apache.poi.util.POILogger; - -/** - * Background shape - * - * @author Yegor Kozlov - */ -public final class Background extends HSLFShape { - - protected Background(EscherContainerRecord escherRecord, ShapeContainer parent) { - super(escherRecord, parent); - } - - protected EscherContainerRecord createSpContainer(boolean isChild) { - return null; - } - - public void draw(Graphics2D graphics) { - Fill f = getFill(); - Dimension pg = getSheet().getSlideShow().getPageSize(); - Rectangle anchor = new Rectangle(0, 0, pg.width, pg.height); - switch (f.getFillType()) { - case Fill.FILL_SOLID: - Color color = f.getForegroundColor(); - graphics.setPaint(color); - graphics.fill(anchor); - break; - case Fill.FILL_PICTURE: - PictureData data = f.getPictureData(); - if (data instanceof Bitmap) { - BufferedImage img = null; - try { - img = ImageIO.read(new ByteArrayInputStream(data.getData())); - } catch (Exception e) { - logger.log(POILogger.WARN, "ImageIO failed to create image. image.type: " + data.getType()); - return; - } - Image scaledImg = img.getScaledInstance(anchor.width, anchor.height, Image.SCALE_SMOOTH); - graphics.drawImage(scaledImg, anchor.x, anchor.y, null); - - } - break; - default: - logger.log(POILogger.WARN, "unsuported fill type: " + f.getFillType()); - break; - } - } -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFAutoShape.java similarity index 86% rename from src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFAutoShape.java index 0cadd7c0d9..1f74f2ceb5 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFAutoShape.java @@ -18,11 +18,13 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; -import org.apache.poi.sl.usermodel.ShapeContainer; -import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.draw.geom.CustomGeometry; +import org.apache.poi.sl.draw.geom.Guide; +import org.apache.poi.sl.usermodel.*; import org.apache.poi.util.POILogger; import java.awt.geom.Rectangle2D; +import java.util.Iterator; /** * Represents an AutoShape. @@ -33,18 +35,18 @@ import java.awt.geom.Rectangle2D; * * @author Yegor Kozlov */ -public class AutoShape extends TextShape { +public class HSLFAutoShape extends HSLFTextShape implements AutoShape { - protected AutoShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected HSLFAutoShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } - public AutoShape(ShapeType type, ShapeContainer parent){ + public HSLFAutoShape(ShapeType type, ShapeContainer parent){ super(null, parent); _escherContainer = createSpContainer(type, parent instanceof HSLFGroupShape); } - public AutoShape(ShapeType type){ + public HSLFAutoShape(ShapeType type){ this(type, null); } @@ -66,10 +68,10 @@ public class AutoShape extends TextShape { return _escherContainer; } - protected void setDefaultTextProperties(TextRun _txtrun){ - setVerticalAlignment(TextBox.AnchorMiddle); - setHorizontalAlignment(TextBox.AlignCenter); - setWordWrap(TextBox.WrapNone); + protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){ + setVerticalAlignment(HSLFTextBox.AnchorMiddle); + setHorizontalAlignment(HSLFTextBox.AlignCenter); + setWordWrap(HSLFTextBox.WrapNone); } /** @@ -118,5 +120,4 @@ public class AutoShape extends TextShape { java.awt.Shape shape = outline.getOutline(this); return AutoShapes.transform(shape, anchor); } - } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFBackground.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFBackground.java new file mode 100644 index 0000000000..8d581f5f35 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFBackground.java @@ -0,0 +1,38 @@ +/* ==================================================================== + 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.hslf.model; + +import org.apache.poi.ddf.EscherContainerRecord; +import org.apache.poi.sl.usermodel.Background; +import org.apache.poi.sl.usermodel.ShapeContainer; + +/** + * Background shape + * + * @author Yegor Kozlov + */ +public final class HSLFBackground extends HSLFShape implements Background { + + protected HSLFBackground(EscherContainerRecord escherRecord, ShapeContainer parent) { + super(escherRecord, parent); + } + + protected EscherContainerRecord createSpContainer(boolean isChild) { + return null; + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFFill.java similarity index 75% rename from src/scratchpad/src/org/apache/poi/hslf/model/Fill.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFFill.java index a394cac474..14846e1ea0 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFFill.java @@ -18,17 +18,17 @@ package org.apache.poi.hslf.model; import java.awt.Color; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.List; -import org.apache.poi.ddf.EscherBSERecord; -import org.apache.poi.ddf.EscherContainerRecord; -import org.apache.poi.ddf.EscherOptRecord; -import org.apache.poi.ddf.EscherProperties; -import org.apache.poi.ddf.EscherRecord; -import org.apache.poi.ddf.EscherSimpleProperty; +import org.apache.poi.ddf.*; import org.apache.poi.hslf.record.Document; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFPictureData; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; +import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -37,7 +37,7 @@ import org.apache.poi.util.POILogger; * * @author Yegor Kozlov */ -public final class Fill { +public final class HSLFFill { // For logging protected POILogger logger = POILogFactory.getLogger(this.getClass()); @@ -106,10 +106,55 @@ public final class Fill { * * @param shape the shape this background applies to */ - public Fill(HSLFShape shape){ + public HSLFFill(HSLFShape shape){ this.shape = shape; } + + public FillStyle getFillStyle() { + return new FillStyle() { + public PaintStyle getPaint() { + switch (getFillType()) { + case FILL_SOLID: { + return new SolidPaint() { + public ColorStyle getSolidColor() { + return new ColorStyle() { + public Color getColor() { return getForegroundColor(); } + public int getAlpha() { return -1; } + public int getLumOff() { return -1; } + public int getLumMod() { return -1; } + public int getShade() { return -1; } + public int getTint() { return -1; } + }; + } + }; + } + case FILL_PICTURE: { + return new TexturePaint() { + final HSLFPictureData pd = getPictureData(); + + public InputStream getImageData() { + return new ByteArrayInputStream(pd.getData()); + } + + public String getContentType() { + return pd.getContentType(); + } + + public int getAlpha() { + return (int)(shape.getAlpha(EscherProperties.FILL__FILLOPACITY)*100000.0); + } + }; + } + default: + logger.log(POILogger.WARN, "unsuported fill type: " + getFillType()); + break; + } + return PaintStyle.TRANSPARENT_PAINT; + } + }; + } + /** * Returns fill type. * Must be one of the FILL_* constants defined in this class. @@ -124,7 +169,7 @@ public final class Fill { /** */ - protected void afterInsert(Sheet sh){ + protected void afterInsert(HSLFSheet sh){ EscherOptRecord opt = shape.getEscherOptRecord(); EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); if(p != null) { @@ -135,12 +180,12 @@ public final class Fill { } protected EscherBSERecord getEscherBSERecord(int idx){ - Sheet sheet = shape.getSheet(); + HSLFSheet sheet = shape.getSheet(); if(sheet == null) { logger.log(POILogger.DEBUG, "Fill has not yet been assigned to a sheet"); return null; } - SlideShow ppt = sheet.getSlideShow(); + HSLFSlideShow ppt = sheet.getSlideShow(); Document doc = ppt.getDocumentRecord(); EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer(); EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); @@ -220,13 +265,13 @@ public final class Fill { /** * PictureData object used in a texture, pattern of picture fill. */ - public PictureData getPictureData(){ + public HSLFPictureData getPictureData(){ EscherOptRecord opt = shape.getEscherOptRecord(); EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); if (p == null) return null; - SlideShow ppt = shape.getSheet().getSlideShow(); - PictureData[] pict = ppt.getPictureData(); + HSLFSlideShow ppt = shape.getSheet().getSlideShow(); + HSLFPictureData[] pict = ppt.getPictureData(); Document doc = ppt.getDocumentRecord(); EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFFreeformShape.java similarity index 97% rename from src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFFreeformShape.java index 6bf232af46..685e2dad2f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFFreeformShape.java @@ -45,7 +45,7 @@ import org.apache.poi.util.POILogger; *

* @author Yegor Kozlov */ -public final class Freeform extends AutoShape { +public final class HSLFFreeformShape extends HSLFAutoShape { public static final byte[] SEGMENTINFO_MOVETO = new byte[]{0x00, 0x40}; public static final byte[] SEGMENTINFO_LINETO = new byte[]{0x00, (byte)0xAC}; @@ -62,7 +62,7 @@ public final class Freeform extends AutoShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected Freeform(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected HSLFFreeformShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -73,7 +73,7 @@ public final class Freeform extends AutoShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public Freeform(ShapeContainer parent){ + public HSLFFreeformShape(ShapeContainer parent){ super((EscherContainerRecord)null, parent); _escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof HSLFGroupShape); } @@ -82,7 +82,7 @@ public final class Freeform extends AutoShape { * Create a new Freeform. This constructor is used when a new shape is created. * */ - public Freeform(){ + public HSLFFreeformShape(){ this(null); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFGroupShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFGroupShape.java index 336f11743a..64d4de28b4 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFGroupShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFGroupShape.java @@ -177,7 +177,7 @@ public class HSLFGroupShape extends HSLFShape implements ShapeContainer { + public HSLFMasterSheet(SheetContainer container, int sheetNo){ super(container, sheetNo); } @@ -47,9 +49,9 @@ public abstract class MasterSheet extends Sheet { * @return true if the shape is a placeholder */ public static boolean isPlaceholder(HSLFShape shape){ - if(!(shape instanceof TextShape)) return false; + if(!(shape instanceof HSLFTextShape)) return false; - TextShape tx = (TextShape)shape; + HSLFTextShape tx = (HSLFTextShape)shape; return tx.getPlaceholderAtom() != null; } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFNotes.java similarity index 50% rename from src/scratchpad/src/org/apache/poi/hslf/model/Notes.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFNotes.java index cdb05030b4..2a7698d21c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFNotes.java @@ -17,6 +17,12 @@ package org.apache.poi.hslf.model; +import java.util.Arrays; +import java.util.List; + +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.sl.usermodel.Notes; + /** * This class represents a slide's notes in a PowerPoint Document. It * allows access to the text within, and the layout. For now, it only @@ -25,42 +31,45 @@ package org.apache.poi.hslf.model; * @author Nick Burch */ -public final class Notes extends Sheet -{ - private TextRun[] _runs; +public final class HSLFNotes extends HSLFSheet implements Notes { + private HSLFTextParagraph[] _runs; - /** - * Constructs a Notes Sheet from the given Notes record. - * Initialises TextRuns, to provide easier access to the text - * - * @param notes the Notes record to read from - */ - public Notes (org.apache.poi.hslf.record.Notes notes) { - super(notes, notes.getNotesAtom().getSlideID()); + /** + * Constructs a Notes Sheet from the given Notes record. + * Initialises TextRuns, to provide easier access to the text + * + * @param notes the Notes record to read from + */ + public HSLFNotes(org.apache.poi.hslf.record.Notes notes) { + super(notes, notes.getNotesAtom().getSlideID()); - // Now, build up TextRuns from pairs of TextHeaderAtom and - // one of TextBytesAtom or TextCharsAtom, found inside - // EscherTextboxWrapper's in the PPDrawing - _runs = findTextRuns(getPPDrawing()); + // Now, build up TextRuns from pairs of TextHeaderAtom and + // one of TextBytesAtom or TextCharsAtom, found inside + // EscherTextboxWrapper's in the PPDrawing + _runs = findTextRuns(getPPDrawing()); - // Set the sheet on each TextRun - for (int i = 0; i < _runs.length; i++) - _runs[i].setSheet(this); - } + // Set the sheet on each TextRun + for (HSLFTextParagraph tp : _runs) { + tp.supplySheet(this); + } + } + /** + * Returns an array of all the TextRuns found + */ + public HSLFTextParagraph[] getTextRuns() { + return _runs; + } - // Accesser methods follow - - /** - * Returns an array of all the TextRuns found - */ - public TextRun[] getTextRuns() { return _runs; } - + @Override + public List getTextParagraphs() { + return Arrays.asList(_runs); + } + /** * Return null - Notes Masters are not yet supported */ - public MasterSheet getMasterSheet() { + public HSLFMasterSheet getMasterSheet() { return null; } - } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFPictureShape.java similarity index 93% rename from src/scratchpad/src/org/apache/poi/hslf/model/Picture.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFPictureShape.java index 8c3b2b6399..e6b72a60fb 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFPictureShape.java @@ -37,8 +37,8 @@ import org.apache.poi.ddf.EscherSimpleProperty; import org.apache.poi.ddf.EscherSpRecord; import org.apache.poi.hslf.blip.Bitmap; import org.apache.poi.hslf.record.Document; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFPictureData; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.POILogger; @@ -51,7 +51,7 @@ import org.apache.poi.util.Units; * * @author Yegor Kozlov */ -public class Picture extends SimpleShape { +public class HSLFPictureShape extends HSLFSimpleShape { /** * Windows Enhanced Metafile (EMF) @@ -88,7 +88,7 @@ public class Picture extends SimpleShape { * * @param idx the index of the picture */ - public Picture(int idx){ + public HSLFPictureShape(int idx){ this(idx, null); } @@ -98,7 +98,7 @@ public class Picture extends SimpleShape { * @param idx the index of the picture * @param parent the parent shape */ - public Picture(int idx, ShapeContainer parent) { + public HSLFPictureShape(int idx, ShapeContainer parent) { super(null, parent); _escherContainer = createSpContainer(idx, parent instanceof HSLFGroupShape); } @@ -110,7 +110,7 @@ public class Picture extends SimpleShape { * this picture in the Slide * @param parent the parent shape of this picture */ - protected Picture(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected HSLFPictureShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -156,7 +156,7 @@ public class Picture extends SimpleShape { * for other types sets the default size of 200x200 pixels. */ public void setDefaultSize(){ - PictureData pict = getPictureData(); + HSLFPictureData pict = getPictureData(); if (pict instanceof Bitmap){ BufferedImage img = null; try { @@ -183,9 +183,9 @@ public class Picture extends SimpleShape { * * @return the picture data for this picture. */ - public PictureData getPictureData(){ - SlideShow ppt = getSheet().getSlideShow(); - PictureData[] pict = ppt.getPictureData(); + public HSLFPictureData getPictureData(){ + HSLFSlideShow ppt = getSheet().getSlideShow(); + HSLFPictureData[] pict = ppt.getPictureData(); EscherBSERecord bse = getEscherBSERecord(); if (bse == null){ @@ -202,7 +202,7 @@ public class Picture extends SimpleShape { } protected EscherBSERecord getEscherBSERecord(){ - SlideShow ppt = getSheet().getSlideShow(); + HSLFSlideShow ppt = getSheet().getSlideShow(); Document doc = ppt.getDocumentRecord(); EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer(); EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); @@ -247,7 +247,7 @@ public class Picture extends SimpleShape { /** * By default set the orininal image size */ - protected void afterInsert(Sheet sh){ + protected void afterInsert(HSLFSheet sh){ super.afterInsert(sh); EscherBSERecord bse = getEscherBSERecord(); @@ -263,7 +263,7 @@ public class Picture extends SimpleShape { AffineTransform at = graphics.getTransform(); ShapePainter.paint(this, graphics); - PictureData data = getPictureData(); + HSLFPictureData data = getPictureData(); if(data != null) data.draw(graphics, this); graphics.setTransform(at); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java index c673cae2de..4e2229982e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java @@ -17,17 +17,15 @@ package org.apache.poi.hslf.model; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; +import java.util.Iterator; + import org.apache.poi.ddf.*; import org.apache.poi.hslf.record.ColorSchemeAtom; -import org.apache.poi.sl.usermodel.ShapeContainer; -import org.apache.poi.sl.usermodel.ShapeType; -import org.apache.poi.util.POILogger; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.Units; - -import java.util.*; -import java.awt.*; -import java.awt.geom.Rectangle2D; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.util.*; /** *

@@ -45,7 +43,7 @@ import java.awt.geom.Rectangle2D; * * @author Yegor Kozlov */ -public abstract class HSLFShape implements org.apache.poi.sl.usermodel.Shape { +public abstract class HSLFShape implements Shape { // For logging protected POILogger logger = POILogFactory.getLogger(this.getClass()); @@ -90,12 +88,12 @@ public abstract class HSLFShape implements org.apache.poi.sl.usermodel.ShapeSheet this shape belongs to */ - protected Sheet _sheet; + protected HSLFSheet _sheet; /** * Fill */ - protected Fill _fill; + protected HSLFFill _fill; /** * Create a Shape object. This constructor is used when an existing Shape is read from from a PowerPoint document. @@ -336,7 +334,7 @@ public abstract class HSLFShape implements org.apache.poi.sl.usermodel.ShapeSlideShow this shape belongs to */ - public Sheet getSheet(){ + public HSLFSheet getSheet(){ return _sheet; } @@ -354,7 +352,7 @@ public abstract class HSLFShape implements org.apache.poi.sl.usermodel.Shape> 24) & 0xFF; int b = (val >> 16) & 0xFF; @@ -446,11 +449,16 @@ public abstract class HSLFShape implements org.apache.poi.sl.usermodel.Shape { - private static POILogger logger = POILogFactory.getLogger(Sheet.class); +public abstract class HSLFSheet implements Sheet { + private static POILogger logger = POILogFactory.getLogger(HSLFSheet.class); /** * The SlideShow we belong to */ - private SlideShow _slideShow; + private HSLFSlideShow _slideShow; /** * Sheet background */ - private Background _background; + private HSLFBackground _background; /** * Record container that holds sheet data. @@ -80,7 +58,7 @@ public abstract class Sheet implements ShapeContainer { private int _sheetNo; - public Sheet(SheetContainer container, int sheetNo) { + public HSLFSheet(SheetContainer container, int sheetNo) { _container = container; _sheetNo = sheetNo; } @@ -88,7 +66,7 @@ public abstract class Sheet implements ShapeContainer { /** * Returns an array of all the TextRuns in the sheet. */ - public abstract TextRun[] getTextRuns(); + public abstract HSLFTextParagraph[] getTextRuns(); /** * Returns the (internal, RefID based) sheet number, as used @@ -116,7 +94,7 @@ public abstract class Sheet implements ShapeContainer { /** * Fetch the SlideShow we're attached to */ - public SlideShow getSlideShow() { + public HSLFSlideShow getSlideShow() { return _slideShow; } @@ -131,13 +109,12 @@ public abstract class Sheet implements ShapeContainer { * Set the SlideShow we're attached to. * Also passes it on to our child RichTextRuns */ - public void setSlideShow(SlideShow ss) { + public void setSlideShow(HSLFSlideShow ss) { _slideShow = ss; - TextRun[] trs = getTextRuns(); - if (trs != null) { - for (int i = 0; i < trs.length; i++) { - trs[i].supplySlideShow(_slideShow); - } + HSLFTextParagraph[] trs = getTextRuns(); + if (trs == null) return; + for (HSLFTextParagraph tp : trs) { + tp.supplySheet(this); } } @@ -145,8 +122,8 @@ public abstract class Sheet implements ShapeContainer { /** * For a given PPDrawing, grab all the TextRuns */ - public static TextRun[] findTextRuns(PPDrawing ppdrawing) { - final List runsV = new ArrayList(); + public static HSLFTextParagraph[] findTextRuns(PPDrawing ppdrawing) { + final List runsV = new ArrayList(); final EscherTextboxWrapper[] wrappers = ppdrawing.getTextboxWrappers(); for (int i = 0; i < wrappers.length; i++) { int s1 = runsV.size(); @@ -156,11 +133,11 @@ public abstract class Sheet implements ShapeContainer { findTextRuns(wrappers[i], runsV); int s2 = runsV.size(); if (s2 != s1){ - TextRun t = runsV.get(runsV.size()-1); + HSLFTextParagraph t = runsV.get(runsV.size()-1); t.setShapeId(wrappers[i].getShapeId()); } } - return runsV.toArray(new TextRun[runsV.size()]); + return runsV.toArray(new HSLFTextParagraph[runsV.size()]); } /** * Scans through the supplied record array, looking for @@ -170,7 +147,7 @@ public abstract class Sheet implements ShapeContainer { * @param records the records to build from * @param found vector to add any found to */ - protected static void findTextRuns(final Record[] records, final List found) { + protected static void findTextParagraphs(final Record[] records, final List found) { findTextRuns(records, found, null); } /** @@ -181,7 +158,7 @@ public abstract class Sheet implements ShapeContainer { * @param wrapper an EscherTextboxWrapper * @param found vector to add any found to */ - protected static void findTextRuns(final EscherTextboxWrapper wrapper, final List found) { + protected static void findTextRuns(final EscherTextboxWrapper wrapper, final List found) { findTextRuns(wrapper.getChildRecords(), found, wrapper.getStyleTextProp9Atom()); } /** @@ -193,12 +170,12 @@ public abstract class Sheet implements ShapeContainer { * @param found vector to add any found to * @param styleTextProp9Atom a StyleTextProp9Atom with numbered lists info */ - protected static void findTextRuns(final Record[] records, final List found, final StyleTextProp9Atom styleTextProp9Atom) { + protected static void findTextRuns(final Record[] records, final List found, final StyleTextProp9Atom styleTextProp9Atom) { for (int i = 0, slwtIndex=0; i < (records.length - 1); i++) { if (records[i] instanceof TextHeaderAtom) { TextHeaderAtom tha = (TextHeaderAtom) records[i]; StyleTextPropAtom stpa = null; - TextRun trun = null; + HSLFTextParagraph trun = null; Record next = null; Record subs = null; @@ -231,10 +208,10 @@ public abstract class Sheet implements ShapeContainer { // Now, check if the next record is one to record if (next instanceof TextCharsAtom) { TextCharsAtom tca = (TextCharsAtom)next; - trun = new TextRun(tha, tca, stpa); + trun = new HSLFTextParagraph(tha, tca, stpa); } else if (next instanceof TextBytesAtom) { TextBytesAtom tba = (TextBytesAtom)next; - trun = new TextRun(tha, tba, stpa); + trun = new HSLFTextParagraph(tha, tba, stpa); } else if (next instanceof StyleTextPropAtom) { stpa = (StyleTextPropAtom)next; } else if (next instanceof TextHeaderAtom) { @@ -372,7 +349,7 @@ public abstract class Sheet implements ShapeContainer { /** * Return the master sheet . */ - public abstract MasterSheet getMasterSheet(); + public abstract HSLFMasterSheet getMasterSheet(); /** * Color scheme for this sheet. @@ -386,7 +363,7 @@ public abstract class Sheet implements ShapeContainer { * * @return the background shape for this sheet. */ - public Background getBackground() { + public HSLFBackground getBackground() { if (_background == null) { PPDrawing ppdrawing = getPPDrawing(); @@ -400,7 +377,7 @@ public abstract class Sheet implements ShapeContainer { break; } } - _background = new Background(spContainer, null); + _background = new HSLFBackground(spContainer, null); _background.setSheet(this); } return _background; @@ -416,7 +393,7 @@ public abstract class Sheet implements ShapeContainer { * * @param shape */ - protected void onAddTextShape(TextShape shape) { + protected void onAddTextShape(HSLFTextShape shape) { } @@ -426,12 +403,12 @@ public abstract class Sheet implements ShapeContainer { * @param type type of text, See {@link org.apache.poi.hslf.record.TextHeaderAtom} * @return TextShape or null */ - public TextShape getPlaceholderByTextType(int type){ + public HSLFTextShape getPlaceholderByTextType(int type){ HSLFShape[] shape = getShapes(); for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof TextShape){ - TextShape tx = (TextShape)shape[i]; - TextRun run = tx.getTextRun(); + if(shape[i] instanceof HSLFTextShape){ + HSLFTextShape tx = (HSLFTextShape)shape[i]; + HSLFTextParagraph run = tx.getTextParagraph(); if(run != null && run.getRunType() == type){ return tx; } @@ -446,11 +423,11 @@ public abstract class Sheet implements ShapeContainer { * @param type type of placeholder to search. See {@link org.apache.poi.hslf.record.OEPlaceholderAtom} * @return TextShape or null */ - public TextShape getPlaceholder(int type){ + public HSLFTextShape getPlaceholder(int type){ HSLFShape[] shape = getShapes(); for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof TextShape){ - TextShape tx = (TextShape)shape[i]; + if(shape[i] instanceof HSLFTextShape){ + HSLFTextShape tx = (HSLFTextShape)shape[i]; int placeholderId = 0; OEPlaceholderAtom oep = tx.getPlaceholderAtom(); if(oep != null) { @@ -540,4 +517,14 @@ public abstract class Sheet implements ShapeContainer { return shapeList; } + /** + * @return whether shapes on the master sheet should be shown. By default master graphics is turned off. + * Sheets that support the notion of master (slide, slideLayout) should override it and + * check this setting + */ + public boolean getFollowMasterGraphics() { + return false; + } + + } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSimpleShape.java similarity index 89% rename from src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFSimpleShape.java index bfe6a1d95a..71c3c34d77 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSimpleShape.java @@ -38,8 +38,10 @@ import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.hslf.record.InteractiveInfo; import org.apache.poi.hslf.record.InteractiveInfoAtom; import org.apache.poi.hslf.record.Record; -import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.StrokeStyle.*; import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.Units; /** * An abstract simple (non-group) shape. @@ -47,7 +49,7 @@ import org.apache.poi.util.LittleEndian; * * @author Yegor Kozlov */ -public abstract class SimpleShape extends HSLFShape { +public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { public final static double DEFAULT_LINE_WIDTH = 0.75; @@ -63,7 +65,7 @@ public abstract class SimpleShape extends HSLFShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected SimpleShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected HSLFSimpleShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -112,7 +114,7 @@ public abstract class SimpleShape extends HSLFShape { public double getLineWidth(){ EscherOptRecord opt = getEscherOptRecord(); EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH); - double width = prop == null ? DEFAULT_LINE_WIDTH : (double)prop.getPropertyValue()/EMU_PER_POINT; + double width = (prop == null) ? DEFAULT_LINE_WIDTH : Units.toPoints(prop.getPropertyValue()); return width; } @@ -122,7 +124,7 @@ public abstract class SimpleShape extends HSLFShape { */ public void setLineWidth(double width){ EscherOptRecord opt = getEscherOptRecord(); - setEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH, (int)(width*EMU_PER_POINT)); + setEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH, Units.toEMU(width)); } /** @@ -155,36 +157,45 @@ public abstract class SimpleShape extends HSLFShape { } /** - * Gets line dashing. One of the PEN_* constants defined in this class. + * Gets line dashing. * * @return dashing of the line. */ - public int getLineDashing(){ + public LineDash getLineDashing(){ EscherOptRecord opt = getEscherOptRecord(); - EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINEDASHING); - return prop == null ? Line.PEN_SOLID : prop.getPropertyValue(); + return (prop == null) ? LineDash.SOLID : LineDash.fromNativeId(prop.getPropertyValue()); } /** - * Sets line dashing. One of the PEN_* constants defined in this class. + * Sets line dashing. * * @param pen new style of the line. */ - public void setLineDashing(int pen){ + public void setLineDashing(LineDash pen){ EscherOptRecord opt = getEscherOptRecord(); - - setEscherProperty(opt, EscherProperties.LINESTYLE__LINEDASHING, pen == Line.PEN_SOLID ? -1 : pen); + setEscherProperty(opt, EscherProperties.LINESTYLE__LINEDASHING, pen == LineDash.SOLID ? -1 : pen.nativeId); } /** - * Sets line style. One of the constants defined in this class. + * Gets the line compound style * - * @param style new style of the line. + * @return the compound style of the line. */ - public void setLineStyle(int style){ + public LineCompound getLineCompound() { EscherOptRecord opt = getEscherOptRecord(); - setEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE, style == Line.LINE_SIMPLE ? -1 : style); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE); + return (prop == null) ? LineCompound.SINGLE : LineCompound.fromNativeId(prop.getPropertyValue()); + } + + /** + * Sets the line compound style + * + * @param style new compound style of the line. + */ + public void setLineCompound(LineCompound style){ + EscherOptRecord opt = getEscherOptRecord(); + setEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE, style == LineCompound.SINGLE ? -1 : style.nativeId); } /** @@ -192,10 +203,29 @@ public abstract class SimpleShape extends HSLFShape { * * @return style of the line. */ - public int getStrokeStyle(){ - EscherOptRecord opt = getEscherOptRecord(); - EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE); - return prop == null ? Line.LINE_SIMPLE : prop.getPropertyValue(); + public StrokeStyle getStrokeStyle(){ + return new StrokeStyle() { + public PaintStyle getPaint() { + return null; + } + + public LineCap getLineCap() { + return null; + } + + public LineDash getLineDash() { + return null; + } + + public LineCompound getLineCompound() { + return null; + } + + public double getLineWidth() { + return 0; + } + + }; } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlide.java similarity index 88% rename from src/scratchpad/src/org/apache/poi/hslf/model/Slide.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlide.java index 1db3173e6a..7030ce73e1 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlide.java @@ -37,7 +37,9 @@ import org.apache.poi.hslf.record.SlideAtom; import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet; import org.apache.poi.hslf.record.StyleTextProp9Atom; import org.apache.poi.hslf.record.TextHeaderAtom; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.usermodel.Slide; /** * This class represents a slide in a PowerPoint Document. It allows @@ -48,11 +50,11 @@ import org.apache.poi.sl.usermodel.ShapeType; * @author Yegor Kozlov */ -public final class Slide extends Sheet { +public final class HSLFSlide extends HSLFSheet implements Slide { private int _slideNo; private SlideAtomsSet _atomSet; - private TextRun[] _runs; - private Notes _notes; // usermodel needs to set this + private HSLFTextParagraph[] _runs; + private HSLFNotes _notes; // usermodel needs to set this /** * Constructs a Slide from the Slide record, and the SlideAtomsSet @@ -63,7 +65,7 @@ public final class Slide extends Sheet { * @param notes the Notes sheet attached to us * @param atomSet the SlideAtomsSet to get the text from */ - public Slide(org.apache.poi.hslf.record.Slide slide, Notes notes, SlideAtomsSet atomSet, int slideIdentifier, int slideNumber) { + public HSLFSlide(org.apache.poi.hslf.record.Slide slide, HSLFNotes notes, SlideAtomsSet atomSet, int slideIdentifier, int slideNumber) { super(slide, slideIdentifier); _notes = notes; @@ -71,31 +73,31 @@ public final class Slide extends Sheet { _slideNo = slideNumber; // Grab the TextRuns from the PPDrawing - TextRun[] _otherRuns = findTextRuns(getPPDrawing()); + HSLFTextParagraph[] _otherRuns = findTextRuns(getPPDrawing()); // For the text coming in from the SlideAtomsSet: // Build up TextRuns from pairs of TextHeaderAtom and // one of TextBytesAtom or TextCharsAtom - final List textRuns = new LinkedList(); + final List textParagraphs = new LinkedList(); if(_atomSet != null) { - findTextRuns(_atomSet.getSlideRecords(),textRuns); + findTextParagraphs(_atomSet.getSlideRecords(),textParagraphs); } else { // No text on the slide, must just be pictures } // Build an array, more useful than a vector - _runs = new TextRun[textRuns.size()+_otherRuns.length]; + _runs = new HSLFTextParagraph[textParagraphs.size()+_otherRuns.length]; // Grab text from SlideListWithTexts entries int i=0; - for(i=0; iTextBox object that represents the slide's title. */ - public TextBox addTitle() { + public HSLFTextBox addTitle() { Placeholder pl = new Placeholder(); pl.setShapeType(ShapeType.RECT); - pl.getTextRun().setRunType(TextHeaderAtom.TITLE_TYPE); + pl.getTextParagraph().setRunType(TextHeaderAtom.TITLE_TYPE); pl.setText("Click to edit title"); pl.setAnchor(new java.awt.Rectangle(54, 48, 612, 90)); addShape(pl); @@ -203,7 +205,7 @@ public final class Slide extends Sheet { * @return title of this slide */ public String getTitle(){ - TextRun[] txt = getTextRuns(); + HSLFTextParagraph[] txt = getTextRuns(); for (int i = 0; i < txt.length; i++) { int type = txt[i].getRunType(); if (type == TextHeaderAtom.CENTER_TITLE_TYPE || @@ -220,7 +222,7 @@ public final class Slide extends Sheet { /** * Returns an array of all the TextRuns found */ - public TextRun[] getTextRuns() { return _runs; } + public HSLFTextParagraph[] getTextRuns() { return _runs; } /** * Returns the (public facing) page number of this slide @@ -237,7 +239,7 @@ public final class Slide extends Sheet { /** * Returns the Notes Sheet for this slide, or null if there isn't one */ - public Notes getNotesSheet() { return _notes; } + public HSLFNotes getNotesSheet() { return _notes; } /** * @return set of records inside SlideListWithtext container @@ -251,11 +253,11 @@ public final class Slide extends Sheet { * * @return the master sheet associated with this slide. */ - public MasterSheet getMasterSheet(){ + public HSLFMasterSheet getMasterSheet(){ SlideMaster[] master = getSlideShow().getSlidesMasters(); SlideAtom sa = getSlideRecord().getSlideAtom(); int masterId = sa.getMasterID(); - MasterSheet sheet = null; + HSLFMasterSheet sheet = null; for (int i = 0; i < master.length; i++) { if (masterId == master[i]._getSheetNumber()) { sheet = master[i]; @@ -277,7 +279,7 @@ public final class Slide extends Sheet { /** * Change Master of this slide. */ - public void setMasterSheet(MasterSheet master){ + public void setMasterSheet(HSLFMasterSheet master){ SlideAtom sa = getSlideRecord().getSlideAtom(); int sheetNo = master._getSheetNumber(); sa.setMasterID(sheetNo); @@ -352,7 +354,7 @@ public final class Slide extends Sheet { /** * Background for this slide. */ - public Background getBackground() { + public HSLFBackground getBackground() { if(getFollowMasterBackground()) { return getMasterSheet().getBackground(); } @@ -423,14 +425,14 @@ public final class Slide extends Sheet { } public void draw(Graphics2D graphics){ - MasterSheet master = getMasterSheet(); - Background bg = getBackground(); + HSLFMasterSheet master = getMasterSheet(); + HSLFBackground bg = getBackground(); if(bg != null)bg.draw(graphics); if(getFollowMasterObjects()){ HSLFShape[] sh = master.getShapes(); for (int i = 0; i < sh.length; i++) { - if(MasterSheet.isPlaceholder(sh[i])) continue; + if(HSLFMasterSheet.isPlaceholder(sh[i])) continue; sh[i].draw(graphics); } @@ -469,12 +471,12 @@ public final class Slide extends Sheet { return new HeadersFooters(hdd, this, newRecord, ppt2007); } - protected void onAddTextShape(TextShape shape) { - TextRun run = shape.getTextRun(); + protected void onAddTextShape(HSLFTextShape shape) { + HSLFTextParagraph run = shape.getTextParagraph(); - if(_runs == null) _runs = new TextRun[]{run}; + if(_runs == null) _runs = new HSLFTextParagraph[]{run}; else { - TextRun[] tmp = new TextRun[_runs.length + 1]; + HSLFTextParagraph[] tmp = new HSLFTextParagraph[_runs.length + 1]; System.arraycopy(_runs, 0, tmp, 0, _runs.length); tmp[tmp.length-1] = run; _runs = tmp; diff --git a/src/scratchpad/src/org/apache/poi/hslf/EncryptedSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowEncrypted.java similarity index 98% rename from src/scratchpad/src/org/apache/poi/hslf/EncryptedSlideShow.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowEncrypted.java index 07a01aa244..803aeacaf3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/EncryptedSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowEncrypted.java @@ -15,7 +15,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf; +package org.apache.poi.hslf.model; import java.io.OutputStream; import java.security.GeneralSecurityException; @@ -49,7 +49,7 @@ import org.apache.poi.util.LittleEndian; * This class provides helper functions for encrypted PowerPoint documents. */ @Internal -public class EncryptedSlideShow { +public class HSLFSlideShowEncrypted { DocumentEncryptionAtom dea; CryptoAPIEncryptor enc = null; CryptoAPIDecryptor dec = null; @@ -58,11 +58,11 @@ public class EncryptedSlideShow { private static final BitField fieldRecInst = new BitField(0xFFF0); - protected EncryptedSlideShow(DocumentEncryptionAtom dea) { + protected HSLFSlideShowEncrypted(DocumentEncryptionAtom dea) { this.dea = dea; } - protected EncryptedSlideShow(byte[] docstream, NavigableMap recordMap) { + protected HSLFSlideShowEncrypted(byte[] docstream, NavigableMap recordMap) { // check for DocumentEncryptionAtom, which would be at the last offset // need to ignore already set UserEdit and PersistAtoms UserEditAtom userEditAtomWithEncryption = null; @@ -362,7 +362,7 @@ public class EncryptedSlideShow { /** * remove duplicated UserEditAtoms and merge PersistPtrHolder. * Before this method is called, make sure that the offsets are correct, - * i.e. call {@link HSLFSlideShow#updateAndWriteDependantRecords(OutputStream, Map)} + * i.e. call {@link HSLFSlideShowImpl#updateAndWriteDependantRecords(OutputStream, Map)} */ protected static Record[] normalizeRecords(Record records[]) { // http://msdn.microsoft.com/en-us/library/office/gg615594(v=office.14).aspx diff --git a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowImpl.java similarity index 93% rename from src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowImpl.java index 55c3f6f876..48e52da65c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowImpl.java @@ -15,7 +15,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf; +package org.apache.poi.hslf.model; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -45,8 +45,8 @@ import org.apache.poi.hslf.record.PositionDependentRecord; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; import org.apache.poi.hslf.record.UserEditAtom; -import org.apache.poi.hslf.usermodel.ObjectData; -import org.apache.poi.hslf.usermodel.PictureData; +import org.apache.poi.hslf.usermodel.HSLFObjectData; +import org.apache.poi.hslf.usermodel.HSLFPictureData; import org.apache.poi.poifs.crypt.cryptoapi.CryptoAPIEncryptor; import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.DocumentEntry; @@ -64,7 +64,7 @@ import org.apache.poi.util.POILogger; * * @author Nick Burch */ -public final class HSLFSlideShow extends POIDocument { +public final class HSLFSlideShowImpl extends POIDocument { public static final int UNSET_OFFSET = -1; // For logging @@ -80,10 +80,10 @@ public final class HSLFSlideShow extends POIDocument { private Record[] _records; // Raw Pictures contained in the pictures stream - private List _pictures; + private List _pictures; // Embedded objects stored in storage records in the document stream, lazily populated. - private ObjectData[] _objects; + private HSLFObjectData[] _objects; /** * Returns the underlying POIFSFileSystem for the document @@ -108,7 +108,7 @@ public final class HSLFSlideShow extends POIDocument { * @param fileName The name of the file to read. * @throws IOException if there is a problem while parsing the document. */ - public HSLFSlideShow(String fileName) throws IOException + public HSLFSlideShowImpl(String fileName) throws IOException { this(new FileInputStream(fileName)); } @@ -120,7 +120,7 @@ public final class HSLFSlideShow extends POIDocument { * @param inputStream the source of the data * @throws IOException if there is a problem while parsing the document. */ - public HSLFSlideShow(InputStream inputStream) throws IOException { + public HSLFSlideShowImpl(InputStream inputStream) throws IOException { //do Ole stuff this(new POIFSFileSystem(inputStream)); } @@ -132,7 +132,7 @@ public final class HSLFSlideShow extends POIDocument { * @param filesystem the POIFS FileSystem to read from * @throws IOException if there is a problem while parsing the document. */ - public HSLFSlideShow(POIFSFileSystem filesystem) throws IOException + public HSLFSlideShowImpl(POIFSFileSystem filesystem) throws IOException { this(filesystem.getRoot()); } @@ -144,7 +144,7 @@ public final class HSLFSlideShow extends POIDocument { * @param filesystem the POIFS FileSystem to read from * @throws IOException if there is a problem while parsing the document. */ - public HSLFSlideShow(NPOIFSFileSystem filesystem) throws IOException + public HSLFSlideShowImpl(NPOIFSFileSystem filesystem) throws IOException { this(filesystem.getRoot()); } @@ -160,7 +160,7 @@ public final class HSLFSlideShow extends POIDocument { * @throws IOException if there is a problem while parsing the document. */ @Deprecated - public HSLFSlideShow(DirectoryNode dir, POIFSFileSystem filesystem) throws IOException + public HSLFSlideShowImpl(DirectoryNode dir, POIFSFileSystem filesystem) throws IOException { this(dir); } @@ -173,7 +173,7 @@ public final class HSLFSlideShow extends POIDocument { * @param dir the POIFS directory to read from * @throws IOException if there is a problem while parsing the document. */ - public HSLFSlideShow(DirectoryNode dir) throws IOException { + public HSLFSlideShowImpl(DirectoryNode dir) throws IOException { super(handleDualStorage(dir)); // First up, grab the "Current User" stream @@ -202,13 +202,13 @@ public final class HSLFSlideShow extends POIDocument { /** * Constructs a new, empty, Powerpoint document. */ - public static final HSLFSlideShow create() { - InputStream is = HSLFSlideShow.class.getResourceAsStream("data/empty.ppt"); + public static final HSLFSlideShowImpl create() { + InputStream is = HSLFSlideShowImpl.class.getResourceAsStream("data/empty.ppt"); if (is == null) { throw new RuntimeException("Missing resource 'empty.ppt'"); } try { - return new HSLFSlideShow(is); + return new HSLFSlideShowImpl(is); } catch (IOException e) { throw new RuntimeException(e); } @@ -279,7 +279,7 @@ public final class HSLFSlideShow extends POIDocument { NavigableMap records = new TreeMap(); // offset -> record Map persistIds = new HashMap(); // offset -> persistId initRecordOffsets(docstream, usrOffset, records, persistIds); - EncryptedSlideShow decryptData = new EncryptedSlideShow(docstream, records); + HSLFSlideShowEncrypted decryptData = new HSLFSlideShowEncrypted(docstream, records); for (Map.Entry entry : records.entrySet()) { Integer offset = entry.getKey(); @@ -373,12 +373,12 @@ public final class HSLFSlideShow extends POIDocument { */ @SuppressWarnings("unused") private void readPictures() throws IOException { - _pictures = new ArrayList(); + _pictures = new ArrayList(); // if the presentation doesn't contain pictures - will use a null set instead if (!directory.hasEntry("Pictures")) return; - EncryptedSlideShow decryptData = new EncryptedSlideShow(getDocumentEncryptionAtom()); + HSLFSlideShowEncrypted decryptData = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom()); DocumentEntry entry = (DocumentEntry)directory.getEntry("Pictures"); byte[] pictstream = new byte[entry.getSize()]; @@ -423,7 +423,7 @@ public final class HSLFSlideShow extends POIDocument { } else { // Build the PictureData object from the data try { - PictureData pict = PictureData.create(type - 0xF018); + HSLFPictureData pict = HSLFPictureData.create(type - 0xF018); // Copy the data, ready to pass to PictureData byte[] imgdata = new byte[imgsize]; @@ -451,7 +451,7 @@ public final class HSLFSlideShow extends POIDocument { } catch (IOException e) { throw new CorruptPowerPointFileException(e); } - _records = EncryptedSlideShow.normalizeRecords(_records); + _records = HSLFSlideShowEncrypted.normalizeRecords(_records); } @@ -517,7 +517,7 @@ public final class HSLFSlideShow extends POIDocument { persistIds.put(oldToNewPositions.get(entry.getValue()), entry.getKey()); } - EncryptedSlideShow encData = new EncryptedSlideShow(getDocumentEncryptionAtom()); + HSLFSlideShowEncrypted encData = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom()); for (Record record : _records) { assert(record instanceof PositionDependentRecord); @@ -580,7 +580,7 @@ public final class HSLFSlideShow extends POIDocument { getDocumentSummaryInformation(); // set new encryption settings - EncryptedSlideShow encryptedSS = new EncryptedSlideShow(getDocumentEncryptionAtom()); + HSLFSlideShowEncrypted encryptedSS = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom()); _records = encryptedSS.updateEncryptionRecord(_records); // Get a new Filesystem to write into @@ -615,7 +615,7 @@ public final class HSLFSlideShow extends POIDocument { if (_pictures.size() > 0) { BufAccessBAOS pict = new BufAccessBAOS(); - for (PictureData p : _pictures) { + for (HSLFPictureData p : _pictures) { int offset = pict.size(); p.write(pict); encryptedSS.encryptPicture(pict.getBuf(), offset); @@ -704,7 +704,7 @@ public final class HSLFSlideShow extends POIDocument { * * @return offset of this picture in the Pictures stream */ - public int addPicture(PictureData img) { + public int addPicture(HSLFPictureData img) { // Process any existing pictures if we haven't yet if(_pictures == null) { try { @@ -717,7 +717,7 @@ public final class HSLFSlideShow extends POIDocument { // Add the new picture in int offset = 0; if(_pictures.size() > 0) { - PictureData prev = _pictures.get(_pictures.size() - 1); + HSLFPictureData prev = _pictures.get(_pictures.size() - 1); offset = prev.getOffset() + prev.getRawData().length + 8; } img.setOffset(offset); @@ -750,7 +750,7 @@ public final class HSLFSlideShow extends POIDocument { * @return array with the read pictures or null if the * presentation doesn't contain pictures. */ - public PictureData[] getPictures() { + public HSLFPictureData[] getPictures() { if(_pictures == null) { try { readPictures(); @@ -759,7 +759,7 @@ public final class HSLFSlideShow extends POIDocument { } } - return _pictures.toArray(new PictureData[_pictures.size()]); + return _pictures.toArray(new HSLFPictureData[_pictures.size()]); } /** @@ -767,15 +767,15 @@ public final class HSLFSlideShow extends POIDocument { * * @return the embedded objects. */ - public ObjectData[] getEmbeddedObjects() { + public HSLFObjectData[] getEmbeddedObjects() { if (_objects == null) { - List objects = new ArrayList(); + List objects = new ArrayList(); for (Record r : _records) { if (r instanceof ExOleObjStg) { - objects.add(new ObjectData((ExOleObjStg)r)); + objects.add(new HSLFObjectData((ExOleObjStg)r)); } } - _objects = objects.toArray(new ObjectData[objects.size()]); + _objects = objects.toArray(new HSLFObjectData[objects.size()]); } return _objects; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextBox.java similarity index 89% rename from src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextBox.java index dc5ac94104..25ea585c95 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextBox.java @@ -30,7 +30,7 @@ import org.apache.poi.sl.usermodel.ShapeType; * * @author Yegor Kozlov */ -public class TextBox extends TextShape { +public class HSLFTextBox extends HSLFTextShape { /** * Create a TextBox object and initialize it from the supplied Record container. @@ -38,7 +38,7 @@ public class TextBox extends TextShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected TextBox(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected HSLFTextBox(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -49,7 +49,7 @@ public class TextBox extends TextShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public TextBox(ShapeContainer parent){ + public HSLFTextBox(ShapeContainer parent){ super(parent); } @@ -57,7 +57,7 @@ public class TextBox extends TextShape { * Create a new TextBox. This constructor is used when a new shape is created. * */ - public TextBox(){ + public HSLFTextBox(){ this(null); } @@ -84,8 +84,8 @@ public class TextBox extends TextShape { return _escherContainer; } - protected void setDefaultTextProperties(TextRun _txtrun){ - setVerticalAlignment(TextBox.AnchorTop); + protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){ + setVerticalAlignment(HSLFTextBox.AnchorTop); setEscherProperty(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE, 0x20002); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextParagraph.java similarity index 90% rename from src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextParagraph.java index 755482f183..b23c997dbe 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextParagraph.java @@ -1,746 +1,744 @@ -/* ==================================================================== - 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.hslf.model; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import org.apache.poi.hslf.model.textproperties.TextPropCollection; -import org.apache.poi.hslf.record.PPDrawing; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.RecordContainer; -import org.apache.poi.hslf.record.SlideListWithText; -import org.apache.poi.hslf.record.StyleTextProp9Atom; -import org.apache.poi.hslf.record.StyleTextPropAtom; -import org.apache.poi.hslf.record.TextBytesAtom; -import org.apache.poi.hslf.record.TextCharsAtom; -import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.record.TextRulerAtom; -import org.apache.poi.hslf.record.TextSpecInfoAtom; -import org.apache.poi.hslf.usermodel.RichTextRun; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.util.StringUtil; - -/** - * This class represents a run of text in a powerpoint document. That - * run could be text on a sheet, or text in a note. - * It is only a very basic class for now - * - * @author Nick Burch - */ - -public final class TextRun -{ - // Note: These fields are protected to help with unit testing - // Other classes shouldn't really go playing with them! - protected TextHeaderAtom _headerAtom; - protected TextBytesAtom _byteAtom; - protected TextCharsAtom _charAtom; - protected StyleTextPropAtom _styleAtom; - protected TextRulerAtom _ruler; - protected boolean _isUnicode; - protected RichTextRun[] _rtRuns; - private SlideShow slideShow; - private Sheet _sheet; - private int shapeId; - private int slwtIndex = -1; //position in the owning SlideListWithText - /** - * all text run records that follow TextHeaderAtom. - * (there can be misc InteractiveInfo, TxInteractiveInfo and other records) - */ - protected Record[] _records; - // private StyleTextPropAtom styleTextPropAtom; - private StyleTextProp9Atom styleTextProp9Atom; - - /** - * Constructs a Text Run from a Unicode text block - * - * @param tha the TextHeaderAtom that defines what's what - * @param tca the TextCharsAtom containing the text - * @param sta the StyleTextPropAtom which defines the character stylings - */ - public TextRun(TextHeaderAtom tha, TextCharsAtom tca, StyleTextPropAtom sta) { - this(tha,null,tca,sta); - } - - /** - * Constructs a Text Run from a Ascii text block - * - * @param tha the TextHeaderAtom that defines what's what - * @param tba the TextBytesAtom containing the text - * @param sta the StyleTextPropAtom which defines the character stylings - */ - public TextRun(TextHeaderAtom tha, TextBytesAtom tba, StyleTextPropAtom sta) { - this(tha,tba,null,sta); - } - - /** - * Internal constructor and initializer - */ - private TextRun(TextHeaderAtom tha, TextBytesAtom tba, TextCharsAtom tca, StyleTextPropAtom sta) { - _headerAtom = tha; - _styleAtom = sta; - if(tba != null) { - _byteAtom = tba; - _isUnicode = false; - } else { - _charAtom = tca; - _isUnicode = true; - } - String runRawText = getText(); - - // Figure out the rich text runs - LinkedList pStyles = new LinkedList(); - LinkedList cStyles = new LinkedList(); - if(_styleAtom != null) { - // Get the style atom to grok itself - _styleAtom.setParentTextSize(runRawText.length()); - pStyles = _styleAtom.getParagraphStyles(); - cStyles = _styleAtom.getCharacterStyles(); - } - buildRichTextRuns(pStyles, cStyles, runRawText); - } - - public void buildRichTextRuns(LinkedList pStyles, LinkedList cStyles, String runRawText){ - - // Handle case of no current style, with a default - if(pStyles.size() == 0 || cStyles.size() == 0) { - _rtRuns = new RichTextRun[1]; - _rtRuns[0] = new RichTextRun(this, 0, runRawText.length()); - } else { - // Build up Rich Text Runs, one for each - // character/paragraph style pair - List rtrs = new ArrayList(); - - int pos = 0; - - int curP = 0; - int curC = 0; - int pLenRemain = -1; - int cLenRemain = -1; - - // Build one for each run with the same style - while(pos <= runRawText.length() && curP < pStyles.size() && curC < cStyles.size()) { - // Get the Props to use - TextPropCollection pProps = pStyles.get(curP); - TextPropCollection cProps = cStyles.get(curC); - - int pLen = pProps.getCharactersCovered(); - int cLen = cProps.getCharactersCovered(); - - // Handle new pass - boolean freshSet = false; - if(pLenRemain == -1 && cLenRemain == -1) { freshSet = true; } - if(pLenRemain == -1) { pLenRemain = pLen; } - if(cLenRemain == -1) { cLenRemain = cLen; } - - // So we know how to build the eventual run - int runLen = -1; - boolean pShared = false; - boolean cShared = false; - - // Same size, new styles - neither shared - if(pLen == cLen && freshSet) { - runLen = cLen; - pShared = false; - cShared = false; - curP++; - curC++; - pLenRemain = -1; - cLenRemain = -1; - } else { - // Some sharing - - // See if we are already in a shared block - if(pLenRemain < pLen) { - // Existing shared p block - pShared = true; - - // Do we end with the c block, or either side of it? - if(pLenRemain == cLenRemain) { - // We end at the same time - cShared = false; - runLen = pLenRemain; - curP++; - curC++; - pLenRemain = -1; - cLenRemain = -1; - } else if(pLenRemain < cLenRemain) { - // We end before the c block - cShared = true; - runLen = pLenRemain; - curP++; - cLenRemain -= pLenRemain; - pLenRemain = -1; - } else { - // We end after the c block - cShared = false; - runLen = cLenRemain; - curC++; - pLenRemain -= cLenRemain; - cLenRemain = -1; - } - } else if(cLenRemain < cLen) { - // Existing shared c block - cShared = true; - - // Do we end with the p block, or either side of it? - if(pLenRemain == cLenRemain) { - // We end at the same time - pShared = false; - runLen = cLenRemain; - curP++; - curC++; - pLenRemain = -1; - cLenRemain = -1; - } else if(cLenRemain < pLenRemain) { - // We end before the p block - pShared = true; - runLen = cLenRemain; - curC++; - pLenRemain -= cLenRemain; - cLenRemain = -1; - } else { - // We end after the p block - pShared = false; - runLen = pLenRemain; - curP++; - cLenRemain -= pLenRemain; - pLenRemain = -1; - } - } else { - // Start of a shared block - if(pLenRemain < cLenRemain) { - // Shared c block - pShared = false; - cShared = true; - runLen = pLenRemain; - curP++; - cLenRemain -= pLenRemain; - pLenRemain = -1; - } else { - // Shared p block - pShared = true; - cShared = false; - runLen = cLenRemain; - curC++; - pLenRemain -= cLenRemain; - cLenRemain = -1; - } - } - } - - // Wind on - int prevPos = pos; - pos += runLen; - // Adjust for end-of-run extra 1 length - if(pos > runRawText.length()) { - runLen--; - } - - // Save - RichTextRun rtr = new RichTextRun(this, prevPos, runLen, pProps, cProps, pShared, cShared); - rtrs.add(rtr); - } - - // Build the array - _rtRuns = rtrs.toArray(new RichTextRun[rtrs.size()]); - } - - } - - // Update methods follow - - /** - * Adds the supplied text onto the end of the TextRun, - * creating a new RichTextRun (returned) for it to - * sit in. - * In many cases, before calling this, you'll want to add - * a newline onto the end of your last RichTextRun - */ - public RichTextRun appendText(String s) { - // We will need a StyleTextProp atom - ensureStyleAtomPresent(); - - // First up, append the text to the - // underlying text atom - int oldSize = getRawText().length(); - storeText( - getRawText() + s - ); - - // If either of the previous styles overran - // the text by one, we need to shuffle that - // extra character onto the new ones - int pOverRun = _styleAtom.getParagraphTextLengthCovered() - oldSize; - int cOverRun = _styleAtom.getCharacterTextLengthCovered() - oldSize; - if(pOverRun > 0) { - TextPropCollection tpc = _styleAtom.getParagraphStyles().getLast(); - tpc.updateTextSize( - tpc.getCharactersCovered() - pOverRun - ); - } - if(cOverRun > 0) { - TextPropCollection tpc = _styleAtom.getCharacterStyles().getLast(); - tpc.updateTextSize( - tpc.getCharactersCovered() - cOverRun - ); - } - - // Next, add the styles for its paragraph and characters - TextPropCollection newPTP = - _styleAtom.addParagraphTextPropCollection(s.length()+pOverRun); - TextPropCollection newCTP = - _styleAtom.addCharacterTextPropCollection(s.length()+cOverRun); - - // Now, create the new RichTextRun - RichTextRun nr = new RichTextRun( - this, oldSize, s.length(), - newPTP, newCTP, false, false - ); - - // Add the new RichTextRun onto our list - RichTextRun[] newRuns = new RichTextRun[_rtRuns.length+1]; - System.arraycopy(_rtRuns, 0, newRuns, 0, _rtRuns.length); - newRuns[newRuns.length-1] = nr; - _rtRuns = newRuns; - - // And return the new run to the caller - return nr; - } - - /** - * Saves the given string to the records. Doesn't - * touch the stylings. - */ - private void storeText(String s) { - // Store in the appropriate record - if(_isUnicode) { - // The atom can safely convert to unicode - _charAtom.setText(s); - } else { - // Will it fit in a 8 bit atom? - boolean hasMultibyte = StringUtil.hasMultibyte(s); - if(! hasMultibyte) { - // Fine to go into 8 bit atom - byte[] text = new byte[s.length()]; - StringUtil.putCompressedUnicode(s,text,0); - _byteAtom.setText(text); - } else { - // Need to swap a TextBytesAtom for a TextCharsAtom - - // Build the new TextCharsAtom - _charAtom = new TextCharsAtom(); - _charAtom.setText(s); - - // Use the TextHeaderAtom to do the swap on the parent - RecordContainer parent = _headerAtom.getParentRecord(); - Record[] cr = parent.getChildRecords(); - for(int i=0; i pStyles = _styleAtom.getParagraphStyles(); - while(pStyles.size() > 1) { pStyles.removeLast(); } - - if (!pStyles.isEmpty()) { - pStyles.getFirst().updateTextSize( s.length()+1 ); - } - - LinkedList cStyles = _styleAtom.getCharacterStyles(); - while(cStyles.size() > 1) { cStyles.removeLast(); } - - if (!cStyles.isEmpty()) { - cStyles.getFirst().updateTextSize( s.length()+1 ); - } - - _rtRuns[0].setText(s); - } else { - // Recreate rich text run with no styling - _rtRuns[0] = new RichTextRun(this,0,s.length()); - } - - } - - /** - * Changes the text. - * Converts '\r' into '\n' - */ - public void setText(String s) { - String text = normalize(s); - setRawText(text); - } - - /** - * Ensure a StyleTextPropAtom is present for this run, - * by adding if required. Normally for internal TextRun use. - */ - public void ensureStyleAtomPresent() { - if(_styleAtom != null) { - // All there - return; - } - - // Create a new one at the right size - _styleAtom = new StyleTextPropAtom(getRawText().length() + 1); - - // Use the TextHeader atom to get at the parent - RecordContainer runAtomsParent = _headerAtom.getParentRecord(); - - // Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom - Record addAfter = _byteAtom; - if(_byteAtom == null) { addAfter = _charAtom; } - runAtomsParent.addChildAfter(_styleAtom, addAfter); - - // Feed this to our sole rich text run - if(_rtRuns.length != 1) { - throw new IllegalStateException("Needed to add StyleTextPropAtom when had many rich text runs"); - } - // These are the only styles for now - _rtRuns[0].supplyTextProps( - _styleAtom.getParagraphStyles().get(0), - _styleAtom.getCharacterStyles().get(0), - false, - false - ); - } - - // Accesser methods follow - - /** - * Returns the text content of the run, which has been made safe - * for printing and other use. - */ - public String getText() { - String rawText = getRawText(); - - // PowerPoint seems to store files with \r as the line break - // The messes things up on everything but a Mac, so translate - // them to \n - String text = rawText.replace('\r','\n'); - - int type = _headerAtom == null ? 0 : _headerAtom.getTextType(); - if(type == TextHeaderAtom.TITLE_TYPE || type == TextHeaderAtom.CENTER_TITLE_TYPE){ - //0xB acts like cariage return in page titles and like blank in the others - text = text.replace((char) 0x0B, '\n'); - } else { - text = text.replace((char) 0x0B, ' '); - } - return text; - } - - /** - * Returns the raw text content of the run. This hasn't had any - * changes applied to it, and so is probably unlikely to print - * out nicely. - */ - public String getRawText() { - if(_isUnicode) { - return _charAtom.getText(); - } - return _byteAtom.getText(); - } - - /** - * Fetch the rich text runs (runs of text with the same styling) that - * are contained within this block of text - */ - public RichTextRun[] getRichTextRuns() { - return _rtRuns; - } - - /** - * Returns the type of the text, from the TextHeaderAtom. - * Possible values can be seen from TextHeaderAtom - * @see org.apache.poi.hslf.record.TextHeaderAtom - */ - public int getRunType() { - return _headerAtom.getTextType(); - } - - /** - * Changes the type of the text. Values should be taken - * from TextHeaderAtom. No checking is done to ensure you - * set this to a valid value! - * @see org.apache.poi.hslf.record.TextHeaderAtom - */ - public void setRunType(int type) { - _headerAtom.setTextType(type); - } - - /** - * Supply the SlideShow we belong to. - * Also passes it on to our child RichTextRuns - */ - public void supplySlideShow(SlideShow ss) { - slideShow = ss; - if(_rtRuns != null) { - for(int i=0; i<_rtRuns.length; i++) { - _rtRuns[i].supplySlideShow(slideShow); - } - } - } - - public void setSheet(Sheet sheet){ - this._sheet = sheet; - } - - public Sheet getSheet(){ - return this._sheet; - } - - /** - * @return Shape ID - */ - protected int getShapeId(){ - return shapeId; - } - - /** - * @param id Shape ID - */ - protected void setShapeId(int id){ - shapeId = id; - } - - /** - * @return 0-based index of the text run in the SLWT container - */ - protected int getIndex(){ - return slwtIndex; - } - - /** - * @param id 0-based index of the text run in the SLWT container - */ - protected void setIndex(int id){ - slwtIndex = id; - } - - /** - * Is this Text Run one from a {@link PPDrawing}, or is it - * one from the {@link SlideListWithText}? - */ - public boolean isDrawingBased() { - return (slwtIndex == -1); - } - - /** - * Returns the array of all hyperlinks in this text run - * - * @return the array of all hyperlinks in this text run - * or null if not found. - */ - public Hyperlink[] getHyperlinks(){ - return Hyperlink.find(this); - } - - /** - * Fetch RichTextRun at a given position - * - * @param pos 0-based index in the text - * @return RichTextRun or null if not found - */ - public RichTextRun getRichTextRunAt(int pos){ - for (int i = 0; i < _rtRuns.length; i++) { - int start = _rtRuns[i].getStartIndex(); - int end = _rtRuns[i].getEndIndex(); - if(pos >= start && pos < end) return _rtRuns[i]; - } - return null; - } - - public TextRulerAtom getTextRuler(){ - if(_ruler == null){ - if(_records != null) for (int i = 0; i < _records.length; i++) { - if(_records[i] instanceof TextRulerAtom) { - _ruler = (TextRulerAtom)_records[i]; - break; - } - } - - } - return _ruler; - - } - - public TextRulerAtom createTextRuler(){ - _ruler = getTextRuler(); - if(_ruler == null){ - _ruler = TextRulerAtom.getParagraphInstance(); - _headerAtom.getParentRecord().appendChildRecord(_ruler); - } - return _ruler; - } - - /** - * Returns a new string with line breaks converted into internal ppt representation - */ - public String normalize(String s){ - String ns = s.replaceAll("\\r?\\n", "\r"); - return ns; - } - - /** - * Returns records that make up this text run - * - * @return text run records - */ - public Record[] getRecords(){ - return _records; - } - /** Numbered List info */ - public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) { - this.styleTextProp9Atom = styleTextProp9Atom; - } - /** Numbered List info */ - public StyleTextProp9Atom getStyleTextProp9Atom() { - return this.styleTextProp9Atom; - } - - /** Characters covered */ - public StyleTextPropAtom getStyleTextPropAtom() { - return this._styleAtom; - } - -} +/* ==================================================================== + 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.hslf.model; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.hslf.record.PPDrawing; +import org.apache.poi.hslf.record.Record; +import org.apache.poi.hslf.record.RecordContainer; +import org.apache.poi.hslf.record.SlideListWithText; +import org.apache.poi.hslf.record.StyleTextProp9Atom; +import org.apache.poi.hslf.record.StyleTextPropAtom; +import org.apache.poi.hslf.record.TextBytesAtom; +import org.apache.poi.hslf.record.TextCharsAtom; +import org.apache.poi.hslf.record.TextHeaderAtom; +import org.apache.poi.hslf.record.TextRulerAtom; +import org.apache.poi.hslf.record.TextSpecInfoAtom; +import org.apache.poi.hslf.usermodel.HSLFTextRun; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.sl.usermodel.TextParagraph; +import org.apache.poi.util.StringUtil; + +/** + * This class represents a run of text in a powerpoint document. That + * run could be text on a sheet, or text in a note. + * It is only a very basic class for now + * + * @author Nick Burch + */ + +public final class HSLFTextParagraph implements TextParagraph +{ + // Note: These fields are protected to help with unit testing + // Other classes shouldn't really go playing with them! + protected TextHeaderAtom _headerAtom; + protected TextBytesAtom _byteAtom; + protected TextCharsAtom _charAtom; + protected StyleTextPropAtom _styleAtom; + protected TextRulerAtom _ruler; + protected boolean _isUnicode; + protected HSLFTextRun[] _rtRuns; + protected HSLFTextShape _parentShape; + // private SlideShow slideShow; + private HSLFSheet _sheet; + private int shapeId; + private int slwtIndex = -1; //position in the owning SlideListWithText + /** + * all text run records that follow TextHeaderAtom. + * (there can be misc InteractiveInfo, TxInteractiveInfo and other records) + */ + protected Record[] _records; + // private StyleTextPropAtom styleTextPropAtom; + private StyleTextProp9Atom styleTextProp9Atom; + + /** + * Constructs a Text Run from a Unicode text block + * + * @param tha the TextHeaderAtom that defines what's what + * @param tca the TextCharsAtom containing the text + * @param sta the StyleTextPropAtom which defines the character stylings + */ + public HSLFTextParagraph(TextHeaderAtom tha, TextCharsAtom tca, StyleTextPropAtom sta) { + this(tha,null,tca,sta); + } + + /** + * Constructs a Text Run from a Ascii text block + * + * @param tha the TextHeaderAtom that defines what's what + * @param tba the TextBytesAtom containing the text + * @param sta the StyleTextPropAtom which defines the character stylings + */ + public HSLFTextParagraph(TextHeaderAtom tha, TextBytesAtom tba, StyleTextPropAtom sta) { + this(tha,tba,null,sta); + } + + /** + * Internal constructor and initializer + */ + private HSLFTextParagraph(TextHeaderAtom tha, TextBytesAtom tba, TextCharsAtom tca, StyleTextPropAtom sta) { + _headerAtom = tha; + _styleAtom = sta; + if(tba != null) { + _byteAtom = tba; + _isUnicode = false; + } else { + _charAtom = tca; + _isUnicode = true; + } + String runRawText = getText(); + + // Figure out the rich text runs + LinkedList pStyles = new LinkedList(); + LinkedList cStyles = new LinkedList(); + if(_styleAtom != null) { + // Get the style atom to grok itself + _styleAtom.setParentTextSize(runRawText.length()); + pStyles = _styleAtom.getParagraphStyles(); + cStyles = _styleAtom.getCharacterStyles(); + } + buildRichTextRuns(pStyles, cStyles, runRawText); + } + + public void buildRichTextRuns(LinkedList pStyles, LinkedList cStyles, String runRawText){ + + // Handle case of no current style, with a default + if(pStyles.size() == 0 || cStyles.size() == 0) { + _rtRuns = new HSLFTextRun[1]; + _rtRuns[0] = new HSLFTextRun(this, 0, runRawText.length()); + } else { + // Build up Rich Text Runs, one for each + // character/paragraph style pair + List rtrs = new ArrayList(); + + int pos = 0; + + int curP = 0; + int curC = 0; + int pLenRemain = -1; + int cLenRemain = -1; + + // Build one for each run with the same style + while(pos <= runRawText.length() && curP < pStyles.size() && curC < cStyles.size()) { + // Get the Props to use + TextPropCollection pProps = pStyles.get(curP); + TextPropCollection cProps = cStyles.get(curC); + + int pLen = pProps.getCharactersCovered(); + int cLen = cProps.getCharactersCovered(); + + // Handle new pass + boolean freshSet = false; + if(pLenRemain == -1 && cLenRemain == -1) { freshSet = true; } + if(pLenRemain == -1) { pLenRemain = pLen; } + if(cLenRemain == -1) { cLenRemain = cLen; } + + // So we know how to build the eventual run + int runLen = -1; + boolean pShared = false; + boolean cShared = false; + + // Same size, new styles - neither shared + if(pLen == cLen && freshSet) { + runLen = cLen; + pShared = false; + cShared = false; + curP++; + curC++; + pLenRemain = -1; + cLenRemain = -1; + } else { + // Some sharing + + // See if we are already in a shared block + if(pLenRemain < pLen) { + // Existing shared p block + pShared = true; + + // Do we end with the c block, or either side of it? + if(pLenRemain == cLenRemain) { + // We end at the same time + cShared = false; + runLen = pLenRemain; + curP++; + curC++; + pLenRemain = -1; + cLenRemain = -1; + } else if(pLenRemain < cLenRemain) { + // We end before the c block + cShared = true; + runLen = pLenRemain; + curP++; + cLenRemain -= pLenRemain; + pLenRemain = -1; + } else { + // We end after the c block + cShared = false; + runLen = cLenRemain; + curC++; + pLenRemain -= cLenRemain; + cLenRemain = -1; + } + } else if(cLenRemain < cLen) { + // Existing shared c block + cShared = true; + + // Do we end with the p block, or either side of it? + if(pLenRemain == cLenRemain) { + // We end at the same time + pShared = false; + runLen = cLenRemain; + curP++; + curC++; + pLenRemain = -1; + cLenRemain = -1; + } else if(cLenRemain < pLenRemain) { + // We end before the p block + pShared = true; + runLen = cLenRemain; + curC++; + pLenRemain -= cLenRemain; + cLenRemain = -1; + } else { + // We end after the p block + pShared = false; + runLen = pLenRemain; + curP++; + cLenRemain -= pLenRemain; + pLenRemain = -1; + } + } else { + // Start of a shared block + if(pLenRemain < cLenRemain) { + // Shared c block + pShared = false; + cShared = true; + runLen = pLenRemain; + curP++; + cLenRemain -= pLenRemain; + pLenRemain = -1; + } else { + // Shared p block + pShared = true; + cShared = false; + runLen = cLenRemain; + curC++; + pLenRemain -= cLenRemain; + cLenRemain = -1; + } + } + } + + // Wind on + int prevPos = pos; + pos += runLen; + // Adjust for end-of-run extra 1 length + if(pos > runRawText.length()) { + runLen--; + } + + // Save + HSLFTextRun rtr = new HSLFTextRun(this, prevPos, runLen, pProps, cProps, pShared, cShared); + rtrs.add(rtr); + } + + // Build the array + _rtRuns = rtrs.toArray(new HSLFTextRun[rtrs.size()]); + } + + } + + // Update methods follow + + /** + * Adds the supplied text onto the end of the TextRun, + * creating a new RichTextRun (returned) for it to + * sit in. + * In many cases, before calling this, you'll want to add + * a newline onto the end of your last RichTextRun + */ + public HSLFTextRun appendText(String s) { + // We will need a StyleTextProp atom + ensureStyleAtomPresent(); + + // First up, append the text to the + // underlying text atom + int oldSize = getRawText().length(); + storeText( + getRawText() + s + ); + + // If either of the previous styles overran + // the text by one, we need to shuffle that + // extra character onto the new ones + int pOverRun = _styleAtom.getParagraphTextLengthCovered() - oldSize; + int cOverRun = _styleAtom.getCharacterTextLengthCovered() - oldSize; + if(pOverRun > 0) { + TextPropCollection tpc = _styleAtom.getParagraphStyles().getLast(); + tpc.updateTextSize( + tpc.getCharactersCovered() - pOverRun + ); + } + if(cOverRun > 0) { + TextPropCollection tpc = _styleAtom.getCharacterStyles().getLast(); + tpc.updateTextSize( + tpc.getCharactersCovered() - cOverRun + ); + } + + // Next, add the styles for its paragraph and characters + TextPropCollection newPTP = + _styleAtom.addParagraphTextPropCollection(s.length()+pOverRun); + TextPropCollection newCTP = + _styleAtom.addCharacterTextPropCollection(s.length()+cOverRun); + + // Now, create the new RichTextRun + HSLFTextRun nr = new HSLFTextRun( + this, oldSize, s.length(), + newPTP, newCTP, false, false + ); + + // Add the new RichTextRun onto our list + HSLFTextRun[] newRuns = new HSLFTextRun[_rtRuns.length+1]; + System.arraycopy(_rtRuns, 0, newRuns, 0, _rtRuns.length); + newRuns[newRuns.length-1] = nr; + _rtRuns = newRuns; + + // And return the new run to the caller + return nr; + } + + /** + * Saves the given string to the records. Doesn't + * touch the stylings. + */ + private void storeText(String s) { + // Store in the appropriate record + if(_isUnicode) { + // The atom can safely convert to unicode + _charAtom.setText(s); + } else { + // Will it fit in a 8 bit atom? + boolean hasMultibyte = StringUtil.hasMultibyte(s); + if(! hasMultibyte) { + // Fine to go into 8 bit atom + byte[] text = new byte[s.length()]; + StringUtil.putCompressedUnicode(s,text,0); + _byteAtom.setText(text); + } else { + // Need to swap a TextBytesAtom for a TextCharsAtom + + // Build the new TextCharsAtom + _charAtom = new TextCharsAtom(); + _charAtom.setText(s); + + // Use the TextHeaderAtom to do the swap on the parent + RecordContainer parent = _headerAtom.getParentRecord(); + Record[] cr = parent.getChildRecords(); + for(int i=0; i pStyles = _styleAtom.getParagraphStyles(); + while(pStyles.size() > 1) { pStyles.removeLast(); } + + if (!pStyles.isEmpty()) { + pStyles.getFirst().updateTextSize( s.length()+1 ); + } + + LinkedList cStyles = _styleAtom.getCharacterStyles(); + while(cStyles.size() > 1) { cStyles.removeLast(); } + + if (!cStyles.isEmpty()) { + cStyles.getFirst().updateTextSize( s.length()+1 ); + } + + _rtRuns[0].setText(s); + } else { + // Recreate rich text run with no styling + _rtRuns[0] = new HSLFTextRun(this,0,s.length()); + } + + } + + /** + * Changes the text. + * Converts '\r' into '\n' + */ + public void setText(String s) { + String text = normalize(s); + setRawText(text); + } + + /** + * Ensure a StyleTextPropAtom is present for this run, + * by adding if required. Normally for internal TextRun use. + */ + public void ensureStyleAtomPresent() { + if(_styleAtom != null) { + // All there + return; + } + + // Create a new one at the right size + _styleAtom = new StyleTextPropAtom(getRawText().length() + 1); + + // Use the TextHeader atom to get at the parent + RecordContainer runAtomsParent = _headerAtom.getParentRecord(); + + // Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom + Record addAfter = _byteAtom; + if(_byteAtom == null) { addAfter = _charAtom; } + runAtomsParent.addChildAfter(_styleAtom, addAfter); + + // Feed this to our sole rich text run + if(_rtRuns.length != 1) { + throw new IllegalStateException("Needed to add StyleTextPropAtom when had many rich text runs"); + } + // These are the only styles for now + _rtRuns[0].supplyTextProps( + _styleAtom.getParagraphStyles().get(0), + _styleAtom.getCharacterStyles().get(0), + false, + false + ); + } + + // Accesser methods follow + + /** + * Returns the text content of the run, which has been made safe + * for printing and other use. + */ + public String getText() { + String rawText = getRawText(); + + // PowerPoint seems to store files with \r as the line break + // The messes things up on everything but a Mac, so translate + // them to \n + String text = rawText.replace('\r','\n'); + + int type = _headerAtom == null ? 0 : _headerAtom.getTextType(); + if(type == TextHeaderAtom.TITLE_TYPE || type == TextHeaderAtom.CENTER_TITLE_TYPE){ + //0xB acts like cariage return in page titles and like blank in the others + text = text.replace((char) 0x0B, '\n'); + } else { + text = text.replace((char) 0x0B, ' '); + } + return text; + } + + /** + * Returns the raw text content of the run. This hasn't had any + * changes applied to it, and so is probably unlikely to print + * out nicely. + */ + public String getRawText() { + if(_isUnicode) { + return _charAtom.getText(); + } + return _byteAtom.getText(); + } + + /** + * Fetch the rich text runs (runs of text with the same styling) that + * are contained within this block of text + */ + public HSLFTextRun[] getRichTextRuns() { + return _rtRuns; + } + + /** + * Returns the type of the text, from the TextHeaderAtom. + * Possible values can be seen from TextHeaderAtom + * @see org.apache.poi.hslf.record.TextHeaderAtom + */ + public int getRunType() { + return _headerAtom.getTextType(); + } + + /** + * Changes the type of the text. Values should be taken + * from TextHeaderAtom. No checking is done to ensure you + * set this to a valid value! + * @see org.apache.poi.hslf.record.TextHeaderAtom + */ + public void setRunType(int type) { + _headerAtom.setTextType(type); + } + + /** + * Supply the Sheet we belong to, which might have an assigned SlideShow + * Also passes it on to our child RichTextRuns + */ + public void supplySheet(HSLFSheet sheet){ + this._sheet = sheet; + + if (_rtRuns == null) return; + for(HSLFTextRun rt : _rtRuns) { + rt.updateSheet(); + } + } + + public HSLFSheet getSheet(){ + return this._sheet; + } + + /** + * @return Shape ID + */ + protected int getShapeId(){ + return shapeId; + } + + /** + * @param id Shape ID + */ + protected void setShapeId(int id){ + shapeId = id; + } + + /** + * @return 0-based index of the text run in the SLWT container + */ + protected int getIndex(){ + return slwtIndex; + } + + /** + * @param id 0-based index of the text run in the SLWT container + */ + protected void setIndex(int id){ + slwtIndex = id; + } + + /** + * Is this Text Run one from a {@link PPDrawing}, or is it + * one from the {@link SlideListWithText}? + */ + public boolean isDrawingBased() { + return (slwtIndex == -1); + } + + /** + * Returns the array of all hyperlinks in this text run + * + * @return the array of all hyperlinks in this text run + * or null if not found. + */ + public Hyperlink[] getHyperlinks(){ + return Hyperlink.find(this); + } + + /** + * Fetch RichTextRun at a given position + * + * @param pos 0-based index in the text + * @return RichTextRun or null if not found + */ + public HSLFTextRun getRichTextRunAt(int pos){ + for (int i = 0; i < _rtRuns.length; i++) { + int start = _rtRuns[i].getStartIndex(); + int end = _rtRuns[i].getEndIndex(); + if(pos >= start && pos < end) return _rtRuns[i]; + } + return null; + } + + public TextRulerAtom getTextRuler(){ + if(_ruler == null){ + if(_records != null) for (int i = 0; i < _records.length; i++) { + if(_records[i] instanceof TextRulerAtom) { + _ruler = (TextRulerAtom)_records[i]; + break; + } + } + + } + return _ruler; + + } + + public TextRulerAtom createTextRuler(){ + _ruler = getTextRuler(); + if(_ruler == null){ + _ruler = TextRulerAtom.getParagraphInstance(); + _headerAtom.getParentRecord().appendChildRecord(_ruler); + } + return _ruler; + } + + /** + * Returns a new string with line breaks converted into internal ppt representation + */ + public String normalize(String s){ + String ns = s.replaceAll("\\r?\\n", "\r"); + return ns; + } + + /** + * Returns records that make up this text run + * + * @return text run records + */ + public Record[] getRecords(){ + return _records; + } + /** Numbered List info */ + public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) { + this.styleTextProp9Atom = styleTextProp9Atom; + } + /** Numbered List info */ + public StyleTextProp9Atom getStyleTextProp9Atom() { + return this.styleTextProp9Atom; + } + + /** Characters covered */ + public StyleTextPropAtom getStyleTextPropAtom() { + return this._styleAtom; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextShape.java similarity index 90% rename from src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java rename to src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextShape.java index 3f47ae6a5b..17e8b81d21 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextShape.java @@ -47,7 +47,7 @@ import org.apache.poi.hslf.record.TextBytesAtom; import org.apache.poi.hslf.record.TextCharsAtom; import org.apache.poi.hslf.record.TextHeaderAtom; import org.apache.poi.hslf.record.TxInteractiveInfoAtom; -import org.apache.poi.hslf.usermodel.RichTextRun; +import org.apache.poi.hslf.usermodel.HSLFTextRun; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.util.POILogger; @@ -56,7 +56,7 @@ import org.apache.poi.util.POILogger; * * @author Yegor Kozlov */ -public abstract class TextShape extends SimpleShape { +public abstract class HSLFTextShape extends HSLFSimpleShape { /** * How to anchor the text @@ -92,7 +92,7 @@ public abstract class TextShape extends SimpleShape { /** * TextRun object which holds actual text and format data */ - protected TextRun _txtrun; + protected HSLFTextParagraph _txtrun; /** * Escher container which holds text attributes such as @@ -111,7 +111,7 @@ public abstract class TextShape extends SimpleShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - protected TextShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected HSLFTextShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -122,7 +122,7 @@ public abstract class TextShape extends SimpleShape { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public TextShape(ShapeContainer parent){ + public HSLFTextShape(ShapeContainer parent){ super(null, parent); _escherContainer = createSpContainer(parent instanceof HSLFGroupShape); } @@ -131,15 +131,15 @@ public abstract class TextShape extends SimpleShape { * Create a new TextBox. This constructor is used when a new shape is created. * */ - public TextShape(){ + public HSLFTextShape(){ this(null); } - public TextRun createTextRun(){ + public HSLFTextParagraph createTextRun(){ _txtbox = getEscherTextboxWrapper(); if(_txtbox == null) _txtbox = new EscherTextboxWrapper(); - _txtrun = getTextRun(); + _txtrun = getTextParagraph(); if(_txtrun == null){ TextHeaderAtom tha = new TextHeaderAtom(); tha.setParentRecord(_txtbox); @@ -151,7 +151,7 @@ public abstract class TextShape extends SimpleShape { StyleTextPropAtom sta = new StyleTextPropAtom(0); _txtbox.appendChildRecord(sta); - _txtrun = new TextRun(tha,tca,sta); + _txtrun = new HSLFTextParagraph(tha,tca,sta); _txtrun._records = new Record[]{tha, tca, sta}; _txtrun.setText(""); @@ -170,7 +170,7 @@ public abstract class TextShape extends SimpleShape { * AutoShape: align=center, valign=middle * */ - protected void setDefaultTextProperties(TextRun _txtrun){ + protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){ } @@ -180,7 +180,7 @@ public abstract class TextShape extends SimpleShape { * @return the text string for this textbox. */ public String getText(){ - TextRun tx = getTextRun(); + HSLFTextParagraph tx = getTextParagraph(); return tx == null ? null : tx.getText(); } @@ -190,7 +190,7 @@ public abstract class TextShape extends SimpleShape { * @param text the text string used by this object. */ public void setText(String text){ - TextRun tx = getTextRun(); + HSLFTextParagraph tx = getTextParagraph(); if(tx == null){ tx = createTextRun(); } @@ -204,7 +204,7 @@ public abstract class TextShape extends SimpleShape { * * @param sh the sheet we are adding to */ - protected void afterInsert(Sheet sh){ + protected void afterInsert(HSLFSheet sh){ super.afterInsert(sh); EscherTextboxWrapper _txtbox = getEscherTextboxWrapper(); @@ -241,7 +241,7 @@ public abstract class TextShape extends SimpleShape { String txt = getText(); if(txt == null || txt.length() == 0) return new Rectangle2D.Float(); - RichTextRun rt = getTextRun().getRichTextRuns()[0]; + HSLFTextRun rt = getTextParagraph().getRichTextRuns()[0]; int size = rt.getFontSize(); int style = 0; if (rt.isBold()) style |= Font.BOLD; @@ -284,26 +284,26 @@ public abstract class TextShape extends SimpleShape { public int getVerticalAlignment(){ EscherOptRecord opt = getEscherOptRecord(); EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__ANCHORTEXT); - int valign = TextShape.AnchorTop; + int valign = HSLFTextShape.AnchorTop; if (prop == null){ /** * If vertical alignment was not found in the shape properties then try to * fetch the master shape and search for the align property there. */ - int type = getTextRun().getRunType(); - MasterSheet master = getSheet().getMasterSheet(); + int type = getTextParagraph().getRunType(); + HSLFMasterSheet master = getSheet().getMasterSheet(); if(master != null){ - TextShape masterShape = master.getPlaceholderByTextType(type); + HSLFTextShape masterShape = master.getPlaceholderByTextType(type); if(masterShape != null) valign = masterShape.getVerticalAlignment(); } else { //not found in the master sheet. Use the hardcoded defaults. switch (type){ case TextHeaderAtom.TITLE_TYPE: case TextHeaderAtom.CENTER_TITLE_TYPE: - valign = TextShape.AnchorMiddle; + valign = HSLFTextShape.AnchorMiddle; break; default: - valign = TextShape.AnchorTop; + valign = HSLFTextShape.AnchorTop; break; } } @@ -330,7 +330,7 @@ public abstract class TextShape extends SimpleShape { * @param align - the type of horizontal alignment */ public void setHorizontalAlignment(int align){ - TextRun tx = getTextRun(); + HSLFTextParagraph tx = getTextParagraph(); if(tx != null) tx.getRichTextRuns()[0].setAlignment(align); } @@ -341,7 +341,7 @@ public abstract class TextShape extends SimpleShape { * @return align - the type of horizontal alignment */ public int getHorizontalAlignment(){ - TextRun tx = getTextRun(); + HSLFTextParagraph tx = getTextParagraph(); return tx == null ? -1 : tx.getRichTextRuns()[0].getAlignment(); } @@ -487,7 +487,7 @@ public abstract class TextShape extends SimpleShape { /** * @return the TextRun object for this text box */ - public TextRun getTextRun(){ + public HSLFTextParagraph getTextParagraph(){ if (null == this._txtrun) initTextRun(); if (null == this._txtrun && null != this._txtbox) { TextHeaderAtom tha = null; @@ -507,36 +507,31 @@ public abstract class TextShape extends SimpleShape { } } if (tba != null) { - this._txtrun = new TextRun(tha, tba, sta); + this._txtrun = new HSLFTextParagraph(tha, tba, sta); } else if (tca != null) { - this._txtrun = new TextRun(tha, tca, sta); + this._txtrun = new HSLFTextParagraph(tha, tca, sta); } } return _txtrun; } - public void setSheet(Sheet sheet) { + public void setSheet(HSLFSheet sheet) { _sheet = sheet; // Initialize _txtrun object. // (We can't do it in the constructor because the sheet // is not assigned then, it's only built once we have // all the records) - TextRun tx = getTextRun(); + HSLFTextParagraph tx = getTextParagraph(); if (tx != null) { // Supply the sheet to our child RichTextRuns - tx.setSheet(_sheet); - RichTextRun[] rt = tx.getRichTextRuns(); - for (int i = 0; i < rt.length; i++) { - rt[i].supplySlideShow(_sheet.getSlideShow()); - } + tx.supplySheet(_sheet); } - } protected void initTextRun(){ EscherTextboxWrapper txtbox = getEscherTextboxWrapper(); - Sheet sheet = getSheet(); + HSLFSheet sheet = getSheet(); if(sheet == null || txtbox == null) return; @@ -550,7 +545,7 @@ public abstract class TextShape extends SimpleShape { } } - TextRun[] runs = _sheet.getTextRuns(); + HSLFTextParagraph[] runs = _sheet.getTextRuns(); if (ota != null) { int idx = ota.getTextIndex(); for (int i = 0; i < runs.length; i++) { @@ -572,11 +567,14 @@ public abstract class TextShape extends SimpleShape { } } } + // ensure the same references child records of TextRun - if(_txtrun != null) for (int i = 0; i < child.length; i++) { - for (Record r : _txtrun.getRecords()) { - if (child[i].getRecordType() == r.getRecordType()) { - child[i] = r; + if(_txtrun != null) { + for (int i = 0; i < child.length; i++) { + for (Record r : _txtrun.getRecords()) { + if (child[i].getRecordType() == r.getRecordType()) { + child[i] = r; + } } } } @@ -605,7 +603,7 @@ public abstract class TextShape extends SimpleShape { * @param linkId id of the hyperlink, @see org.apache.poi.hslf.usermodel.SlideShow#addHyperlink(Hyperlink) * @param beginIndex the beginning index, inclusive. * @param endIndex the ending index, exclusive. - * @see org.apache.poi.hslf.usermodel.SlideShow#addHyperlink(Hyperlink) + * @see org.apache.poi.hslf.usermodel.HSLFSlideShow#addHyperlink(Hyperlink) */ public void setHyperlink(int linkId, int beginIndex, int endIndex){ //TODO validate beginIndex and endIndex and throw IllegalArgumentException diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java b/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java index 8bb441e4e4..bd3a6da399 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.hslf.record.*; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; /** * Header / Footer settings. @@ -31,19 +31,19 @@ public final class HeadersFooters { private HeadersFootersContainer _container; private boolean _newRecord; - private SlideShow _ppt; - private Sheet _sheet; + private HSLFSlideShow _ppt; + private HSLFSheet _sheet; private boolean _ppt2007; - public HeadersFooters(HeadersFootersContainer rec, SlideShow ppt, boolean newRecord, boolean isPpt2007){ + public HeadersFooters(HeadersFootersContainer rec, HSLFSlideShow ppt, boolean newRecord, boolean isPpt2007){ _container = rec; _newRecord = newRecord; _ppt = ppt; _ppt2007 = isPpt2007; } - public HeadersFooters(HeadersFootersContainer rec, Sheet sheet, boolean newRecord, boolean isPpt2007){ + public HeadersFooters(HeadersFootersContainer rec, HSLFSheet sheet, boolean newRecord, boolean isPpt2007){ _container = rec; _newRecord = newRecord; _sheet = sheet; @@ -240,8 +240,8 @@ public final class HeadersFooters { private boolean isVisible(int flag, int placeholderId){ boolean visible; if(_ppt2007){ - Sheet master = _sheet != null ? _sheet : _ppt.getSlidesMasters()[0]; - TextShape placeholder = master.getPlaceholder(placeholderId); + HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlidesMasters()[0]; + HSLFTextShape placeholder = master.getPlaceholder(placeholderId); visible = placeholder != null && placeholder.getText() != null; } else { visible = _container.getHeadersFootersAtom().getFlag(flag); @@ -252,8 +252,8 @@ public final class HeadersFooters { private String getPlaceholderText(int placeholderId, CString cs){ String text = null; if(_ppt2007){ - Sheet master = _sheet != null ? _sheet : _ppt.getSlidesMasters()[0]; - TextShape placeholder = master.getPlaceholder(placeholderId); + HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlidesMasters()[0]; + HSLFTextShape placeholder = master.getPlaceholder(placeholderId); if(placeholder != null) text = placeholder.getText(); //default text in master placeholders is not visible diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java b/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java index df207e6716..2e1f1ec586 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.hslf.record.*; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherRecord; import org.apache.poi.ddf.EscherClientDataRecord; @@ -95,7 +95,7 @@ public final class Hyperlink { return address; } - public void setAddress(Slide slide) { + public void setAddress(HSLFSlide slide) { String href = slide._getSheetNumber() + ","+slide.getSlideNumber()+",Slide " + slide.getSlideNumber(); setAddress(href);; setTitle("Slide " + slide.getSlideNumber()); @@ -151,9 +151,9 @@ public final class Hyperlink { * @param run TextRun to lookup hyperlinks in * @return found hyperlinks or null if not found */ - protected static Hyperlink[] find(TextRun run){ + protected static Hyperlink[] find(HSLFTextParagraph run){ List lst = new ArrayList(); - SlideShow ppt = run.getSheet().getSlideShow(); + HSLFSlideShow ppt = run.getSheet().getSlideShow(); //document-level container which stores info about all links in a presentation ExObjList exobj = ppt.getDocumentRecord().getExObjList(); if (exobj == null) { @@ -178,7 +178,7 @@ public final class Hyperlink { */ protected static Hyperlink find(HSLFShape shape){ List lst = new ArrayList(); - SlideShow ppt = shape.getSheet().getSlideShow(); + HSLFSlideShow ppt = shape.getSheet().getSlideShow(); //document-level container which stores info about all links in a presentation ExObjList exobj = ppt.getDocumentRecord().getExObjList(); if (exobj == null) { diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java index e811aeb6bf..b2e0b35884 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java @@ -29,74 +29,7 @@ import java.awt.geom.Line2D; * * @author Yegor Kozlov */ -public final class Line extends SimpleShape { - /** - * Solid (continuous) pen - */ - public static final int PEN_SOLID = 1; - /** - * PS_DASH system dash style - */ - public static final int PEN_PS_DASH = 2; - /** - * PS_DOT system dash style - */ - public static final int PEN_DOT = 3; - /** - * PS_DASHDOT system dash style - */ - public static final int PEN_DASHDOT = 4; - /** - * PS_DASHDOTDOT system dash style - */ - public static final int PEN_DASHDOTDOT = 5; - /** - * square dot style - */ - public static final int PEN_DOTGEL = 6; - /** - * dash style - */ - public static final int PEN_DASH = 7; - /** - * long dash style - */ - public static final int PEN_LONGDASHGEL = 8; - /** - * dash short dash - */ - public static final int PEN_DASHDOTGEL = 9; - /** - * long dash short dash - */ - public static final int PEN_LONGDASHDOTGEL = 10; - /** - * long dash short dash short dash - */ - public static final int PEN_LONGDASHDOTDOTGEL = 11; - - /** - * Single line (of width lineWidth) - */ - public static final int LINE_SIMPLE = 0; - /** - * Double lines of equal width - */ - public static final int LINE_DOUBLE = 1; - /** - * Double lines, one thick, one thin - */ - public static final int LINE_THICKTHIN = 2; - /** - * Double lines, reverse order - */ - public static final int LINE_THINTHICK = 3; - /** - * Three lines, thin, thick, thin - */ - public static final int LINE_TRIPLE = 4; - - +public final class Line extends HSLFSimpleShape { protected Line(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java index 834dc870e4..e366fdbe92 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java @@ -24,7 +24,7 @@ import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherProperties; import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.hslf.record.*; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.ShapeContainer; /** @@ -32,7 +32,7 @@ import org.apache.poi.sl.usermodel.ShapeContainer; * * @author Yegor Kozlov */ -public final class MovieShape extends Picture { +public final class MovieShape extends HSLFPictureShape { public static final int DEFAULT_MOVIE_THUMBNAIL = -1; public static final int MOVIE_MPEG = 1; @@ -113,7 +113,7 @@ public final class MovieShape extends Picture { /** * Assign a movie to this shape * - * @see org.apache.poi.hslf.usermodel.SlideShow#addMovie(String, int) + * @see org.apache.poi.hslf.usermodel.HSLFSlideShow#addMovie(String, int) * @param idx the index of the movie */ public void setMovieIndex(int idx){ @@ -154,7 +154,7 @@ public final class MovieShape extends Picture { OEShapeAtom oe = getClientDataRecord(RecordTypes.OEShapeAtom.typeID); int idx = oe.getOptions(); - SlideShow ppt = getSheet().getSlideShow(); + HSLFSlideShow ppt = getSheet().getSlideShow(); ExObjList lst = (ExObjList)ppt.getDocumentRecord().findFirstOfType(RecordTypes.ExObjList.typeID); if(lst == null) return null; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java index a1e9c94e08..49ed8c2073 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java @@ -18,8 +18,8 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.hslf.usermodel.ObjectData; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFObjectData; import org.apache.poi.hslf.record.ExObjList; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.ExEmbed; @@ -34,7 +34,7 @@ import org.apache.poi.util.POILogger; * * @author Yegor Kozlov */ -public final class OLEShape extends Picture { +public final class OLEShape extends HSLFPictureShape { protected ExEmbed _exEmbed; /** @@ -117,13 +117,13 @@ public final class OLEShape extends Picture { * * @return the unique identifier for the OLE object */ - public ObjectData getObjectData(){ - SlideShow ppt = getSheet().getSlideShow(); - ObjectData[] ole = ppt.getEmbeddedObjects(); + public HSLFObjectData getObjectData(){ + HSLFSlideShow ppt = getSheet().getSlideShow(); + HSLFObjectData[] ole = ppt.getEmbeddedObjects(); //persist reference ExEmbed exEmbed = getExEmbed(); - ObjectData data = null; + HSLFObjectData data = null; if(exEmbed != null) { int ref = exEmbed.getExOleObjAtom().getObjStgDataRef(); @@ -156,7 +156,7 @@ public final class OLEShape extends Picture { */ public ExEmbed getExEmbed(){ if(_exEmbed == null){ - SlideShow ppt = getSheet().getSlideShow(); + HSLFSlideShow ppt = getSheet().getSlideShow(); ExObjList lst = ppt.getDocumentRecord().getExObjList(); if(lst == null){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java index f775addac3..47500df2f6 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java @@ -28,7 +28,7 @@ import java.awt.image.renderable.RenderableImage; import java.awt.geom.*; import java.text.AttributedCharacterIterator; import java.util.Map; -import org.apache.poi.hslf.usermodel.RichTextRun; +import org.apache.poi.hslf.usermodel.HSLFTextRun; import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogFactory; @@ -214,7 +214,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { */ public void draw(Shape shape){ GeneralPath path = new GeneralPath(_transform.createTransformedShape(shape)); - Freeform p = new Freeform(_group); + HSLFFreeformShape p = new HSLFFreeformShape(_group); p.setPath(path); p.getFill().setForegroundColor(null); applyStroke(p); @@ -250,12 +250,11 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { * @see #setClip */ public void drawString(String s, float x, float y) { - TextBox txt = new TextBox(_group); - txt.getTextRun().supplySlideShow(_group.getSheet().getSlideShow()); - txt.getTextRun().setSheet(_group.getSheet()); + HSLFTextBox txt = new HSLFTextBox(_group); + txt.getTextParagraph().supplySheet(_group.getSheet()); txt.setText(s); - RichTextRun rt = txt.getTextRun().getRichTextRuns()[0]; + HSLFTextRun rt = txt.getTextParagraph().getRichTextRuns()[0]; rt.setFontSize(_font.getSize()); rt.setFontName(_font.getFamily()); @@ -267,9 +266,9 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { txt.setMarginTop(0); txt.setMarginLeft(0); txt.setMarginRight(0); - txt.setWordWrap(TextBox.WrapNone); - txt.setHorizontalAlignment(TextBox.AlignLeft); - txt.setVerticalAlignment(TextBox.AnchorMiddle); + txt.setWordWrap(HSLFTextBox.WrapNone); + txt.setHorizontalAlignment(HSLFTextBox.AlignLeft); + txt.setVerticalAlignment(HSLFTextBox.AnchorMiddle); TextLayout layout = new TextLayout(s, _font, getFontRenderContext()); @@ -317,7 +316,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { */ public void fill(Shape shape){ GeneralPath path = new GeneralPath(_transform.createTransformedShape(shape)); - Freeform p = new Freeform(_group); + HSLFFreeformShape p = new HSLFFreeformShape(_group); p.setPath(path); applyPaint(p); p.setLineColor(null); //Fills must be "No Line" @@ -1788,7 +1787,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { } } - protected void applyStroke(SimpleShape shape) { + protected void applyStroke(HSLFSimpleShape shape) { if (_stroke instanceof BasicStroke){ BasicStroke bs = (BasicStroke)_stroke; shape.setLineWidth(bs.getLineWidth()); @@ -1800,7 +1799,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { } } - protected void applyPaint(SimpleShape shape) { + protected void applyPaint(HSLFSimpleShape shape) { if (_paint instanceof Color) { shape.getFill().setForegroundColor((Color)_paint); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java index 0e6052e969..470f6a4204 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java @@ -29,7 +29,7 @@ import java.io.ByteArrayOutputStream; * * @author Yegor Kozlov */ -public final class Placeholder extends TextBox { +public final class Placeholder extends HSLFTextBox { protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java index 2d67c03fdc..7bfd95a571 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java @@ -29,7 +29,7 @@ import java.awt.geom.Point2D; * * @author Yegor Kozlov */ -public final class Polygon extends AutoShape { +public final class Polygon extends HSLFAutoShape { /** * Create a Polygon object and initialize it from the supplied Record container. * diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java index 01ac53855c..d21cf9dd2b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java @@ -89,7 +89,7 @@ public final class ShapeFactory { ShapeType type = ShapeType.forId(spRecord.getShapeType(), false); switch (type){ case TEXT_BOX: - shape = new TextBox(spContainer, parent); + shape = new HSLFTextBox(spContainer, parent); break; case HOST_CONTROL: case FRAME: { @@ -110,7 +110,7 @@ public final class ShapeFactory { shape = new OLEShape(spContainer, parent); } - if(shape == null) shape = new Picture(spContainer, parent); + if(shape == null) shape = new HSLFPictureShape(spContainer, parent); break; } case LINE: @@ -120,16 +120,16 @@ public final class ShapeFactory { EscherOptRecord opt = HSLFShape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID); EscherProperty prop = HSLFShape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES); if(prop != null) - shape = new Freeform(spContainer, parent); + shape = new HSLFFreeformShape(spContainer, parent); else { logger.log(POILogger.WARN, "Creating AutoShape for a NotPrimitive shape"); - shape = new AutoShape(spContainer, parent); + shape = new HSLFAutoShape(spContainer, parent); } break; } default: - shape = new AutoShape(spContainer, parent); + shape = new HSLFAutoShape(spContainer, parent); break; } return shape; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java index c9954a8dee..e9686a6120 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java @@ -35,7 +35,7 @@ import org.apache.poi.util.POILogger; public final class ShapePainter { protected static final POILogger logger = POILogFactory.getLogger(ShapePainter.class); - public static void paint(SimpleShape shape, Graphics2D graphics){ + public static void paint(HSLFSimpleShape shape, Graphics2D graphics){ Rectangle2D anchor = shape.getLogicalAnchor2D(); java.awt.Shape outline = shape.getOutline(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java b/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java index a103d09c77..859ceebb42 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java @@ -20,7 +20,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.hslf.model.textproperties.TextProp; import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.record.*; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; /** * SlideMaster determines the graphics, layout, and formatting for all the slides in a given presentation. @@ -29,8 +29,8 @@ import org.apache.poi.hslf.usermodel.SlideShow; * * @author Yegor Kozlov */ -public final class SlideMaster extends MasterSheet { - private TextRun[] _runs; +public final class SlideMaster extends HSLFMasterSheet { + private HSLFTextParagraph[] _runs; /** * all TxMasterStyleAtoms available in this master @@ -51,14 +51,14 @@ public final class SlideMaster extends MasterSheet { /** * Returns an array of all the TextRuns found */ - public TextRun[] getTextRuns() { + public HSLFTextParagraph[] getTextRuns() { return _runs; } /** * Returns null since SlideMasters doen't have master sheet. */ - public MasterSheet getMasterSheet() { + public HSLFMasterSheet getMasterSheet() { return null; } @@ -112,7 +112,7 @@ public final class SlideMaster extends MasterSheet { * Assign SlideShow for this slide master. * (Used interanlly) */ - public void setSlideShow(SlideShow ss) { + public void setSlideShow(HSLFSlideShow ss) { super.setSlideShow(ss); //after the slide show is assigned collect all available style records @@ -130,12 +130,12 @@ public final class SlideMaster extends MasterSheet { } } - protected void onAddTextShape(TextShape shape) { - TextRun run = shape.getTextRun(); + protected void onAddTextShape(HSLFTextShape shape) { + HSLFTextParagraph run = shape.getTextParagraph(); - if(_runs == null) _runs = new TextRun[]{run}; + if(_runs == null) _runs = new HSLFTextParagraph[]{run}; else { - TextRun[] tmp = new TextRun[_runs.length + 1]; + HSLFTextParagraph[] tmp = new HSLFTextParagraph[_runs.length + 1]; System.arraycopy(_runs, 0, tmp, 0, _runs.length); tmp[tmp.length-1] = run; _runs = tmp; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java index f94bd7f5b6..99ee13f211 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java @@ -115,7 +115,7 @@ public final class Table extends HSLFGroupShape { return cells.length; } - protected void afterInsert(Sheet sh){ + protected void afterInsert(HSLFSheet sh){ super.afterInsert(sh); EscherContainerRecord spCont = (EscherContainerRecord) getSpContainer().getChild(0); @@ -165,7 +165,7 @@ public final class Table extends HSLFGroupShape { List> lst = new ArrayList>(); List row = null; for (HSLFShape sh : shapeList) { - if(sh instanceof TextShape){ + if(sh instanceof HSLFTextShape){ Rectangle anchor = sh.getAnchor(); if(anchor.y != y0){ y0 = anchor.y; @@ -180,7 +180,7 @@ public final class Table extends HSLFGroupShape { for (int i = 0; i < lst.size(); i++) { row = lst.get(i); for (int j = 0; j < row.size(); j++) { - TextShape tx = (TextShape)row.get(j); + HSLFTextShape tx = (HSLFTextShape)row.get(j); cells[i][j] = new TableCell(tx.getSpContainer(), getParent()); cells[i][j].setSheet(tx.getSheet()); } @@ -192,7 +192,7 @@ public final class Table extends HSLFGroupShape { * * @param sheet owner of this shape */ - public void setSheet(Sheet sheet){ + public void setSheet(HSLFSheet sheet){ super.setSheet(sheet); if(cells == null) initTable(); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java b/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java index 715181cfad..18431a720c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java @@ -30,7 +30,7 @@ import org.apache.poi.sl.usermodel.ShapeType; * * @author Yegor Kozlov */ -public final class TableCell extends TextBox { +public final class TableCell extends HSLFTextBox { protected static final int DEFAULT_WIDTH = 100; protected static final int DEFAULT_HEIGHT = 40; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java index 4b8805c266..038e28a04d 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java @@ -35,7 +35,7 @@ import java.util.List; import java.util.Map; import org.apache.poi.hslf.record.TextRulerAtom; -import org.apache.poi.hslf.usermodel.RichTextRun; +import org.apache.poi.hslf.usermodel.HSLFTextRun; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -57,27 +57,27 @@ public final class TextPainter { */ protected static final char DEFAULT_BULLET_CHAR = '\u25a0'; - protected TextShape _shape; + protected HSLFTextShape _shape; - public TextPainter(TextShape shape){ + public TextPainter(HSLFTextShape shape){ _shape = shape; } - public AttributedString getAttributedString(TextRun txrun) { + public AttributedString getAttributedString(HSLFTextParagraph txrun) { return getAttributedString(txrun, null); } /** * Convert the underlying set of rich text runs into java.text.AttributedString */ - public AttributedString getAttributedString(TextRun txrun, Graphics2D graphics){ + public AttributedString getAttributedString(HSLFTextParagraph txrun, Graphics2D graphics){ String text = txrun.getText(); //TODO: properly process tabs text = text.replace('\t', ' '); text = text.replace((char)160, ' '); AttributedString at = new AttributedString(text); - RichTextRun[] rt = txrun.getRichTextRuns(); + HSLFTextRun[] rt = txrun.getRichTextRuns(); for (int i = 0; i < rt.length; i++) { int start = rt[i].getStartIndex(); int end = rt[i].getEndIndex(); @@ -157,15 +157,15 @@ public final class TextPainter { int valign = _shape.getVerticalAlignment(); double y0 = anchor.getY(); switch (valign){ - case TextShape.AnchorTopBaseline: - case TextShape.AnchorTop: + case HSLFTextShape.AnchorTopBaseline: + case HSLFTextShape.AnchorTop: y0 += _shape.getMarginTop(); break; - case TextShape.AnchorBottom: + case HSLFTextShape.AnchorBottom: y0 += anchor.getHeight() - textHeight - _shape.getMarginBottom(); break; default: - case TextShape.AnchorMiddle: + case HSLFTextShape.AnchorMiddle: float delta = (float)anchor.getHeight() - textHeight - _shape.getMarginTop() - _shape.getMarginBottom(); y0 += _shape.getMarginTop() + delta/2; break; @@ -205,14 +205,14 @@ public final class TextPainter { pen.y = y0; switch (elem[i]._align) { default: - case TextShape.AlignLeft: + case HSLFTextShape.AlignLeft: pen.x = anchor.getX() + _shape.getMarginLeft(); break; - case TextShape.AlignCenter: + case HSLFTextShape.AlignCenter: pen.x = anchor.getX() + _shape.getMarginLeft() + (anchor.getWidth() - elem[i].advance - _shape.getMarginLeft() - _shape.getMarginRight()) / 2; break; - case TextShape.AlignRight: + case HSLFTextShape.AlignRight: pen.x = anchor.getX() + _shape.getMarginLeft() + (anchor.getWidth() - elem[i].advance - _shape.getMarginLeft() - _shape.getMarginRight()); break; @@ -235,7 +235,7 @@ public final class TextPainter { } public TextElement[] getTextElements(float textWidth, FontRenderContext frc, Graphics2D graphics){ - TextRun run = _shape.getTextRun(); + HSLFTextParagraph run = _shape.getTextParagraph(); if (run == null) return null; String text = run.getText(); @@ -257,7 +257,7 @@ public final class TextPainter { boolean prStart = text.charAt(startIndex) == '\n'; if(prStart) measurer.setPosition(startIndex++); - RichTextRun rt = run.getRichTextRunAt(startIndex == text.length() ? (startIndex-1) : startIndex); + HSLFTextRun rt = run.getRichTextRunAt(startIndex == text.length() ? (startIndex-1) : startIndex); if(rt == null) { logger.log(POILogger.WARN, "RichTextRun not found at pos" + startIndex + "; text.length: " + text.length()); break; @@ -283,7 +283,7 @@ public final class TextPainter { if(bulletOffset > 0 || prStart || startIndex == 0) wrappingWidth -= textOffset; - if (_shape.getWordWrap() == TextShape.WrapNone) { + if (_shape.getWordWrap() == HSLFTextShape.WrapNone) { wrappingWidth = _shape.getSheet().getSlideShow().getPageSize().width; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java b/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java index 843f123890..8184c030fa 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java @@ -25,8 +25,8 @@ import org.apache.poi.hslf.record.*; * * @author Yegor Kozlov */ -public final class TitleMaster extends MasterSheet { - private TextRun[] _runs; +public final class TitleMaster extends HSLFMasterSheet { + private HSLFTextParagraph[] _runs; /** * Constructs a TitleMaster @@ -42,7 +42,7 @@ public final class TitleMaster extends MasterSheet { /** * Returns an array of all the TextRuns found */ - public TextRun[] getTextRuns() { + public HSLFTextParagraph[] getTextRuns() { return _runs; } @@ -50,14 +50,14 @@ public final class TitleMaster extends MasterSheet { * Delegate the call to the underlying slide master. */ public TextProp getStyleAttribute(int txtype, int level, String name, boolean isCharacter) { - MasterSheet master = getMasterSheet(); + HSLFMasterSheet master = getMasterSheet(); return master == null ? null : master.getStyleAttribute(txtype, level, name, isCharacter); } /** * Returns the slide master for this title master. */ - public MasterSheet getMasterSheet(){ + public HSLFMasterSheet getMasterSheet(){ SlideMaster[] master = getSlideShow().getSlidesMasters(); SlideAtom sa = ((org.apache.poi.hslf.record.Slide)getSheetContainer()).getSlideAtom(); int masterId = sa.getMasterID(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/ObjectData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFObjectData.java similarity index 96% rename from src/scratchpad/src/org/apache/poi/hslf/usermodel/ObjectData.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFObjectData.java index bbef87a96c..f02ddbe785 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/ObjectData.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFObjectData.java @@ -26,7 +26,7 @@ import org.apache.poi.hslf.record.ExOleObjStg; * * @author Daniel Noll */ -public class ObjectData { +public class HSLFObjectData { /** * The record that contains the object data. */ @@ -37,7 +37,7 @@ public class ObjectData { * * @param storage the record that contains the object data. */ - public ObjectData(ExOleObjStg storage) { + public HSLFObjectData(ExOleObjStg storage) { this.storage = storage; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java similarity index 88% rename from src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java index 857ad5451e..9d9b0dc594 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java @@ -30,7 +30,7 @@ import org.apache.poi.hslf.blip.JPEG; import org.apache.poi.hslf.blip.PICT; import org.apache.poi.hslf.blip.PNG; import org.apache.poi.hslf.blip.WMF; -import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.HSLFPictureShape; import org.apache.poi.poifs.crypt.CryptoFunctions; import org.apache.poi.poifs.crypt.HashAlgorithm; import org.apache.poi.util.LittleEndian; @@ -42,7 +42,7 @@ import org.apache.poi.util.POILogger; * * @author Yegor Kozlov */ -public abstract class PictureData { +public abstract class HSLFPictureData { protected POILogger logger = POILogFactory.getLogger(this.getClass()); @@ -68,6 +68,14 @@ public abstract class PictureData { */ public abstract int getType(); + + /** + * Returns content type (mime type) of this picture. + * + * @return content type of this picture. + */ + public abstract String getContentType(); + /** * Returns the binary data of this Picture * @return picture data @@ -86,9 +94,9 @@ public abstract class PictureData { protected static final ImagePainter[] painters = new ImagePainter[8]; static { - PictureData.setImagePainter(Picture.PNG, new BitmapPainter()); - PictureData.setImagePainter(Picture.JPEG, new BitmapPainter()); - PictureData.setImagePainter(Picture.DIB, new BitmapPainter()); + HSLFPictureData.setImagePainter(HSLFPictureShape.PNG, new BitmapPainter()); + HSLFPictureData.setImagePainter(HSLFPictureShape.JPEG, new BitmapPainter()); + HSLFPictureData.setImagePainter(HSLFPictureShape.DIB, new BitmapPainter()); } /** @@ -173,25 +181,25 @@ public abstract class PictureData { * Must be one of the static constants defined in the Picture class. * @return concrete instance of PictureData */ - public static PictureData create(int type){ - PictureData pict; + public static HSLFPictureData create(int type){ + HSLFPictureData pict; switch (type){ - case Picture.EMF: + case HSLFPictureShape.EMF: pict = new EMF(); break; - case Picture.WMF: + case HSLFPictureShape.WMF: pict = new WMF(); break; - case Picture.PICT: + case HSLFPictureShape.PICT: pict = new PICT(); break; - case Picture.JPEG: + case HSLFPictureShape.JPEG: pict = new JPEG(); break; - case Picture.PNG: + case HSLFPictureShape.PNG: pict = new PNG(); break; - case Picture.DIB: + case HSLFPictureShape.DIB: pict = new DIB(); break; default: @@ -227,7 +235,7 @@ public abstract class PictureData { return getData().length; } - public void draw(Graphics2D graphics, Picture parent){ + public void draw(Graphics2D graphics, HSLFPictureShape parent){ ImagePainter painter = painters[getType()]; if(painter != null) painter.paint(graphics, this, parent); else logger.log(POILogger.WARN, "Rendering is not supported: " + getClass().getName()); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java similarity index 94% rename from src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java index d6829b4b4e..1f9f6ca027 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java @@ -37,19 +37,9 @@ import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherOptRecord; import org.apache.poi.ddf.EscherRecord; import org.apache.poi.hpsf.ClassID; -import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException; import org.apache.poi.hslf.exceptions.HSLFException; -import org.apache.poi.hslf.model.HeadersFooters; -import org.apache.poi.hslf.model.Hyperlink; -import org.apache.poi.hslf.model.MovieShape; -import org.apache.poi.hslf.model.Notes; -import org.apache.poi.hslf.model.PPFont; -import org.apache.poi.hslf.model.Picture; -import org.apache.poi.hslf.model.HSLFShape; -import org.apache.poi.hslf.model.Slide; -import org.apache.poi.hslf.model.SlideMaster; -import org.apache.poi.hslf.model.TitleMaster; +import org.apache.poi.hslf.model.*; import org.apache.poi.hslf.record.Document; import org.apache.poi.hslf.record.DocumentAtom; import org.apache.poi.hslf.record.ExAviMovie; @@ -79,6 +69,7 @@ import org.apache.poi.hslf.record.SlidePersistAtom; import org.apache.poi.hslf.record.UserEditAtom; import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.sl.usermodel.SlideShow; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -91,9 +82,9 @@ import org.apache.poi.util.POILogger; * @author Nick Burch * @author Yegor kozlov */ -public final class SlideShow { +public final class HSLFSlideShow implements SlideShow { // What we're based on - private HSLFSlideShow _hslfSlideShow; + private HSLFSlideShowImpl _hslfSlideShow; // Pointers to the most recent versions of the core records // (Document, Notes, Slide etc) @@ -108,8 +99,8 @@ public final class SlideShow { // Friendly objects for people to deal with private SlideMaster[] _masters; private TitleMaster[] _titleMasters; - private Slide[] _slides; - private Notes[] _notes; + private HSLFSlide[] _slides; + private HSLFNotes[] _notes; private FontCollection _fonts; // For logging @@ -128,7 +119,7 @@ public final class SlideShow { * * @param hslfSlideShow the HSLFSlideShow to base on */ - public SlideShow(HSLFSlideShow hslfSlideShow) { + public HSLFSlideShow(HSLFSlideShowImpl hslfSlideShow) { // Get useful things from our base slideshow _hslfSlideShow = hslfSlideShow; @@ -149,15 +140,15 @@ public final class SlideShow { /** * Constructs a new, empty, Powerpoint document. */ - public SlideShow() { - this(HSLFSlideShow.create()); + public HSLFSlideShow() { + this(HSLFSlideShowImpl.create()); } /** * Constructs a Powerpoint document from an input stream. */ - public SlideShow(InputStream inputStream) throws IOException { - this(new HSLFSlideShow(inputStream)); + public HSLFSlideShow(InputStream inputStream) throws IOException { + this(new HSLFSlideShowImpl(inputStream)); } /** @@ -417,21 +408,21 @@ public final class SlideShow { // Finally, generate model objects for everything // Notes first - _notes = new Notes[notesRecords.length]; + _notes = new HSLFNotes[notesRecords.length]; for (int i = 0; i < _notes.length; i++) { if (notesRecords[i] != null) { - _notes[i] = new Notes(notesRecords[i]); + _notes[i] = new HSLFNotes(notesRecords[i]); _notes[i].setSlideShow(this); } } // Then slides - _slides = new Slide[slidesRecords.length]; + _slides = new HSLFSlide[slidesRecords.length]; for (int i = 0; i < _slides.length; i++) { SlideAtomsSet sas = slidesSets[i]; int slideIdentifier = sas.getSlidePersistAtom().getSlideIdentifier(); // Do we have a notes for this? - Notes notes = null; + HSLFNotes notes = null; // Slide.SlideAtom.notesId references the corresponding notes slide. // 0 if slide has no notes. int noteId = slidesRecords[i].getSlideAtom().getNotesID(); @@ -445,7 +436,7 @@ public final class SlideShow { } // Now, build our slide - _slides[i] = new Slide(slidesRecords[i], notes, sas, slideIdentifier, (i + 1)); + _slides[i] = new HSLFSlide(slidesRecords[i], notes, sas, slideIdentifier, (i + 1)); _slides[i].setSlideShow(this); } } @@ -481,14 +472,14 @@ public final class SlideShow { /** * Returns an array of all the normal Slides found in the slideshow */ - public Slide[] getSlides() { + public HSLFSlide[] getSlides() { return _slides; } /** * Returns an array of all the normal Notes found in the slideshow */ - public Notes[] getNotes() { + public HSLFNotes[] getNotes() { return _notes; } @@ -509,22 +500,22 @@ public final class SlideShow { /** * Returns the data of all the pictures attached to the SlideShow */ - public PictureData[] getPictureData() { + public HSLFPictureData[] getPictureData() { return _hslfSlideShow.getPictures(); } /** * Returns the data of all the embedded OLE object in the SlideShow */ - public ObjectData[] getEmbeddedObjects() { + public HSLFObjectData[] getEmbeddedObjects() { return _hslfSlideShow.getEmbeddedObjects(); } /** * Returns the data of all the embedded sounds in the SlideShow */ - public SoundData[] getSoundData() { - return SoundData.find(_documentRecord); + public HSLFSoundData[] getSoundData() { + return HSLFSoundData.find(_documentRecord); } /** @@ -621,7 +612,7 @@ public final class SlideShow { * the index of the slide to remove (0-based) * @return the slide that was removed from the slide show. */ - public Slide removeSlide(int index) { + public HSLFSlide removeSlide(int index) { int lastSlideIdx = _slides.length - 1; if (index < 0 || index > lastSlideIdx) { throw new IllegalArgumentException("Slide index (" + index + ") is out of range (0.." @@ -631,13 +622,13 @@ public final class SlideShow { SlideListWithText slwt = _documentRecord.getSlideSlideListWithText(); SlideAtomsSet[] sas = slwt.getSlideAtomsSets(); - Slide removedSlide = null; + HSLFSlide removedSlide = null; ArrayList records = new ArrayList(); ArrayList sa = new ArrayList(); - ArrayList sl = new ArrayList(); + ArrayList sl = new ArrayList(); - ArrayList nt = new ArrayList(); - for (Notes notes : getNotes()) + ArrayList nt = new ArrayList(); + for (HSLFNotes notes : getNotes()) nt.add(notes); for (int i = 0, num = 0; i < _slides.length; i++) { @@ -658,7 +649,7 @@ public final class SlideShow { slwt.setSlideAtomsSets(sa.toArray(new SlideAtomsSet[sa.size()])); slwt.setChildRecord(records.toArray(new Record[records.size()])); } - _slides = sl.toArray(new Slide[sl.size()]); + _slides = sl.toArray(new HSLFSlide[sl.size()]); // if the removed slide had notes - remove references to them too @@ -685,7 +676,7 @@ public final class SlideShow { } } - _notes = nt.toArray(new Notes[nt.size()]); + _notes = nt.toArray(new HSLFNotes[nt.size()]); return removedSlide; } @@ -701,7 +692,7 @@ public final class SlideShow { * * @return the created Slide */ - public Slide createSlide() { + public HSLFSlide createSlide() { SlideListWithText slist = null; // We need to add the records to the SLWT that deals @@ -745,12 +736,12 @@ public final class SlideShow { slist.addSlidePersistAtom(sp); // Create a new Slide - Slide slide = new Slide(sp.getSlideIdentifier(), sp.getRefID(), _slides.length + 1); + HSLFSlide slide = new HSLFSlide(sp.getSlideIdentifier(), sp.getRefID(), _slides.length + 1); slide.setSlideShow(this); slide.onCreate(); // Add in to the list of Slides - Slide[] s = new Slide[_slides.length + 1]; + HSLFSlide[] s = new HSLFSlide[_slides.length + 1]; System.arraycopy(_slides, 0, s, 0, _slides.length); s[_slides.length] = slide; _slides = s; @@ -779,7 +770,7 @@ public final class SlideShow { * @return the index to this picture (1 based). */ public int addPicture(byte[] data, int format) throws IOException { - byte[] uid = PictureData.getChecksum(data); + byte[] uid = HSLFPictureData.getChecksum(data); EscherContainerRecord bstore; @@ -801,7 +792,7 @@ public final class SlideShow { } } - PictureData pict = PictureData.create(format); + HSLFPictureData pict = HSLFPictureData.create(format); pict.setData(data); int offset = _hslfSlideShow.addPicture(pict); @@ -815,12 +806,12 @@ public final class SlideShow { bse.setBlipTypeMacOS((byte) format); bse.setBlipTypeWin32((byte) format); - if (format == Picture.EMF) - bse.setBlipTypeMacOS((byte) Picture.PICT); - else if (format == Picture.WMF) - bse.setBlipTypeMacOS((byte) Picture.PICT); - else if (format == Picture.PICT) - bse.setBlipTypeWin32((byte) Picture.WMF); + if (format == HSLFPictureShape.EMF) + bse.setBlipTypeMacOS((byte) HSLFPictureShape.PICT); + else if (format == HSLFPictureShape.WMF) + bse.setBlipTypeMacOS((byte) HSLFPictureShape.PICT); + else if (format == HSLFPictureShape.PICT) + bse.setBlipTypeWin32((byte) HSLFPictureShape.WMF); bse.setRef(0); bse.setOffset(offset); @@ -1134,7 +1125,7 @@ public final class SlideShow { } protected int addPersistentObject(PositionDependentRecord slideRecord) { - slideRecord.setLastOnDiskOffset(HSLFSlideShow.UNSET_OFFSET); + slideRecord.setLastOnDiskOffset(HSLFSlideShowImpl.UNSET_OFFSET); _hslfSlideShow.appendRootLevelRecord((Record)slideRecord); // For position dependent records, hold where they were and now are diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSoundData.java similarity index 89% rename from src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSoundData.java index 9fd85e1bdb..7750b25f15 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSoundData.java @@ -26,7 +26,7 @@ import java.util.ArrayList; * * @author Yegor Kozlov */ -public final class SoundData { +public final class HSLFSoundData { /** * The record that contains the object data. */ @@ -37,7 +37,7 @@ public final class SoundData { * * @param container the record that contains the sound data. */ - public SoundData(Sound container) { + public HSLFSoundData(Sound container) { this._container = container; } @@ -74,8 +74,8 @@ public final class SoundData { * @param document the document to find in * @return the array with the sound data */ - public static SoundData[] find(Document document){ - ArrayList lst = new ArrayList(); + public static HSLFSoundData[] find(Document document){ + ArrayList lst = new ArrayList(); Record[] ch = document.getChildRecords(); for (int i = 0; i < ch.length; i++) { if(ch[i].getRecordType() == RecordTypes.SoundCollection.typeID){ @@ -83,12 +83,12 @@ public final class SoundData { Record[] sr = col.getChildRecords(); for (int j = 0; j < sr.length; j++) { if(sr[j] instanceof Sound){ - lst.add(new SoundData((Sound)sr[j])); + lst.add(new HSLFSoundData((Sound)sr[j])); } } } } - return lst.toArray(new SoundData[lst.size()]); + return lst.toArray(new HSLFSoundData[lst.size()]); } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java similarity index 90% rename from src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index 878f8c12eb..06980e9ff5 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -19,16 +19,14 @@ package org.apache.poi.hslf.usermodel; import java.awt.Color; -import org.apache.poi.hslf.model.MasterSheet; -import org.apache.poi.hslf.model.HSLFShape; -import org.apache.poi.hslf.model.Sheet; -import org.apache.poi.hslf.model.TextRun; +import org.apache.poi.hslf.model.*; import org.apache.poi.hslf.model.textproperties.BitMaskTextProp; import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp; import org.apache.poi.hslf.model.textproperties.TextProp; import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.record.ColorSchemeAtom; +import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -37,13 +35,13 @@ import org.apache.poi.util.POILogger; * Represents a run of text, all with the same style * */ -public final class RichTextRun { +public final class HSLFTextRun implements TextRun { protected POILogger logger = POILogFactory.getLogger(this.getClass()); /** The TextRun we belong to */ - private TextRun parentRun; + private HSLFTextParagraph parentParagraph; /** The SlideShow we belong to */ - private SlideShow slideShow; + // private SlideShow slideShow; /** Where in the parent TextRun we start from */ private int startPos; @@ -68,7 +66,7 @@ public final class RichTextRun { * @param startAt * @param len */ - public RichTextRun(TextRun parent, int startAt, int len) { + public HSLFTextRun(HSLFTextParagraph parent, int startAt, int len) { this(parent, startAt, len, null, null, false, false); } /** @@ -81,10 +79,10 @@ public final class RichTextRun { * @param pShared The paragraph styles are shared with other runs * @param cShared The character styles are shared with other runs */ - public RichTextRun(TextRun parent, int startAt, int len, + public HSLFTextRun(HSLFTextParagraph parent, int startAt, int len, TextPropCollection pStyle, TextPropCollection cStyle, boolean pShared, boolean cShared) { - parentRun = parent; + parentParagraph = parent; startPos = startAt; length = len; paragraphStyle = pStyle; @@ -109,8 +107,7 @@ public final class RichTextRun { /** * Supply the SlideShow we belong to */ - public void supplySlideShow(SlideShow ss) { - slideShow = ss; + public void updateSheet() { if (_fontname != null) { setFontName(_fontname); _fontname = null; @@ -146,20 +143,20 @@ public final class RichTextRun { * Fetch the text, in output suitable form */ public String getText() { - return parentRun.getText().substring(startPos, startPos+length); + return parentParagraph.getText().substring(startPos, startPos+length); } /** * Fetch the text, in raw storage form */ public String getRawText() { - return parentRun.getRawText().substring(startPos, startPos+length); + return parentParagraph.getRawText().substring(startPos, startPos+length); } /** * Change the text */ public void setText(String text) { - String s = parentRun.normalize(text); + String s = parentParagraph.normalize(text); setRawText(s); } @@ -168,7 +165,7 @@ public final class RichTextRun { */ public void setRawText(String text) { length = text.length(); - parentRun.changeTextInRichTextRun(this,text); + parentParagraph.changeTextInRichTextRun(this,text); } /** @@ -207,10 +204,10 @@ public final class RichTextRun { prop = (BitMaskTextProp)props.findByName(propname); } if (prop == null){ - Sheet sheet = parentRun.getSheet(); + HSLFSheet sheet = parentParagraph.getSheet(); if(sheet != null){ - int txtype = parentRun.getRunType(); - MasterSheet master = sheet.getMasterSheet(); + int txtype = parentParagraph.getRunType(); + HSLFMasterSheet master = sheet.getMasterSheet(); if (master != null){ prop = (BitMaskTextProp)master.getStyleAttribute(txtype, getIndentLevel(), propname, isCharacter); } @@ -243,7 +240,7 @@ public final class RichTextRun { // Ensure we have the StyleTextProp atom we're going to need if(props == null) { - parentRun.ensureStyleAtomPresent(); + parentParagraph.ensureStyleAtomPresent(); props = isCharacter ? characterStyle : paragraphStyle; } @@ -279,9 +276,9 @@ public final class RichTextRun { } if (prop == null){ - Sheet sheet = parentRun.getSheet(); - int txtype = parentRun.getRunType(); - MasterSheet master = sheet.getMasterSheet(); + HSLFSheet sheet = parentParagraph.getSheet(); + int txtype = parentParagraph.getRunType(); + HSLFMasterSheet master = sheet.getMasterSheet(); if (master != null) prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, true); } @@ -303,9 +300,9 @@ public final class RichTextRun { hardAttribute = maskProp != null && maskProp.getValue() == 0; } if (prop == null && !hardAttribute){ - Sheet sheet = parentRun.getSheet(); - int txtype = parentRun.getRunType(); - MasterSheet master = sheet.getMasterSheet(); + HSLFSheet sheet = parentParagraph.getSheet(); + int txtype = parentParagraph.getRunType(); + HSLFMasterSheet master = sheet.getMasterSheet(); if (master != null) prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); } @@ -321,7 +318,7 @@ public final class RichTextRun { public void setParaTextPropVal(String propName, int val) { // Ensure we have the StyleTextProp atom we're going to need if(paragraphStyle == null) { - parentRun.ensureStyleAtomPresent(); + parentParagraph.ensureStyleAtomPresent(); // paragraphStyle will now be defined } @@ -337,7 +334,7 @@ public final class RichTextRun { public void setCharTextPropVal(String propName, int val) { // Ensure we have the StyleTextProp atom we're going to need if(characterStyle == null) { - parentRun.ensureStyleAtomPresent(); + parentParagraph.ensureStyleAtomPresent(); // characterStyle will now be defined } @@ -380,14 +377,14 @@ public final class RichTextRun { /** * Is the text underlined? */ - public boolean isUnderlined() { + public boolean isUnderline() { return isCharFlagsTextPropVal(CharFlagsTextProp.UNDERLINE_IDX); } /** * Is the text underlined? */ - public void setUnderlined(boolean underlined) { + public void setUnderline(boolean underlined) { setCharFlagsTextPropVal(CharFlagsTextProp.UNDERLINE_IDX, underlined); } @@ -486,21 +483,25 @@ public final class RichTextRun { * Sets the font name to use */ public void setFontName(String fontName) { - if (slideShow == null) { + HSLFSheet sheet = parentParagraph.getSheet(); + HSLFSlideShowImpl slideShow = (sheet == null) ? null : sheet.getSlideShow(); + if (sheet == null || slideShow == null) { //we can't set font since slideshow is not assigned yet _fontname = fontName; - } else { - // Get the index for this font (adding if needed) - int fontIdx = slideShow.getFontCollection().addFont(fontName); - setCharTextPropVal("font.index", fontIdx); + return; } + // Get the index for this font (adding if needed) + int fontIdx = slideShow.getFontCollection().addFont(fontName); + setCharTextPropVal("font.index", fontIdx); } /** * Gets the font name */ public String getFontName() { - if (slideShow == null) { + HSLFSheet sheet = parentParagraph.getSheet(); + HSLFSlideShowImpl slideShow = (sheet == null) ? null : sheet.getSlideShow(); + if (sheet == null || slideShow == null) { return _fontname; } int fontIdx = getCharTextPropVal("font.index"); @@ -517,7 +518,7 @@ public final class RichTextRun { int cidx = rgb >> 24; if (rgb % 0x1000000 == 0){ - ColorSchemeAtom ca = parentRun.getSheet().getColorScheme(); + ColorSchemeAtom ca = parentParagraph.getSheet().getColorScheme(); if(cidx >= 0 && cidx <= 7) rgb = ca.getColor(cidx); } Color tmp = new Color(rgb, true); @@ -673,7 +674,7 @@ public final class RichTextRun { int cidx = rgb >> 24; if (rgb % 0x1000000 == 0){ - ColorSchemeAtom ca = parentRun.getSheet().getColorScheme(); + ColorSchemeAtom ca = parentParagraph.getSheet().getColorScheme(); if(cidx >= 0 && cidx <= 7) rgb = ca.getColor(cidx); } Color tmp = new Color(rgb, true); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java index f28c2cbfd4..f9fc966575 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java @@ -3,7 +3,7 @@ package org.apache.poi.sl.draw; import org.apache.poi.sl.usermodel.*; -public class DrawAutoShape> extends DrawTextShape { +public class DrawAutoShape>> extends DrawTextShape { public DrawAutoShape(T shape) { super(shape); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java index 80b95ee5f6..bf82208cdc 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java @@ -45,7 +45,7 @@ public class DrawFactory { boolean isHint = false; if (graphics != null) { factory = (DrawFactory)graphics.getRenderingHint(DRAW_FACTORY); - isHint = true; + isHint = (factory != null); } // secondly try the thread local default if (factory == null) { @@ -76,25 +76,25 @@ public class DrawFactory { } else if (shape instanceof Background) { return getDrawable((Background)shape); } else if (shape instanceof Slide) { - return getDrawable((Slide)shape); + return getDrawable((Slide)shape); } else if (shape instanceof MasterSheet) { - return getDrawable((MasterSheet)shape); + return getDrawable((MasterSheet)shape); } else if (shape instanceof Sheet) { - return getDrawable((Sheet)shape); + return getDrawable((Sheet)shape); } throw new IllegalArgumentException("Unsupported shape type: "+shape.getClass()); } - public > DrawSlide getDrawable(T sheet) { + public > DrawSlide getDrawable(T sheet) { return new DrawSlide(sheet); } - public > DrawSheet getDrawable(T sheet) { + public > DrawSheet getDrawable(T sheet) { return new DrawSheet(sheet); } - public > DrawMasterSheet getDrawable(T sheet) { + public > DrawMasterSheet getDrawable(T sheet) { return new DrawMasterSheet(sheet); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java index 7a89828ede..452704a757 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java @@ -3,7 +3,7 @@ package org.apache.poi.sl.draw; import org.apache.poi.sl.usermodel.*; -public class DrawMasterSheet> extends DrawSheet { +public class DrawMasterSheet> extends DrawSheet { public DrawMasterSheet(T sheet) { super(sheet); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java index 77a0da740a..ca2346b207 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java @@ -17,6 +17,7 @@ package org.apache.poi.sl.draw; +import static org.apache.poi.sl.usermodel.PaintStyle.TRANSPARENT_PAINT; import java.awt.*; import java.awt.MultipleGradientPaint.ColorSpaceType; import java.awt.MultipleGradientPaint.CycleMethod; @@ -35,7 +36,7 @@ import org.apache.poi.util.POILogger; public class DrawPaint { - public final static Color NO_PAINT = new Color(0xFF, 0xFF, 0xFF, 0); + private final static POILogger LOG = POILogFactory.getLogger(DrawPaint.class); protected PlaceableShape shape; @@ -43,6 +44,21 @@ public class DrawPaint { public DrawPaint(PlaceableShape shape) { this.shape = shape; } + + public static SolidPaint createSolidPaint(final Color color) { + return new SolidPaint() { + public ColorStyle getSolidColor() { + return new ColorStyle(){ + public Color getColor() { return color; } + public int getAlpha() { return -1; } + public int getLumOff() { return -1; } + public int getLumMod() { return -1; } + public int getShade() { return -1; } + public int getTint() { return -1; } + }; + } + }; + } public Paint getPaint(Graphics2D graphics, PaintStyle paint) { if (paint instanceof SolidPaint) { @@ -74,7 +90,7 @@ public class DrawPaint { protected Paint getTexturePaint(TexturePaint fill, Graphics2D graphics) { InputStream is = fill.getImageData(); - if (is == null) return NO_PAINT; + if (is == null) return TRANSPARENT_PAINT.getSolidColor().getColor(); assert(graphics != null); ImageRenderer renderer = (ImageRenderer)graphics.getRenderingHint(Drawable.IMAGE_RENDERER); @@ -84,7 +100,7 @@ public class DrawPaint { renderer.loadImage(fill.getImageData(), fill.getContentType()); } catch (IOException e) { LOG.log(POILogger.ERROR, "Can't load image data - using transparent color", e); - return NO_PAINT; + return TRANSPARENT_PAINT.getSolidColor().getColor(); } int alpha = fill.getAlpha(); @@ -105,7 +121,9 @@ public class DrawPaint { public static Color applyColorTransform(ColorStyle color){ Color result = color.getColor(); - if (result == null || color.getAlpha() == 100) return NO_PAINT; + if (result == null || color.getAlpha() == 100) { + return TRANSPARENT_PAINT.getSolidColor().getColor(); + } result = applyAlpha(result, color); result = applyLuminanace(result, color); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java index 238bb1a116..ceda9280c4 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java @@ -7,17 +7,12 @@ import java.awt.geom.Rectangle2D; import org.apache.poi.sl.usermodel.*; -public class DrawShapeGroup> implements Drawable { +public class DrawShapeGroup> extends DrawShape implements Drawable { - protected final T shape; - public DrawShapeGroup(T shape) { - this.shape = shape; + super(shape); } - public void applyTransform(Graphics2D context) { - } - public void draw(Graphics2D graphics) { // the coordinate system of this group of shape @@ -54,7 +49,4 @@ public class DrawShapeGroup> implements Dr graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, tx0); } - - public void drawContent(Graphics2D context) { - } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java index d3901b39b3..d0026f31dc 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java @@ -6,7 +6,7 @@ import java.awt.geom.AffineTransform; import org.apache.poi.sl.usermodel.*; -public class DrawSheet> implements Drawable { +public class DrawSheet> implements Drawable { protected final T sheet; @@ -14,14 +14,9 @@ public class DrawSheet> implements Drawable { this.sheet = sheet; } - public void applyTransform(Graphics2D context) { - // TODO Auto-generated method stub - - } - public void draw(Graphics2D graphics) { DrawFactory drawFact = DrawFactory.getInstance(graphics); - MasterSheet master = sheet.getMasterSheet(); + MasterSheet master = sheet.getMasterSheet(); if(sheet.getFollowMasterGraphics() && master != null) { Drawable drawer = drawFact.getDrawable(master); @@ -53,9 +48,10 @@ public class DrawSheet> implements Drawable { } } + public void applyTransform(Graphics2D context) { + } + public void drawContent(Graphics2D context) { - // TODO Auto-generated method stub - } /** diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java index c5e5b4244c..4ff0034eba 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java @@ -18,7 +18,7 @@ import org.apache.poi.sl.draw.geom.*; import org.apache.poi.sl.usermodel.*; import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize; import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; -import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; +import org.apache.poi.sl.usermodel.StrokeStyle.*; import org.apache.poi.util.Units; @@ -223,15 +223,22 @@ public class DrawSimpleShape extends DrawShape { if (lineWidth == 0.0f) lineWidth = 0.25f; // Both PowerPoint and OOo draw zero-length lines as 0.25pt LineDash lineDash = strokeStyle.getLineDash(); + if (lineDash == null) { + lineDash = LineDash.SOLID; + lineWidth = 0.0f; + } + int dashPatI[] = lineDash.pattern; float[] dashPatF = new float[dashPatI.length]; final float dash_phase = 0; for (int i=0; i extends DrawShape { int lineJoin = BasicStroke.JOIN_ROUND; - return new BasicStroke(lineWidth, lineCap, lineJoin, Math.max(1, lineWidth), dashPatF, dash_phase); + return new BasicStroke(lineWidth, lineCap, lineJoin, lineWidth, dashPatF, dash_phase); } protected void drawShadow( diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java index 8bc4eaf686..cada314ece 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java @@ -5,7 +5,7 @@ import java.awt.Graphics2D; import org.apache.poi.sl.usermodel.*; -public class DrawSlide> extends DrawSheet { +public class DrawSlide> extends DrawSheet { public DrawSlide(T slide) { super(slide); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java index c9bf1f4085..4b2c79e378 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java @@ -4,8 +4,6 @@ import java.awt.Graphics2D; import java.awt.font.TextLayout; import java.text.*; -import org.apache.poi.xslf.usermodel.XSLFRenderingHint; - public class DrawTextFragment implements Drawable { final TextLayout layout; final AttributedString str; @@ -29,8 +27,8 @@ public class DrawTextFragment implements Drawable { double yBaseline = y + layout.getAscent(); - Integer textMode = (Integer)graphics.getRenderingHint(XSLFRenderingHint.TEXT_RENDERING_MODE); - if(textMode != null && textMode == XSLFRenderingHint.TEXT_AS_SHAPES){ + Integer textMode = (Integer)graphics.getRenderingHint(Drawable.TEXT_RENDERING_MODE); + if(textMode != null && textMode == Drawable.TEXT_AS_SHAPES){ layout.draw(graphics, (float)x, (float)yBaseline); } else { graphics.drawString(str.getIterator(), (float)x, (float)yBaseline ); @@ -38,13 +36,9 @@ public class DrawTextFragment implements Drawable { } public void applyTransform(Graphics2D graphics) { - // TODO Auto-generated method stub - } public void drawContent(Graphics2D graphics) { - // TODO Auto-generated method stub - } public TextLayout getLayout() { diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java index cda6a1a88f..f0b4ff42b3 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java @@ -8,7 +8,7 @@ import java.util.Iterator; import org.apache.poi.sl.usermodel.*; -public class DrawTextShape> extends DrawSimpleShape { +public class DrawTextShape>> extends DrawSimpleShape { public DrawTextShape(T shape) { super(shape); @@ -26,7 +26,7 @@ public class DrawTextShape> extends // Transform of text in flipped shapes is special. // At this point the flip and rotation transform is already applied - // (see XSLFShape#applyTransform ), but we need to restore it to avoid painting "upside down". + // (see DrawShape#applyTransform ), but we need to restore it to avoid painting "upside down". // See Bugzilla 54210. if(shape.getFlipVertical()){ @@ -84,12 +84,12 @@ public class DrawTextShape> extends Insets2D shapePadding = shape.getInsets(); double y0 = y; - Iterator paragraphs = shape.iterator(); + Iterator> paragraphs = shape.iterator(); boolean isFirstLine = true; while (paragraphs.hasNext()){ - TextParagraph p = paragraphs.next(); - DrawTextParagraph dp = fact.getDrawable(p); + TextParagraph p = paragraphs.next(); + DrawTextParagraph dp = fact.getDrawable(p); dp.setInsets(shapePadding); dp.breakText(graphics); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java index d876d1512a..736dc0d668 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java @@ -45,7 +45,7 @@ public class PresetGeometries extends LinkedHashMap { @SuppressWarnings("unused") public void init(InputStream is) throws XMLStreamException, JAXBException { - Reader xml = new InputStreamReader( is, Charset.forName("UTF-8") ); + // Reader xml = new InputStreamReader( is, Charset.forName("UTF-8") ); // StAX: @@ -58,7 +58,7 @@ public class PresetGeometries extends LinkedHashMap { long cntElem = 0; XMLInputFactory staxFactory = XMLInputFactory.newInstance(); - XMLEventReader staxReader = staxFactory.createXMLEventReader(xml); + XMLEventReader staxReader = staxFactory.createXMLEventReader(is); XMLEventReader staxFiltRd = staxFactory.createFilteredReader(staxReader, startElementFilter); // ignore StartElement: XMLEvent evDoc = staxFiltRd.nextEvent(); diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java index 21c3a507fd..1bf073dfbb 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoShape.java @@ -17,5 +17,5 @@ package org.apache.poi.sl.usermodel; -public interface AutoShape extends TextShape { +public interface AutoShape> extends TextShape { } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java index 09d61989df..e0843a11a1 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/FreeformShape.java @@ -17,6 +17,6 @@ package org.apache.poi.sl.usermodel; -public interface FreeformShape extends AutoShape { +public interface FreeformShape> extends AutoShape { } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/MasterSheet.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/MasterSheet.java index 8ba80156bd..727217d3fa 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/MasterSheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/MasterSheet.java @@ -17,6 +17,6 @@ package org.apache.poi.sl.usermodel; -public interface MasterSheet extends Sheet { +public interface MasterSheet extends Sheet { } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java index c16774c298..08f023cd9f 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java @@ -17,6 +17,8 @@ package org.apache.poi.sl.usermodel; -public interface Notes extends Sheet { - public TextRun getTextRun(); +import java.util.List; + +public interface Notes extends Sheet { + List> getTextParagraphs(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java index 9dcd495e40..2551201692 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/PaintStyle.java @@ -17,8 +17,11 @@ package org.apache.poi.sl.usermodel; +import java.awt.Color; import java.io.InputStream; +import org.apache.poi.sl.draw.DrawPaint; + public interface PaintStyle { @@ -55,4 +58,6 @@ public interface PaintStyle { */ int getAlpha(); } + + SolidPaint TRANSPARENT_PAINT = DrawPaint.createSolidPaint(new Color(0xFF, 0xFF, 0xFF, 0)); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java index 6ad149b489..4de645d41f 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Shape.java @@ -19,14 +19,11 @@ package org.apache.poi.sl.usermodel; public interface Shape { - ShapeContainer getParent(); + ShapeContainer getParent(); /** * * @return the sheet this shape belongs to */ - Sheet getSheet(); - - - + Sheet getSheet(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java index 8de1dbcb06..7bd940c36c 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java @@ -19,6 +19,6 @@ package org.apache.poi.sl.usermodel; import java.awt.geom.Rectangle2D; -public interface ShapeGroup extends ShapeContainer, PlaceableShape { +public interface ShapeGroup extends Shape, ShapeContainer, PlaceableShape { Rectangle2D getInteriorAnchor(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java index 64b53a3014..6f4ba0ac67 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java @@ -21,8 +21,8 @@ package org.apache.poi.sl.usermodel; /** * Common parent of Slides, Notes and Masters */ -public interface Sheet extends ShapeContainer { - SlideShow getSlideShow(); +public interface Sheet extends ShapeContainer { + SS getSlideShow(); /** * @return whether shapes on the master sheet should be shown. By default master graphics is turned off. @@ -31,7 +31,7 @@ public interface Sheet extends ShapeContainer { */ boolean getFollowMasterGraphics(); - MasterSheet getMasterSheet(); + MasterSheet getMasterSheet(); Background getBackground(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java index 243d9a8174..b2027c182c 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java @@ -17,9 +17,9 @@ package org.apache.poi.sl.usermodel; -public interface Slide extends Sheet { - public Notes getNotes(); - public void setNotes(Notes notes); +public interface Slide extends Sheet { + public Notes getNotes(); + public void setNotes(Notes notes); public boolean getFollowMasterBackground(); public void setFollowMasterBackground(boolean follow); diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java index 4505ca5843..e3007f6c17 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java @@ -21,11 +21,11 @@ import java.awt.Dimension; import java.io.IOException; public interface SlideShow { - Slide createSlide() throws IOException; - MasterSheet createMasterSheet() throws IOException; + Slide createSlide() throws IOException; + MasterSheet createMasterSheet() throws IOException; - Slide[] getSlides(); - MasterSheet[] getMasterSheet(); + Slide[] getSlides(); + MasterSheet[] getMasterSheet(); Resources getResources(); diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java index c02e1a33f9..a55317740a 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java @@ -33,27 +33,75 @@ public interface StrokeStyle { * with actual line width */ enum LineDash { - SOLID(1), - DOT(1,1), - DASH(3,4), - LG_DASH(8,3), - DASH_DOT(4,3,1,3), - LG_DASH_DOT(8,3,1,3), - LG_DASH_DOT_DOT(8,3,1,3,1,3), - SYS_DASH(2,2), - SYS_DOT(1,1), - SYS_DASH_DOT, - SYS_DASH_DOT_DOT; + /** Solid (continuous) pen - native 1 */ + SOLID(1, 1), + /** square dot style - native 6 */ + DOT(6, 1,1), + /** dash style - native 7 */ + DASH(7, 3,4), + /** dash short dash - native 9*/ + DASH_DOT(9, 4,3,1,3), + /** long dash style - native 8 */ + LG_DASH(8, 8,3), + /** long dash short dash - native 10 */ + LG_DASH_DOT(10, 8,3,1,3), + /** long dash short dash short dash - native 11 */ + LG_DASH_DOT_DOT(11, 8,3,1,3,1,3), + /** PS_DASH system dash style - native 2 */ + SYS_DASH(2, 2,2), + /** PS_DOT system dash style - native 3 */ + SYS_DOT(3, 1,1), + /** PS_DASHDOT system dash style - native 4 */ + SYS_DASH_DOT(4, 2,2,1,1), + /** PS_DASHDOTDOT system dash style / native 5 */ + SYS_DASH_DOT_DOT(5, 2,2,1,1,1,1); - public int pattern[]; - - LineDash(int... pattern) { + public final int pattern[]; + public final int nativeId; + + LineDash(int nativeId, int... pattern) { + this.nativeId = nativeId; this.pattern = (pattern == null || pattern.length == 0) ? new int[]{1} : pattern; } + + public static LineDash fromNativeId(int nativeId) { + for (LineDash ld : values()) { + if (ld.nativeId == nativeId) return ld; + } + return null; + } } - + + enum LineCompound { + /** Single line (of width lineWidth) - native 0 / ooxml default */ + SINGLE(0), + /** Double lines of equal width - native 1 / ooxml "dbl" */ + DOUBLE(1), + /** Double lines, one thick, one thin - native 2 / ooxml "thickThin" */ + THICK_THIN(2), + /** Double lines, reverse order - native 3 / ooxml "thinThick" */ + THIN_THICK(3), + /** Three lines, thin, thick, thin - native 4 / ooxml "tri" */ + TRIPLE(4); + + public final int nativeId; + + LineCompound(int nativeId) { + this.nativeId = nativeId; + } + + public static LineCompound fromNativeId(int nativeId) { + for (LineCompound lc : values()) { + if (lc.nativeId == nativeId) return lc; + } + return null; + } + } + + PaintStyle getPaint(); LineCap getLineCap(); LineDash getLineDash(); + LineCompound getLineCompound(); double getLineWidth(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextBox.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextBox.java index 9ac61d526a..3fa3bbe20d 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextBox.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextBox.java @@ -17,5 +17,5 @@ package org.apache.poi.sl.usermodel; -public interface TextBox extends AutoShape { +public interface TextBox> extends AutoShape { } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java index f9b1833610..a6a53fe1bd 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java @@ -19,7 +19,7 @@ package org.apache.poi.sl.usermodel; -public interface TextShape> extends SimpleShape, Iterable { +public interface TextShape> extends SimpleShape, Iterable { /** * Vertical Text Types */ diff --git a/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java index b3f91236ec..134f3e8ac0 100644 --- a/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java +++ b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java @@ -22,9 +22,10 @@ package org.apache.poi; import junit.framework.TestCase; + import java.io.*; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hwpf.HWPFTestDataSamples; import org.apache.poi.poifs.filesystem.*; @@ -47,7 +48,7 @@ public final class TestPOIDocumentScratchpad extends TestCase { * a Word Document for our testing */ public void setUp() throws Exception { - doc = new HSLFSlideShow(POIDataSamples.getSlideShowInstance().openResourceAsStream("basic_test_ppt_file.ppt")); + doc = new HSLFSlideShowImpl(POIDataSamples.getSlideShowInstance().openResourceAsStream("basic_test_ppt_file.ppt")); doc2 = HWPFTestDataSamples.openSampleFile("test2.doc"); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java b/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java index 6740708792..6207a4597d 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java @@ -24,7 +24,8 @@ import java.io.IOException; import java.io.InputStream; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; public class HSLFTestDataSamples { @@ -45,12 +46,12 @@ public class HSLFTestDataSamples { * from a ByteArrayInputStream.

* Useful for verifying that the serialisation round trip */ - public static HSLFSlideShow writeOutAndReadBack(HSLFSlideShow original) { + public static HSLFSlideShowImpl writeOutAndReadBack(HSLFSlideShowImpl original) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); original.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - return new HSLFSlideShow(bais); + return new HSLFSlideShowImpl(bais); } catch (IOException e) { throw new RuntimeException(e); } @@ -61,12 +62,12 @@ public class HSLFTestDataSamples { * from a ByteArrayInputStream.

* Useful for verifying that the serialisation round trip */ - public static SlideShow writeOutAndReadBack(SlideShow original) { + public static HSLFSlideShow writeOutAndReadBack(HSLFSlideShow original) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); original.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - return new SlideShow(bais); + return new HSLFSlideShow(bais); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java index da07810b86..3de6032ae5 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java @@ -21,6 +21,7 @@ package org.apache.poi.hslf; import junit.framework.TestCase; import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.POIDataSamples; /** @@ -32,28 +33,28 @@ public final class TestEncryptedFile extends TestCase { private static POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); public void testLoadNonEncrypted() throws Exception { - HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); assertNotNull(hss); } public void testLoadEncrypted() throws Exception { try { - new HSLFSlideShow(slTests.openResourceAsStream("Password_Protected-hello.ppt")); + new HSLFSlideShowImpl(slTests.openResourceAsStream("Password_Protected-hello.ppt")); fail(); } catch(EncryptedPowerPointFileException e) { // Good } try { - new HSLFSlideShow(slTests.openResourceAsStream("Password_Protected-np-hello.ppt")); + new HSLFSlideShowImpl(slTests.openResourceAsStream("Password_Protected-np-hello.ppt")); fail(); } catch(EncryptedPowerPointFileException e) { // Good } try { - new HSLFSlideShow(slTests.openResourceAsStream("Password_Protected-56-hello.ppt")); + new HSLFSlideShowImpl(slTests.openResourceAsStream("Password_Protected-56-hello.ppt")); fail(); } catch(EncryptedPowerPointFileException e) { // Good diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java index 1398e747e1..ae64b3614d 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java @@ -25,7 +25,8 @@ import java.io.FileNotFoundException; import junit.framework.TestCase; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.poifs.filesystem.DocumentEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; @@ -37,9 +38,9 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem; */ public final class TestReWrite extends TestCase { // HSLFSlideShow primed on the test data - private HSLFSlideShow hssA; - private HSLFSlideShow hssB; - private HSLFSlideShow hssC; + private HSLFSlideShowImpl hssA; + private HSLFSlideShowImpl hssB; + private HSLFSlideShowImpl hssC; // POIFS primed on the test data private POIFSFileSystem pfsA; private POIFSFileSystem pfsB; @@ -50,20 +51,20 @@ public final class TestReWrite extends TestCase { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); pfsA = new POIFSFileSystem(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - hssA = new HSLFSlideShow(pfsA); + hssA = new HSLFSlideShowImpl(pfsA); pfsB = new POIFSFileSystem(slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt")); - hssB = new HSLFSlideShow(pfsB); + hssB = new HSLFSlideShowImpl(pfsB); pfsC = new POIFSFileSystem(slTests.openResourceAsStream("WithMacros.ppt")); - hssC = new HSLFSlideShow(pfsC); + hssC = new HSLFSlideShowImpl(pfsC); } public void testWritesOutTheSame() throws Exception { assertWritesOutTheSame(hssA, pfsA); assertWritesOutTheSame(hssB, pfsB); } - public void assertWritesOutTheSame(HSLFSlideShow hss, POIFSFileSystem pfs) throws Exception { + public void assertWritesOutTheSame(HSLFSlideShowImpl hss, POIFSFileSystem pfs) throws Exception { // Write out to a byte array ByteArrayOutputStream baos = new ByteArrayOutputStream(); hss.write(baos); @@ -129,9 +130,9 @@ public final class TestReWrite extends TestCase { // We need to identify and fix that first //assertSlideShowWritesOutTheSame(hssB, pfsB); } - public void assertSlideShowWritesOutTheSame(HSLFSlideShow hss, POIFSFileSystem pfs) throws Exception { + public void assertSlideShowWritesOutTheSame(HSLFSlideShowImpl hss, POIFSFileSystem pfs) throws Exception { // Create a slideshow covering it - SlideShow ss = new SlideShow(hss); + HSLFSlideShow ss = new HSLFSlideShow(hss); ss.getSlides(); ss.getNotes(); @@ -163,7 +164,7 @@ public final class TestReWrite extends TestCase { } public void test48593() throws Exception { - SlideShow slideShow = new SlideShow(); + HSLFSlideShow slideShow = new HSLFSlideShow(); slideShow.createSlide(); slideShow = HSLFTestDataSamples.writeOutAndReadBack(slideShow); slideShow.createSlide(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java index ae76116a41..31a80ae306 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java @@ -19,8 +19,11 @@ package org.apache.poi.hslf; import junit.framework.TestCase; + import java.io.*; import java.util.*; + +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; import org.apache.poi.poifs.filesystem.*; import org.apache.poi.POIDataSamples; @@ -33,14 +36,14 @@ import org.apache.poi.POIDataSamples; */ public final class TestReWriteSanity extends TestCase { // HSLFSlideShow primed on the test data - private HSLFSlideShow ss; + private HSLFSlideShowImpl ss; // POIFS primed on the test data private POIFSFileSystem pfs; public TestReWriteSanity() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); pfs = new POIFSFileSystem(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - ss = new HSLFSlideShow(pfs); + ss = new HSLFSlideShowImpl(pfs); } public void testUserEditAtomsRight() throws Exception { @@ -52,7 +55,7 @@ public final class TestReWriteSanity extends TestCase { ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); // Create a new one from that - HSLFSlideShow wss = new HSLFSlideShow(bais); + HSLFSlideShowImpl wss = new HSLFSlideShowImpl(bais); // Find the location of the PersistPtrIncrementalBlocks and // UserEditAtoms diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java index 5d509b6203..732f609381 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java @@ -19,6 +19,8 @@ package org.apache.poi.hslf; import junit.framework.TestCase; + +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; import org.apache.poi.POIDataSamples; @@ -30,11 +32,11 @@ import org.apache.poi.POIDataSamples; */ public final class TestRecordCounts extends TestCase { // HSLFSlideShow primed on the test data - private HSLFSlideShow ss; + private HSLFSlideShowImpl ss; public TestRecordCounts() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - ss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + ss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); } public void testSheetsCount() { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java index 7fc234f8ef..a00d75d03e 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java @@ -23,9 +23,9 @@ import java.util.List; import org.apache.poi.POIDataSamples; import org.apache.poi.POITestCase; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.model.OLEShape; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.poifs.filesystem.DirectoryNode; @@ -140,7 +140,7 @@ public final class TestExtractor extends POITestCase { POIFSFileSystem fs = new POIFSFileSystem( POIDataSamples.getSpreadSheetInstance().openResourceAsStream("excel_with_embeded.xls") ); - HSLFSlideShow ss; + HSLFSlideShowImpl ss; DirectoryNode dirA = (DirectoryNode) fs.getRoot().getEntry("MBD0000A3B6"); @@ -151,14 +151,14 @@ public final class TestExtractor extends POITestCase { assertNotNull(dirB.getEntry("PowerPoint Document")); // Check the first file - ss = new HSLFSlideShow(dirA); + ss = new HSLFSlideShowImpl(dirA); ppe = new PowerPointExtractor(ss); assertEquals("Sample PowerPoint file\nThis is the 1st file\nNot much too it\n", ppe.getText(true, false) ); // And the second - ss = new HSLFSlideShow(dirB); + ss = new HSLFSlideShowImpl(dirB); ppe = new PowerPointExtractor(ss); assertEquals("Sample PowerPoint file\nThis is the 2nd file\nNot much too it either\n", ppe.getText(true, false) @@ -186,7 +186,7 @@ public final class TestExtractor extends POITestCase { num_doc++; } else if ("Presentation".equals(name)) { num_ppt++; - SlideShow ppt = new SlideShow(data); + HSLFSlideShow ppt = new HSLFSlideShow(data); } } assertEquals("Expected 2 embedded Word Documents", 2, num_doc); @@ -241,8 +241,8 @@ public final class TestExtractor extends POITestCase { String text; // With a header on the notes - HSLFSlideShow hslf = new HSLFSlideShow(slTests.openResourceAsStream("45537_Header.ppt")); - SlideShow ss = new SlideShow(hslf); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("45537_Header.ppt")); + HSLFSlideShow ss = new HSLFSlideShow(hslf); assertNotNull(ss.getNotesHeadersFooters()); assertEquals("testdoc test phrase", ss.getNotesHeadersFooters().getHeaderText()); @@ -259,8 +259,8 @@ public final class TestExtractor extends POITestCase { // And with a footer, also on notes - hslf = new HSLFSlideShow(slTests.openResourceAsStream("45537_Footer.ppt")); - ss = new SlideShow(hslf); + hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("45537_Footer.ppt")); + ss = new HSLFSlideShow(hslf); assertNotNull(ss.getNotesHeadersFooters()); assertEquals("testdoc test phrase", ss.getNotesHeadersFooters().getFooterText()); @@ -281,7 +281,7 @@ public final class TestExtractor extends POITestCase { String masterTitleText = "This is the Master Title"; String masterRandomText = "This text comes from the Master Slide"; String masterFooterText = "Footer from the master slide"; - HSLFSlideShow hslf = new HSLFSlideShow(slTests.openResourceAsStream("WithMaster.ppt")); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("WithMaster.ppt")); ppe = new PowerPointExtractor(hslf); @@ -309,7 +309,7 @@ public final class TestExtractor extends POITestCase { // Now with another file only containing master text // Will always show up String masterText = "Footer from the master slide"; - HSLFSlideShow hslf = new HSLFSlideShow(slTests.openResourceAsStream("WithMaster.ppt")); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("WithMaster.ppt")); ppe = new PowerPointExtractor(hslf); @@ -322,7 +322,7 @@ public final class TestExtractor extends POITestCase { * Bug #54880 Chinese text not extracted properly */ public void testChineseText() throws Exception { - HSLFSlideShow hslf = new HSLFSlideShow(slTests.openResourceAsStream("54880_chinese.ppt")); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("54880_chinese.ppt")); ppe = new PowerPointExtractor(hslf); String text = ppe.getText(); @@ -360,7 +360,7 @@ public final class TestExtractor extends POITestCase { // Open via a HWPFDocument for(DirectoryNode dir : files) { - HSLFSlideShow slideshow = new HSLFSlideShow(dir); + HSLFSlideShowImpl slideshow = new HSLFSlideShowImpl(dir); PowerPointExtractor extractor = new PowerPointExtractor(slideshow); assertEquals(expectText, extractor.getText()); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java index 8838561501..0d1cfd9e09 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java @@ -32,9 +32,8 @@ import org.apache.poi.ddf.EscherOptRecord; import org.apache.poi.ddf.EscherProperties; import org.apache.poi.ddf.EscherRecord; import org.apache.poi.ddf.EscherSimpleProperty; -import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.record.Document; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.ShapeType; import org.junit.Test; @@ -52,16 +51,16 @@ public final class TestBackground { */ @Test public void defaults() { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - assertEquals(Fill.FILL_SOLID, ppt.getSlidesMasters()[0].getBackground().getFill().getFillType()); + assertEquals(HSLFFill.FILL_SOLID, ppt.getSlidesMasters()[0].getBackground().getFill().getFillType()); - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); assertTrue(slide.getFollowMasterBackground()); - assertEquals(Fill.FILL_SOLID, slide.getBackground().getFill().getFillType()); + assertEquals(HSLFFill.FILL_SOLID, slide.getBackground().getFill().getFillType()); - HSLFShape shape = new AutoShape(ShapeType.RECT); - assertEquals(Fill.FILL_SOLID, shape.getFill().getFillType()); + HSLFShape shape = new HSLFAutoShape(ShapeType.RECT); + assertEquals(HSLFFill.FILL_SOLID, shape.getFill().getFillType()); } /** @@ -69,31 +68,31 @@ public final class TestBackground { */ @Test public void readBackground() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("backgrounds.ppt")); - Fill fill; + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("backgrounds.ppt")); + HSLFFill fill; HSLFShape shape; - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); fill = slide[0].getBackground().getFill(); - assertEquals(Fill.FILL_PICTURE, fill.getFillType()); + assertEquals(HSLFFill.FILL_PICTURE, fill.getFillType()); shape = slide[0].getShapes()[0]; - assertEquals(Fill.FILL_SOLID, shape.getFill().getFillType()); + assertEquals(HSLFFill.FILL_SOLID, shape.getFill().getFillType()); fill = slide[1].getBackground().getFill(); - assertEquals(Fill.FILL_PATTERN, fill.getFillType()); + assertEquals(HSLFFill.FILL_PATTERN, fill.getFillType()); shape = slide[1].getShapes()[0]; - assertEquals(Fill.FILL_BACKGROUND, shape.getFill().getFillType()); + assertEquals(HSLFFill.FILL_BACKGROUND, shape.getFill().getFillType()); fill = slide[2].getBackground().getFill(); - assertEquals(Fill.FILL_TEXTURE, fill.getFillType()); + assertEquals(HSLFFill.FILL_TEXTURE, fill.getFillType()); shape = slide[2].getShapes()[0]; - assertEquals(Fill.FILL_PICTURE, shape.getFill().getFillType()); + assertEquals(HSLFFill.FILL_PICTURE, shape.getFill().getFillType()); fill = slide[3].getBackground().getFill(); - assertEquals(Fill.FILL_SHADE_CENTER, fill.getFillType()); + assertEquals(HSLFFill.FILL_SHADE_CENTER, fill.getFillType()); shape = slide[3].getShapes()[0]; - assertEquals(Fill.FILL_SHADE, shape.getFill().getFillType()); + assertEquals(HSLFFill.FILL_SHADE, shape.getFill().getFillType()); } /** @@ -101,9 +100,9 @@ public final class TestBackground { */ @Test public void backgroundPicture() throws Exception { - SlideShow ppt = new SlideShow(); - Slide slide; - Fill fill; + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide; + HSLFFill fill; HSLFShape shape; int idx; @@ -111,45 +110,45 @@ public final class TestBackground { slide = ppt.createSlide(); slide.setFollowMasterBackground(false); fill = slide.getBackground().getFill(); - idx = ppt.addPicture(_slTests.readFile("tomcat.png"), Picture.PNG); - fill.setFillType(Fill.FILL_PICTURE); + idx = ppt.addPicture(_slTests.readFile("tomcat.png"), HSLFPictureShape.PNG); + fill.setFillType(HSLFFill.FILL_PICTURE); fill.setPictureData(idx); - shape = new AutoShape(ShapeType.RECT); + shape = new HSLFAutoShape(ShapeType.RECT); shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200)); fill = shape.getFill(); - fill.setFillType(Fill.FILL_SOLID); + fill.setFillType(HSLFFill.FILL_SOLID); slide.addShape(shape); //slide 2 slide = ppt.createSlide(); slide.setFollowMasterBackground(false); fill = slide.getBackground().getFill(); - idx = ppt.addPicture(_slTests.readFile("tomcat.png"), Picture.PNG); - fill.setFillType(Fill.FILL_PATTERN); + idx = ppt.addPicture(_slTests.readFile("tomcat.png"), HSLFPictureShape.PNG); + fill.setFillType(HSLFFill.FILL_PATTERN); fill.setPictureData(idx); fill.setBackgroundColor(Color.green); fill.setForegroundColor(Color.red); - shape = new AutoShape(ShapeType.RECT); + shape = new HSLFAutoShape(ShapeType.RECT); shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200)); fill = shape.getFill(); - fill.setFillType(Fill.FILL_BACKGROUND); + fill.setFillType(HSLFFill.FILL_BACKGROUND); slide.addShape(shape); //slide 3 slide = ppt.createSlide(); slide.setFollowMasterBackground(false); fill = slide.getBackground().getFill(); - idx = ppt.addPicture(_slTests.readFile("tomcat.png"), Picture.PNG); - fill.setFillType(Fill.FILL_TEXTURE); + idx = ppt.addPicture(_slTests.readFile("tomcat.png"), HSLFPictureShape.PNG); + fill.setFillType(HSLFFill.FILL_TEXTURE); fill.setPictureData(idx); - shape = new AutoShape(ShapeType.RECT); + shape = new HSLFAutoShape(ShapeType.RECT); shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200)); fill = shape.getFill(); - fill.setFillType(Fill.FILL_PICTURE); - idx = ppt.addPicture(_slTests.readFile("clock.jpg"), Picture.JPEG); + fill.setFillType(HSLFFill.FILL_PICTURE); + idx = ppt.addPicture(_slTests.readFile("clock.jpg"), HSLFPictureShape.JPEG); fill.setPictureData(idx); slide.addShape(shape); @@ -157,14 +156,14 @@ public final class TestBackground { slide = ppt.createSlide(); slide.setFollowMasterBackground(false); fill = slide.getBackground().getFill(); - fill.setFillType(Fill.FILL_SHADE_CENTER); + fill.setFillType(HSLFFill.FILL_SHADE_CENTER); fill.setBackgroundColor(Color.white); fill.setForegroundColor(Color.darkGray); - shape = new AutoShape(ShapeType.RECT); + shape = new HSLFAutoShape(ShapeType.RECT); shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200)); fill = shape.getFill(); - fill.setFillType(Fill.FILL_SHADE); + fill.setFillType(HSLFFill.FILL_SHADE); fill.setBackgroundColor(Color.red); fill.setForegroundColor(Color.green); slide.addShape(shape); @@ -174,42 +173,42 @@ public final class TestBackground { ppt.write(out); out.close(); - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); - Slide[] slides = ppt.getSlides(); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); + HSLFSlide[] slides = ppt.getSlides(); fill = slides[0].getBackground().getFill(); - assertEquals(Fill.FILL_PICTURE, fill.getFillType()); + assertEquals(HSLFFill.FILL_PICTURE, fill.getFillType()); assertEquals(3, getFillPictureRefCount(slides[0].getBackground(), fill)); shape = slides[0].getShapes()[0]; - assertEquals(Fill.FILL_SOLID, shape.getFill().getFillType()); + assertEquals(HSLFFill.FILL_SOLID, shape.getFill().getFillType()); fill = slides[1].getBackground().getFill(); - assertEquals(Fill.FILL_PATTERN, fill.getFillType()); + assertEquals(HSLFFill.FILL_PATTERN, fill.getFillType()); shape = slides[1].getShapes()[0]; - assertEquals(Fill.FILL_BACKGROUND, shape.getFill().getFillType()); + assertEquals(HSLFFill.FILL_BACKGROUND, shape.getFill().getFillType()); fill = slides[2].getBackground().getFill(); - assertEquals(Fill.FILL_TEXTURE, fill.getFillType()); + assertEquals(HSLFFill.FILL_TEXTURE, fill.getFillType()); assertEquals(3, getFillPictureRefCount(slides[2].getBackground(), fill)); shape = slides[2].getShapes()[0]; - assertEquals(Fill.FILL_PICTURE, shape.getFill().getFillType()); + assertEquals(HSLFFill.FILL_PICTURE, shape.getFill().getFillType()); assertEquals(1, getFillPictureRefCount(shape, fill)); fill = slides[3].getBackground().getFill(); - assertEquals(Fill.FILL_SHADE_CENTER, fill.getFillType()); + assertEquals(HSLFFill.FILL_SHADE_CENTER, fill.getFillType()); shape = slides[3].getShapes()[0]; - assertEquals(Fill.FILL_SHADE, shape.getFill().getFillType()); + assertEquals(HSLFFill.FILL_SHADE, shape.getFill().getFillType()); } - private int getFillPictureRefCount(HSLFShape shape, Fill fill) { + private int getFillPictureRefCount(HSLFShape shape, HSLFFill fill) { EscherOptRecord opt = shape.getEscherOptRecord(); EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); if(p != null) { int idx = p.getPropertyValue(); - Sheet sheet = shape.getSheet(); - SlideShow ppt = sheet.getSlideShow(); + HSLFSheet sheet = shape.getSheet(); + HSLFSlideShow ppt = sheet.getSlideShow(); Document doc = ppt.getDocumentRecord(); EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer(); EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java index 6ff4870386..6d1365efbe 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java @@ -43,7 +43,7 @@ public final class TestFreeform extends TestCase { path1.lineTo(100, 200); path1.closePath(); - Freeform p = new Freeform(); + HSLFFreeformShape p = new HSLFFreeformShape(); p.setPath(path1); java.awt.Shape path2 = p.getOutline(); @@ -54,7 +54,7 @@ public final class TestFreeform extends TestCase { GeneralPath path1 = new GeneralPath(new Line2D.Double(100, 100, 200, 100)); - Freeform p = new Freeform(); + HSLFFreeformShape p = new HSLFFreeformShape(); p.setPath(path1); java.awt.Shape path2 = p.getOutline(); @@ -65,7 +65,7 @@ public final class TestFreeform extends TestCase { GeneralPath path1 = new GeneralPath(new Rectangle2D.Double(100, 100, 200, 50)); - Freeform p = new Freeform(); + HSLFFreeformShape p = new HSLFFreeformShape(); p.setPath(path1); java.awt.Shape path2 = p.getOutline(); @@ -78,7 +78,7 @@ public final class TestFreeform extends TestCase { */ public void test54188() { - Freeform p = new Freeform(); + HSLFFreeformShape p = new HSLFFreeformShape(); GeneralPath path = (GeneralPath)p.getOutline(); GeneralPath emptyPath = new GeneralPath(); assertEquals(emptyPath.getBounds2D(), path.getBounds2D()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java index 1e86b8c3af..8239a359d5 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.model; import java.io.*; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; import junit.framework.TestCase; @@ -33,7 +33,7 @@ public final class TestHeadersFooters extends TestCase public void testRead() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("headers_footers.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("headers_footers.ppt")); HeadersFooters slideHdd = ppt.getSlideHeadersFooters(); assertTrue(slideHdd.isFooterVisible()); @@ -53,7 +53,7 @@ public final class TestHeadersFooters extends TestCase assertTrue(notesHdd.isUserDateVisible()); assertNull(notesHdd.getDateTimeText()); - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); //the first slide uses presentation-scope headers / footers HeadersFooters hd1 = slide[0].getHeadersFooters(); assertEquals(slideHdd.isFooterVisible(), hd1.isFooterVisible()); @@ -77,7 +77,7 @@ public final class TestHeadersFooters extends TestCase */ public void testReadNoHeadersFooters() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); HeadersFooters slideHdd = ppt.getSlideHeadersFooters(); assertFalse(slideHdd.isFooterVisible()); @@ -97,7 +97,7 @@ public final class TestHeadersFooters extends TestCase assertFalse(notesHdd.isUserDateVisible()); assertNull(notesHdd.getDateTimeText()); - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); for(int i=0 ; i < slide.length; i++){ HeadersFooters hd1 = slide[i].getHeadersFooters(); assertFalse(hd1.isFooterVisible()); @@ -114,7 +114,7 @@ public final class TestHeadersFooters extends TestCase */ public void testRead2007() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("headers_footers_2007.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("headers_footers_2007.ppt")); HeadersFooters slideHdd = ppt.getSlideHeadersFooters(); assertTrue(slideHdd.isFooterVisible()); @@ -137,7 +137,7 @@ public final class TestHeadersFooters extends TestCase //assertEquals("08/12/08", notesHdd.getDateTimeText()); //per-slide headers / footers - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); //the first slide uses presentation-scope headers / footers HeadersFooters hd1 = slide[0].getHeadersFooters(); assertTrue(hd1.isFooterVisible()); @@ -174,7 +174,7 @@ public final class TestHeadersFooters extends TestCase public void testCreateSlideFooters() throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); HeadersFooters hdd = ppt.getSlideHeadersFooters(); hdd.setFootersText("My slide footer"); hdd.setSlideNumberVisible(true); @@ -183,7 +183,7 @@ public final class TestHeadersFooters extends TestCase ppt.write(out); byte[] b = out.toByteArray(); - SlideShow ppt2 = new SlideShow(new ByteArrayInputStream(b)); + HSLFSlideShow ppt2 = new HSLFSlideShow(new ByteArrayInputStream(b)); HeadersFooters hdd2 = ppt2.getSlideHeadersFooters(); assertTrue(hdd2.isSlideNumberVisible()); assertTrue(hdd2.isFooterVisible()); @@ -192,7 +192,7 @@ public final class TestHeadersFooters extends TestCase public void testCreateNotesFooters() throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); HeadersFooters hdd = ppt.getNotesHeadersFooters(); hdd.setFootersText("My notes footer"); hdd.setHeaderText("My notes header"); @@ -202,7 +202,7 @@ public final class TestHeadersFooters extends TestCase ppt.write(out); byte[] b = out.toByteArray(); - SlideShow ppt2 = new SlideShow(new ByteArrayInputStream(b)); + HSLFSlideShow ppt2 = new HSLFSlideShow(new ByteArrayInputStream(b)); HeadersFooters hdd2 = ppt2.getNotesHeadersFooters(); assertTrue(hdd2.isSlideNumberVisible()); assertTrue(hdd2.isFooterVisible()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java index 6f9f9eb8b4..83e6ca6582 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java @@ -19,7 +19,7 @@ package org.apache.poi.hslf.model; import junit.framework.TestCase; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; /** @@ -31,10 +31,10 @@ public final class TestHyperlink extends TestCase { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); public void testTextRunHyperlinks() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("WithLinks.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("WithLinks.ppt")); - TextRun[] run; - Slide slide; + HSLFTextParagraph[] run; + HSLFSlide slide; slide = ppt.getSlides()[0]; run = slide.getTextRuns(); for (int i = 0; i < run.length; i++) { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java index 9de8cad43e..11a64f6379 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java @@ -23,7 +23,7 @@ import junit.framework.TestCase; import org.apache.poi.hslf.blip.BitmapPainter; import org.apache.poi.hslf.blip.ImagePainter; -import org.apache.poi.hslf.usermodel.PictureData; +import org.apache.poi.hslf.usermodel.HSLFPictureData; /** * Test Picture shape. @@ -36,19 +36,19 @@ public final class TestImagePainter extends TestCase { public CustomImagePainter() { // no fields to initialise } - public void paint(Graphics2D graphics, PictureData pict, Picture parent){ + public void paint(Graphics2D graphics, HSLFPictureData pict, HSLFPictureShape parent){ //do noting } } public void testImagePainter() { - ImagePainter pntr = PictureData.getImagePainter(Picture.PNG); - assertTrue(PictureData.getImagePainter(Picture.PNG) instanceof BitmapPainter); - assertTrue(PictureData.getImagePainter(Picture.JPEG) instanceof BitmapPainter); - assertTrue(PictureData.getImagePainter(Picture.DIB) instanceof BitmapPainter); + ImagePainter pntr = HSLFPictureData.getImagePainter(HSLFPictureShape.PNG); + assertTrue(HSLFPictureData.getImagePainter(HSLFPictureShape.PNG) instanceof BitmapPainter); + assertTrue(HSLFPictureData.getImagePainter(HSLFPictureShape.JPEG) instanceof BitmapPainter); + assertTrue(HSLFPictureData.getImagePainter(HSLFPictureShape.DIB) instanceof BitmapPainter); - PictureData.setImagePainter(Picture.WMF, new CustomImagePainter()); - assertTrue(PictureData.getImagePainter(Picture.WMF) instanceof CustomImagePainter); + HSLFPictureData.setImagePainter(HSLFPictureShape.WMF, new CustomImagePainter()); + assertTrue(HSLFPictureData.getImagePainter(HSLFPictureShape.WMF) instanceof CustomImagePainter); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java index 735fa30466..413ff8ebe8 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java @@ -21,7 +21,7 @@ import java.awt.Color; import junit.framework.TestCase; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; /** * Test Line shape. @@ -31,9 +31,9 @@ import org.apache.poi.hslf.usermodel.SlideShow; public final class TestLine extends TestCase { public void testCreateLines() { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); slide.addTitle().setText("Lines tester"); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java index 9460642bb4..1b5bbd3298 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java @@ -23,7 +23,7 @@ import java.io.ByteArrayOutputStream; import junit.framework.TestCase; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; /** @@ -36,13 +36,13 @@ public final class TestMovieShape extends TestCase { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); public void testCreate() throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); String path = "/test-movie.mpg"; int movieIdx = ppt.addMovie(path, MovieShape.MOVIE_MPEG); - int thumbnailIdx = ppt.addPicture(_slTests.readFile("tomcat.png"), Picture.PNG); + int thumbnailIdx = ppt.addPicture(_slTests.readFile("tomcat.png"), HSLFPictureShape.PNG); MovieShape shape = new MovieShape(movieIdx, thumbnailIdx); shape.setAnchor(new Rectangle2D.Float(300,225,120,90)); @@ -56,7 +56,7 @@ public final class TestMovieShape extends TestCase { ByteArrayOutputStream out = new ByteArrayOutputStream(); ppt.write(out); - ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); + ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); slide = ppt.getSlides()[0]; shape = (MovieShape)slide.getShapes()[0]; assertEquals(path, shape.getPath()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java index 249c4ee964..410f48226a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java @@ -28,10 +28,9 @@ import java.io.InputStream; import junit.framework.TestCase; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.ObjectData; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFObjectData; +import org.apache.poi.hslf.usermodel.HSLFPictureData; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hwpf.HWPFDocument; @@ -46,31 +45,31 @@ public final class TestOleEmbedding extends TestCase { * @throws Exception if an error occurs. */ public void testOleEmbedding2003() throws Exception { - HSLFSlideShow slideShow = new HSLFSlideShow(_slTests.openResourceAsStream("ole2-embedding-2003.ppt")); + HSLFSlideShowImpl slideShow = new HSLFSlideShowImpl(_slTests.openResourceAsStream("ole2-embedding-2003.ppt")); // Placeholder EMFs for clients that don't support the OLE components. - PictureData[] pictures = slideShow.getPictures(); + HSLFPictureData[] pictures = slideShow.getPictures(); assertEquals("Should be two pictures", 2, pictures.length); //assertDigestEquals("Wrong data for picture 1", "8d1fbadf4814f321bb1ccdd056e3c788", pictures[0].getData()); //assertDigestEquals("Wrong data for picture 2", "987a698e83559cf3d38a0deeba1cc63b", pictures[1].getData()); // Actual embedded objects. - ObjectData[] objects = slideShow.getEmbeddedObjects(); + HSLFObjectData[] objects = slideShow.getEmbeddedObjects(); assertEquals("Should be two objects", 2, objects.length); //assertDigestEquals("Wrong data for objecs 1", "0d1fcc61a83de5c4894dc0c88e9a019d", objects[0].getData()); //assertDigestEquals("Wrong data for object 2", "b323604b2003a7299c77c2693b641495", objects[1].getData()); } public void testOLEShape() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("ole2-embedding-2003.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("ole2-embedding-2003.ppt")); - Slide slide = ppt.getSlides()[0]; + HSLFSlide slide = ppt.getSlides()[0]; HSLFShape[] sh = slide.getShapes(); int cnt = 0; for (int i = 0; i < sh.length; i++) { if(sh[i] instanceof OLEShape){ cnt++; OLEShape ole = (OLEShape)sh[i]; - ObjectData data = ole.getObjectData(); + HSLFObjectData data = ole.getObjectData(); if("Worksheet".equals(ole.getInstanceName())){ //Voila! we created a workbook from the embedded OLE data HSSFWorkbook wb = new HSSFWorkbook(data.getData()); @@ -94,11 +93,11 @@ public final class TestOleEmbedding extends TestCase { } public void testEmbedding() throws Exception { - HSLFSlideShow _hslfSlideShow = HSLFSlideShow.create(); - SlideShow ppt = new SlideShow(_hslfSlideShow); + HSLFSlideShowImpl _hslfSlideShow = HSLFSlideShowImpl.create(); + HSLFSlideShow ppt = new HSLFSlideShow(_hslfSlideShow); File pict = POIDataSamples.getSlideShowInstance().getFile("clock.jpg"); - int pictId = ppt.addPicture(pict, Picture.JPEG); + int pictId = ppt.addPicture(pict, HSLFPictureShape.JPEG); InputStream is = POIDataSamples.getSpreadSheetInstance().openResourceAsStream("Employee.xls"); POIFSFileSystem poiData1 = new POIFSFileSystem(is); @@ -106,14 +105,14 @@ public final class TestOleEmbedding extends TestCase { int oleObjectId1 = ppt.addEmbed(poiData1); - Slide slide1 = ppt.createSlide(); + HSLFSlide slide1 = ppt.createSlide(); OLEShape oleShape1 = new OLEShape(pictId); oleShape1.setObjectID(oleObjectId1); slide1.addShape(oleShape1); oleShape1.setAnchor(new Rectangle2D.Double(100,100,100,100)); // add second slide with different order in object creation - Slide slide2 = ppt.createSlide(); + HSLFSlide slide2 = ppt.createSlide(); OLEShape oleShape2 = new OLEShape(pictId); is = POIDataSamples.getSpreadSheetInstance().openResourceAsStream("SimpleWithImages.xls"); @@ -129,7 +128,7 @@ public final class TestOleEmbedding extends TestCase { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ppt.write(bos); - ppt = new SlideShow(new ByteArrayInputStream(bos.toByteArray())); + ppt = new HSLFSlideShow(new ByteArrayInputStream(bos.toByteArray())); OLEShape comp = (OLEShape)ppt.getSlides()[0].getShapes()[0]; byte compData[] = IOUtils.toByteArray(comp.getObjectData().getData()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java index aff848dfc5..fb04ccf5dd 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.model; import junit.framework.TestCase; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; /** * Test adding fonts to the presenataion resources @@ -28,7 +28,7 @@ import org.apache.poi.hslf.usermodel.SlideShow; public final class TestPPFont extends TestCase{ public void testCreate() { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); assertEquals(1, ppt.getNumberOfFonts()); assertEquals("Arial", ppt.getFont(0).getFontName()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java index b58dbadecf..b71ce01035 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java @@ -18,12 +18,11 @@ package org.apache.poi.hslf.model; import junit.framework.TestCase; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.hslf.HSLFSlideShow; + +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; import java.awt.*; -import java.awt.Rectangle; import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; @@ -34,10 +33,10 @@ import java.io.ByteArrayInputStream; */ public final class TestPPGraphics2D extends TestCase { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); - private SlideShow ppt; + private HSLFSlideShow ppt; protected void setUp() throws Exception { - ppt = new SlideShow(_slTests.openResourceAsStream("empty.ppt")); + ppt = new HSLFSlideShow(_slTests.openResourceAsStream("empty.ppt")); } public void testGraphics() throws Exception { @@ -45,7 +44,7 @@ public final class TestPPGraphics2D extends TestCase { assertEquals(0, ppt.getSlides().length); // Add a slide - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); assertEquals(1, ppt.getSlides().length); // Add some stuff into it @@ -73,7 +72,7 @@ public final class TestPPGraphics2D extends TestCase { out.close(); // And read it back in - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); assertEquals(1, ppt.getSlides().length); slide = ppt.getSlides()[0]; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java index fabf63beee..08077f0e00 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java @@ -36,9 +36,8 @@ import javax.imageio.ImageIO; import org.apache.poi.POIDataSamples; import org.apache.poi.ddf.EscherBSERecord; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFPictureData; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.util.JvmBugs; import org.junit.Ignore; import org.junit.Test; @@ -58,16 +57,16 @@ public final class TestPicture { */ @Test public void multiplePictures() throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - Slide s = ppt.createSlide(); - Slide s2 = ppt.createSlide(); - Slide s3 = ppt.createSlide(); + HSLFSlide s = ppt.createSlide(); + HSLFSlide s2 = ppt.createSlide(); + HSLFSlide s3 = ppt.createSlide(); - int idx = ppt.addPicture(_slTests.readFile("clock.jpg"), Picture.JPEG); - Picture pict = new Picture(idx); - Picture pict2 = new Picture(idx); - Picture pict3 = new Picture(idx); + int idx = ppt.addPicture(_slTests.readFile("clock.jpg"), HSLFPictureShape.JPEG); + HSLFPictureShape pict = new HSLFPictureShape(idx); + HSLFPictureShape pict2 = new HSLFPictureShape(idx); + HSLFPictureShape pict3 = new HSLFPictureShape(idx); pict.setAnchor(new Rectangle(10,10,100,100)); s.addShape(pict); @@ -93,12 +92,12 @@ public final class TestPicture { */ @Test public void bug46122() { - SlideShow ppt = new SlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); - Picture pict = new Picture(-1); //index to non-existing picture data + HSLFPictureShape pict = new HSLFPictureShape(-1); //index to non-existing picture data pict.setSheet(slide); - PictureData data = pict.getPictureData(); + HSLFPictureData data = pict.getPictureData(); assertNull(data); BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); @@ -108,9 +107,9 @@ public final class TestPicture { @Test public void macImages() throws Exception { - HSLFSlideShow hss = new HSLFSlideShow(_slTests.openResourceAsStream("53446.ppt")); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(_slTests.openResourceAsStream("53446.ppt")); - PictureData[] pictures = hss.getPictures(); + HSLFPictureData[] pictures = hss.getPictures(); assertEquals(15, pictures.length); int[][] expectedSizes = { @@ -134,7 +133,7 @@ public final class TestPicture { for (int i = 0; i < pictures.length; i++) { BufferedImage image = ImageIO.read(new ByteArrayInputStream(pictures[i].getData())); - if (pictures[i].getType() != Picture.WMF && pictures[i].getType() != Picture.EMF) { + if (pictures[i].getType() != HSLFPictureShape.WMF && pictures[i].getType() != HSLFPictureShape.EMF) { assertNotNull(image); int[] dimensions = expectedSizes[i]; @@ -163,12 +162,12 @@ public final class TestPicture { // System.out.println("########################"); InputStream is = _slTests.openResourceAsStream("54541_cropped_bitmap.ppt"); - SlideShow ss = new SlideShow(is); + HSLFSlideShow ss = new HSLFSlideShow(is); is.close(); Dimension pg = ss.getPageSize(); int i=1; - for(Slide slide : ss.getSlides()) { + for(HSLFSlide slide : ss.getSlides()) { BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = img.createGraphics(); fixFonts(graphics); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java index 23b798fd6f..e1703626ca 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java @@ -18,9 +18,9 @@ package org.apache.poi.hslf.model; import junit.framework.TestCase; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.hslf.usermodel.RichTextRun; -import org.apache.poi.hslf.HSLFSlideShow; + +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFTextRun; import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; @@ -36,15 +36,15 @@ public final class TestSetBoldItalic extends TestCase { * and set some of the style attributes */ public void testTextBoxWrite() throws Exception { - SlideShow ppt = new SlideShow(); - Slide sl = ppt.createSlide(); - RichTextRun rt; + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide sl = ppt.createSlide(); + HSLFTextRun rt; String val = "Hello, World!"; // Create a new textbox, and give it lots of properties - TextBox txtbox = new TextBox(); - rt = txtbox.getTextRun().getRichTextRuns()[0]; + HSLFTextBox txtbox = new HSLFTextBox(); + rt = txtbox.getTextParagraph().getRichTextRuns()[0]; txtbox.setText(val); rt.setFontSize(42); rt.setBold(true); @@ -53,7 +53,7 @@ public final class TestSetBoldItalic extends TestCase { sl.addShape(txtbox); // Check it before save - rt = txtbox.getTextRun().getRichTextRuns()[0]; + rt = txtbox.getTextParagraph().getRichTextRuns()[0]; assertEquals(val, rt.getText()); assertEquals(42, rt.getFontSize()); assertTrue(rt.isBold()); @@ -64,11 +64,11 @@ public final class TestSetBoldItalic extends TestCase { ppt.write(out); out.close(); - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); sl = ppt.getSlides()[0]; - txtbox = (TextBox)sl.getShapes()[0]; - rt = txtbox.getTextRun().getRichTextRuns()[0]; + txtbox = (HSLFTextBox)sl.getShapes()[0]; + rt = txtbox.getTextParagraph().getRichTextRuns()[0]; // Check after save assertEquals(val, rt.getText()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java index 700b758a1e..9456c211f8 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java @@ -38,9 +38,8 @@ import org.apache.poi.ddf.EscherDggRecord; import org.apache.poi.ddf.EscherOptRecord; import org.apache.poi.ddf.EscherProperties; import org.apache.poi.ddf.EscherSimpleProperty; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.RichTextRun; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFTextRun; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.ShapeType; import org.junit.Before; import org.junit.Test; @@ -53,17 +52,17 @@ import org.junit.Test; public final class TestShapes { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); - private SlideShow ppt; - private SlideShow pptB; + private HSLFSlideShow ppt; + private HSLFSlideShow pptB; @Before public void setUp() throws Exception { InputStream is1 = null, is2 = null; try { is1 = _slTests.openResourceAsStream("empty.ppt"); - ppt = new SlideShow(is1); + ppt = new HSLFSlideShow(is1); is2 = _slTests.openResourceAsStream("empty_textbox.ppt"); - pptB = new SlideShow(is2); + pptB = new HSLFSlideShow(is2); } finally { is1.close(); is2.close(); @@ -72,7 +71,7 @@ public final class TestShapes { @Test public void graphics() throws Exception { - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); Line line = new Line(); java.awt.Rectangle lineAnchor = new java.awt.Rectangle(100, 200, 50, 60); @@ -82,7 +81,7 @@ public final class TestShapes { line.setLineColor(Color.red); slide.addShape(line); - AutoShape ellipse = new AutoShape(ShapeType.ELLIPSE); + HSLFAutoShape ellipse = new HSLFAutoShape(ShapeType.ELLIPSE); java.awt.Rectangle ellipseAnchor = new Rectangle(320, 154, 55, 111); ellipse.setAnchor(ellipseAnchor); ellipse.setLineWidth(2); @@ -97,7 +96,7 @@ public final class TestShapes { //read ppt from byte array - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); assertEquals(1, ppt.getSlides().length); slide = ppt.getSlides()[0]; @@ -107,7 +106,7 @@ public final class TestShapes { assertTrue(shape[0] instanceof Line); //group shape assertEquals(lineAnchor, shape[0].getAnchor()); //group shape - assertTrue(shape[1] instanceof AutoShape); //group shape + assertTrue(shape[1] instanceof HSLFAutoShape); //group shape assertEquals(ellipseAnchor, shape[1].getAnchor()); //group shape } @@ -117,17 +116,17 @@ public final class TestShapes { */ @Test public void textBoxRead() throws Exception { - ppt = new SlideShow(_slTests.openResourceAsStream("with_textbox.ppt")); - Slide sl = ppt.getSlides()[0]; + ppt = new HSLFSlideShow(_slTests.openResourceAsStream("with_textbox.ppt")); + HSLFSlide sl = ppt.getSlides()[0]; HSLFShape[] sh = sl.getShapes(); for (int i = 0; i < sh.length; i++) { - assertTrue(sh[i] instanceof TextBox); - TextBox txtbox = (TextBox)sh[i]; + assertTrue(sh[i] instanceof HSLFTextBox); + HSLFTextBox txtbox = (HSLFTextBox)sh[i]; String text = txtbox.getText(); assertNotNull(text); - assertEquals(txtbox.getTextRun().getRichTextRuns().length, 1); - RichTextRun rt = txtbox.getTextRun().getRichTextRuns()[0]; + assertEquals(txtbox.getTextParagraph().getRichTextRuns().length, 1); + HSLFTextRun rt = txtbox.getTextParagraph().getRichTextRuns()[0]; if (text.equals("Hello, World!!!")){ assertEquals(32, rt.getFontSize()); @@ -153,15 +152,15 @@ public final class TestShapes { */ @Test public void textBoxWriteBytes() throws Exception { - ppt = new SlideShow(); - Slide sl = ppt.createSlide(); - RichTextRun rt; + ppt = new HSLFSlideShow(); + HSLFSlide sl = ppt.createSlide(); + HSLFTextRun rt; String val = "Hello, World!"; // Create a new textbox, and give it lots of properties - TextBox txtbox = new TextBox(); - rt = txtbox.getTextRun().getRichTextRuns()[0]; + HSLFTextBox txtbox = new HSLFTextBox(); + rt = txtbox.getTextParagraph().getRichTextRuns()[0]; txtbox.setText(val); rt.setFontName("Arial"); rt.setFontSize(42); @@ -172,7 +171,7 @@ public final class TestShapes { sl.addShape(txtbox); // Check it before save - rt = txtbox.getTextRun().getRichTextRuns()[0]; + rt = txtbox.getTextParagraph().getRichTextRuns()[0]; assertEquals(val, rt.getText()); assertEquals(42, rt.getFontSize()); assertTrue(rt.isBold()); @@ -186,11 +185,11 @@ public final class TestShapes { ppt.write(out); out.close(); - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); sl = ppt.getSlides()[0]; - txtbox = (TextBox)sl.getShapes()[0]; - rt = txtbox.getTextRun().getRichTextRuns()[0]; + txtbox = (HSLFTextBox)sl.getShapes()[0]; + rt = txtbox.getTextParagraph().getRichTextRuns()[0]; // Check after save assertEquals(val, rt.getText()); @@ -208,8 +207,8 @@ public final class TestShapes { @Test public void emptyTextBox() { assertEquals(2, pptB.getSlides().length); - Slide s1 = pptB.getSlides()[0]; - Slide s2 = pptB.getSlides()[1]; + HSLFSlide s1 = pptB.getSlides()[0]; + HSLFSlide s2 = pptB.getSlides()[1]; // Check we can get the shapes count assertEquals(2, s1.getShapes().length); @@ -231,11 +230,11 @@ public final class TestShapes { } private void textBoxSet(String filename) throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream(filename)); - Slide[] sl = ppt.getSlides(); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream(filename)); + HSLFSlide[] sl = ppt.getSlides(); for (int k = 0; k < sl.length; k++) { ArrayList lst1 = new ArrayList(); - TextRun[] txt = sl[k].getTextRuns(); + HSLFTextParagraph[] txt = sl[k].getTextRuns(); for (int i = 0; i < txt.length; i++) { lst1.add(txt[i].getText()); } @@ -243,8 +242,8 @@ public final class TestShapes { ArrayList lst2 = new ArrayList(); HSLFShape[] sh = sl[k].getShapes(); for (int i = 0; i < sh.length; i++) { - if (sh[i] instanceof TextShape){ - TextShape tbox = (TextShape)sh[i]; + if (sh[i] instanceof HSLFTextShape){ + HSLFTextShape tbox = (HSLFTextShape)sh[i]; lst2.add(tbox.getText()); } } @@ -258,9 +257,9 @@ public final class TestShapes { */ @Test public void shapeGroup() throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); Dimension pgsize = ppt.getPageSize(); HSLFGroupShape group = new HSLFGroupShape(); @@ -268,8 +267,8 @@ public final class TestShapes { group.setAnchor(new Rectangle(0, 0, (int)pgsize.getWidth(), (int)pgsize.getHeight())); slide.addShape(group); - int idx = ppt.addPicture(_slTests.readFile("clock.jpg"), Picture.JPEG); - Picture pict = new Picture(idx, group); + int idx = ppt.addPicture(_slTests.readFile("clock.jpg"), HSLFPictureShape.JPEG); + HSLFPictureShape pict = new HSLFPictureShape(idx, group); pict.setAnchor(new Rectangle(0, 0, 200, 200)); group.addShape(pict); @@ -283,7 +282,7 @@ public final class TestShapes { out.close(); ByteArrayInputStream is = new ByteArrayInputStream(out.toByteArray()); - ppt = new SlideShow(is); + ppt = new HSLFSlideShow(is); is.close(); slide = ppt.getSlides()[0]; @@ -295,10 +294,10 @@ public final class TestShapes { group = (HSLFGroupShape)shape[0]; HSLFShape[] grshape = group.getShapes(); assertEquals(2, grshape.length); - assertTrue(grshape[0] instanceof Picture); + assertTrue(grshape[0] instanceof HSLFPictureShape); assertTrue(grshape[1] instanceof Line); - pict = (Picture)grshape[0]; + pict = (HSLFPictureShape)grshape[0]; assertEquals(new Rectangle(0, 0, 200, 200), pict.getAnchor()); line = (Line)grshape[1]; @@ -311,8 +310,8 @@ public final class TestShapes { @Test public void removeShapes() throws IOException { String file = "with_textbox.ppt"; - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream(file)); - Slide sl = ppt.getSlides()[0]; + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream(file)); + HSLFSlide sl = ppt.getSlides()[0]; HSLFShape[] sh = sl.getShapes(); assertEquals("expected four shaped in " + file, 4, sh.length); //remove all @@ -328,30 +327,30 @@ public final class TestShapes { ppt.write(out); out.close(); - ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); + ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); sl = ppt.getSlides()[0]; assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().length); } @Test public void lineWidth() { - SimpleShape sh = new AutoShape(ShapeType.RT_TRIANGLE); + HSLFSimpleShape sh = new HSLFAutoShape(ShapeType.RT_TRIANGLE); EscherOptRecord opt = sh.getEscherOptRecord(); - EscherSimpleProperty prop = SimpleShape.getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH); + EscherSimpleProperty prop = HSLFSimpleShape.getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH); assertNull(prop); - assertEquals(SimpleShape.DEFAULT_LINE_WIDTH, sh.getLineWidth(), 0); + assertEquals(HSLFSimpleShape.DEFAULT_LINE_WIDTH, sh.getLineWidth(), 0); sh.setLineWidth(1.0); - prop = SimpleShape.getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH); + prop = HSLFSimpleShape.getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH); assertNotNull(prop); assertEquals(1.0, sh.getLineWidth(), 0); } @Test public void shapeId() { - SlideShow ppt = new SlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); HSLFShape shape = null; //EscherDgg is a document-level record which keeps track of the drawing groups @@ -400,25 +399,25 @@ public final class TestShapes { @Test public void lineColor() throws IOException { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("51731.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("51731.ppt")); HSLFShape[] shape = ppt.getSlides()[0].getShapes(); assertEquals(4, shape.length); - TextShape sh1 = (TextShape)shape[0]; + HSLFTextShape sh1 = (HSLFTextShape)shape[0]; assertEquals("Hello Apache POI", sh1.getText()); assertNull(sh1.getLineColor()); - TextShape sh2 = (TextShape)shape[1]; + HSLFTextShape sh2 = (HSLFTextShape)shape[1]; assertEquals("Why are you showing this border?", sh2.getText()); assertNull(sh2.getLineColor()); - TextShape sh3 = (TextShape)shape[2]; + HSLFTextShape sh3 = (HSLFTextShape)shape[2]; assertEquals("Text in a black border", sh3.getText()); assertEquals(Color.black, sh3.getLineColor()); assertEquals(0.75, sh3.getLineWidth(), 0); - TextShape sh4 = (TextShape)shape[3]; + HSLFTextShape sh4 = (HSLFTextShape)shape[3]; assertEquals("Border width is 5 pt", sh4.getText()); assertEquals(Color.black, sh4.getLineColor()); assertEquals(5.0, sh4.getLineWidth(), 0); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java index a22e7eb3f9..60b8ca42e2 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java @@ -23,7 +23,7 @@ import junit.framework.TestCase; import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; import org.apache.poi.hslf.record.ColorSchemeAtom; import org.apache.poi.hslf.record.PPDrawing; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; /** @@ -42,7 +42,7 @@ public final class TestSheet extends TestCase { String[] tests = {"SampleShow.ppt", "backgrounds.ppt", "text_shapes.ppt", "pictures.ppt"}; for (String file : tests) { try { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream(file)); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream(file)); doSlideShow(ppt); } catch (EncryptedPowerPointFileException e){ ; //skip encrypted ppt @@ -50,21 +50,21 @@ public final class TestSheet extends TestCase { } } - private void doSlideShow(SlideShow ppt) { - Slide[] slide = ppt.getSlides(); + private void doSlideShow(HSLFSlideShow ppt) { + HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { verify(slide[i]); - Notes notes = slide[i].getNotesSheet(); + HSLFNotes notes = slide[i].getNotesSheet(); if(notes != null) verify(notes); - MasterSheet master = slide[i].getMasterSheet(); + HSLFMasterSheet master = slide[i].getMasterSheet(); assertNotNull(master); verify(master); } } - private void verify(Sheet sheet){ + private void verify(HSLFSheet sheet){ assertNotNull(sheet.getSlideShow()); ColorSchemeAtom colorscheme = sheet.getColorScheme(); @@ -73,13 +73,13 @@ public final class TestSheet extends TestCase { PPDrawing ppdrawing = sheet.getPPDrawing(); assertNotNull(ppdrawing); - Background background = sheet.getBackground(); + HSLFBackground background = sheet.getBackground(); assertNotNull(background); assertTrue(sheet._getSheetNumber() != 0); assertTrue(sheet._getSheetRefId() != 0); - TextRun[] txt = sheet.getTextRuns(); + HSLFTextParagraph[] txt = sheet.getTextRuns(); if (txt == null) { throw new AssertionFailedError("no text runs"); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java index 71c95f87b7..2d4fe15131 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java @@ -20,9 +20,8 @@ package org.apache.poi.hslf.model; import junit.framework.TestCase; -import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.record.SlideAtom; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; /** @@ -32,16 +31,16 @@ import org.apache.poi.POIDataSamples; */ public final class TestSlideChangeNotes extends TestCase { // SlideShow primed on the test data - private SlideShow ss; + private HSLFSlideShow ss; public TestSlideChangeNotes() throws Exception { POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); - HSLFSlideShow hss = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - ss = new SlideShow(hss); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + ss = new HSLFSlideShow(hss); } public void testSetToNone() { - Slide slideOne = ss.getSlides()[0]; + HSLFSlide slideOne = ss.getSlides()[0]; SlideAtom sa = slideOne.getSlideRecord().getSlideAtom(); slideOne.setNotes(null); @@ -50,8 +49,8 @@ public final class TestSlideChangeNotes extends TestCase { } public void testSetToSomething() { - Slide slideOne = ss.getSlides()[0]; - Notes notesOne = ss.getNotes()[1]; + HSLFSlide slideOne = ss.getSlides()[0]; + HSLFNotes notesOne = ss.getNotes()[1]; SlideAtom sa = slideOne.getSlideRecord().getSlideAtom(); slideOne.setNotes(notesOne); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java index 45c3c0c2bc..ffb6563da5 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java @@ -22,12 +22,11 @@ import java.io.ByteArrayOutputStream; import junit.framework.TestCase; -import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; import org.apache.poi.hslf.record.Environment; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.RichTextRun; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFTextRun; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; /** @@ -43,7 +42,7 @@ public final class TestSlideMaster extends TestCase{ * Check we can read their attributes. */ public void testSlideMaster() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); Environment env = ppt.getDocumentRecord().getEnvironment(); @@ -83,7 +82,7 @@ public final class TestSlideMaster extends TestCase{ * Test we can read default text attributes for a title master sheet */ public void testTitleMasterTextAttributes() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); TitleMaster[] master = ppt.getTitleMasters(); assertEquals(1, master.length); @@ -104,14 +103,14 @@ public final class TestSlideMaster extends TestCase{ * Slide 3 has title layout and follows the TitleMaster. Verify that. */ public void testTitleMaster() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt")); - Slide slide = ppt.getSlides()[2]; - MasterSheet masterSheet = slide.getMasterSheet(); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); + HSLFSlide slide = ppt.getSlides()[2]; + HSLFMasterSheet masterSheet = slide.getMasterSheet(); assertTrue(masterSheet instanceof TitleMaster); - TextRun[] txt = slide.getTextRuns(); + HSLFTextParagraph[] txt = slide.getTextRuns(); for (int i = 0; i < txt.length; i++) { - RichTextRun rt = txt[i].getRichTextRuns()[0]; + HSLFTextRun rt = txt[i].getRichTextRuns()[0]; switch(txt[i].getRunType()){ case TextHeaderAtom.CENTER_TITLE_TYPE: assertEquals("Arial", rt.getFontName()); @@ -133,20 +132,20 @@ public final class TestSlideMaster extends TestCase{ * If a style attribute is not set ensure it is read from the master */ public void testMasterAttributes() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt")); - Slide[] slide = ppt.getSlides(); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); + HSLFSlide[] slide = ppt.getSlides(); assertEquals(3, slide.length); - TextRun[] trun; + HSLFTextParagraph[] trun; trun = slide[0].getTextRuns(); for (int i = 0; i < trun.length; i++) { if (trun[i].getRunType() == TextHeaderAtom.TITLE_TYPE){ - RichTextRun rt = trun[i].getRichTextRuns()[0]; + HSLFTextRun rt = trun[i].getRichTextRuns()[0]; assertEquals(40, rt.getFontSize()); assertEquals(true, rt.isUnderlined()); assertEquals("Arial", rt.getFontName()); } else if (trun[i].getRunType() == TextHeaderAtom.BODY_TYPE){ - RichTextRun rt; + HSLFTextRun rt; rt = trun[i].getRichTextRuns()[0]; assertEquals(0, rt.getIndentLevel()); assertEquals(32, rt.getFontSize()); @@ -163,12 +162,12 @@ public final class TestSlideMaster extends TestCase{ trun = slide[1].getTextRuns(); for (int i = 0; i < trun.length; i++) { if (trun[i].getRunType() == TextHeaderAtom.TITLE_TYPE){ - RichTextRun rt = trun[i].getRichTextRuns()[0]; + HSLFTextRun rt = trun[i].getRichTextRuns()[0]; assertEquals(48, rt.getFontSize()); assertEquals(true, rt.isItalic()); assertEquals("Georgia", rt.getFontName()); } else if (trun[i].getRunType() == TextHeaderAtom.BODY_TYPE){ - RichTextRun rt; + HSLFTextRun rt; rt = trun[i].getRichTextRuns()[0]; assertEquals(0, rt.getIndentLevel()); assertEquals(32, rt.getFontSize()); @@ -182,9 +181,9 @@ public final class TestSlideMaster extends TestCase{ * Check we can dynamically assign a slide master to a slide. */ public void testChangeSlideMaster() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); SlideMaster[] master = ppt.getSlidesMasters(); - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); int sheetNo; //each slide uses its own master @@ -203,7 +202,7 @@ public final class TestSlideMaster extends TestCase{ ppt.write(out); out.close(); - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); master = ppt.getSlidesMasters(); slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { @@ -216,19 +215,19 @@ public final class TestSlideMaster extends TestCase{ * (typical for the "bullted body" placeholder) */ public void testIndentation() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt")); - Slide slide = ppt.getSlides()[0]; - TextRun[] trun; + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); + HSLFSlide slide = ppt.getSlides()[0]; + HSLFTextParagraph[] trun; trun = slide.getTextRuns(); for (int i = 0; i < trun.length; i++) { if (trun[i].getRunType() == TextHeaderAtom.TITLE_TYPE){ - RichTextRun rt = trun[i].getRichTextRuns()[0]; + HSLFTextRun rt = trun[i].getRichTextRuns()[0]; assertEquals(40, rt.getFontSize()); assertEquals(true, rt.isUnderlined()); assertEquals("Arial", rt.getFontName()); } else if (trun[i].getRunType() == TextHeaderAtom.BODY_TYPE){ - RichTextRun[] rt = trun[i].getRichTextRuns(); + HSLFTextRun[] rt = trun[i].getRichTextRuns(); for (int j = 0; j < rt.length; j++) { int indent = rt[j].getIndentLevel(); switch (indent){ diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java index 11889f4409..f5e0abef59 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java @@ -18,8 +18,8 @@ package org.apache.poi.hslf.model; import junit.framework.TestCase; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.SlideShow; + +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; import java.io.ByteArrayOutputStream; @@ -39,10 +39,10 @@ public final class TestSlides extends TestCase { * @throws Exception */ public void testAddSlides1() throws Exception { - SlideShow ppt = new SlideShow(new HSLFSlideShow( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") )); + HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") )); assertTrue(ppt.getSlides().length == 0); - Slide s1 = ppt.createSlide(); + HSLFSlide s1 = ppt.createSlide(); assertTrue(ppt.getSlides().length == 1); assertEquals(3, s1._getSheetRefId()); assertEquals(256, s1._getSheetNumber()); @@ -53,7 +53,7 @@ public final class TestSlides extends TestCase { ppt.write(out); out.close(); - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); assertTrue(ppt.getSlides().length == 1); } @@ -62,16 +62,16 @@ public final class TestSlides extends TestCase { * @throws Exception */ public void testAddSlides2() throws Exception { - SlideShow ppt = new SlideShow(new HSLFSlideShow( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") )); + HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") )); assertTrue(ppt.getSlides().length == 0); - Slide s1 = ppt.createSlide(); + HSLFSlide s1 = ppt.createSlide(); assertTrue(ppt.getSlides().length == 1); assertEquals(3, s1._getSheetRefId()); assertEquals(256, s1._getSheetNumber()); assertEquals(1, s1.getSlideNumber()); - Slide s2 = ppt.createSlide(); + HSLFSlide s2 = ppt.createSlide(); assertTrue(ppt.getSlides().length == 2); assertEquals(4, s2._getSheetRefId()); assertEquals(257, s2._getSheetNumber()); @@ -82,7 +82,7 @@ public final class TestSlides extends TestCase { ppt.write(out); out.close(); - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); assertTrue(ppt.getSlides().length == 2); } @@ -91,22 +91,22 @@ public final class TestSlides extends TestCase { * @throws Exception */ public void testAddSlides3() throws Exception { - SlideShow ppt = new SlideShow(new HSLFSlideShow( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") )); + HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") )); assertTrue(ppt.getSlides().length == 0); - Slide s1 = ppt.createSlide(); + HSLFSlide s1 = ppt.createSlide(); assertTrue(ppt.getSlides().length == 1); assertEquals(3, s1._getSheetRefId()); assertEquals(256, s1._getSheetNumber()); assertEquals(1, s1.getSlideNumber()); - Slide s2 = ppt.createSlide(); + HSLFSlide s2 = ppt.createSlide(); assertTrue(ppt.getSlides().length == 2); assertEquals(4, s2._getSheetRefId()); assertEquals(257, s2._getSheetNumber()); assertEquals(2, s2.getSlideNumber()); - Slide s3 = ppt.createSlide(); + HSLFSlide s3 = ppt.createSlide(); assertTrue(ppt.getSlides().length == 3); assertEquals(5, s3._getSheetRefId()); assertEquals(258, s3._getSheetNumber()); @@ -118,7 +118,7 @@ public final class TestSlides extends TestCase { ppt.write(out); out.close(); - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); assertTrue(ppt.getSlides().length == 3); // Check IDs are still right @@ -139,22 +139,22 @@ public final class TestSlides extends TestCase { */ public void testAddSlides2to3() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - SlideShow ppt = new SlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); assertTrue(ppt.getSlides().length == 2); // First slide is 256 / 4 - Slide s1 = ppt.getSlides()[0]; + HSLFSlide s1 = ppt.getSlides()[0]; assertEquals(256, s1._getSheetNumber()); assertEquals(4, s1._getSheetRefId()); // Last slide is 257 / 6 - Slide s2 = ppt.getSlides()[1]; + HSLFSlide s2 = ppt.getSlides()[1]; assertEquals(257, s2._getSheetNumber()); assertEquals(6, s2._getSheetRefId()); // Add another slide, goes in at the end - Slide s3 = ppt.createSlide(); + HSLFSlide s3 = ppt.createSlide(); assertTrue(ppt.getSlides().length == 3); assertEquals(258, s3._getSheetNumber()); assertEquals(8, s3._getSheetRefId()); @@ -165,7 +165,7 @@ public final class TestSlides extends TestCase { ppt.write(out); out.close(); - ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); assertTrue(ppt.getSlides().length == 3); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java index 480fd8ab65..d3fb354063 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java @@ -23,7 +23,7 @@ import java.io.ByteArrayOutputStream; import junit.framework.TestCase; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; /** * Test Table object. @@ -36,16 +36,16 @@ public final class TestTable extends TestCase { * Test that ShapeFactory works properly and returns Table */ public void testShapeFactory() throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); Table tbl = new Table(2, 5); slide.addShape(tbl); TableCell cell = tbl.getCell(0, 0); //table cells have type=TextHeaderAtom.OTHER_TYPE, see bug #46033 - assertEquals(TextHeaderAtom.OTHER_TYPE, cell.getTextRun().getRunType()); + assertEquals(TextHeaderAtom.OTHER_TYPE, cell.getTextParagraph().getRunType()); assertTrue(slide.getShapes()[0] instanceof Table); Table tbl2 = (Table)slide.getShapes()[0]; @@ -56,7 +56,7 @@ public final class TestTable extends TestCase { ppt.write(out); out.close(); - ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); + ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); slide = ppt.getSlides()[0]; assertTrue(slide.getShapes()[0] instanceof Table); Table tbl3 = (Table)slide.getShapes()[0]; @@ -68,8 +68,8 @@ public final class TestTable extends TestCase { * Error constructing Table when rownum=1 */ public void test45889(){ - SlideShow ppt = new SlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); HSLFShape[] shapes; Table tbl1 = new Table(1, 5); assertEquals(5, tbl1.getNumberOfColumns()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java index 1b0119307a..01ce6a0534 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java @@ -30,8 +30,8 @@ import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.TextBytesAtom; import org.apache.poi.hslf.record.TextCharsAtom; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.RichTextRun; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFTextRun; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; /** @@ -43,24 +43,24 @@ public final class TestTextRun extends TestCase { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); // SlideShow primed on the test data - private SlideShow ss; - private SlideShow ssRich; + private HSLFSlideShow ss; + private HSLFSlideShow ssRich; protected void setUp() throws IOException { // Basic (non rich) test file - ss = new SlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + ss = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); // Rich test file - ssRich = new SlideShow(_slTests.openResourceAsStream("Single_Coloured_Page.ppt")); + ssRich = new HSLFSlideShow(_slTests.openResourceAsStream("Single_Coloured_Page.ppt")); } /** * Test to ensure that getting the text works correctly */ public void testGetText() { - Slide slideOne = ss.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); + HSLFSlide slideOne = ss.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); assertEquals(2, textRuns.length); @@ -74,8 +74,8 @@ public final class TestTextRun extends TestCase { // Now check on a rich text run - Slide slideOneR = ssRich.getSlides()[0]; - TextRun[] textRunsR = slideOneR.getTextRuns(); + HSLFSlide slideOneR = ssRich.getSlides()[0]; + HSLFTextParagraph[] textRunsR = slideOneR.getTextRuns(); assertEquals(2, textRunsR.length); assertEquals("This is a title, it\u2019s in black", textRunsR[0].getText()); @@ -88,9 +88,9 @@ public final class TestTextRun extends TestCase { * Test to ensure changing non rich text bytes->bytes works correctly */ public void testSetText() { - Slide slideOne = ss.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); - TextRun run = textRuns[0]; + HSLFSlide slideOne = ss.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); + HSLFTextParagraph run = textRuns[0]; // Check current text assertEquals("This is a test title", run.getText()); @@ -110,8 +110,8 @@ public final class TestTextRun extends TestCase { * chars works correctly */ public void testAdvancedSetText() { - Slide slideOne = ss.getSlides()[0]; - TextRun run = slideOne.getTextRuns()[0]; + HSLFSlide slideOne = ss.getSlides()[0]; + HSLFTextParagraph run = slideOne.getTextRuns()[0]; TextHeaderAtom tha = run._headerAtom; TextBytesAtom tba = run._byteAtom; @@ -171,19 +171,19 @@ public final class TestTextRun extends TestCase { * set up for it */ public void testGetRichTextNonRich() { - Slide slideOne = ss.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); + HSLFSlide slideOne = ss.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); assertEquals(2, textRuns.length); - TextRun trA = textRuns[0]; - TextRun trB = textRuns[1]; + HSLFTextParagraph trA = textRuns[0]; + HSLFTextParagraph trB = textRuns[1]; assertEquals(1, trA.getRichTextRuns().length); assertEquals(1, trB.getRichTextRuns().length); - RichTextRun rtrA = trA.getRichTextRuns()[0]; - RichTextRun rtrB = trB.getRichTextRuns()[0]; + HSLFTextRun rtrA = trA.getRichTextRuns()[0]; + HSLFTextRun rtrB = trB.getRichTextRuns()[0]; assertEquals(trA.getText(), rtrA.getText()); assertEquals(trB.getText(), rtrB.getText()); @@ -198,21 +198,21 @@ public final class TestTextRun extends TestCase { * Tests to ensure that the rich text runs are built up correctly */ public void testGetRichText() { - Slide slideOne = ssRich.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); + HSLFSlide slideOne = ssRich.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); assertEquals(2, textRuns.length); - TextRun trA = textRuns[0]; - TextRun trB = textRuns[1]; + HSLFTextParagraph trA = textRuns[0]; + HSLFTextParagraph trB = textRuns[1]; assertEquals(1, trA.getRichTextRuns().length); assertEquals(3, trB.getRichTextRuns().length); - RichTextRun rtrA = trA.getRichTextRuns()[0]; - RichTextRun rtrB = trB.getRichTextRuns()[0]; - RichTextRun rtrC = trB.getRichTextRuns()[1]; - RichTextRun rtrD = trB.getRichTextRuns()[2]; + HSLFTextRun rtrA = trA.getRichTextRuns()[0]; + HSLFTextRun rtrB = trB.getRichTextRuns()[0]; + HSLFTextRun rtrC = trB.getRichTextRuns()[1]; + HSLFTextRun rtrD = trB.getRichTextRuns()[2]; assertEquals(trA.getText(), rtrA.getText()); @@ -244,12 +244,12 @@ public final class TestTextRun extends TestCase { * ensuring that everything stays with the same default styling */ public void testSetTextWhereNotRich() { - Slide slideOne = ss.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); - TextRun trB = textRuns[1]; + HSLFSlide slideOne = ss.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); + HSLFTextParagraph trB = textRuns[1]; assertEquals(1, trB.getRichTextRuns().length); - RichTextRun rtrB = trB.getRichTextRuns()[0]; + HSLFTextRun rtrB = trB.getRichTextRuns()[0]; assertEquals(trB.getText(), rtrB.getText()); assertNull(rtrB._getRawCharacterStyle()); assertNull(rtrB._getRawParagraphStyle()); @@ -268,14 +268,14 @@ public final class TestTextRun extends TestCase { * sets everything to the same styling */ public void testSetTextWhereRich() { - Slide slideOne = ssRich.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); - TextRun trB = textRuns[1]; + HSLFSlide slideOne = ssRich.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); + HSLFTextParagraph trB = textRuns[1]; assertEquals(3, trB.getRichTextRuns().length); - RichTextRun rtrB = trB.getRichTextRuns()[0]; - RichTextRun rtrC = trB.getRichTextRuns()[1]; - RichTextRun rtrD = trB.getRichTextRuns()[2]; + HSLFTextRun rtrB = trB.getRichTextRuns()[0]; + HSLFTextRun rtrC = trB.getRichTextRuns()[1]; + HSLFTextRun rtrD = trB.getRichTextRuns()[2]; TextPropCollection tpBP = rtrB._getRawParagraphStyle(); TextPropCollection tpBC = rtrB._getRawCharacterStyle(); TextPropCollection tpCP = rtrC._getRawParagraphStyle(); @@ -316,12 +316,12 @@ public final class TestTextRun extends TestCase { * in a rich text run, that doesn't happen to actually be rich */ public void testChangeTextInRichTextRunNonRich() { - Slide slideOne = ss.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); - TextRun trB = textRuns[1]; + HSLFSlide slideOne = ss.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); + HSLFTextParagraph trB = textRuns[1]; assertEquals(1, trB.getRichTextRuns().length); - RichTextRun rtrB = trB.getRichTextRuns()[0]; + HSLFTextRun rtrB = trB.getRichTextRuns()[0]; assertEquals(trB.getText(), rtrB.getText()); assertNull(rtrB._getRawCharacterStyle()); assertNull(rtrB._getRawParagraphStyle()); @@ -341,16 +341,16 @@ public final class TestTextRun extends TestCase { * correctly */ public void testChangeTextInRichTextRun() { - Slide slideOne = ssRich.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); - TextRun trB = textRuns[1]; + HSLFSlide slideOne = ssRich.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); + HSLFTextParagraph trB = textRuns[1]; assertEquals(3, trB.getRichTextRuns().length); // We start with 3 text runs, each with their own set of styles, // but all sharing the same paragraph styles - RichTextRun rtrB = trB.getRichTextRuns()[0]; - RichTextRun rtrC = trB.getRichTextRuns()[1]; - RichTextRun rtrD = trB.getRichTextRuns()[2]; + HSLFTextRun rtrB = trB.getRichTextRuns()[0]; + HSLFTextRun rtrC = trB.getRichTextRuns()[1]; + HSLFTextRun rtrD = trB.getRichTextRuns()[2]; TextPropCollection tpBP = rtrB._getRawParagraphStyle(); TextPropCollection tpBC = rtrB._getRawCharacterStyle(); TextPropCollection tpCP = rtrC._getRawParagraphStyle(); @@ -421,11 +421,11 @@ public final class TestTextRun extends TestCase { * */ public void testBug41015() throws IOException { - RichTextRun[] rt; + HSLFTextRun[] rt; - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("bug-41015.ppt")); - Slide sl = ppt.getSlides()[0]; - TextRun[] txt = sl.getTextRuns(); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bug-41015.ppt")); + HSLFSlide sl = ppt.getSlides()[0]; + HSLFTextParagraph[] txt = sl.getTextRuns(); assertEquals(2, txt.length); rt = txt[0].getRichTextRuns(); @@ -448,24 +448,24 @@ public final class TestTextRun extends TestCase { * Test creation of TextRun objects. */ public void testAddTextRun() { - SlideShow ppt = new SlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); assertNull(slide.getTextRuns()); - TextBox shape1 = new TextBox(); - TextRun run1 = shape1.getTextRun(); + HSLFTextBox shape1 = new HSLFTextBox(); + HSLFTextParagraph run1 = shape1.getTextParagraph(); assertSame(run1, shape1.createTextRun()); run1.setText("Text 1"); slide.addShape(shape1); //The array of Slide's text runs must be updated when new text shapes are added. - TextRun[] runs = slide.getTextRuns(); + HSLFTextParagraph[] runs = slide.getTextRuns(); assertNotNull(runs); assertSame(run1, runs[0]); - TextBox shape2 = new TextBox(); - TextRun run2 = shape2.getTextRun(); + HSLFTextBox shape2 = new HSLFTextBox(); + HSLFTextParagraph run2 = shape2.getTextParagraph(); assertSame(run2, shape2.createTextRun()); run2.setText("Text 2"); slide.addShape(shape2); @@ -479,14 +479,14 @@ public final class TestTextRun extends TestCase { //as getShapes() HSLFShape[] sh = slide.getShapes(); assertEquals(2, sh.length); - assertTrue(sh[0] instanceof TextBox); - TextBox box1 = (TextBox)sh[0]; - assertSame(run1, box1.getTextRun()); - TextBox box2 = (TextBox)sh[1]; - assertSame(run2, box2.getTextRun()); + assertTrue(sh[0] instanceof HSLFTextBox); + HSLFTextBox box1 = (HSLFTextBox)sh[0]; + assertSame(run1, box1.getTextParagraph()); + HSLFTextBox box2 = (HSLFTextBox)sh[1]; + assertSame(run2, box2.getTextParagraph()); //test Table - a complex group of shapes containing text objects - Slide slide2 = ppt.createSlide(); + HSLFSlide slide2 = ppt.createSlide(); assertNull(slide2.getTextRuns()); Table table = new Table(2, 2); slide2.addShape(table); @@ -496,12 +496,12 @@ public final class TestTextRun extends TestCase { } public void test48916() throws IOException { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("SampleShow.ppt")); - for(Slide slide : ppt.getSlides()){ + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("SampleShow.ppt")); + for(HSLFSlide slide : ppt.getSlides()){ for(HSLFShape sh : slide.getShapes()){ - if(sh instanceof TextShape){ - TextShape tx = (TextShape)sh; - TextRun run = tx.getTextRun(); + if(sh instanceof HSLFTextShape){ + HSLFTextShape tx = (HSLFTextShape)sh; + HSLFTextParagraph run = tx.getTextParagraph(); //verify that records cached in TextRun and EscherTextboxWrapper are the same Record[] runChildren = run.getRecords(); Record[] txboxChildren = tx.getEscherTextboxWrapper().getChildRecords(); @@ -517,13 +517,13 @@ public final class TestTextRun extends TestCase { } ByteArrayOutputStream out = new ByteArrayOutputStream(); ppt.write(out); - ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); - for(Slide slide : ppt.getSlides()){ + ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); + for(HSLFSlide slide : ppt.getSlides()){ for(HSLFShape sh : slide.getShapes()){ - if(sh instanceof TextShape){ - TextShape tx = (TextShape)sh; - TextRun run = tx.getTextRun(); - RichTextRun rt = run.getRichTextRuns()[0]; + if(sh instanceof HSLFTextShape){ + HSLFTextShape tx = (HSLFTextShape)sh; + HSLFTextParagraph run = tx.getTextParagraph(); + HSLFTextRun rt = run.getRichTextRuns()[0]; assertTrue(rt.isBold()); assertEquals(rt.getFontColor(), Color.RED); } @@ -533,9 +533,9 @@ public final class TestTextRun extends TestCase { } public void test52244() throws IOException { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("52244.ppt")); - Slide slide = ppt.getSlides()[0]; - TextRun[] runs = slide.getTextRuns(); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52244.ppt")); + HSLFSlide slide = ppt.getSlides()[0]; + HSLFTextParagraph[] runs = slide.getTextRuns(); assertEquals("Arial", runs[0].getRichTextRuns()[0].getFontName()); assertEquals(36, runs[0].getRichTextRuns()[0].getFontSize()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java index db55a2c052..c5a01341ae 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java @@ -19,11 +19,11 @@ package org.apache.poi.hslf.model; import junit.framework.TestCase; + import java.io.*; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.RichTextRun; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFTextRun; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.poifs.filesystem.*; import org.apache.poi.POIDataSamples; @@ -36,9 +36,9 @@ import org.apache.poi.POIDataSamples; */ public final class TestTextRunReWrite extends TestCase { // HSLFSlideShow primed on the test data - private HSLFSlideShow hss; + private HSLFSlideShowImpl hss; // HSLFSlideShow primed on the test data - private SlideShow ss; + private HSLFSlideShow ss; // POIFS primed on the test data private POIFSFileSystem pfs; @@ -49,14 +49,14 @@ public final class TestTextRunReWrite extends TestCase { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); String filename = "Single_Coloured_Page_With_Fonts_and_Alignments.ppt"; pfs = new POIFSFileSystem(slTests.openResourceAsStream(filename)); - hss = new HSLFSlideShow(pfs); - ss = new SlideShow(hss); + hss = new HSLFSlideShowImpl(pfs); + ss = new HSLFSlideShow(hss); } public void testWritesOutTheSameNonRich() throws Exception { // Grab the first text run on the first sheet - TextRun tr1 = ss.getSlides()[0].getTextRuns()[0]; - TextRun tr2 = ss.getSlides()[0].getTextRuns()[1]; + HSLFTextParagraph tr1 = ss.getSlides()[0].getTextRuns()[0]; + HSLFTextParagraph tr2 = ss.getSlides()[0].getTextRuns()[1]; // Ensure the text lengths are as we'd expect to start with assertEquals(1, ss.getSlides().length); @@ -112,10 +112,10 @@ public final class TestTextRunReWrite extends TestCase { public void testWritesOutTheSameRich() throws Exception { // Grab the first text run on the first sheet - TextRun tr1 = ss.getSlides()[0].getTextRuns()[0]; + HSLFTextParagraph tr1 = ss.getSlides()[0].getTextRuns()[0]; // Get the first rich text run - RichTextRun rtr1 = tr1.getRichTextRuns()[0]; + HSLFTextRun rtr1 = tr1.getRichTextRuns()[0]; // Check that the text sizes are as expected diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java index 542d608d8e..5666b8db0e 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java @@ -34,7 +34,7 @@ import java.util.Map; import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.ShapeType; import org.junit.Test; @@ -48,14 +48,14 @@ public final class TestTextShape { @Test public void createAutoShape(){ - TextShape shape = new AutoShape(ShapeType.TRAPEZOID); - assertNull(shape.getTextRun()); + HSLFTextShape shape = new HSLFAutoShape(ShapeType.TRAPEZOID); + assertNull(shape.getTextParagraph()); assertNull(shape.getText()); assertNull(shape.getEscherTextboxWrapper()); - TextRun run = shape.createTextRun(); + HSLFTextParagraph run = shape.createTextRun(); assertNotNull(run); - assertNotNull(shape.getTextRun()); + assertNotNull(shape.getTextParagraph()); assertNotNull(shape.getEscherTextboxWrapper()); assertEquals("", shape.getText()); assertSame(run, shape.createTextRun()); @@ -64,14 +64,14 @@ public final class TestTextShape { @Test public void createTextBox(){ - TextShape shape = new TextBox(); - TextRun run = shape.getTextRun(); + HSLFTextShape shape = new HSLFTextBox(); + HSLFTextParagraph run = shape.getTextParagraph(); assertNotNull(run); assertNotNull(shape.getText()); assertNotNull(shape.getEscherTextboxWrapper()); assertSame(run, shape.createTextRun()); - assertNotNull(shape.getTextRun()); + assertNotNull(shape.getTextParagraph()); assertNotNull(shape.getEscherTextboxWrapper()); assertEquals("", shape.getText()); @@ -85,15 +85,15 @@ public final class TestTextShape { */ @Test public void read() throws IOException { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("text_shapes.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text_shapes.ppt")); List lst1 = new ArrayList(); - Slide slide = ppt.getSlides()[0]; + HSLFSlide slide = ppt.getSlides()[0]; HSLFShape[] shape = slide.getShapes(); for (int i = 0; i < shape.length; i++) { - assertTrue("Expected TextShape but found " + shape[i].getClass().getName(), shape[i] instanceof TextShape); - TextShape tx = (TextShape)shape[i]; - TextRun run = tx.getTextRun(); + assertTrue("Expected TextShape but found " + shape[i].getClass().getName(), shape[i] instanceof HSLFTextShape); + HSLFTextShape tx = (HSLFTextShape)shape[i]; + HSLFTextParagraph run = tx.getTextParagraph(); assertNotNull(run); int runType = run.getRunType(); @@ -125,7 +125,7 @@ public final class TestTextShape { } List lst2 = new ArrayList(); - TextRun[] run = slide.getTextRuns(); + HSLFTextParagraph[] run = slide.getTextRuns(); for (int i = 0; i < run.length; i++) { lst2.add(run[i].getText()); } @@ -135,18 +135,18 @@ public final class TestTextShape { @Test public void readWrite() throws IOException { - SlideShow ppt = new SlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); - TextShape shape1 = new TextBox(); - TextRun run1 = shape1.createTextRun(); + HSLFTextShape shape1 = new HSLFTextBox(); + HSLFTextParagraph run1 = shape1.createTextRun(); run1.setText("Hello, World!"); slide.addShape(shape1); shape1.moveTo(100, 100); - TextShape shape2 = new AutoShape(ShapeType.RIGHT_ARROW); - TextRun run2 = shape2.createTextRun(); + HSLFTextShape shape2 = new HSLFAutoShape(ShapeType.RIGHT_ARROW); + HSLFTextParagraph run2 = shape2.createTextRun(); run2.setText("Testing TextShape"); slide.addShape(shape2); shape2.moveTo(300, 300); @@ -155,37 +155,37 @@ public final class TestTextShape { ppt.write(out); out.close(); - ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); + ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); slide = ppt.getSlides()[0]; HSLFShape[] shape = slide.getShapes(); - assertTrue(shape[0] instanceof TextShape); - shape1 = (TextShape)shape[0]; + assertTrue(shape[0] instanceof HSLFTextShape); + shape1 = (HSLFTextShape)shape[0]; assertEquals(ShapeType.TEXT_BOX, shape1.getShapeType()); - assertEquals("Hello, World!", shape1.getTextRun().getText()); + assertEquals("Hello, World!", shape1.getTextParagraph().getText()); - assertTrue(shape[1] instanceof TextShape); - shape1 = (TextShape)shape[1]; + assertTrue(shape[1] instanceof HSLFTextShape); + shape1 = (HSLFTextShape)shape[1]; assertEquals(ShapeType.RIGHT_ARROW, shape1.getShapeType()); - assertEquals("Testing TextShape", shape1.getTextRun().getText()); + assertEquals("Testing TextShape", shape1.getTextParagraph().getText()); } @Test public void margins() throws IOException { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("text-margins.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text-margins.ppt")); - Slide slide = ppt.getSlides()[0]; + HSLFSlide slide = ppt.getSlides()[0]; - Map map = new HashMap(); + Map map = new HashMap(); HSLFShape[] shape = slide.getShapes(); for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof TextShape){ - TextShape tx = (TextShape)shape[i]; + if(shape[i] instanceof HSLFTextShape){ + HSLFTextShape tx = (HSLFTextShape)shape[i]; map.put(tx.getText(), tx); } } - TextShape tx; + HSLFTextShape tx; tx = map.get("TEST1"); assertEquals(0.1, tx.getMarginLeft()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); @@ -214,22 +214,22 @@ public final class TestTextShape { @Test public void bug52599() throws IOException { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("52599.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52599.ppt")); - Slide slide = ppt.getSlides()[0]; + HSLFSlide slide = ppt.getSlides()[0]; HSLFShape[] sh = slide.getShapes(); assertEquals(3, sh.length); - TextShape sh0 = (TextShape)sh[0]; + HSLFTextShape sh0 = (HSLFTextShape)sh[0]; assertEquals(null, sh0.getText()); - assertEquals(null, sh0.getTextRun()); + assertEquals(null, sh0.getTextParagraph()); - TextShape sh1 = (TextShape)sh[1]; + HSLFTextShape sh1 = (HSLFTextShape)sh[1]; assertEquals(null, sh1.getText()); - assertEquals(null, sh1.getTextRun()); + assertEquals(null, sh1.getTextParagraph()); - TextShape sh2 = (TextShape)sh[2]; + HSLFTextShape sh2 = (HSLFTextShape)sh[2]; assertEquals("this box should be shown just once", sh2.getText()); - assertEquals(-1, sh2.getTextRun().getIndex()); + assertEquals(-1, sh2.getTextParagraph().getIndex()); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java index 7db3ca6c8e..7e37b47a43 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java @@ -19,7 +19,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.hslf.record.StyleTextPropAtom; import org.apache.poi.hslf.record.TextCharsAtom; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hssf.usermodel.DummyGraphics2d; import org.junit.Test; @@ -27,22 +27,22 @@ import org.junit.Test; public class TextPainterTest { @Test public void testTextPainter() { - TextShape shape = new Polygon(); + HSLFTextShape shape = new Polygon(); TextPainter painter = new TextPainter(shape); - painter.getAttributedString(new TextRun(null, new TextCharsAtom(), null)); + painter.getAttributedString(new HSLFTextParagraph(null, new TextCharsAtom(), null)); painter.paint(new DummyGraphics2d()); painter.getTextElements((float)1.0, null); } @Test public void testTextPainterWithText() { - TextShape shape = new Polygon(); + HSLFTextShape shape = new Polygon(); TextPainter painter = new TextPainter(shape); TextCharsAtom tca = new TextCharsAtom(); tca.setText("some text to read"); - TextRun txrun = new TextRun(new TextHeaderAtom(), tca, new StyleTextPropAtom(10)); - Slide sheet = new Slide(1, 1, 1); - sheet.setSlideShow(new SlideShow()); + HSLFTextParagraph txrun = new HSLFTextParagraph(new TextHeaderAtom(), tca, new StyleTextPropAtom(10)); + HSLFSlide sheet = new HSLFSlide(1, 1, 1); + sheet.setSlideShow(new HSLFSlideShow()); txrun.setSheet(sheet); painter.getAttributedString(txrun, new DummyGraphics2d()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java index 05478e3374..60aee0f49d 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java @@ -24,8 +24,8 @@ import java.io.ByteArrayOutputStream; import java.io.InputStream; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.poifs.filesystem.DocumentEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.junit.Test; @@ -72,7 +72,7 @@ public final class TestCurrentUserAtom { new CurrentUserAtom(fs); assertTrue(true); // not yet failed - new HSLFSlideShow(fs); + new HSLFSlideShowImpl(fs); } @Test diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java index 114a41da8d..d7de61c877 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java @@ -19,7 +19,7 @@ package org.apache.poi.hslf.record; import junit.framework.TestCase; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.poifs.filesystem.*; import org.apache.poi.POIDataSamples; @@ -30,14 +30,14 @@ import org.apache.poi.POIDataSamples; */ public final class TestDocument extends TestCase { // HSLFSlideShow primed on the test data - private HSLFSlideShow ss; + private HSLFSlideShowImpl ss; // POIFS primed on the test data private POIFSFileSystem pfs; public TestDocument() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); pfs = new POIFSFileSystem(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - ss = new HSLFSlideShow(pfs); + ss = new HSLFSlideShowImpl(pfs); } private Document getDocRecord() { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java index d9e3717842..12c114b344 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java @@ -33,11 +33,11 @@ import org.apache.poi.hpsf.DocumentSummaryInformation; import org.apache.poi.hpsf.PropertySet; import org.apache.poi.hpsf.PropertySetFactory; import org.apache.poi.hpsf.SummaryInformation; -import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; -import org.apache.poi.hslf.model.Slide; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.model.HSLFSlide; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFPictureData; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey; import org.apache.poi.poifs.crypt.CryptoFunctions; import org.apache.poi.poifs.crypt.EncryptionInfo; @@ -71,8 +71,8 @@ public class TestDocumentEncryption { for (String pptFile : encPpts) { try { NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true); - HSLFSlideShow hss = new HSLFSlideShow(fs); - new SlideShow(hss); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs); + new HSLFSlideShow(hss); fs.close(); } catch (EncryptedPowerPointFileException e) { fail(pptFile+" can't be decrypted"); @@ -85,9 +85,9 @@ public class TestDocumentEncryption { String pptFile = "cryptoapi-proc2356.ppt"; Biff8EncryptionKey.setCurrentUserPassword("crypto"); NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true); - HSLFSlideShow hss = new HSLFSlideShow(fs); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs); // need to cache data (i.e. read all data) before changing the key size - PictureData picsExpected[] = hss.getPictures(); + HSLFPictureData picsExpected[] = hss.getPictures(); hss.getDocumentSummaryInformation(); EncryptionInfo ei = hss.getDocumentEncryptionAtom().getEncryptionInfo(); ((CryptoAPIEncryptionHeader)ei.getHeader()).setKeySize(0x78); @@ -97,8 +97,8 @@ public class TestDocumentEncryption { fs.close(); fs = new NPOIFSFileSystem(new ByteArrayInputStream(bos.toByteArray())); - hss = new HSLFSlideShow(fs); - PictureData picsActual[] = hss.getPictures(); + hss = new HSLFSlideShowImpl(fs); + HSLFPictureData picsActual[] = hss.getPictures(); fs.close(); assertEquals(picsExpected.length, picsActual.length); @@ -112,7 +112,7 @@ public class TestDocumentEncryption { /* documents with multiple edits need to be normalized for encryption */ String pptFile = "57272_corrupted_usereditatom.ppt"; NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true); - HSLFSlideShow hss = new HSLFSlideShow(fs); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs); hss.normalizeRecords(); // normalized ppt @@ -128,7 +128,7 @@ public class TestDocumentEncryption { // decrypted ByteArrayInputStream bis = new ByteArrayInputStream(encrypted.toByteArray()); fs = new NPOIFSFileSystem(bis); - hss = new HSLFSlideShow(fs); + hss = new HSLFSlideShowImpl(fs); Biff8EncryptionKey.setCurrentUserPassword(null); ByteArrayOutputStream actual = new ByteArrayOutputStream(); hss.write(actual); @@ -143,10 +143,10 @@ public class TestDocumentEncryption { // http://blogs.msdn.com/b/openspecification/archive/2009/05/08/dominic-salemno.aspx Biff8EncryptionKey.setCurrentUserPassword("crypto"); NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile("cryptoapi-proc2356.ppt")); - HSLFSlideShow hss = new HSLFSlideShow(fs); - SlideShow ss = new SlideShow(hss); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs); + HSLFSlideShow ss = new HSLFSlideShow(hss); - Slide slide = ss.getSlides()[0]; + HSLFSlide slide = ss.getSlides()[0]; assertEquals("Dominic Salemno", slide.getTextRuns()[0].getText()); String picCmp[][] = { @@ -160,9 +160,9 @@ public class TestDocumentEncryption { }; MessageDigest md = CryptoFunctions.getMessageDigest(HashAlgorithm.sha1); - PictureData pd[] = hss.getPictures(); + HSLFPictureData pd[] = hss.getPictures(); int i = 0; - for (PictureData p : pd) { + for (HSLFPictureData p : pd) { byte hash[] = md.digest(p.getData()); assertEquals(Integer.parseInt(picCmp[i][0]), p.getOffset()); assertEquals(picCmp[i][1], Base64.encodeBase64String(hash)); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java index fff9d7286e..f712e20a6d 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java @@ -25,8 +25,8 @@ import java.util.List; import junit.framework.AssertionFailedError; import junit.framework.TestCase; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; /** @@ -99,8 +99,8 @@ public final class TestExHyperlink extends TestCase { public void testRealFile() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("WithLinks.ppt")); - SlideShow ss = new SlideShow(hss); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("WithLinks.ppt")); + HSLFSlideShow ss = new HSLFSlideShow(hss); // Get the document Document doc = ss.getDocumentRecord(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java index d3739ec3b8..836016666e 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java @@ -20,8 +20,8 @@ package org.apache.poi.hslf.record; import junit.framework.TestCase; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; /** @@ -32,8 +32,8 @@ import org.apache.poi.POIDataSamples; public class TestExObjList extends TestCase { public void testRealFile() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("WithLinks.ppt")); - SlideShow ss = new SlideShow(hss); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("WithLinks.ppt")); + HSLFSlideShow ss = new HSLFSlideShow(hss); // Get the document Document doc = ss.getDocumentRecord(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java index 8481cbc70f..cecf3ee319 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java @@ -20,7 +20,7 @@ package org.apache.poi.hslf.record; import junit.framework.TestCase; -import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.POIDataSamples; /** @@ -149,7 +149,7 @@ public final class TestRecordContainer extends TestCase { // Find a real RecordContainer record POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); Record[] r = hss.getRecords(); for(int i=0; i notesMap = new HashMap(); @@ -143,10 +128,10 @@ public final class TestBugs { notesMap.put(Integer.valueOf(7), "Although multiply and square root are easier"); notesMap.put(Integer.valueOf(8), "The bus Z is split into Z_H and Z_L"); - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { Integer slideNumber = Integer.valueOf(slide[i].getSlideNumber()); - Notes notes = slide[i].getNotesSheet(); + HSLFNotes notes = slide[i].getNotesSheet(); if (notesMap.containsKey(slideNumber)){ assertNotNull(notes); String text = notes.getTextRuns()[0].getRawText(); @@ -162,18 +147,18 @@ public final class TestBugs { */ @Test public void bug42485 () throws Exception { - HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42485.ppt")); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42485.ppt")); - SlideShow ppt = new SlideShow(hslf); + HSLFSlideShow ppt = new HSLFSlideShow(hslf); HSLFShape[] shape = ppt.getSlides()[0].getShapes(); for (int i = 0; i < shape.length; i++) { if(shape[i] instanceof HSLFGroupShape){ HSLFGroupShape group = (HSLFGroupShape)shape[i]; HSLFShape[] sh = group.getShapes(); for (int j = 0; j < sh.length; j++) { - if( sh[j] instanceof TextBox){ - TextBox txt = (TextBox)sh[j]; - assertNotNull(txt.getTextRun()); + if( sh[j] instanceof HSLFTextBox){ + HSLFTextBox txt = (HSLFTextBox)sh[j]; + assertNotNull(txt.getTextParagraph()); } } } @@ -185,9 +170,9 @@ public final class TestBugs { */ @Test public void bug42484 () throws Exception { - HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42485.ppt")); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42485.ppt")); - SlideShow ppt = new SlideShow(hslf); + HSLFSlideShow ppt = new HSLFSlideShow(hslf); HSLFShape[] shape = ppt.getSlides()[0].getShapes(); for (int i = 0; i < shape.length; i++) { if(shape[i] instanceof HSLFGroupShape){ @@ -207,16 +192,16 @@ public final class TestBugs { */ @Test public void bug41381() throws Exception { - HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("alterman_security.ppt")); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("alterman_security.ppt")); - SlideShow ppt = new SlideShow(hslf); + HSLFSlideShow ppt = new HSLFSlideShow(hslf); assertTrue("No Exceptions while reading file", true); assertEquals(1, ppt.getSlidesMasters().length); assertEquals(1, ppt.getTitleMasters().length); - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { - MasterSheet master = slide[i].getMasterSheet(); + HSLFMasterSheet master = slide[i].getMasterSheet(); if (i == 0) assertTrue(master instanceof TitleMaster); //the first slide follows TitleMaster else assertTrue(master instanceof SlideMaster); } @@ -227,10 +212,10 @@ public final class TestBugs { */ @Test public void bug42486 () throws Exception { - HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42486.ppt")); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42486.ppt")); - SlideShow ppt = new SlideShow(hslf); - Slide[] slide = ppt.getSlides(); + HSLFSlideShow ppt = new HSLFSlideShow(hslf); + HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { @SuppressWarnings("unused") HSLFShape[] shape = slide[i].getShapes(); @@ -244,11 +229,11 @@ public final class TestBugs { */ @Test public void bug42524 () throws Exception { - HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42486.ppt")); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42486.ppt")); - SlideShow ppt = new SlideShow(hslf); + HSLFSlideShow ppt = new HSLFSlideShow(hslf); //walk down the tree and see if there were no errors while reading - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { @@ -272,17 +257,17 @@ public final class TestBugs { */ @Test public void bug42520 () throws Exception { - HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42520.ppt")); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42520.ppt")); - SlideShow ppt = new SlideShow(hslf); + HSLFSlideShow ppt = new HSLFSlideShow(hslf); //test case from the bug report HSLFGroupShape shapeGroup = (HSLFGroupShape)ppt.getSlides()[11].getShapes()[10]; - Picture picture = (Picture)shapeGroup.getShapes()[0]; + HSLFPictureShape picture = (HSLFPictureShape)shapeGroup.getShapes()[0]; picture.getPictureData(); //walk down the tree and see if there were no errors while reading - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { HSLFShape[] shape = slide[i].getShapes(); for (int j = 0; j < shape.length; j++) { @@ -291,9 +276,9 @@ public final class TestBugs { HSLFShape[] comps = group.getShapes(); for (int k = 0; k < comps.length; k++) { HSLFShape comp = comps[k]; - if (comp instanceof Picture){ + if (comp instanceof HSLFPictureShape){ @SuppressWarnings("unused") - PictureData pict = ((Picture)comp).getPictureData(); + HSLFPictureData pict = ((HSLFPictureShape)comp).getPictureData(); } } } @@ -310,13 +295,13 @@ public final class TestBugs { */ @Test public void bug38256 () throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("38256.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("38256.ppt")); assertTrue("No Exceptions while reading file", true); - Slide[] slide = ppt.getSlides(); + HSLFSlide[] slide = ppt.getSlides(); assertEquals(1, slide.length); - TextRun[] runs = slide[0].getTextRuns(); + HSLFTextParagraph[] runs = slide[0].getTextRuns(); assertEquals(4, runs.length); Set txt = new HashSet(); @@ -338,13 +323,13 @@ public final class TestBugs { */ @Test public void bug43781 () throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("43781.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("43781.ppt")); assertTrue("No Exceptions while reading file", true); // Check the first slide - Slide slide = ppt.getSlides()[0]; - TextRun[] slTr = slide.getTextRuns(); + HSLFSlide slide = ppt.getSlides()[0]; + HSLFTextParagraph[] slTr = slide.getTextRuns(); // Has two text runs, one from slide text, one from drawing assertEquals(2, slTr.length); @@ -354,11 +339,11 @@ public final class TestBugs { assertEquals("Second run", slTr[1].getText()); // Check the shape based text runs - List lst = new ArrayList(); + List lst = new ArrayList(); HSLFShape[] shape = slide.getShapes(); for (int i = 0; i < shape.length; i++) { - if( shape[i] instanceof TextShape){ - TextRun textRun = ((TextShape)shape[i]).getTextRun(); + if( shape[i] instanceof HSLFTextShape){ + HSLFTextParagraph textRun = ((HSLFTextShape)shape[i]).getTextParagraph(); if(textRun != null) { lst.add(textRun); } @@ -377,17 +362,17 @@ public final class TestBugs { */ @Test public void bug44296 () throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("44296.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("44296.ppt")); - Slide slide = ppt.getSlides()[0]; + HSLFSlide slide = ppt.getSlides()[0]; - Background b = slide.getBackground(); - Fill f = b.getFill(); - assertEquals(Fill.FILL_PICTURE, f.getFillType()); + HSLFBackground b = slide.getBackground(); + HSLFFill f = b.getFill(); + assertEquals(HSLFFill.FILL_PICTURE, f.getFillType()); - PictureData pict = f.getPictureData(); + HSLFPictureData pict = f.getPictureData(); assertNotNull(pict); - assertEquals(Picture.JPEG, pict.getType()); + assertEquals(HSLFPictureShape.JPEG, pict.getType()); } /** @@ -396,7 +381,7 @@ public final class TestBugs { @Test public void bug44770() throws Exception { try { - new SlideShow(_slTests.openResourceAsStream("44770.ppt")); + new HSLFSlideShow(_slTests.openResourceAsStream("44770.ppt")); } catch (RuntimeException e) { if (e.getMessage().equals("Couldn't instantiate the class for type with id 1036 on class class org.apache.poi.hslf.record.PPDrawing")) { throw new AssertionFailedError("Identified bug 44770"); @@ -410,16 +395,16 @@ public final class TestBugs { */ @Test public void bug41071() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("41071.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("41071.ppt")); - Slide slide = ppt.getSlides()[0]; + HSLFSlide slide = ppt.getSlides()[0]; HSLFShape[] sh = slide.getShapes(); assertEquals(1, sh.length); - assertTrue(sh[0] instanceof TextShape); - TextShape tx = (TextShape)sh[0]; - assertEquals("Fundera, planera och involvera.", tx.getTextRun().getText()); + assertTrue(sh[0] instanceof HSLFTextShape); + HSLFTextShape tx = (HSLFTextShape)sh[0]; + assertEquals("Fundera, planera och involvera.", tx.getTextParagraph().getText()); - TextRun[] run = slide.getTextRuns(); + HSLFTextParagraph[] run = slide.getTextRuns(); assertEquals(1, run.length); assertEquals("Fundera, planera och involvera.", run[0].getText()); } @@ -431,10 +416,10 @@ public final class TestBugs { @Test(expected=OldPowerPointFormatException.class) public void bug41711() throws Exception { // New file is fine - new SlideShow(_slTests.openResourceAsStream("SampleShow.ppt")); + new HSLFSlideShow(_slTests.openResourceAsStream("SampleShow.ppt")); // PowerPoint 95 gives an old format exception - new SlideShow(_slTests.openResourceAsStream("PPT95.ppt")); + new HSLFSlideShow(_slTests.openResourceAsStream("PPT95.ppt")); } /** @@ -442,9 +427,9 @@ public final class TestBugs { */ @Test public void bug49648() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("49648.ppt")); - for(Slide slide : ppt.getSlides()) { - for(TextRun run : slide.getTextRuns()) { + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("49648.ppt")); + for(HSLFSlide slide : ppt.getSlides()) { + for(HSLFTextParagraph run : slide.getTextRuns()) { String text = run.getRawText(); text.replace("{txtTot}", "With \u0123\u1234\u5678 unicode"); run.setRawText(text); @@ -458,10 +443,10 @@ public final class TestBugs { @Test public void bug41246a() throws Exception { InputStream fis = _slTests.openResourceAsStream("41246-1.ppt"); - HSLFSlideShow hslf = new HSLFSlideShow(fis); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(fis); fis.close(); - SlideShow ppt = new SlideShow(hslf); + HSLFSlideShow ppt = new HSLFSlideShow(hslf); assertTrue("No Exceptions while reading file", true); ppt = HSLFTestDataSamples.writeOutAndReadBack(ppt); @@ -471,10 +456,10 @@ public final class TestBugs { @Test public void bug41246b() throws Exception { InputStream fis = _slTests.openResourceAsStream("41246-2.ppt"); - HSLFSlideShow hslf = new HSLFSlideShow(fis); + HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(fis); fis.close(); - SlideShow ppt = new SlideShow(hslf); + HSLFSlideShow ppt = new HSLFSlideShow(hslf); assertTrue("No Exceptions while reading file", true); ppt = HSLFTestDataSamples.writeOutAndReadBack(ppt); @@ -487,14 +472,14 @@ public final class TestBugs { @Test public void bug45776() throws Exception { InputStream is = _slTests.openResourceAsStream("45776.ppt"); - SlideShow ppt = new SlideShow(new HSLFSlideShow(is)); + HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl(is)); is.close(); // get slides - for (Slide slide : ppt.getSlides()) { + for (HSLFSlide slide : ppt.getSlides()) { for (HSLFShape shape : slide.getShapes()) { - if (!(shape instanceof TextBox)) continue; - TextBox tb = (TextBox) shape; + if (!(shape instanceof HSLFTextBox)) continue; + HSLFTextBox tb = (HSLFTextBox) shape; // work with TextBox String str = tb.getText(); @@ -502,7 +487,7 @@ public final class TestBugs { str = str.replace("$$DATE$$", new Date().toString()); tb.setText(str); - TextRun tr = tb.getTextRun(); + HSLFTextParagraph tr = tb.getTextParagraph(); assertEquals(str.length()+1,tr.getStyleTextPropAtom().getParagraphStyles().getFirst().getCharactersCovered()); assertEquals(str.length()+1,tr.getStyleTextPropAtom().getCharacterStyles().getFirst().getCharactersCovered()); } @@ -513,12 +498,12 @@ public final class TestBugs { public void bug55732() throws Exception { File file = _slTests.getFile("bug55732.ppt"); - HSLFSlideShow ss = new HSLFSlideShow(file.getAbsolutePath()); - SlideShow _show = new SlideShow(ss); - Slide[] _slides = _show.getSlides(); + HSLFSlideShowImpl ss = new HSLFSlideShowImpl(file.getAbsolutePath()); + HSLFSlideShow _show = new HSLFSlideShow(ss); + HSLFSlide[] _slides = _show.getSlides(); /* Iterate over slides and extract text */ - for( Slide slide : _slides ) { + for( HSLFSlide slide : _slides ) { HeadersFooters hf = slide.getHeadersFooters(); /*boolean visible =*/ hf.isHeaderVisible(); // exception happens here } @@ -529,9 +514,9 @@ public final class TestBugs { public void bug56260() throws Exception { File file = _slTests.getFile("56260.ppt"); - HSLFSlideShow ss = new HSLFSlideShow(file.getAbsolutePath()); - SlideShow _show = new SlideShow(ss); - Slide[] _slides = _show.getSlides(); + HSLFSlideShowImpl ss = new HSLFSlideShowImpl(file.getAbsolutePath()); + HSLFSlideShow _show = new HSLFSlideShow(ss); + HSLFSlide[] _slides = _show.getSlides(); assertEquals(13, _slides.length); // Check the number of TextHeaderAtoms on Slide 1 @@ -553,7 +538,7 @@ public final class TestBugs { // Check the number of text runs based on the slide (not textbox) // Will have skipped the empty one int str = 0; - for (TextRun tr : _slides[0].getTextRuns()) { + for (HSLFTextParagraph tr : _slides[0].getTextRuns()) { if (! tr.isDrawingBased()) str++; } assertEquals(1, str); @@ -563,10 +548,10 @@ public final class TestBugs { public void bug37625() throws IOException { InputStream inputStream = new FileInputStream(_slTests.getFile("37625.ppt")); try { - SlideShow slideShow = new SlideShow(inputStream); + HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); assertEquals(29, slideShow.getSlides().length); - SlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow); + HSLFSlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow); assertNotNull(slideBack); assertEquals(29, slideBack.getSlides().length); } finally { @@ -578,10 +563,10 @@ public final class TestBugs { public void bug57272() throws Exception { InputStream inputStream = new FileInputStream(_slTests.getFile("57272_corrupted_usereditatom.ppt")); try { - SlideShow slideShow = new SlideShow(inputStream); + HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); assertEquals(6, slideShow.getSlides().length); - SlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow); + HSLFSlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow); assertNotNull(slideBack); assertEquals(6, slideBack.getSlides().length); } finally { @@ -593,10 +578,10 @@ public final class TestBugs { public void bug49541() throws Exception { InputStream inputStream = new FileInputStream(_slTests.getFile("49541_symbol_map.ppt")); try { - SlideShow slideShow = new SlideShow(inputStream); - Slide slide = slideShow.getSlides()[0]; + HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); + HSLFSlide slide = slideShow.getSlides()[0]; HSLFGroupShape sg = (HSLFGroupShape)slide.getShapes()[0]; - TextBox tb = (TextBox)sg.getShapes()[0]; + HSLFTextBox tb = (HSLFTextBox)sg.getShapes()[0]; String text = StringUtil.mapMsCodepointString(tb.getText()); assertEquals("\u226575 years", text); } finally { @@ -608,7 +593,7 @@ public final class TestBugs { public void bug47261() throws Exception { InputStream inputStream = new FileInputStream(_slTests.getFile("bug47261.ppt")); try { - SlideShow slideShow = new SlideShow(inputStream); + HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); slideShow.removeSlide(0); slideShow.createSlide(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); @@ -622,7 +607,7 @@ public final class TestBugs { public void bug56240() throws Exception { InputStream inputStream = new FileInputStream(_slTests.getFile("bug56240.ppt")); try { - SlideShow slideShow = new SlideShow(inputStream); + HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); int slideCnt = slideShow.getSlides().length; assertEquals(105, slideCnt); ByteArrayOutputStream bos = new ByteArrayOutputStream(); @@ -637,8 +622,8 @@ public final class TestBugs { public void bug46441() throws Exception { InputStream inputStream = new FileInputStream(_slTests.getFile("bug46441.ppt")); try { - SlideShow slideShow = new SlideShow(inputStream); - AutoShape as = (AutoShape)slideShow.getSlides()[0].getShapes()[0]; + HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); + HSLFAutoShape as = (HSLFAutoShape)slideShow.getSlides()[0].getShapes()[0]; EscherOptRecord opt = as.getEscherOptRecord(); EscherArrayProperty ep = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__SHADECOLORS); double exp[][] = { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java index eb84e7711a..dbee82742f 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java @@ -19,6 +19,7 @@ package org.apache.poi.hslf.usermodel; import junit.framework.TestCase; + import org.apache.poi.hslf.*; import org.apache.poi.hslf.model.*; import org.apache.poi.POIDataSamples; @@ -30,16 +31,16 @@ import org.apache.poi.POIDataSamples; */ public final class TestCounts extends TestCase { // SlideShow primed on the test data - private SlideShow ss; + private HSLFSlideShow ss; public TestCounts() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - ss = new SlideShow(hss); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + ss = new HSLFSlideShow(hss); } public void testSheetsCount() { - Slide[] slides = ss.getSlides(); + HSLFSlide[] slides = ss.getSlides(); // Two sheets - master sheet is separate assertEquals(2, slides.length); @@ -57,7 +58,7 @@ public final class TestCounts extends TestCase { } public void testNotesCount() { - Notes[] notes = ss.getNotes(); + HSLFNotes[] notes = ss.getNotes(); // Two sheets -> two notes // Note: there are also notes on the slide master //assertEquals(3, notes.length); // When we do slide masters diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java index a6fa770059..37b7bb6965 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java @@ -39,7 +39,7 @@ import java.util.Map; import javax.imageio.ImageIO; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.model.Slide; +import org.apache.poi.hslf.model.HSLFSlide; import org.apache.poi.hslf.model.TextPainter; import org.apache.poi.util.TempFile; import org.junit.Ignore; @@ -82,12 +82,12 @@ public class TestFontRendering { } InputStream is = slTests.openResourceAsStream("bug55902-mixedFontChineseCharacters.ppt"); - SlideShow ss = new SlideShow(is); + HSLFSlideShow ss = new HSLFSlideShow(is); is.close(); Dimension pgsize = ss.getPageSize(); - Slide slide = ss.getSlides()[0]; + HSLFSlide slide = ss.getSlides()[0]; // render it double zoom = 1; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java index ce68b7a2d8..088dbb0cee 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java @@ -19,7 +19,9 @@ package org.apache.poi.hslf.usermodel; import junit.framework.TestCase; + import org.apache.poi.hslf.*; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; import org.apache.poi.POIDataSamples; @@ -30,14 +32,14 @@ import org.apache.poi.POIDataSamples; */ public final class TestMostRecentRecords extends TestCase { // HSLFSlideShow primed on the test data - private HSLFSlideShow hss; + private HSLFSlideShowImpl hss; // SlideShow primed on the test data - private SlideShow ss; + private HSLFSlideShow ss; public TestMostRecentRecords() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - ss = new SlideShow(hss); + hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + ss = new HSLFSlideShow(hss); } public void testCount() { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java index 3def468f9e..22b40a22e2 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java @@ -19,6 +19,7 @@ package org.apache.poi.hslf.usermodel; import junit.framework.TestCase; + import org.apache.poi.hslf.*; import org.apache.poi.hslf.model.*; import org.apache.poi.POIDataSamples; @@ -30,16 +31,16 @@ import org.apache.poi.POIDataSamples; */ public final class TestNotesText extends TestCase { // SlideShow primed on the test data - private SlideShow ss; + private HSLFSlideShow ss; public TestNotesText() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - ss = new SlideShow(hss); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + ss = new HSLFSlideShow(hss); } public void testNotesOne() { - Notes notes = ss.getNotes()[0]; + HSLFNotes notes = ss.getNotes()[0]; String[] expectText = new String[] {"These are the notes for page 1"}; assertEquals(expectText.length, notes.getTextRuns().length); @@ -49,7 +50,7 @@ public final class TestNotesText extends TestCase { } public void testNotesTwo() { - Notes notes = ss.getNotes()[1]; + HSLFNotes notes = ss.getNotes()[1]; String[] expectText = new String[] {"These are the notes on page two, again lacking formatting"}; assertEquals(expectText.length, notes.getTextRuns().length); for(int i=0; i 3 assertEquals(s1._getSheetNumber(), _s3._getSheetNumber()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java index 5475dae9c1..c15bacd1f2 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java @@ -19,7 +19,9 @@ package org.apache.poi.hslf.usermodel; import junit.framework.TestCase; + import org.apache.poi.hslf.*; +import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.ParentAwareRecord; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordContainer; @@ -34,13 +36,13 @@ import org.apache.poi.POIDataSamples; */ public final class TestRecordSetup extends TestCase { // SlideShow primed on the test data - private SlideShow ss; - private HSLFSlideShow hss; + private HSLFSlideShow ss; + private HSLFSlideShowImpl hss; public TestRecordSetup() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - ss = new SlideShow(hss); + hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + ss = new HSLFSlideShow(hss); } public void testHandleParentAwareRecords() { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java index a71b72a28b..267e9ec7a4 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java @@ -23,10 +23,7 @@ import java.io.FileInputStream; import org.apache.poi.POIDataSamples; import org.apache.poi.POITestCase; -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.model.Slide; -import org.apache.poi.hslf.model.TextBox; -import org.apache.poi.hslf.model.TextRun; +import org.apache.poi.hslf.model.*; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.SlideListWithText; @@ -39,40 +36,40 @@ public final class TestRichTextRun extends POITestCase { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); // SlideShow primed on the test data - private SlideShow ss; - private SlideShow ssRichA; - private SlideShow ssRichB; - private SlideShow ssRichC; - private SlideShow ssChinese; - private HSLFSlideShow hss; - private HSLFSlideShow hssRichA; - private HSLFSlideShow hssRichB; - private HSLFSlideShow hssRichC; - private HSLFSlideShow hssChinese; + private HSLFSlideShow ss; + private HSLFSlideShow ssRichA; + private HSLFSlideShow ssRichB; + private HSLFSlideShow ssRichC; + private HSLFSlideShow ssChinese; + private HSLFSlideShowImpl hss; + private HSLFSlideShowImpl hssRichA; + private HSLFSlideShowImpl hssRichB; + private HSLFSlideShowImpl hssRichC; + private HSLFSlideShowImpl hssChinese; private static String filenameC; protected void setUp() throws Exception { // Basic (non rich) test file - hss = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - ss = new SlideShow(hss); + hss = new HSLFSlideShowImpl(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + ss = new HSLFSlideShow(hss); // Rich test file A - hssRichA = new HSLFSlideShow(_slTests.openResourceAsStream("Single_Coloured_Page.ppt")); - ssRichA = new SlideShow(hssRichA); + hssRichA = new HSLFSlideShowImpl(_slTests.openResourceAsStream("Single_Coloured_Page.ppt")); + ssRichA = new HSLFSlideShow(hssRichA); // Rich test file B - hssRichB = new HSLFSlideShow(_slTests.openResourceAsStream("Single_Coloured_Page_With_Fonts_and_Alignments.ppt")); - ssRichB = new SlideShow(hssRichB); + hssRichB = new HSLFSlideShowImpl(_slTests.openResourceAsStream("Single_Coloured_Page_With_Fonts_and_Alignments.ppt")); + ssRichB = new HSLFSlideShow(hssRichB); // Rich test file C - has paragraph styles that run out before // the character ones do filenameC = "ParagraphStylesShorterThanCharStyles.ppt"; - hssRichC = new HSLFSlideShow(_slTests.openResourceAsStream(filenameC)); - ssRichC = new SlideShow(hssRichC); + hssRichC = new HSLFSlideShowImpl(_slTests.openResourceAsStream(filenameC)); + ssRichC = new HSLFSlideShow(hssRichC); // Rich test file with Chinese + English text in it - hssChinese = new HSLFSlideShow(_slTests.openResourceAsStream("54880_chinese.ppt")); - ssChinese = new SlideShow(hssChinese); + hssChinese = new HSLFSlideShowImpl(_slTests.openResourceAsStream("54880_chinese.ppt")); + ssChinese = new HSLFSlideShow(hssChinese); } /** @@ -80,9 +77,9 @@ public final class TestRichTextRun extends POITestCase { * on a non rich text run */ public void testBoldNonRich() { - Slide slideOne = ss.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); - RichTextRun rtr = textRuns[0].getRichTextRuns()[0]; + HSLFSlide slideOne = ss.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); + HSLFTextRun rtr = textRuns[0].getRichTextRuns()[0]; assertNull(rtr._getRawCharacterStyle()); assertNull(rtr._getRawParagraphStyle()); @@ -108,9 +105,9 @@ public final class TestRichTextRun extends POITestCase { * on a rich text run */ public void testBoldRich() { - Slide slideOneR = ssRichA.getSlides()[0]; - TextRun[] textRunsR = slideOneR.getTextRuns(); - RichTextRun[] rtrs = textRunsR[1].getRichTextRuns(); + HSLFSlide slideOneR = ssRichA.getSlides()[0]; + HSLFTextParagraph[] textRunsR = slideOneR.getTextRuns(); + HSLFTextRun[] rtrs = textRunsR[1].getRichTextRuns(); assertEquals(3, rtrs.length); assertTrue(rtrs[0].isBold()); @@ -136,15 +133,15 @@ public final class TestRichTextRun extends POITestCase { */ public void testFontSize() { - Slide slideOne = ss.getSlides()[0]; - TextRun[] textRuns = slideOne.getTextRuns(); - RichTextRun rtr = textRuns[0].getRichTextRuns()[0]; + HSLFSlide slideOne = ss.getSlides()[0]; + HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); + HSLFTextRun rtr = textRuns[0].getRichTextRuns()[0]; - Slide slideOneR = ssRichB.getSlides()[0]; - TextRun[] textRunsR = slideOneR.getTextRuns(); - RichTextRun rtrRa = textRunsR[0].getRichTextRuns()[0]; - RichTextRun rtrRb = textRunsR[1].getRichTextRuns()[0]; - RichTextRun rtrRc = textRunsR[1].getRichTextRuns()[3]; + HSLFSlide slideOneR = ssRichB.getSlides()[0]; + HSLFTextParagraph[] textRunsR = slideOneR.getTextRuns(); + HSLFTextRun rtrRa = textRunsR[0].getRichTextRuns()[0]; + HSLFTextRun rtrRb = textRunsR[1].getRichTextRuns()[0]; + HSLFTextRun rtrRc = textRunsR[1].getRichTextRuns()[3]; String defaultFont = "Arial"; @@ -195,14 +192,14 @@ public final class TestRichTextRun extends POITestCase { } public void testChangeWriteRead() throws Exception { - HSLFSlideShow[] h = new HSLFSlideShow[] { hss, hssRichA, hssRichB }; - Slide[] s = new Slide[] { ss.getSlides()[0], ssRichA.getSlides()[0], ssRichB.getSlides()[0] }; + HSLFSlideShowImpl[] h = new HSLFSlideShowImpl[] { hss, hssRichA, hssRichB }; + HSLFSlide[] s = new HSLFSlide[] { ss.getSlides()[0], ssRichA.getSlides()[0], ssRichB.getSlides()[0] }; for(int i=0; i(text a)(text a)(text b) // TR: // (text) - TextRun[] s7tr = slideSevenC.getTextRuns(); - RichTextRun[] s7rtr0 = s7tr[0].getRichTextRuns(); - RichTextRun[] s7rtr1 = s7tr[1].getRichTextRuns(); - RichTextRun[] s7rtr2 = s7tr[2].getRichTextRuns(); + HSLFTextParagraph[] s7tr = slideSevenC.getTextRuns(); + HSLFTextRun[] s7rtr0 = s7tr[0].getRichTextRuns(); + HSLFTextRun[] s7rtr1 = s7tr[1].getRichTextRuns(); + HSLFTextRun[] s7rtr2 = s7tr[2].getRichTextRuns(); assertEquals(1, s7rtr0.length); assertEquals(3, s7rtr1.length); @@ -334,11 +331,11 @@ public final class TestRichTextRun extends POITestCase { assertMatchesSLTWC(ssRichC); assertMatchesFileC(ssRichC); - Slide slideSevenC = ssRichC.getSlides()[6]; - TextRun[] s7tr = slideSevenC.getTextRuns(); - RichTextRun[] s7rtr0 = s7tr[0].getRichTextRuns(); - RichTextRun[] s7rtr1 = s7tr[1].getRichTextRuns(); - RichTextRun[] s7rtr2 = s7tr[2].getRichTextRuns(); + HSLFSlide slideSevenC = ssRichC.getSlides()[6]; + HSLFTextParagraph[] s7tr = slideSevenC.getTextRuns(); + HSLFTextRun[] s7rtr0 = s7tr[0].getRichTextRuns(); + HSLFTextRun[] s7rtr1 = s7tr[1].getRichTextRuns(); + HSLFTextRun[] s7rtr2 = s7tr[2].getRichTextRuns(); String oldText; @@ -374,9 +371,9 @@ public final class TestRichTextRun extends POITestCase { * contents. * @param s */ - private void assertMatchesSLTWC(SlideShow s) throws Exception { + private void assertMatchesSLTWC(HSLFSlideShow s) throws Exception { // Grab a new copy of slideshow C - SlideShow refC = new SlideShow(_slTests.openResourceAsStream(filenameC)); + HSLFSlideShow refC = new HSLFSlideShow(_slTests.openResourceAsStream(filenameC)); // Write out the 2nd SLWT in the active document SlideListWithText refSLWT = refC.getDocumentRecord().getSlideListWithTexts()[1]; @@ -411,7 +408,7 @@ public final class TestRichTextRun extends POITestCase { * Checks that the supplied slideshow still matches the bytes * of slideshow c */ - private static void assertMatchesFileC(SlideShow s) throws Exception { + private static void assertMatchesFileC(HSLFSlideShow s) throws Exception { if (true) { // TODO - test is disabled, pending fix of bug #39800 // System.err.println("Skipping test, as would be marked as failed due to bug #39800"); // return; @@ -450,12 +447,12 @@ if(false) { } public void testIndentationLevel() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt")); - Slide[] sl = ppt.getSlides(); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt")); + HSLFSlide[] sl = ppt.getSlides(); for (int i = 0; i < sl.length; i++) { - TextRun[] txt = sl[i].getTextRuns(); + HSLFTextParagraph[] txt = sl[i].getTextRuns(); for (int j = 0; j < txt.length; j++) { - RichTextRun[] rt = txt[j].getRichTextRuns(); + HSLFTextRun[] rt = txt[j].getRichTextRuns(); for (int k = 0; k < rt.length; k++) { int indent = rt[k].getIndentLevel(); assertTrue(indent >= 0 && indent <= 4 ); @@ -466,12 +463,12 @@ if(false) { } public void testReadParagraphStyles() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("bullets.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt")); assertTrue("No Exceptions while reading file", true); - RichTextRun rt; - TextRun[] txt; - Slide[] slide = ppt.getSlides(); + HSLFTextRun rt; + HSLFTextParagraph[] txt; + HSLFSlide[] slide = ppt.getSlides(); assertEquals(2, slide.length); txt = slide[0].getTextRuns(); @@ -516,12 +513,12 @@ if(false) { } public void testSetParagraphStyles() throws Exception { - SlideShow ppt = new SlideShow(); + HSLFSlideShow ppt = new HSLFSlideShow(); - Slide slide = ppt.createSlide(); + HSLFSlide slide = ppt.createSlide(); - TextBox shape = new TextBox(); - RichTextRun rt = shape.getTextRun().getRichTextRuns()[0]; + HSLFTextBox shape = new HSLFTextBox(); + HSLFTextRun rt = shape.getTextParagraph().getRichTextRuns()[0]; shape.setText( "Hello, World!\r" + "This should be\r" + @@ -547,10 +544,10 @@ if(false) { ppt.write(out); out.close(); - ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); + ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); slide = ppt.getSlides()[0]; - shape = (TextBox)slide.getShapes()[0]; - rt = shape.getTextRun().getRichTextRuns()[0]; + shape = (HSLFTextBox)slide.getShapes()[0]; + rt = shape.getTextParagraph().getRichTextRuns()[0]; assertEquals(42, rt.getFontSize()); assertEquals(true, rt.isBullet()); assertEquals(50, rt.getTextOffset()); @@ -559,12 +556,12 @@ if(false) { } public void testAddText() throws Exception { - SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("bullets.ppt")); + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt")); assertTrue("No Exceptions while reading file", true); - RichTextRun rt; - TextRun[] txt; - Slide[] slides = ppt.getSlides(); + HSLFTextRun rt; + HSLFTextParagraph[] txt; + HSLFSlide[] slides = ppt.getSlides(); assertEquals(2, slides.length); txt = slides[0].getTextRuns(); @@ -605,7 +602,7 @@ if(false) { ppt.write(out); out.close(); - ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); + ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); slides = ppt.getSlides(); assertEquals(2, slides.length); @@ -628,10 +625,10 @@ if(false) { } public void testChineseParagraphs() throws Exception { - RichTextRun[] rts; - RichTextRun rt; - TextRun[] txt; - Slide[] slides = ssChinese.getSlides(); + HSLFTextRun[] rts; + HSLFTextRun rt; + HSLFTextParagraph[] txt; + HSLFSlide[] slides = ssChinese.getSlides(); // One slide assertEquals(1, slides.length); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java index cb27d3ee92..fda2aba0d0 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java @@ -19,6 +19,7 @@ package org.apache.poi.hslf.usermodel; import junit.framework.TestCase; + import org.apache.poi.hslf.*; import org.apache.poi.hslf.model.*; import org.apache.poi.POIDataSamples; @@ -30,16 +31,16 @@ import org.apache.poi.POIDataSamples; */ public final class TestSheetText extends TestCase { // SlideShow primed on the test data - private SlideShow ss; + private HSLFSlideShow ss; public TestSheetText() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - ss = new SlideShow(hss); + HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); + ss = new HSLFSlideShow(hss); } public void testSheetOne() { - Sheet slideOne = ss.getSlides()[0]; + HSLFSheet slideOne = ss.getSlides()[0]; String[] expectText = new String[] {"This is a test title","This is a test subtitle\nThis is on page 1"}; assertEquals(expectText.length, slideOne.getTextRuns().length); @@ -49,7 +50,7 @@ public final class TestSheetText extends TestCase { } public void testSheetTwo() { - Sheet slideTwo = ss.getSlides()[1]; + HSLFSheet slideTwo = ss.getSlides()[1]; String[] expectText = new String[] {"This is the title on page 2","This is page two\nIt has several blocks of text\nNone of them have formatting"}; assertEquals(expectText.length, slideTwo.getTextRuns().length); for(int i=0; i Date: Mon, 27 Apr 2015 20:13:43 +0000 Subject: [PATCH 05/22] committing intermediate results - hslf is mostly migrated to common interface - junit tests partly fail - still a few compile errors - xslf drawing works - hslf drawing is not yet tested git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1676365 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hslf/examples/ApacheconEU08.java | 88 +- .../apache/poi/hslf/examples/BulletsDemo.java | 7 +- .../poi/hslf/examples/CreateHyperlink.java | 6 +- .../poi/hslf/examples/Graphics2DDemo.java | 2 +- .../poi/hslf/examples/HeadersFootersDemo.java | 2 +- .../apache/poi/hslf/examples/Hyperlinks.java | 16 +- .../org/apache/poi/hslf/examples/PPT2PNG.java | 1 + .../apache/poi/hslf/examples/SoundFinder.java | 1 + .../apache/poi/hslf/examples/TableDemo.java | 7 +- .../usermodel/examples/EmeddedObjects.java | 2 +- .../poi/xslf/usermodel/tutorial/Step1.java | 4 +- .../usermodel/examples/EmbeddedObjects.java | 2 +- .../apache/poi/stress/HSLFFileHandler.java | 2 +- .../apache/poi/ddf/EscherContainerRecord.java | 28 +- .../extractor/XSLFPowerPointExtractor.java | 3 +- .../poi/xslf/usermodel/XMLSlideShow.java | 63 +- .../poi/xslf/usermodel/XSLFGroupShape.java | 51 +- .../apache/poi/xslf/usermodel/XSLFNotes.java | 6 +- .../apache/poi/xslf/usermodel/XSLFSheet.java | 7 +- .../apache/poi/xslf/usermodel/XSLFSlide.java | 4 +- .../poi/xslf/usermodel/XSLFTextParagraph.java | 64 +- .../poi/xslf/usermodel/XSLFTextRun.java | 10 +- .../poi/xslf/usermodel/XSLFTextShape.java | 42 +- .../org/apache/poi/xslf/util/PPTX2PNG.java | 10 +- .../org/apache/poi/xslf/TestXSLFBugs.java | 28 +- .../poi/xslf/geom/TestFormulaParser.java | 30 +- .../poi/xslf/geom/TestPresetGeometries.java | 15 +- .../poi/xslf/usermodel/TestPPTX2PNG.java | 6 +- .../poi/xslf/usermodel/TestXMLSlideShow.java | 44 +- .../poi/xslf/usermodel/TestXSLFAutoShape.java | 75 +- .../poi/xslf/usermodel/TestXSLFChart.java | 2 +- .../usermodel/TestXSLFConnectorShape.java | 12 +- .../xslf/usermodel/TestXSLFFreeformShape.java | 7 +- .../xslf/usermodel/TestXSLFGroupShape.java | 46 +- .../poi/xslf/usermodel/TestXSLFHyperlink.java | 20 +- .../xslf/usermodel/TestXSLFPictureShape.java | 23 +- .../poi/xslf/usermodel/TestXSLFShape.java | 51 +- .../usermodel/TestXSLFShapeContainer.java | 21 +- .../poi/xslf/usermodel/TestXSLFSheet.java | 54 +- .../xslf/usermodel/TestXSLFSimpleShape.java | 60 +- .../poi/xslf/usermodel/TestXSLFSlide.java | 131 +- .../poi/xslf/usermodel/TestXSLFSlideShow.java | 59 +- .../poi/xslf/usermodel/TestXSLFTable.java | 50 +- .../xslf/usermodel/TestXSLFTableStyles.java | 10 +- .../poi/xslf/usermodel/TestXSLFTextBox.java | 19 +- .../xslf/usermodel/TestXSLFTextParagraph.java | 10 +- .../poi/xslf/usermodel/TestXSLFTextShape.java | 318 ++--- .../poi/xslf/usermodel/TestXSLFTheme.java | 65 +- .../apache/poi/hslf/blip/BitmapPainter.java | 3 +- .../src/org/apache/poi/hslf/blip/DIB.java | 4 +- .../src/org/apache/poi/hslf/blip/EMF.java | 4 +- .../apache/poi/hslf/blip/ImagePainter.java | 2 +- .../src/org/apache/poi/hslf/blip/JPEG.java | 4 +- .../src/org/apache/poi/hslf/blip/PICT.java | 6 +- .../src/org/apache/poi/hslf/blip/PNG.java | 4 +- .../src/org/apache/poi/hslf/blip/WMF.java | 4 +- .../poi/hslf/dev/PPDrawingTextListing.java | 2 +- .../org/apache/poi/hslf/dev/SLWTListing.java | 2 +- .../apache/poi/hslf/dev/SLWTTextListing.java | 2 +- .../hslf/dev/SlideAndNotesAtomListing.java | 2 +- .../apache/poi/hslf/dev/SlideIdListing.java | 2 +- .../poi/hslf/dev/SlideShowRecordDumper.java | 2 +- .../apache/poi/hslf/dev/TextStyleListing.java | 23 +- .../hslf/dev/UserEditAndPersistListing.java | 2 +- .../poi/hslf/extractor/ImageExtractor.java | 5 +- .../hslf/extractor/PowerPointExtractor.java | 58 +- .../QuickButCruddyTextExtractor.java | 28 +- .../apache/poi/hslf/model/ActiveXShape.java | 1 + .../org/apache/poi/hslf/model/AutoShapes.java | 388 ------ .../poi/hslf/model/HSLFTextParagraph.java | 744 ----------- .../apache/poi/hslf/model/HSLFTextShape.java | 639 ---------- .../apache/poi/hslf/model/HeadersFooters.java | 6 +- .../src/org/apache/poi/hslf/model/Line.java | 3 +- .../org/apache/poi/hslf/model/MovieShape.java | 4 +- .../org/apache/poi/hslf/model/OLEShape.java | 5 +- .../apache/poi/hslf/model/PPGraphics2D.java | 33 +- .../apache/poi/hslf/model/Placeholder.java | 2 + .../org/apache/poi/hslf/model/Polygon.java | 1 + .../apache/poi/hslf/model/ShapeOutline.java | 28 - .../apache/poi/hslf/model/ShapePainter.java | 105 -- .../src/org/apache/poi/hslf/model/Table.java | 3 +- .../org/apache/poi/hslf/model/TableCell.java | 2 + .../apache/poi/hslf/model/TextPainter.java | 418 ------- .../model/textproperties/BitMaskTextProp.java | 5 +- .../hslf/model/textproperties/IndentProp.java | 2 +- .../textproperties/TabStopPropCollection.java | 113 ++ .../hslf/model/textproperties/TextProp.java | 39 +- .../textproperties/TextPropCollection.java | 92 +- .../apache/poi/hslf/record/RecordTypes.java | 4 +- .../poi/hslf/record/StyleTextPropAtom.java | 36 +- .../apache/poi/hslf/record/TextBytesAtom.java | 2 +- .../apache/poi/hslf/record/TextCharsAtom.java | 2 +- .../poi/hslf/record/TextHeaderAtom.java | 14 +- .../poi/hslf/record/TextSpecInfoAtom.java | 4 +- .../poi/hslf/record/TxMasterStyleAtom.java | 75 +- .../{model => usermodel}/HSLFAutoShape.java | 27 +- .../{model => usermodel}/HSLFBackground.java | 2 +- .../hslf/{model => usermodel}/HSLFFill.java | 4 +- .../HSLFFreeformShape.java | 2 +- .../{model => usermodel}/HSLFGroupShape.java | 49 +- .../HSLFHyperlink.java} | 75 +- .../{model => usermodel}/HSLFMasterSheet.java | 3 +- .../hslf/{model => usermodel}/HSLFNotes.java | 32 +- .../poi/hslf/usermodel/HSLFPictureData.java | 1 - .../HSLFPictureShape.java | 29 +- .../hslf/{model => usermodel}/HSLFShape.java | 6 +- .../HSLFShapeFactory.java} | 12 +- .../hslf/{model => usermodel}/HSLFSheet.java | 165 +-- .../{model => usermodel}/HSLFSimpleShape.java | 90 +- .../hslf/{model => usermodel}/HSLFSlide.java | 167 +-- .../HSLFSlideMaster.java} | 33 +- .../poi/hslf/usermodel/HSLFSlideShow.java | 188 ++- .../HSLFSlideShowEncrypted.java | 2 +- .../HSLFSlideShowImpl.java | 6 +- .../{model => usermodel}/HSLFTextBox.java | 10 +- .../poi/hslf/usermodel/HSLFTextParagraph.java | 1089 +++++++++++++++++ .../poi/hslf/usermodel/HSLFTextRun.java | 508 +------- .../poi/hslf/usermodel/HSLFTextShape.java | 754 ++++++++++++ .../HSLFTitleMaster.java} | 24 +- .../org/apache/poi/sl/draw/DrawFactory.java | 4 +- .../src/org/apache/poi/sl/draw/DrawSlide.java | 2 +- .../apache/poi/sl/draw/DrawTextParagraph.java | 4 +- .../poi/sl/draw/geom/PresetGeometries.java | 3 +- .../src/org/apache/poi/sl/usermodel/Line.java | 2 +- .../org/apache/poi/sl/usermodel/Notes.java | 2 +- .../poi/sl/usermodel/ShapeContainer.java | 12 +- .../apache/poi/sl/usermodel/ShapeType.java | 19 + .../org/apache/poi/sl/usermodel/Slide.java | 18 +- .../apache/poi/sl/usermodel/SlideShow.java | 15 +- .../poi/sl/usermodel/TextParagraph.java | 36 +- .../org/apache/poi/sl/usermodel/TextRun.java | 4 +- .../apache/poi/sl/usermodel/TextShape.java | 12 + .../apache/poi/TestPOIDocumentScratchpad.java | 2 +- .../apache/poi/hslf/HSLFTestDataSamples.java | 2 +- .../apache/poi/hslf/TestEncryptedFile.java | 2 +- .../org/apache/poi/hslf/TestReWrite.java | 2 +- .../apache/poi/hslf/TestReWriteSanity.java | 2 +- .../org/apache/poi/hslf/TestRecordCounts.java | 2 +- .../poi/hslf/extractor/TestExtractor.java | 2 +- .../poi/hslf/model/AllHSLFModelTests.java | 1 + .../apache/poi/hslf/model/TestBackground.java | 44 +- .../apache/poi/hslf/model/TestFreeform.java | 17 +- .../poi/hslf/model/TestHeadersFooters.java | 54 +- .../apache/poi/hslf/model/TestHyperlink.java | 92 +- .../poi/hslf/model/TestImagePainter.java | 1 + .../org/apache/poi/hslf/model/TestLine.java | 41 +- .../apache/poi/hslf/model/TestMovieShape.java | 14 +- .../poi/hslf/model/TestOleEmbedding.java | 30 +- .../org/apache/poi/hslf/model/TestPPFont.java | 8 +- .../poi/hslf/model/TestPPGraphics2D.java | 36 +- .../apache/poi/hslf/model/TestPicture.java | 3 +- .../poi/hslf/model/TestSetBoldItalic.java | 31 +- .../org/apache/poi/hslf/model/TestShapes.java | 168 ++- .../org/apache/poi/hslf/model/TestSheet.java | 49 +- .../poi/hslf/model/TestSlideChangeNotes.java | 21 +- .../poi/hslf/model/TestSlideMaster.java | 190 ++- .../org/apache/poi/hslf/model/TestSlides.java | 70 +- .../org/apache/poi/hslf/model/TestTable.java | 31 +- .../apache/poi/hslf/model/TestTextRun.java | 551 --------- .../poi/hslf/model/TestTextRunReWrite.java | 81 +- .../apache/poi/hslf/model/TestTextShape.java | 72 +- .../poi/hslf/model/TextPainterTest.java | 2 +- .../poi/hslf/record/TestCurrentUserAtom.java | 2 +- .../apache/poi/hslf/record/TestDocument.java | 2 +- .../hslf/record/TestDocumentEncryption.java | 7 +- .../poi/hslf/record/TestExHyperlink.java | 2 +- .../apache/poi/hslf/record/TestExObjList.java | 2 +- .../poi/hslf/record/TestRecordContainer.java | 2 +- .../apache/poi/hslf/record/TestSlideAtom.java | 2 +- .../apache/poi/hslf/usermodel/TestBugs.java | 40 +- .../poi/hslf/usermodel/TestFontRendering.java | 1 - .../hslf/usermodel/TestMostRecentRecords.java | 1 - .../poi/hslf/usermodel/TestNotesText.java | 8 +- .../poi/hslf/usermodel/TestNumberedList.java | 14 +- .../poi/hslf/usermodel/TestNumberedList2.java | 14 +- .../poi/hslf/usermodel/TestNumberedList3.java | 12 +- .../poi/hslf/usermodel/TestRecordSetup.java | 1 - .../poi/hslf/usermodel/TestRichTextRun.java | 152 +-- .../poi/hslf/usermodel/TestSheetText.java | 12 +- .../poi/hslf/usermodel/TestSlideOrdering.java | 10 +- .../apache/poi/hslf/usermodel/TestTable.java | 11 +- .../poi/hslf/usermodel/TestTextRun.java | 581 +++++++++ 182 files changed, 4923 insertions(+), 5498 deletions(-) delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextParagraph.java delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextShape.java delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFAutoShape.java (83%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFBackground.java (97%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFFill.java (98%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFFreeformShape.java (99%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFGroupShape.java (88%) rename src/scratchpad/src/org/apache/poi/hslf/{model/Hyperlink.java => usermodel/HSLFHyperlink.java} (76%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFMasterSheet.java (96%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFNotes.java (73%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFPictureShape.java (90%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFShape.java (99%) rename src/scratchpad/src/org/apache/poi/hslf/{model/ShapeFactory.java => usermodel/HSLFShapeFactory.java} (94%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFSheet.java (64%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFSimpleShape.java (85%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFSlide.java (77%) rename src/scratchpad/src/org/apache/poi/hslf/{model/SlideMaster.java => usermodel/HSLFSlideMaster.java} (86%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFSlideShowEncrypted.java (99%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFSlideShowImpl.java (99%) rename src/scratchpad/src/org/apache/poi/hslf/{model => usermodel}/HSLFTextBox.java (93%) create mode 100644 src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java rename src/scratchpad/src/org/apache/poi/hslf/{model/TitleMaster.java => usermodel/HSLFTitleMaster.java} (73%) delete mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java create mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java index 7a4b20c187..229d7576e7 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java +++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java @@ -60,22 +60,22 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE); tr1.setText("POI-HSLF"); box1.setAnchor(new Rectangle(54, 78, 612, 115)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraph(); + HSLFTextParagraph tr2 = box2.getTextParagraphs(); tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE); tr2.setText("Java API To Access Microsoft PowerPoint Format Files"); box2.setAnchor(new Rectangle(108, 204, 504, 138)); slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraph(); - tr3.getRichTextRuns()[0].setFontSize(32); + HSLFTextParagraph tr3 = box3.getTextParagraphs(); + tr3.getTextRuns()[0].setFontSize(32); box3.setHorizontalAlignment(HSLFTextBox.AlignCenter); tr3.setText( "Yegor Kozlov\r" + @@ -88,14 +88,14 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("What is HSLF?"); box1.setAnchor(new Rectangle(36, 21, 648, 90)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraph(); + HSLFTextParagraph tr2 = box2.getTextParagraphs(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); tr2.setText("HorribleSLideshowFormat is the POI Project's pure Java implementation " + "of the Powerpoint binary file format. \r" + @@ -111,25 +111,25 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF in a Nutshell"); box1.setAnchor(new Rectangle(36, 15, 648, 65)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraph(); + HSLFTextParagraph tr2 = box2.getTextParagraphs(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); tr2.setText( "HSLF provides a way to read, create and modify MS PowerPoint presentations\r" + "Pure Java API - you don't need PowerPoint to read and write *.ppt files\r" + "Comprehensive support of PowerPoint objects"); - tr2.getRichTextRuns()[0].setFontSize(28); + tr2.getTextRuns()[0].setFontSize(28); box2.setAnchor(new Rectangle(36, 80, 648, 200)); slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraph(); + HSLFTextParagraph tr3 = box3.getTextParagraphs(); tr3.setRunType(TextHeaderAtom.BODY_TYPE); tr3.setText( "Rich text\r" + @@ -137,13 +137,13 @@ public final class ApacheconEU08 { "Shapes\r" + "Pictures\r" + "Master slides"); - tr3.getRichTextRuns()[0].setFontSize(24); - tr3.getRichTextRuns()[0].setIndentLevel(1); + tr3.getTextRuns()[0].setFontSize(24); + tr3.getTextRuns()[0].setIndentLevel(1); box3.setAnchor(new Rectangle(36, 265, 648, 150)); slide.addShape(box3); HSLFTextBox box4 = new HSLFTextBox(); - HSLFTextParagraph tr4 = box4.getTextParagraph(); + HSLFTextParagraph tr4 = box4.getTextParagraphs(); tr4.setRunType(TextHeaderAtom.BODY_TYPE); tr4.setText("Access to low level data structures"); box4.setAnchor(new Rectangle(36, 430, 648, 50)); @@ -162,8 +162,8 @@ public final class ApacheconEU08 { for (int j = 0; j < txt1[i].length; j++) { TableCell cell = table1.getCell(i, j); cell.setText(txt1[i][j]); - cell.getTextParagraph().getRichTextRuns()[0].setFontSize(10); - HSLFTextRun rt = cell.getTextParagraph().getRichTextRuns()[0]; + cell.getTextParagraphs().getTextRuns()[0].setFontSize(10); + HSLFTextRun rt = cell.getTextParagraphs().getTextRuns()[0]; rt.setFontName("Arial"); rt.setBold(true); if(i == 0){ @@ -197,10 +197,10 @@ public final class ApacheconEU08 { HSLFTextBox box1 = new HSLFTextBox(); box1.setHorizontalAlignment(HSLFTextBox.AlignCenter); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setText("The source code is available at\r" + "http://people.apache.org/~yegor/apachecon_eu08/"); - HSLFTextRun rt = tr1.getRichTextRuns()[0]; + HSLFTextRun rt = tr1.getTextRuns()[0]; rt.setFontSize(24); box1.setAnchor(new Rectangle(80, 356, 553, 65)); slide.addShape(box1); @@ -211,14 +211,14 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF in Action - 1\rData Extraction"); box1.setAnchor(new Rectangle(36, 21, 648, 100)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraph(); + HSLFTextParagraph tr2 = box2.getTextParagraphs(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); tr2.setText( "Text from slides and notes\r" + @@ -234,22 +234,22 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF in Action - 2"); box1.setAnchor(new Rectangle(36, 20, 648, 90)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraph(); - tr2.getRichTextRuns()[0].setFontSize(18); + HSLFTextParagraph tr2 = box2.getTextParagraphs(); + tr2.getTextRuns()[0].setFontSize(18); tr2.setText("Creating a simple presentation from scratch"); box2.setAnchor(new Rectangle(170, 100, 364, 30)); slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraph(); - HSLFTextRun rt3 = tr3.getRichTextRuns()[0]; + HSLFTextParagraph tr3 = box3.getTextParagraphs(); + HSLFTextRun rt3 = tr3.getTextRuns()[0]; rt3.setFontName("Courier New"); rt3.setFontSize(8); tr3.setText( @@ -296,7 +296,7 @@ public final class ApacheconEU08 { HSLFTextBox box2 = new HSLFTextBox(); box2.setHorizontalAlignment(HSLFTextBox.AlignCenter); box2.setVerticalAlignment(HSLFTextBox.AnchorMiddle); - box2.getTextParagraph().setText("Java Code"); + box2.getTextParagraphs().setText("Java Code"); box2.getFill().setForegroundColor(new Color(187, 224, 227)); box2.setLineColor(Color.black); box2.setLineWidth(0.75); @@ -306,7 +306,7 @@ public final class ApacheconEU08 { HSLFTextBox box3 = new HSLFTextBox(); box3.setHorizontalAlignment(HSLFTextBox.AlignCenter); box3.setVerticalAlignment(HSLFTextBox.AnchorMiddle); - box3.getTextParagraph().setText("*.ppt file"); + box3.getTextParagraphs().setText("*.ppt file"); box3.setLineWidth(0.75); box3.setLineColor(Color.black); box3.getFill().setForegroundColor(new Color(187, 224, 227)); @@ -325,14 +325,14 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("Wait, there is more!"); box1.setAnchor(new Rectangle(36, 21, 648, 90)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraph(); + HSLFTextParagraph tr2 = box2.getTextParagraphs(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); tr2.setText( "Rich text\r" + @@ -347,22 +347,22 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF in Action - 3"); box1.setAnchor(new Rectangle(36, 20, 648, 50)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraph(); - tr2.getRichTextRuns()[0].setFontSize(18); + HSLFTextParagraph tr2 = box2.getTextParagraphs(); + tr2.getTextRuns()[0].setFontSize(18); tr2.setText("PPGraphics2D: PowerPoint Graphics2D driver"); box2.setAnchor(new Rectangle(178, 70, 387, 30)); slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraph(); - HSLFTextRun rt3 = tr3.getRichTextRuns()[0]; + HSLFTextParagraph tr3 = box3.getTextParagraphs(); + HSLFTextRun rt3 = tr3.getTextRuns()[0]; rt3.setFontName("Courier New"); rt3.setFontSize(8); tr3.setText( @@ -449,16 +449,16 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setRunType(TextHeaderAtom.TITLE_TYPE); tr1.setText("HSLF Development Plans"); box1.setAnchor(new Rectangle(36, 21, 648, 90)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraph(); + HSLFTextParagraph tr2 = box2.getTextParagraphs(); tr2.setRunType(TextHeaderAtom.BODY_TYPE); - tr2.getRichTextRuns()[0].setFontSize(32); + tr2.getTextRuns()[0].setFontSize(32); tr2.setText( "Support for more PowerPoint functionality\r" + "Rendering slides into java.awt.Graphics2D"); @@ -466,27 +466,27 @@ public final class ApacheconEU08 { slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraph(); + HSLFTextParagraph tr3 = box3.getTextParagraphs(); tr3.setRunType(TextHeaderAtom.BODY_TYPE); - tr3.getRichTextRuns()[0].setIndentLevel(1); + tr3.getTextRuns()[0].setIndentLevel(1); tr3.setText( "A way to export slides into images or other formats"); box3.setAnchor(new Rectangle(36, 220, 648, 70)); slide.addShape(box3); HSLFTextBox box4 = new HSLFTextBox(); - HSLFTextParagraph tr4 = box4.getTextParagraph(); + HSLFTextParagraph tr4 = box4.getTextParagraphs(); tr4.setRunType(TextHeaderAtom.BODY_TYPE); - tr4.getRichTextRuns()[0].setFontSize(32); + tr4.getTextRuns()[0].setFontSize(32); tr4.setText( "Integration with Apache FOP - Formatting Objects Processor"); box4.setAnchor(new Rectangle(36, 290, 648, 90)); slide.addShape(box4); HSLFTextBox box5 = new HSLFTextBox(); - HSLFTextParagraph tr5 = box5.getTextParagraph(); + HSLFTextParagraph tr5 = box5.getTextParagraphs(); tr5.setRunType(TextHeaderAtom.BODY_TYPE); - tr5.getRichTextRuns()[0].setIndentLevel(1); + tr5.getTextRuns()[0].setIndentLevel(1); tr5.setText( "Transformation of XSL-FO into PPT\r" + "PPT2PDF transcoder"); @@ -498,14 +498,14 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraph(); + HSLFTextParagraph tr1 = box1.getTextParagraphs(); tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE); tr1.setText("Questions?"); box1.setAnchor(new Rectangle(54, 167, 612, 115)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraph(); + HSLFTextParagraph tr2 = box2.getTextParagraphs(); tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE); tr2.setText( "http://poi.apache.org/hslf/\r" + diff --git a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java index ed6dd1231d..58aaf1fff2 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java @@ -17,10 +17,7 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.HSLFTextRun; -import org.apache.poi.hslf.model.HSLFSlide; -import org.apache.poi.hslf.model.HSLFTextBox; +import org.apache.poi.hslf.usermodel.*; import java.io.FileOutputStream; @@ -39,7 +36,7 @@ public final class BulletsDemo { HSLFSlide slide = ppt.createSlide(); HSLFTextBox shape = new HSLFTextBox(); - HSLFTextRun rt = shape.getTextParagraph().getRichTextRuns()[0]; + HSLFTextRun rt = shape.getTextParagraphs().getTextRuns()[0]; shape.setText( "January\r" + "February\r" + diff --git a/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java b/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java index 99c5d7d31f..8732152324 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java +++ b/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hslf.model.*; import java.io.FileOutputStream; @@ -43,7 +43,7 @@ public final class CreateHyperlink { textBox1.setAnchor(new Rectangle(100, 100, 200, 50)); String text = textBox1.getText(); - Hyperlink link = new Hyperlink(); + HSLFHyperlink link = new HSLFHyperlink(); link.setAddress("http://www.apache.org"); link.setTitle(textBox1.getText()); int linkId = ppt.addHyperlink(link); @@ -58,7 +58,7 @@ public final class CreateHyperlink { textBox2.setText("Go to slide #3"); textBox2.setAnchor(new Rectangle(100, 300, 200, 50)); - Hyperlink link2 = new Hyperlink(); + HSLFHyperlink link2 = new HSLFHyperlink(); link2.setAddress(slideC); ppt.addHyperlink(link2); diff --git a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java index 4e678ba64d..19fe496769 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hslf.model.*; import java.awt.*; diff --git a/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java b/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java index 068d675347..b335e1f1e1 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java @@ -16,9 +16,9 @@ ==================================================================== */ package org.apache.poi.hslf.examples; +import org.apache.poi.hslf.usermodel.HSLFSlide; import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hslf.model.HeadersFooters; -import org.apache.poi.hslf.model.HSLFSlide; import java.io.FileOutputStream; diff --git a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java index 89dcb636af..b9af6d2d56 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java +++ b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java @@ -17,11 +17,7 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.hslf.model.HSLFSlide; -import org.apache.poi.hslf.model.HSLFTextParagraph; -import org.apache.poi.hslf.model.Hyperlink; -import org.apache.poi.hslf.model.HSLFShape; +import org.apache.poi.hslf.usermodel.*; import java.io.FileInputStream; @@ -44,12 +40,12 @@ public final class Hyperlinks { //read hyperlinks from the slide's text runs System.out.println("reading hyperlinks from the text runs"); - HSLFTextParagraph[] txt = slide[j].getTextRuns(); + HSLFTextParagraph[] txt = slide[j].getTextParagraphs(); for (int k = 0; k < txt.length; k++) { - String text = txt[k].getText(); - Hyperlink[] links = txt[k].getHyperlinks(); + String text = txt[k].getRawText(); + HSLFHyperlink[] links = txt[k].getHyperlinks(); if(links != null) for (int l = 0; l < links.length; l++) { - Hyperlink link = links[l]; + HSLFHyperlink link = links[l]; String title = link.getTitle(); String address = link.getAddress(); System.out.println(" " + title); @@ -65,7 +61,7 @@ public final class Hyperlinks { System.out.println(" reading hyperlinks from the slide's shapes"); HSLFShape[] sh = slide[j].getShapes(); for (int k = 0; k < sh.length; k++) { - Hyperlink link = sh[k].getHyperlink(); + HSLFHyperlink link = sh[k].getHyperlink(); if(link != null) { String title = link.getTitle(); String address = link.getAddress(); diff --git a/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java b/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java index 373f942844..784d912c0e 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java +++ b/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java @@ -21,6 +21,7 @@ import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hslf.model.*; import javax.imageio.ImageIO; + import java.io.FileOutputStream; import java.io.FileInputStream; import java.awt.*; diff --git a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java index 765ba3ef49..7ebbea9f17 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java +++ b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java @@ -21,6 +21,7 @@ import org.apache.poi.hslf.record.InteractiveInfo; import org.apache.poi.hslf.record.InteractiveInfoAtom; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.usermodel.*; + import java.io.FileInputStream; import java.util.Iterator; import java.util.List; diff --git a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java index 5dd1edea06..1d03e1b6f1 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java @@ -17,8 +17,7 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.HSLFTextRun; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hslf.model.*; import java.awt.*; @@ -53,7 +52,7 @@ public final class TableDemo { for (int j = 0; j < txt1[i].length; j++) { TableCell cell = table1.getCell(i, j); cell.setText(txt1[i][j]); - HSLFTextRun rt = cell.getTextParagraph().getRichTextRuns()[0]; + HSLFTextRun rt = cell.getTextParagraphs().getTextRuns()[0]; rt.setFontName("Arial"); rt.setFontSize(10); if(i == 0){ @@ -92,7 +91,7 @@ public final class TableDemo { for (int j = 0; j < txt2[i].length; j++) { TableCell cell = table2.getCell(i, j); cell.setText(txt2[i][j]); - HSLFTextRun rt = cell.getTextParagraph().getRichTextRuns()[0]; + HSLFTextRun rt = cell.getTextParagraphs().getTextRuns()[0]; rt.setFontSize(10); rt.setFontName("Arial"); if(i == 0){ diff --git a/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java b/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java index caf96a84c8..c656e7c5c6 100644 --- a/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java +++ b/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java @@ -21,8 +21,8 @@ import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.Entry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.hwpf.HWPFDocument; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import java.io.FileInputStream; import java.util.Iterator; diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java index a83a17e4b8..2f0e7e7515 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java @@ -52,10 +52,10 @@ public class Step1 { for(XSLFTextParagraph p : tsh){ System.out.println("Paragraph level: " + p.getLevel()); for(XSLFTextRun r : p){ - System.out.println(r.getText()); + System.out.println(r.getRawText()); System.out.println(" bold: " + r.isBold()); System.out.println(" italic: " + r.isItalic()); - System.out.println(" underline: " + r.isUnderline()); + System.out.println(" underline: " + r.isUnderlined()); System.out.println(" font.family: " + r.getFontFamily()); System.out.println(" font.size: " + r.getFontSize()); System.out.println(" font.color: " + r.getFontColor()); diff --git a/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java b/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java index ea3a5b28e1..69b570f7d3 100644 --- a/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java +++ b/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java @@ -20,7 +20,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.xslf.XSLFSlideShow; import org.apache.poi.hssf.usermodel.HSSFWorkbook; diff --git a/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java b/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java index 6b2ee5f09e..a946b18c12 100644 --- a/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java +++ b/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java @@ -22,8 +22,8 @@ import static org.junit.Assert.assertTrue; import java.io.FileInputStream; import java.io.InputStream; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.Record; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.junit.Test; public class HSLFFileHandler extends POIFSFileHandler { diff --git a/src/java/org/apache/poi/ddf/EscherContainerRecord.java b/src/java/org/apache/poi/ddf/EscherContainerRecord.java index 8454231cf1..d6139436aa 100644 --- a/src/java/org/apache/poi/ddf/EscherContainerRecord.java +++ b/src/java/org/apache/poi/ddf/EscherContainerRecord.java @@ -18,10 +18,7 @@ package org.apache.poi.ddf; import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; +import java.util.*; import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndian; @@ -154,30 +151,9 @@ public final class EscherContainerRecord extends EscherRecord { } public Iterator getChildIterator() { - return new ReadOnlyIterator(_childRecords); + return Collections.unmodifiableList(_childRecords).iterator(); } - private static final class ReadOnlyIterator implements Iterator { - private final List _list; - private int _index; - public ReadOnlyIterator(List list) { - _list = list; - _index = 0; - } - - public boolean hasNext() { - return _index < _list.size(); - } - public EscherRecord next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - return _list.get(_index++); - } - public void remove() { - throw new UnsupportedOperationException(); - } - } /** * replaces the internal child list with the contents of the supplied childRecords */ diff --git a/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java index 67f1067b71..266ebb395d 100644 --- a/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java +++ b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java @@ -17,6 +17,7 @@ package org.apache.poi.xslf.extractor; import java.io.IOException; +import java.util.List; import org.apache.poi.POIXMLTextExtractor; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; @@ -122,7 +123,7 @@ public class XSLFPowerPointExtractor extends POIXMLTextExtractor { public String getText(boolean slideText, boolean notesText, boolean masterText) { StringBuffer text = new StringBuffer(); - XSLFSlide[] slides = slideshow.getSlides(); + List slides = slideshow.getSlides(); XSLFCommentAuthors commentAuthors = slideshow.getCommentAuthors(); for (XSLFSlide slide : slides) { diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index 26780f9662..6bdca81d6f 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -17,52 +17,20 @@ package org.apache.poi.xslf.usermodel; import java.awt.Dimension; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.io.*; +import java.util.*; import java.util.regex.Pattern; -import org.apache.poi.POIXMLDocument; -import org.apache.poi.POIXMLDocumentPart; -import org.apache.poi.POIXMLException; -import org.apache.poi.POIXMLRelation; +import org.apache.poi.*; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; -import org.apache.poi.openxml4j.opc.OPCPackage; -import org.apache.poi.openxml4j.opc.PackagePart; -import org.apache.poi.openxml4j.opc.PackagePartName; -import org.apache.poi.openxml4j.opc.TargetMode; -import org.apache.poi.sl.usermodel.MasterSheet; -import org.apache.poi.sl.usermodel.Resources; -import org.apache.poi.sl.usermodel.SlideShow; -import org.apache.poi.util.Beta; -import org.apache.poi.util.IOUtils; -import org.apache.poi.util.Internal; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; -import org.apache.poi.util.PackageHelper; -import org.apache.poi.util.Units; +import org.apache.poi.openxml4j.opc.*; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.util.*; import org.apache.poi.xslf.XSLFSlideShow; -import org.apache.xmlbeans.XmlException; -import org.apache.xmlbeans.XmlObject; -import org.apache.xmlbeans.XmlOptions; +import org.apache.xmlbeans.*; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId; -import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesMasterIdList; -import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesMasterIdListEntry; -import org.openxmlformats.schemas.presentationml.x2006.main.CTPresentation; -import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdList; -import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry; -import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideSize; -import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument; - -import sun.reflect.generics.reflectiveObjects.NotImplementedException; - -import com.sun.org.apache.xml.internal.utils.UnImplNode; +import org.openxmlformats.schemas.presentationml.x2006.main.*; /** * High level representation of a ooxml slideshow. @@ -334,7 +302,7 @@ public class XMLSlideShow extends POIXMLDocument implements SlideShow { XSLFTheme theme = (XSLFTheme) createRelationship(XSLFRelation.THEME, XSLFFactory.getInstance(), themeIndex); - theme.importTheme(getSlides()[0].getTheme()); + theme.importTheme(getSlides().get(0).getTheme()); _notesMaster.addRelation(theme.getPackageRelationship().getId(), theme); PackagePartName themePackagePartName = theme.getPackagePart().getPartName(); @@ -350,15 +318,16 @@ public class XMLSlideShow extends POIXMLDocument implements SlideShow { return _notesMaster; } - public XSLFSlideMaster[] getSlideMasters() { - return _masters.values().toArray(new XSLFSlideMaster[_masters.size()]); + @Override + public List getSlideMasters() { + return new ArrayList(_masters.values()); } /** * Return all the slides in the slideshow */ - public XSLFSlide[] getSlides() { - return _slides.toArray(new XSLFSlide[_slides.size()]); + public List getSlides() { + return _slides; } /** @@ -496,10 +465,6 @@ public class XMLSlideShow extends POIXMLDocument implements SlideShow { return null; } - public XSLFSlideMaster[] getMasterSheet() { - return getSlideMasters(); - } - public MasterSheet createMasterSheet() throws IOException { // TODO: implement! throw new UnsupportedOperationException(); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java index 9a58a5128a..685ae46da5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java @@ -27,8 +27,7 @@ import java.util.regex.Pattern; import org.apache.poi.openxml4j.opc.*; import org.apache.poi.sl.usermodel.PlaceableShape; import org.apache.poi.sl.usermodel.ShapeGroup; -import org.apache.poi.util.Beta; -import org.apache.poi.util.Units; +import org.apache.poi.util.*; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.*; @@ -40,6 +39,8 @@ import org.openxmlformats.schemas.presentationml.x2006.main.*; */ @Beta public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, ShapeGroup { + private static POILogger _logger = POILogFactory.getLogger(XSLFGroupShape.class); + private final List _shapes; private final CTGroupShapeProperties _grpSpPr; private XSLFDrawing _drawing; @@ -135,8 +136,9 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, Sha * * @return child shapes contained witin this group */ - public XSLFShape[] getShapes(){ - return _shapes.toArray(new XSLFShape[_shapes.size()]); + @Override + public List getShapes(){ + return _shapes; } /** @@ -246,6 +248,13 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, Sha return sh; } + public XSLFTable createTable(){ + XSLFTable sh = getDrawing().createTable(); + _shapes.add(sh); + sh.setParent(this); + return sh; + } + @Override public void setFlipHorizontal(boolean flip){ getSafeXfrm().setFlipH(flip); @@ -282,14 +291,36 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, Sha @Override void copy(XSLFShape src){ XSLFGroupShape gr = (XSLFGroupShape)src; + + // clear shapes + clear(); + // recursively update each shape - XSLFShape[] tgtShapes = getShapes(); - XSLFShape[] srcShapes = gr.getShapes(); - for(int i = 0; i < tgtShapes.length; i++){ - XSLFShape s1 = srcShapes[i]; - XSLFShape s2 = tgtShapes[i]; + for(XSLFShape shape : gr.getShapes()) { + XSLFShape newShape = null; + if (shape instanceof XSLFTextBox) { + newShape = createTextBox(); + } else if (shape instanceof XSLFAutoShape) { + newShape = createAutoShape(); + } else if (shape instanceof XSLFConnectorShape) { + newShape = createConnector(); + } else if (shape instanceof XSLFFreeformShape) { + newShape = createFreeform(); + } else if (shape instanceof XSLFPictureShape) { + XSLFPictureShape p = (XSLFPictureShape)shape; + XSLFPictureData pd = p.getPictureData(); + int picId = getSheet().getSlideShow().addPicture(pd.getData(), pd.getPictureType()); + newShape = createPicture(picId); + } else if (shape instanceof XSLFGroupShape) { + newShape = createGroup(); + } else if (shape instanceof XSLFTable) { + newShape = createTable(); + } else { + _logger.log(POILogger.WARN, "copying of class "+shape.getClass()+" not supported."); + continue; + } - s2.copy(s1); + newShape.copy(shape); } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java index a953e2013e..7296d1d450 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java @@ -91,12 +91,12 @@ public final class XSLFNotes extends XSLFSheet implements Notes getTextParagraphs() { - List tp = new ArrayList(); + public List> getTextParagraphs() { + List> tp = new ArrayList>(); for (XSLFShape sh : super.getShapes()) { if (sh instanceof XSLFTextShape) { XSLFTextShape txt = (XSLFTextShape)sh; - tp.addAll(txt.getTextParagraphs()); + tp.add(txt.getTextParagraphs()); } } return tp; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index 38dea1b462..43ec701301 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -199,8 +199,8 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC * * @return an array of all shapes in this sheet */ - public XSLFShape[] getShapes(){ - return getShapeList().toArray(new XSLFShape[_shapes.size()]); + public List getShapes(){ + return getShapeList(); } /** @@ -301,6 +301,9 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC _spTree = null; _placeholders = null; + // fix-me: wth would this ever happen to work ... + + // first copy the source xml getSpTree().set(src.getSpTree()); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index ee62ee9d79..b6ee1bc8e2 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -29,7 +29,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.*; @Beta -public final class XSLFSlide extends XSLFSheet implements Slide { +public final class XSLFSlide extends XSLFSheet implements Slide { private final CTSlide _slide; private XSLFSlideLayout _layout; private XSLFComments _comments; @@ -245,7 +245,7 @@ public final class XSLFSlide extends XSLFSheet implements Slide notes) { + public void setNotes(XSLFNotes notes) { // TODO Auto-generated method stub } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java index 6f6dad8ee8..ca369ea957 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -68,7 +68,7 @@ public class XSLFTextParagraph implements TextParagraph { public String getText(){ StringBuilder out = new StringBuilder(); for (XSLFTextRun r : _runs) { - out.append(r.getText()); + out.append(r.getRawText()); } return out.toString(); } @@ -171,6 +171,39 @@ public class XSLFTextParagraph implements TextParagraph { } } + @Override + public FontAlign getFontAlign(){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + public boolean fetch(CTTextParagraphProperties props){ + if(props.isSetFontAlgn()){ + FontAlign val = FontAlign.values()[props.getFontAlgn().intValue() - 1]; + setValue(val); + return true; + } + return false; + } + }; + fetchParagraphProperty(fetcher); + return fetcher.getValue() == null ? FontAlign.AUTO : fetcher.getValue(); + } + + /** + * Specifies the font alignment that is to be applied to the paragraph. + * Possible values for this include auto, top, center, baseline and bottom. + * see {@link org.apache.poi.sl.usermodel.TextParagraph.FontAlign}. + * + * @param align font align + */ + public void setFontAlign(FontAlign align){ + CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); + if(align == null) { + if(pr.isSetFontAlgn()) pr.unsetFontAlgn(); + } else { + pr.setFontAlgn(STTextFontAlignType.Enum.forInt(align.ordinal() + 1)); + } + } + + /** * @return the font to be used on bullet characters within a given paragraph @@ -306,6 +339,7 @@ public class XSLFTextParagraph implements TextParagraph { * * @param value the indent in points. */ + @Override public void setIndent(double value){ CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); if(value == -1) { @@ -319,6 +353,7 @@ public class XSLFTextParagraph implements TextParagraph { * * @return the indent applied to the first line of text in the paragraph. */ + @Override public double getIndent(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ @@ -340,8 +375,9 @@ public class XSLFTextParagraph implements TextParagraph { * inset and applies only to this text paragraph. That is the text body Inset and the LeftMargin * attributes are additive with respect to the text position. * - * @param value the left margin of the paragraph + * @param value the left margin (in points) of the paragraph */ + @Override public void setLeftMargin(double value){ CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); if(value == -1) { @@ -353,9 +389,9 @@ public class XSLFTextParagraph implements TextParagraph { } /** - * - * @return the left margin of the paragraph + * @return the left margin (in points) of the paragraph */ + @Override public double getLeftMargin(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ @@ -372,10 +408,28 @@ public class XSLFTextParagraph implements TextParagraph { return fetcher.getValue() == null ? 0 : fetcher.getValue(); } + /** + * Specifies the right margin of the paragraph. This is specified in addition to the text body + * inset and applies only to this text paragraph. That is the text body Inset and the RightMargin + * attributes are additive with respect to the text position. + * + * @param value the right margin (in points) of the paragraph + */ + @Override + public void setRightMargin(double value){ + CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); + if(value == -1) { + if(pr.isSetMarR()) pr.unsetMarR(); + } else { + pr.setMarR(Units.toEMU(value)); + } + } + /** * * @return the right margin of the paragraph */ + @Override public double getRightMargin(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ @@ -834,11 +888,13 @@ public class XSLFTextParagraph implements TextParagraph { } } + @Override public double getDefaultFontSize() { CTTextCharacterProperties endPr = _p.getEndParaRPr(); return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100); } + @Override public String getDefaultFontFamily() { return (_runs.isEmpty() ? "Arial" : _runs.get(0).getFontFamily()); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java index 0a6daf6cea..2b63a58099 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java @@ -59,7 +59,7 @@ public class XSLFTextRun implements TextRun { return _p; } - public String getText(){ + public String getRawText(){ return _r.getT(); } @@ -479,7 +479,7 @@ public class XSLFTextRun implements TextRun { /** * @return whether this run of text is formatted as underlined text */ - public boolean isUnderline(){ + public boolean isUnderlined(){ CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetU()){ @@ -499,7 +499,7 @@ public class XSLFTextRun implements TextRun { @Override public String toString(){ - return "[" + getClass() + "]" + getText(); + return "[" + getClass() + "]" + getRawText(); } public XSLFHyperlink createHyperlink(){ @@ -568,8 +568,8 @@ public class XSLFTextRun implements TextRun { boolean italic = r.isItalic(); if(italic != isItalic()) setItalic(italic); - boolean underline = r.isUnderline(); - if(underline != isUnderline()) setUnderline(underline); + boolean underline = r.isUnderlined(); + if(underline != isUnderlined()) setUnderline(underline); boolean strike = r.isStrikethrough(); if(strike != isStrikethrough()) setStrikethrough(strike); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java index ac482a981f..5b58adbf1a 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java @@ -112,7 +112,7 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape * Sets the type of vertical alignment for the text. * * @param anchor - the type of alignment. - * A null values unsets this property. + * A {@code null} values unsets this property. */ public void setVerticalAlignment(VerticalAlignment anchor){ CTTextBodyProperties bodyPr = getTextBodyPr(); @@ -145,6 +145,40 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape return fetcher.getValue() == null ? VerticalAlignment.TOP : fetcher.getValue(); } + /** + * Sets if the paragraphs are horizontal centered + * + * @param isCentered true, if the paragraphs are horizontal centered + * A {@code null} values unsets this property. + * + * @see TextShape#isHorizontalCentered() + */ + public void setHorizontalCentered(Boolean isCentered){ + CTTextBodyProperties bodyPr = getTextBodyPr(); + if (bodyPr != null) { + if (isCentered == null) { + if (bodyPr.isSetAnchorCtr()) bodyPr.unsetAnchorCtr(); + } else { + bodyPr.setAnchorCtr(isCentered); + } + } + } + + @Override + public boolean isHorizontalCentered(){ + PropertyFetcher fetcher = new TextBodyPropertyFetcher(){ + public boolean fetch(CTTextBodyProperties props){ + if(props.isSetAnchorCtr()){ + setValue(props.getAnchorCtr()); + return true; + } + return false; + } + }; + fetchShapeProperty(fetcher); + return fetcher.getValue() == null ? false : fetcher.getValue(); + } + /** * * @param orientation vertical orientation of the text @@ -266,7 +300,7 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape } /** - * Sets the botom margin. + * Sets the bottom margin. * @see #getBottomInset() * * @param margin the bottom margin @@ -429,9 +463,7 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape } } - /** - * Compute the cumulative height occupied by the text - */ + @Override public double getTextHeight(){ DrawFactory drawFact = DrawFactory.getInstance(null); DrawTextShape dts = drawFact.getDrawable(this); diff --git a/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java b/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java index 76bb08559f..400c637ca8 100644 --- a/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java +++ b/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java @@ -24,12 +24,14 @@ import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.apache.poi.xslf.usermodel.XSLFSlide; import javax.imageio.ImageIO; + import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.FileOutputStream; +import java.util.List; /** * An utulity to convert slides of a .pptx slide show to a PNG image @@ -79,11 +81,11 @@ public class PPTX2PNG { int width = (int) (pgsize.width * scale); int height = (int) (pgsize.height * scale); - XSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { + List slide = ppt.getSlides(); + for (int i = 0; i < slide.size(); i++) { if (slidenum != -1 && slidenum != (i + 1)) continue; - String title = slide[i].getTitle(); + String title = slide.get(i).getTitle(); System.out.println("Rendering slide " + (i + 1) + (title == null ? "" : ": " + title)); BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); @@ -101,7 +103,7 @@ public class PPTX2PNG { graphics.scale(scale, scale); // draw stuff - slide[i].draw(graphics); + slide.get(i).draw(graphics); // save the result int sep = file.lastIndexOf("."); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java index 7d18541d9b..6d66caefe0 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java @@ -55,8 +55,8 @@ public class TestXSLFBugs { public void bug51187() throws Exception { XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("51187.pptx"); - assertEquals(1, ss.getSlides().length); - XSLFSlide slide = ss.getSlides()[0]; + assertEquals(1, ss.getSlides().size()); + XSLFSlide slide = ss.getSlides().get(0); // Check the relations on it // Note - rId3 is a self reference @@ -71,7 +71,7 @@ public class TestXSLFBugs { // Save and re-load ss = XSLFTestDataSamples.writeOutAndReadBack(ss); - assertEquals(1, ss.getSlides().length); + assertEquals(1, ss.getSlides().size()); slidePart = ss._getXSLFSlideShow().getSlidePart( ss._getXSLFSlideShow().getSlideReferences().getSldIdArray(0) @@ -92,8 +92,8 @@ public class TestXSLFBugs { XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("with_japanese.pptx"); // Should have one slide - assertEquals(1, ss.getSlides().length); - XSLFSlide slide = ss.getSlides()[0]; + assertEquals(1, ss.getSlides().size()); + XSLFSlide slide = ss.getSlides().get(0); // Check the relations from this List rels = slide.getRelations(); @@ -142,20 +142,20 @@ public class TestXSLFBugs { XSLFSlide slide; // Should find 4 slides - assertEquals(4, ss.getSlides().length); + assertEquals(4, ss.getSlides().size()); // Check the text, to see we got them in order - slide = ss.getSlides()[0]; + slide = ss.getSlides().get(0); assertContains("POI cannot read this", getSlideText(slide)); - slide = ss.getSlides()[1]; + slide = ss.getSlides().get(1); assertContains("POI can read this", getSlideText(slide)); assertContains("Has a relationship to another slide", getSlideText(slide)); - slide = ss.getSlides()[2]; + slide = ss.getSlides().get(2); assertContains("POI can read this", getSlideText(slide)); - slide = ss.getSlides()[3]; + slide = ss.getSlides().get(3); assertContains("POI can read this", getSlideText(slide)); } @@ -196,13 +196,13 @@ public class TestXSLFBugs { } @Test - @Ignore("Similar to TestFontRendering it doesn't make sense to compare images because of tiny rendering differences in windows/unix") + // @Ignore("Similar to TestFontRendering it doesn't make sense to compare images because of tiny rendering differences in windows/unix") public void bug54542() throws Exception { XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("54542_cropped_bitmap.pptx"); Dimension pgsize = ss.getPageSize(); - XSLFSlide slide = ss.getSlides()[0]; + XSLFSlide slide = ss.getSlides().get(0); // render it double zoom = 1; @@ -265,10 +265,10 @@ public class TestXSLFBugs { ss = XSLFTestDataSamples.writeOutAndReadBack(ss); } - assertEquals(slideTexts.length, ss.getSlides().length); + assertEquals(slideTexts.length, ss.getSlides().size()); for (int i = 0; i < slideTexts.length; i++) { - XSLFSlide slide = ss.getSlides()[i]; + XSLFSlide slide = ss.getSlides().get(i); assertContains(getSlideText(slide), slideTexts[i]); } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java b/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java index 47d2277712..36d42471ca 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java @@ -18,19 +18,19 @@ */ package org.apache.poi.xslf.geom; -import junit.framework.TestCase; -import org.apache.poi.xslf.model.geom.Context; -import org.apache.poi.xslf.model.geom.CustomGeometry; -import org.apache.poi.xslf.model.geom.Formula; -import org.apache.poi.xslf.model.geom.Guide; -import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D; +import static org.junit.Assert.assertEquals; + +import org.apache.poi.sl.draw.binding.CTCustomGeometry2D; +import org.apache.poi.sl.draw.geom.*; +import org.junit.Test; /** * Date: 10/24/11 * * @author Yegor Kozlov */ -public class TestFormulaParser extends TestCase { +public class TestFormulaParser { + @Test public void testParse(){ Formula[] ops = { @@ -44,18 +44,18 @@ public class TestFormulaParser extends TestCase { new Guide("a5", "abs -2"), }; - CustomGeometry geom = new CustomGeometry(CTCustomGeometry2D.Factory.newInstance()); + CustomGeometry geom = new CustomGeometry(new CTCustomGeometry2D()); Context ctx = new Context(geom, null, 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")); + assertEquals(100.0, ctx.getValue("adj1"), 0.0); + assertEquals(200.0, ctx.getValue("adj2"), 0.0); + assertEquals(1.0, ctx.getValue("a1"), 0.0); + assertEquals(101.0, ctx.getValue("a2"), 0.0); + assertEquals(1.5, ctx.getValue("a3"), 0.0); + assertEquals(200.0, ctx.getValue("a4"), 0.0); + assertEquals(2.0, ctx.getValue("a5"), 0.0); } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java b/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java index 50a66667ab..5001dc8b91 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java @@ -18,24 +18,23 @@ */ package org.apache.poi.xslf.geom; -import junit.framework.TestCase; -import org.apache.poi.xslf.model.geom.Context; -import org.apache.poi.xslf.model.geom.CustomGeometry; -import org.apache.poi.xslf.model.geom.Guide; -import org.apache.poi.xslf.model.geom.IAdjustableShape; -import org.apache.poi.xslf.model.geom.Path; -import org.apache.poi.xslf.model.geom.PresetGeometries; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.util.Map; +import org.apache.poi.sl.draw.geom.*; +import org.junit.Test; + /** * Date: 10/24/11 * * @author Yegor Kozlov */ -public class TestPresetGeometries extends TestCase { +public class TestPresetGeometries { + @Test public void testRead(){ Map shapes = PresetGeometries.getInstance(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java index 5c616cd43a..e2124eca3b 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java @@ -25,7 +25,7 @@ import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; -import org.apache.poi.hslf.model.TextPainter; +import org.apache.poi.sl.draw.Drawable; import org.apache.poi.util.JvmBugs; import org.apache.poi.xslf.XSLFTestDataSamples; import org.junit.Test; @@ -56,10 +56,10 @@ public class TestPPTX2PNG { @SuppressWarnings("unchecked") private void fixFonts(Graphics2D graphics) { if (!JvmBugs.hasLineBreakMeasurerBug()) return; - Map fontMap = (Map)graphics.getRenderingHint(TextPainter.KEY_FONTMAP); + Map fontMap = (Map)graphics.getRenderingHint(Drawable.FONT_MAP); if (fontMap == null) fontMap = new HashMap(); fontMap.put("Calibri", "Lucida Sans"); fontMap.put("Cambria", "Lucida Bright"); - graphics.setRenderingHint(TextPainter.KEY_FONTMAP, fontMap); + graphics.setRenderingHint(Drawable.FONT_MAP, fontMap); } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java index 604f68fffb..5b615ee828 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java @@ -16,23 +16,25 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; +import static org.junit.Assert.*; import org.apache.poi.POIDataSamples; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; -import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesMasterIdListEntry; -import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry; -import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideMasterIdListEntry; +import org.junit.Before; +import org.junit.Test; +import org.openxmlformats.schemas.presentationml.x2006.main.*; -public class TestXMLSlideShow extends TestCase { +public class TestXMLSlideShow { private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); private OPCPackage pack; - protected void setUp() throws Exception { + @Before + public void setUp() throws Exception { pack = OPCPackage.open(slTests.openResourceAsStream("sample.pptx")); } + @Test public void testContainsMainContentType() throws Exception { boolean found = false; for(PackagePart part : pack.getParts()) { @@ -43,6 +45,7 @@ public class TestXMLSlideShow extends TestCase { assertTrue(found); } + @Test public void testOpen() throws Exception { XMLSlideShow xml; @@ -52,22 +55,20 @@ public class TestXMLSlideShow extends TestCase { assertNotNull(xml.getCTPresentation()); // Check it has some slides - assertNotNull(xml.getSlides().length); - assertTrue(xml.getSlides().length > 0); - - assertNotNull(xml.getSlideMasters().length); - assertTrue(xml.getSlideMasters().length > 0); + assertFalse(xml.getSlides().isEmpty()); + assertFalse(xml.getSlideMasters().isEmpty()); } + @Test @SuppressWarnings("deprecation") public void testSlideBasics() throws Exception { XMLSlideShow xml = new XMLSlideShow(pack); // Should have 1 master - assertEquals(1, xml.getSlideMasters().length); + assertEquals(1, xml.getSlideMasters().size()); // Should have two sheets - assertEquals(2, xml.getSlides().length); + assertEquals(2, xml.getSlides().size()); // Check they're as expected CTSlideIdListEntry[] slides = xml.getCTPresentation().getSldIdLst().getSldIdArray(); @@ -78,19 +79,19 @@ public class TestXMLSlideShow extends TestCase { assertEquals("rId3", slides[1].getId2()); // Now get those objects - assertNotNull(xml.getSlides()[0]); - assertNotNull(xml.getSlides()[1]); + assertNotNull(xml.getSlides().get(0)); + assertNotNull(xml.getSlides().get(1)); // And check they have notes as expected - assertNotNull(xml.getSlides()[0].getNotes()); - assertNotNull(xml.getSlides()[1].getNotes()); + assertNotNull(xml.getSlides().get(0).getNotes()); + assertNotNull(xml.getSlides().get(1).getNotes()); // Next up look for the slide master CTSlideMasterIdListEntry[] masters = xml.getCTPresentation().getSldMasterIdLst().getSldMasterIdArray(); assertEquals(2147483648l, masters[0].getId()); assertEquals("rId1", masters[0].getId2()); - assertNotNull(xml.getSlideMasters()[0]); + assertNotNull(xml.getSlideMasters().get(0)); // Finally look for the notes master CTNotesMasterIdListEntry notesMaster = @@ -100,6 +101,7 @@ public class TestXMLSlideShow extends TestCase { assertNotNull(xml.getNotesMaster()); } + @Test public void testMetadataBasics() throws Exception { XMLSlideShow xml = new XMLSlideShow(pack); @@ -114,6 +116,7 @@ public class TestXMLSlideShow extends TestCase { assertEquals(null, xml.getProperties().getCoreProperties().getUnderlyingProperties().getSubjectProperty().getValue()); } + @Test public void testComments() throws Exception { // Default sample file has none XMLSlideShow xml = new XMLSlideShow(pack); @@ -134,8 +137,9 @@ public class TestXMLSlideShow extends TestCase { assertEquals("XPVMWARE01", xmlComments.getCommentAuthors().getAuthorById(0).getName()); // First two slides have comments - for (int i=0; i shapes = slide.getShapes(); + XSLFTable tbl = (XSLFTable)shapes.get(0); XSLFTableCell cell1 = tbl.getRows().get(1).getCells().get(0); assertEquals("Web Page", cell1.getText()); XSLFHyperlink link1 = cell1.getTextParagraphs().get(0).getTextRuns().get(0).getHyperlink(); @@ -53,6 +58,7 @@ public class TestXSLFHyperlink extends TestCase { assertEquals(URI.create("mailto:dev@poi.apache.org?subject=Hi%20There"), link3.getTargetURI()); } + @Test public void testCreate() throws Exception { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide1 = ppt.createSlide(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java index 955b273c1e..0ec9b972a0 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java @@ -16,22 +16,20 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.*; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import junit.framework.TestCase; +import java.util.*; import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture; /** * @author Yegor Kozlov */ -public class TestXSLFPictureShape extends TestCase { +public class TestXSLFPictureShape { + @Test public void testCreate() { XMLSlideShow ppt = new XMLSlideShow(); assertEquals(0, ppt.getAllPictures().size()); @@ -61,11 +59,12 @@ public class TestXSLFPictureShape extends TestCase { assertArrayEquals(data1, pics.get(0).getData()); assertArrayEquals(data2, pics.get(1).getData()); - XSLFShape[] shapes = ppt.getSlides()[0].getShapes(); - assertArrayEquals(data1, ((XSLFPictureShape) shapes[0]).getPictureData().getData()); - assertArrayEquals(data2, ((XSLFPictureShape) shapes[1]).getPictureData().getData()); + List shapes = ppt.getSlides().get(0).getShapes(); + assertArrayEquals(data1, ((XSLFPictureShape) shapes.get(0)).getPictureData().getData()); + assertArrayEquals(data2, ((XSLFPictureShape) shapes.get(1)).getPictureData().getData()); } + @Test public void testCreateMultiplePictures() { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide1 = ppt.createSlide(); @@ -118,6 +117,7 @@ public class TestXSLFPictureShape extends TestCase { } } + @Test public void testImageCaching() { XMLSlideShow ppt = new XMLSlideShow(); byte[] img1 = new byte[]{1,2,3}; @@ -137,6 +137,7 @@ public class TestXSLFPictureShape extends TestCase { } + @Test public void testMerge() { XMLSlideShow ppt1 = new XMLSlideShow(); byte[] data1 = new byte[100]; @@ -150,7 +151,7 @@ public class TestXSLFPictureShape extends TestCase { XMLSlideShow ppt2 = new XMLSlideShow(); XSLFSlide slide2 = ppt2.createSlide().importContent(slide1); - XSLFPictureShape shape2 = (XSLFPictureShape)slide2.getShapes()[0]; + XSLFPictureShape shape2 = (XSLFPictureShape)slide2.getShapes().get(0); assertArrayEquals(data1, shape2.getPictureData().getData()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java index e6c4728474..3983d0b392 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java @@ -16,8 +16,10 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; +import static org.junit.Assert.*; + import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType; import java.util.List; @@ -25,17 +27,18 @@ import java.util.List; /** * @author Yegor Kozlov */ -public class TestXSLFShape extends TestCase { +public class TestXSLFShape { + @Test public void testReadTextShapes() { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); - XSLFSlide[] slides = ppt.getSlides(); + List slides = ppt.getSlides(); - XSLFSlide slide1 = slides[0]; - XSLFShape[] shapes1 = slide1.getShapes(); - assertEquals(7, shapes1.length); - assertEquals("TextBox 3", shapes1[0].getShapeName()); - XSLFAutoShape sh0 = (XSLFAutoShape) shapes1[0]; + XSLFSlide slide1 = slides.get(0); + List shapes1 = slide1.getShapes(); + assertEquals(7, shapes1.size()); + assertEquals("TextBox 3", shapes1.get(0).getShapeName()); + XSLFAutoShape sh0 = (XSLFAutoShape) shapes1.get(0); assertEquals("Learning PPTX", sh0.getText()); List paragraphs0 = sh0.getTextParagraphs(); assertEquals(1, paragraphs0.size()); @@ -43,28 +46,28 @@ public class TestXSLFShape extends TestCase { assertEquals("Learning PPTX", p0.getText()); assertEquals(1, p0.getTextRuns().size()); XSLFTextRun r0 = p0.getTextRuns().get(0); - assertEquals("Learning PPTX", r0.getText()); + assertEquals("Learning PPTX", r0.getRawText()); - XSLFSlide slide2 = slides[1]; - XSLFShape[] shapes2 = slide2.getShapes(); - assertTrue(shapes2[0] instanceof XSLFAutoShape); - assertEquals("PPTX Title", ((XSLFAutoShape) shapes2[0]).getText()); - XSLFAutoShape sh1 = (XSLFAutoShape) shapes2[0]; + XSLFSlide slide2 = slides.get(1); + List shapes2 = slide2.getShapes(); + assertTrue(shapes2.get(0) instanceof XSLFAutoShape); + assertEquals("PPTX Title", ((XSLFAutoShape) shapes2.get(0)).getText()); + XSLFAutoShape sh1 = (XSLFAutoShape) shapes2.get(0); List paragraphs1 = sh1.getTextParagraphs(); assertEquals(1, paragraphs1.size()); XSLFTextParagraph p1 = paragraphs1.get(0); assertEquals("PPTX Title", p1.getText()); List r2 = paragraphs1.get(0).getTextRuns(); assertEquals(2, r2.size()); - assertEquals("PPTX ", r2.get(0).getText()); - assertEquals("Title", r2.get(1).getText()); + assertEquals("PPTX ", r2.get(0).getRawText()); + assertEquals("Title", r2.get(1).getRawText()); // Title is underlined assertEquals(STTextUnderlineType.SNG, r2.get(1).getXmlObject().getRPr().getU()); - assertTrue(shapes2[1] instanceof XSLFAutoShape); - assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape) shapes2[1]).getText()); - XSLFAutoShape sh2 = (XSLFAutoShape) shapes2[1]; + assertTrue(shapes2.get(1) instanceof XSLFAutoShape); + assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape) shapes2.get(1)).getText()); + XSLFAutoShape sh2 = (XSLFAutoShape) shapes2.get(1); List paragraphs2 = sh2.getTextParagraphs(); assertEquals(2, paragraphs2.size()); assertEquals("Subtitle", paragraphs2.get(0).getText()); @@ -73,20 +76,20 @@ public class TestXSLFShape extends TestCase { assertEquals(1, paragraphs2.get(0).getTextRuns().size()); assertEquals(1, paragraphs2.get(1).getTextRuns().size()); - assertEquals("Subtitle", paragraphs2.get(0).getTextRuns().get(0).getText()); + assertEquals("Subtitle", paragraphs2.get(0).getTextRuns().get(0).getRawText()); assertTrue(paragraphs2.get(0).getTextRuns().get(0).getXmlObject().getRPr().getB()); - assertEquals("And second line", paragraphs2.get(1).getTextRuns().get(0).getText()); + assertEquals("And second line", paragraphs2.get(1).getTextRuns().get(0).getRawText()); } public void testCreateShapes() { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); - assertEquals(0, slide.getShapes().length); + assertTrue(slide.getShapes().isEmpty()); XSLFTextBox textBox = slide.createTextBox(); - assertEquals(1, slide.getShapes().length); - assertSame(textBox, slide.getShapes()[0]); + assertEquals(1, slide.getShapes().size()); + assertSame(textBox, slide.getShapes().get(0)); assertEquals("", textBox.getText()); assertEquals(0, textBox.getTextParagraphs().size()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java index 8f8e46d944..d880966909 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java @@ -18,35 +18,40 @@ */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; +import static org.junit.Assert.*; + +import org.junit.Test; /** * test common operations on containers of shapes (sheets and groups of shapes) * * @author Yegor Kozlov */ -public class TestXSLFShapeContainer extends TestCase { +public class TestXSLFShapeContainer { + @SuppressWarnings("unused") + @Test public void verifyContainer(XSLFShapeContainer container) { container.clear(); - assertEquals(0, container.getShapes().length); + assertEquals(0, container.getShapes().size()); XSLFGroupShape shape1 = container.createGroup(); - assertEquals(1, container.getShapes().length); + assertEquals(1, container.getShapes().size()); XSLFTextBox shape2 = container.createTextBox(); - assertEquals(2, container.getShapes().length); + assertEquals(2, container.getShapes().size()); XSLFAutoShape shape3 = container.createAutoShape(); - assertEquals(3, container.getShapes().length); + assertEquals(3, container.getShapes().size()); XSLFConnectorShape shape4 = container.createConnector(); - assertEquals(4, container.getShapes().length); + assertEquals(4, container.getShapes().size()); container.clear(); - assertEquals(0, container.getShapes().length); + assertEquals(0, container.getShapes().size()); } + @Test public void testSheet() { XMLSlideShow ppt = new XMLSlideShow(); XSLFSheet sheet = ppt.createSlide(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSheet.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSheet.java index d605a05198..92c30b62d5 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSheet.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSheet.java @@ -16,50 +16,56 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; +import static org.junit.Assert.*; + +import java.util.List; + import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; /** * test common properties for sheets (slides, masters, layouts, etc.) * * @author Yegor Kozlov */ -public class TestXSLFSheet extends TestCase { +public class TestXSLFSheet { + + @Test public void testCreateShapes(){ XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); - assertEquals(0, slide.getShapes().length); + assertTrue(slide.getShapes().isEmpty()); XSLFSimpleShape shape1 = slide.createAutoShape(); - assertEquals(1, slide.getShapes().length); - assertSame(shape1, slide.getShapes()[0]); + assertEquals(1, slide.getShapes().size()); + assertSame(shape1, slide.getShapes().get(0)); XSLFTextBox shape2 = slide.createTextBox(); - assertEquals(2, slide.getShapes().length); - assertSame(shape1, slide.getShapes()[0]); - assertSame(shape2, slide.getShapes()[1]); + assertEquals(2, slide.getShapes().size()); + assertSame(shape1, slide.getShapes().get(0)); + assertSame(shape2, slide.getShapes().get(1)); XSLFConnectorShape shape3 = slide.createConnector(); - assertEquals(3, slide.getShapes().length); - assertSame(shape1, slide.getShapes()[0]); - assertSame(shape2, slide.getShapes()[1]); - assertSame(shape3, slide.getShapes()[2]); + assertEquals(3, slide.getShapes().size()); + assertSame(shape1, slide.getShapes().get(0)); + assertSame(shape2, slide.getShapes().get(1)); + assertSame(shape3, slide.getShapes().get(2)); XSLFGroupShape shape4 = slide.createGroup(); - assertEquals(4, slide.getShapes().length); - assertSame(shape1, slide.getShapes()[0]); - assertSame(shape2, slide.getShapes()[1]); - assertSame(shape3, slide.getShapes()[2]); - assertSame(shape4, slide.getShapes()[3]); + assertEquals(4, slide.getShapes().size()); + assertSame(shape1, slide.getShapes().get(0)); + assertSame(shape2, slide.getShapes().get(1)); + assertSame(shape3, slide.getShapes().get(2)); + assertSame(shape4, slide.getShapes().get(3)); ppt = XSLFTestDataSamples.writeOutAndReadBack(ppt); - slide = ppt.getSlides()[0]; - XSLFShape[] shapes = slide.getShapes(); - assertEquals(4, shapes.length); + slide = ppt.getSlides().get(0); + List shapes = slide.getShapes(); + assertEquals(4, shapes.size()); - assertTrue(shapes[0] instanceof XSLFAutoShape); - assertTrue(shapes[1] instanceof XSLFTextBox); - assertTrue(shapes[2] instanceof XSLFConnectorShape); - assertTrue(shapes[3] instanceof XSLFGroupShape); + assertTrue(shapes.get(0) instanceof XSLFAutoShape); + assertTrue(shapes.get(1) instanceof XSLFTextBox); + assertTrue(shapes.get(2) instanceof XSLFConnectorShape); + assertTrue(shapes.get(3) instanceof XSLFGroupShape); } } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java index b3a5fc211e..064ebe6cb7 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java @@ -16,30 +16,34 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import java.awt.Color; +import static org.junit.Assert.*; -import junit.framework.TestCase; +import java.awt.Color; +import java.util.List; import org.apache.poi.sl.usermodel.StrokeStyle.LineCap; import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.util.Units; import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.*; /** * @author Yegor Kozlov */ -public class TestXSLFSimpleShape extends TestCase { +public class TestXSLFSimpleShape { + + @Test public void testLineStyles() { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); XSLFSimpleShape shape = slide.createAutoShape(); - assertEquals(1, slide.getShapes().length); + assertEquals(1, slide.getShapes().size()); // line properties are not set by default assertFalse(shape.getSpPr().isSetLn()); - assertEquals(0., shape.getLineWidth()); + assertEquals(0., shape.getLineWidth(), 0); assertEquals(null, shape.getLineColor()); assertEquals(null, shape.getLineDash()); assertEquals(null, shape.getLineCap()); @@ -54,10 +58,10 @@ public class TestXSLFSimpleShape extends TestCase { // line width shape.setLineWidth(1.0); - assertEquals(1.0, shape.getLineWidth()); + assertEquals(1.0, shape.getLineWidth(), 0); assertEquals(Units.EMU_PER_POINT, shape.getSpPr().getLn().getW()); shape.setLineWidth(5.5); - assertEquals(5.5, shape.getLineWidth()); + assertEquals(5.5, shape.getLineWidth(), 0); assertEquals(Units.toEMU(5.5), shape.getSpPr().getLn().getW()); shape.setLineWidth(0.0); // setting line width to zero unsets the W attribute @@ -108,17 +112,18 @@ public class TestXSLFSimpleShape extends TestCase { ln2.setLineDash(LineDash.DOT); assertEquals(LineDash.DOT, ln2.getLineDash()); ln2.setLineWidth(0.); - assertEquals(0., ln2.getLineWidth()); + assertEquals(0., ln2.getLineWidth(), 0); XSLFSimpleShape ln3 = slide.createAutoShape(); ln3.setLineWidth(1.); - assertEquals(1., ln3.getLineWidth()); + assertEquals(1., ln3.getLineWidth(), 0); ln3.setLineDash(null); assertEquals(null, ln3.getLineDash()); ln3.setLineCap(null); assertEquals(null, ln3.getLineDash()); } + @Test public void testFill() { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -143,29 +148,30 @@ public class TestXSLFSimpleShape extends TestCase { assertFalse(shape.getSpPr().isSetSolidFill()); } + @Test public void testDefaultProperties() { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); - XSLFSlide slide6 = ppt.getSlides()[5]; - XSLFShape[] shapes = slide6.getShapes(); - for(int i = 1; i < shapes.length; i++){ - XSLFSimpleShape s = (XSLFSimpleShape) shapes[i]; + XSLFSlide slide6 = ppt.getSlides().get(5); + List shapes = slide6.getShapes(); + for(XSLFShape xs : shapes){ + XSLFSimpleShape s = (XSLFSimpleShape)xs; // all shapes have a theme color="accent1" assertEquals("accent1", s.getSpStyle().getFillRef().getSchemeClr().getVal().toString()); - assertEquals(2.0, s.getLineWidth()); + assertEquals(2.0, s.getLineWidth(), 0); assertEquals(LineCap.FLAT, s.getLineCap()); // YK: calculated color is slightly different from PowerPoint assertEquals(new Color(39, 64, 94), s.getLineColor()); } - XSLFSimpleShape s0 = (XSLFSimpleShape) shapes[0]; + XSLFSimpleShape s0 = (XSLFSimpleShape) shapes.get(0); // fill is not set assertNull(s0.getSpPr().getSolidFill()); //assertEquals(slide6.getTheme().getColor("accent1").getColor(), s0.getFillColor()); assertEquals(new Color(79, 129, 189), s0.getFillColor()); // lighter 80% - XSLFSimpleShape s1 = (XSLFSimpleShape)shapes[1]; + XSLFSimpleShape s1 = (XSLFSimpleShape)shapes.get(1); CTSchemeColor ref1 = s1.getSpPr().getSolidFill().getSchemeClr(); assertEquals(1, ref1.sizeOfLumModArray()); assertEquals(1, ref1.sizeOfLumOffArray()); @@ -175,7 +181,7 @@ public class TestXSLFSimpleShape extends TestCase { assertEquals(new Color(220, 230, 242), s1.getFillColor()); // lighter 60% - XSLFSimpleShape s2 = (XSLFSimpleShape)shapes[2]; + XSLFSimpleShape s2 = (XSLFSimpleShape)shapes.get(2); CTSchemeColor ref2 = s2.getSpPr().getSolidFill().getSchemeClr(); assertEquals(1, ref2.sizeOfLumModArray()); assertEquals(1, ref2.sizeOfLumOffArray()); @@ -185,7 +191,7 @@ public class TestXSLFSimpleShape extends TestCase { assertEquals(new Color(185, 205, 229), s2.getFillColor()); // lighter 40% - XSLFSimpleShape s3 = (XSLFSimpleShape)shapes[3]; + XSLFSimpleShape s3 = (XSLFSimpleShape)shapes.get(3); CTSchemeColor ref3 = s3.getSpPr().getSolidFill().getSchemeClr(); assertEquals(1, ref3.sizeOfLumModArray()); assertEquals(1, ref3.sizeOfLumOffArray()); @@ -195,7 +201,7 @@ public class TestXSLFSimpleShape extends TestCase { assertEquals(new Color(149, 179, 215), s3.getFillColor()); // darker 25% - XSLFSimpleShape s4 = (XSLFSimpleShape)shapes[4]; + XSLFSimpleShape s4 = (XSLFSimpleShape)shapes.get(4); CTSchemeColor ref4 = s4.getSpPr().getSolidFill().getSchemeClr(); assertEquals(1, ref4.sizeOfLumModArray()); assertEquals(0, ref4.sizeOfLumOffArray()); @@ -204,7 +210,7 @@ public class TestXSLFSimpleShape extends TestCase { // YK: calculated color is slightly different from PowerPoint assertEquals(new Color(59, 97, 142), s4.getFillColor()); - XSLFSimpleShape s5 = (XSLFSimpleShape)shapes[5]; + XSLFSimpleShape s5 = (XSLFSimpleShape)shapes.get(5); CTSchemeColor ref5 = s5.getSpPr().getSolidFill().getSchemeClr(); assertEquals(1, ref5.sizeOfLumModArray()); assertEquals(0, ref5.sizeOfLumOffArray()); @@ -214,26 +220,27 @@ public class TestXSLFSimpleShape extends TestCase { assertEquals(new Color(40, 65, 95), s5.getFillColor()); } + @Test public void testAnchor(){ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); - XSLFSlide[] slide = ppt.getSlides(); + List slide = ppt.getSlides(); - XSLFSlide slide2 = slide[1]; + XSLFSlide slide2 = slide.get(1); XSLFSlideLayout layout2 = slide2.getSlideLayout(); - XSLFShape[] shapes2 = slide2.getShapes(); - XSLFTextShape sh1 = (XSLFTextShape)shapes2[0]; + List shapes2 = slide2.getShapes(); + XSLFTextShape sh1 = (XSLFTextShape)shapes2.get(0); assertEquals(Placeholder.CENTERED_TITLE, sh1.getTextType()); assertEquals("PPTX Title", sh1.getText()); assertNull(sh1.getSpPr().getXfrm()); // xfrm is not set, the query is delegated to the slide layout assertEquals(sh1.getAnchor(), layout2.getTextShapeByType(Placeholder.CENTERED_TITLE).getAnchor()); - XSLFTextShape sh2 = (XSLFTextShape)shapes2[1]; + XSLFTextShape sh2 = (XSLFTextShape)shapes2.get(1); assertEquals("Subtitle\nAnd second line", sh2.getText()); assertEquals(Placeholder.SUBTITLE, sh2.getTextType()); assertNull(sh2.getSpPr().getXfrm()); // xfrm is not set, the query is delegated to the slide layout assertEquals(sh2.getAnchor(), layout2.getTextShapeByType(Placeholder.SUBTITLE).getAnchor()); - XSLFSlide slide5 = slide[4]; + XSLFSlide slide5 = slide.get(4); XSLFSlideLayout layout5 = slide5.getSlideLayout(); XSLFTextShape shTitle = slide5.getTextShapeByType(Placeholder.TITLE); assertEquals("Hyperlinks", shTitle.getText()); @@ -247,6 +254,7 @@ public class TestXSLFSimpleShape extends TestCase { } @SuppressWarnings({ "deprecation", "unused" }) + @Test public void testShadowEffects(){ XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java index ecfd70eac2..fdfb46ee9a 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java @@ -16,88 +16,91 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.*; import java.awt.Color; - -import junit.framework.TestCase; +import java.util.List; import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; /** * @author Yegor Kozlov */ -public class TestXSLFSlide extends TestCase { +public class TestXSLFSlide { + + @Test public void testReadShapes(){ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); - XSLFSlide[] slides = ppt.getSlides(); + List slides = ppt.getSlides(); - XSLFSlide slide1 = slides[0]; - XSLFShape[] shapes1 = slide1.getShapes(); - assertEquals(7, shapes1.length); - assertEquals("TextBox 3", shapes1[0].getShapeName()); - assertTrue(shapes1[0] instanceof XSLFTextBox); - XSLFAutoShape sh0 = (XSLFAutoShape)shapes1[0]; + XSLFSlide slide1 = slides.get(0); + List shapes1 = slide1.getShapes(); + assertEquals(7, shapes1.size()); + assertEquals("TextBox 3", shapes1.get(0).getShapeName()); + assertTrue(shapes1.get(0) instanceof XSLFTextBox); + XSLFAutoShape sh0 = (XSLFAutoShape)shapes1.get(0); assertEquals("Learning PPTX", sh0.getText()); - assertEquals("Straight Connector 5", shapes1[1].getShapeName()); - assertTrue(shapes1[1] instanceof XSLFConnectorShape); + assertEquals("Straight Connector 5", shapes1.get(1).getShapeName()); + assertTrue(shapes1.get(1) instanceof XSLFConnectorShape); - assertEquals("Freeform 6", shapes1[2].getShapeName()); - assertTrue(shapes1[2] instanceof XSLFFreeformShape); - XSLFAutoShape sh2 = (XSLFAutoShape)shapes1[2]; + assertEquals("Freeform 6", shapes1.get(2).getShapeName()); + assertTrue(shapes1.get(2) instanceof XSLFFreeformShape); + XSLFAutoShape sh2 = (XSLFAutoShape)shapes1.get(2); assertEquals("Cloud", sh2.getText()); - assertEquals("Picture 1", shapes1[3].getShapeName()); - assertTrue(shapes1[3] instanceof XSLFPictureShape); + assertEquals("Picture 1", shapes1.get(3).getShapeName()); + assertTrue(shapes1.get(3) instanceof XSLFPictureShape); - assertEquals("Table 2", shapes1[4].getShapeName()); - assertTrue(shapes1[4] instanceof XSLFGraphicFrame); + assertEquals("Table 2", shapes1.get(4).getShapeName()); + assertTrue(shapes1.get(4) instanceof XSLFGraphicFrame); - assertEquals("Straight Arrow Connector 7", shapes1[5].getShapeName()); - assertTrue(shapes1[5] instanceof XSLFConnectorShape); + assertEquals("Straight Arrow Connector 7", shapes1.get(5).getShapeName()); + assertTrue(shapes1.get(5) instanceof XSLFConnectorShape); - assertEquals("Elbow Connector 9", shapes1[6].getShapeName()); - assertTrue(shapes1[6] instanceof XSLFConnectorShape); + assertEquals("Elbow Connector 9", shapes1.get(6).getShapeName()); + assertTrue(shapes1.get(6) instanceof XSLFConnectorShape); // titles on slide2 - XSLFSlide slide2 = slides[1]; - XSLFShape[] shapes2 = slide2.getShapes(); - assertEquals(2, shapes2.length); - assertTrue(shapes2[0] instanceof XSLFAutoShape); - assertEquals("PPTX Title", ((XSLFAutoShape)shapes2[0]).getText()); - assertTrue(shapes2[1] instanceof XSLFAutoShape); - assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape)shapes2[1]).getText()); + XSLFSlide slide2 = slides.get(1); + List shapes2 = slide2.getShapes(); + assertEquals(2, shapes2.size()); + assertTrue(shapes2.get(0) instanceof XSLFAutoShape); + assertEquals("PPTX Title", ((XSLFAutoShape)shapes2.get(0)).getText()); + assertTrue(shapes2.get(1) instanceof XSLFAutoShape); + assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape)shapes2.get(1)).getText()); // group shape on slide3 - XSLFSlide slide3 = slides[2]; - XSLFShape[] shapes3 = slide3.getShapes(); - assertEquals(1, shapes3.length); - assertTrue(shapes3[0] instanceof XSLFGroupShape); - XSLFShape[] groupShapes = ((XSLFGroupShape)shapes3[0]).getShapes(); - assertEquals(3, groupShapes.length); - assertTrue(groupShapes[0] instanceof XSLFAutoShape); - assertEquals("Rectangle 1", groupShapes[0].getShapeName()); + XSLFSlide slide3 = slides.get(2); + List shapes3 = slide3.getShapes(); + assertEquals(1, shapes3.size()); + assertTrue(shapes3.get(0) instanceof XSLFGroupShape); + List groupShapes = ((XSLFGroupShape)shapes3.get(0)).getShapes(); + assertEquals(3, groupShapes.size()); + assertTrue(groupShapes.get(0) instanceof XSLFAutoShape); + assertEquals("Rectangle 1", groupShapes.get(0).getShapeName()); - assertTrue(groupShapes[1] instanceof XSLFAutoShape); - assertEquals("Oval 2", groupShapes[1].getShapeName()); + assertTrue(groupShapes.get(1) instanceof XSLFAutoShape); + assertEquals("Oval 2", groupShapes.get(1).getShapeName()); - assertTrue(groupShapes[2] instanceof XSLFAutoShape); - assertEquals("Right Arrow 3", groupShapes[2].getShapeName()); + assertTrue(groupShapes.get(2) instanceof XSLFAutoShape); + assertEquals("Right Arrow 3", groupShapes.get(2).getShapeName()); - XSLFSlide slide4 = slides[3]; - XSLFShape[] shapes4 = slide4.getShapes(); - assertEquals(1, shapes4.length); - assertTrue(shapes4[0] instanceof XSLFTable); - XSLFTable tbl = (XSLFTable)shapes4[0]; + XSLFSlide slide4 = slides.get(3); + List shapes4 = slide4.getShapes(); + assertEquals(1, shapes4.size()); + assertTrue(shapes4.get(0) instanceof XSLFTable); + XSLFTable tbl = (XSLFTable)shapes4.get(0); assertEquals(3, tbl.getNumberOfColumns()); assertEquals(6, tbl.getNumberOfRows()); } + @Test public void testCreateSlide(){ XMLSlideShow ppt = new XMLSlideShow(); - assertEquals(0, ppt.getSlides().length); + assertEquals(0, ppt.getSlides().size()); XSLFSlide slide = ppt.createSlide(); assertTrue(slide.getFollowMasterGraphics()); @@ -107,34 +110,35 @@ public class TestXSLFSlide extends TestCase { assertTrue(slide.getFollowMasterGraphics()); } + @Test public void testImportContent(){ XMLSlideShow ppt = new XMLSlideShow(); XMLSlideShow src = XSLFTestDataSamples.openSampleDocument("themes.pptx"); // create a blank slide and import content from the 4th slide of themes.pptx - XSLFSlide slide1 = ppt.createSlide().importContent(src.getSlides()[3]); - XSLFShape[] shapes1 = slide1.getShapes(); - assertEquals(2, shapes1.length); + XSLFSlide slide1 = ppt.createSlide().importContent(src.getSlides().get(3)); + List shapes1 = slide1.getShapes(); + assertEquals(2, shapes1.size()); - XSLFTextShape sh1 = (XSLFTextShape)shapes1[0]; + XSLFTextShape sh1 = (XSLFTextShape)shapes1.get(0); assertEquals("Austin Theme", sh1.getText()); XSLFTextRun r1 = sh1.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals("Century Gothic", r1.getFontFamily()); - assertEquals(40.0, r1.getFontSize()); + assertEquals(40.0, r1.getFontSize(), 0); assertTrue(r1.isBold()); assertTrue(r1.isItalic()); assertEquals(new Color(148, 198, 0), r1.getFontColor()); assertNull(sh1.getFillColor()); assertNull(sh1.getLineColor()); - XSLFTextShape sh2 = (XSLFTextShape)shapes1[1]; + XSLFTextShape sh2 = (XSLFTextShape)shapes1.get(1); assertEquals( "Text in a autoshape is white\n" + "Fill: RGB(148, 198,0)", sh2.getText()); XSLFTextRun r2 = sh2.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals("Century Gothic", r2.getFontFamily()); - assertEquals(18.0, r2.getFontSize()); + assertEquals(18.0, r2.getFontSize(), 0); assertFalse(r2.isBold()); assertFalse(r2.isItalic()); assertEquals(Color.white, r2.getFontColor()); @@ -142,11 +146,11 @@ public class TestXSLFSlide extends TestCase { assertEquals(new Color(74, 99, 0), sh2.getLineColor()); // slightly different from PowerPoint! // the 5th slide has a picture and a texture fill - XSLFSlide slide2 = ppt.createSlide().importContent(src.getSlides()[4]); - XSLFShape[] shapes2 = slide2.getShapes(); - assertEquals(2, shapes2.length); + XSLFSlide slide2 = ppt.createSlide().importContent(src.getSlides().get(4)); + List shapes2 = slide2.getShapes(); + assertEquals(2, shapes2.size()); - XSLFTextShape sh3 = (XSLFTextShape)shapes2[0]; + XSLFTextShape sh3 = (XSLFTextShape)shapes2.get(0); assertEquals("This slide overrides master background with a texture fill", sh3.getText()); XSLFTextRun r3 = sh3.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals("Century Gothic", r3.getFontFamily()); @@ -157,11 +161,12 @@ public class TestXSLFSlide extends TestCase { assertNull(sh3.getFillColor()); assertNull(sh3.getLineColor()); - XSLFPictureShape sh4 = (XSLFPictureShape)shapes2[1]; - XSLFPictureShape srcPic = (XSLFPictureShape)src.getSlides()[4].getShapes()[1]; + XSLFPictureShape sh4 = (XSLFPictureShape)shapes2.get(1); + XSLFPictureShape srcPic = (XSLFPictureShape)src.getSlides().get(4).getShapes().get(1); assertArrayEquals(sh4.getPictureData().getData(), srcPic.getPictureData().getData()); } + @Test public void testMergeSlides(){ XMLSlideShow ppt = new XMLSlideShow(); String[] pptx = {"shapes.pptx", "themes.pptx", "layouts.pptx", "backgrounds.pptx"}; @@ -173,6 +178,6 @@ public class TestXSLFSlide extends TestCase { ppt.createSlide().importContent(srcSlide); } } - assertEquals(30, ppt.getSlides().length); + assertEquals(30, ppt.getSlides().size()); } } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java index c3057d590f..3d20be87ea 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java @@ -16,63 +16,68 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; -import org.apache.poi.POIXMLDocumentPart; -import org.apache.poi.xslf.XSLFTestDataSamples; +import static org.junit.Assert.*; import java.awt.Dimension; import java.util.List; +import org.apache.poi.POIXMLDocumentPart; +import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; + /** * @author Yegor Kozlov */ -public class TestXSLFSlideShow extends TestCase { +public class TestXSLFSlideShow { + @Test public void testCreateSlide(){ XMLSlideShow ppt = new XMLSlideShow(); - assertEquals(0, ppt.getSlides().length); + assertEquals(0, ppt.getSlides().size()); XSLFSlide slide1 = ppt.createSlide(); - assertEquals(1, ppt.getSlides().length); - assertSame(slide1, ppt.getSlides()[0]); + assertEquals(1, ppt.getSlides().size()); + assertSame(slide1, ppt.getSlides().get(0)); List rels = slide1.getRelations(); assertEquals(1, rels.size()); assertEquals(slide1.getSlideMaster().getLayout(SlideLayout.BLANK), rels.get(0)); XSLFSlide slide2 = ppt.createSlide(); - assertEquals(2, ppt.getSlides().length); - assertSame(slide2, ppt.getSlides()[1]); + assertEquals(2, ppt.getSlides().size()); + assertSame(slide2, ppt.getSlides().get(1)); ppt.setSlideOrder(slide2, 0); - assertSame(slide2, ppt.getSlides()[0]); - assertSame(slide1, ppt.getSlides()[1]); + assertSame(slide2, ppt.getSlides().get(0)); + assertSame(slide1, ppt.getSlides().get(1)); ppt = XSLFTestDataSamples.writeOutAndReadBack(ppt); - assertEquals(2, ppt.getSlides().length); - rels = ppt.getSlides()[0].getRelations(); + assertEquals(2, ppt.getSlides().size()); + rels = ppt.getSlides().get(0).getRelations(); } + @Test public void testRemoveSlide(){ XMLSlideShow ppt = new XMLSlideShow(); - assertEquals(0, ppt.getSlides().length); + assertEquals(0, ppt.getSlides().size()); XSLFSlide slide1 = ppt.createSlide(); XSLFSlide slide2 = ppt.createSlide(); - assertEquals(2, ppt.getSlides().length); - assertSame(slide1, ppt.getSlides()[0]); - assertSame(slide2, ppt.getSlides()[1]); + assertEquals(2, ppt.getSlides().size()); + assertSame(slide1, ppt.getSlides().get(0)); + assertSame(slide2, ppt.getSlides().get(1)); XSLFSlide removedSlide = ppt.removeSlide(0); assertSame(slide1, removedSlide); - assertEquals(1, ppt.getSlides().length); - assertSame(slide2, ppt.getSlides()[0]); + assertEquals(1, ppt.getSlides().size()); + assertSame(slide2, ppt.getSlides().get(0)); ppt = XSLFTestDataSamples.writeOutAndReadBack(ppt); - assertEquals(1, ppt.getSlides().length); + assertEquals(1, ppt.getSlides().size()); } + @Test public void testDimension(){ XMLSlideShow ppt = new XMLSlideShow(); Dimension sz = ppt.getPageSize(); @@ -84,24 +89,26 @@ public class TestXSLFSlideShow extends TestCase { assertEquals(612, sz.height); } + @Test public void testSlideMasters(){ XMLSlideShow ppt = new XMLSlideShow(); - XSLFSlideMaster[] masters = ppt.getSlideMasters(); - assertEquals(1, masters.length); + List masters = ppt.getSlideMasters(); + assertEquals(1, masters.size()); XSLFSlide slide = ppt.createSlide(); - assertSame(masters[0], slide.getSlideMaster()); + assertSame(masters.get(0), slide.getSlideMaster()); } + @Test public void testSlideLayout(){ XMLSlideShow ppt = new XMLSlideShow(); - XSLFSlideMaster[] masters = ppt.getSlideMasters(); - assertEquals(1, masters.length); + List masters = ppt.getSlideMasters(); + assertEquals(1, masters.size()); XSLFSlide slide = ppt.createSlide(); XSLFSlideLayout layout = slide.getSlideLayout(); assertNotNull(layout); - assertSame(masters[0], layout.getSlideMaster()); + assertSame(masters.get(0), layout.getSlideMaster()); } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java index 80a52fd2cc..3b7c5cbcc2 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java @@ -16,10 +16,11 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; +import static org.junit.Assert.*; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell; import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; @@ -29,16 +30,16 @@ import java.util.List; /** * @author Yegor Kozlov */ -public class TestXSLFTable extends TestCase { - +public class TestXSLFTable { + @Test public void testRead(){ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); - XSLFSlide slide = ppt.getSlides()[3]; - XSLFShape[] shapes = slide.getShapes(); - assertEquals(1, shapes.length); - assertTrue(shapes[0] instanceof XSLFTable); - XSLFTable tbl = (XSLFTable)shapes[0]; + XSLFSlide slide = ppt.getSlides().get(3); + List shapes = slide.getShapes(); + assertEquals(1, shapes.size()); + assertTrue(shapes.get(0) instanceof XSLFTable); + XSLFTable tbl = (XSLFTable)shapes.get(0); assertEquals(3, tbl.getNumberOfColumns()); assertEquals(6, tbl.getNumberOfRows()); assertNotNull(tbl.getCTTable()); @@ -46,13 +47,13 @@ public class TestXSLFTable extends TestCase { List rows = tbl.getRows(); assertEquals(6, rows.size()); - assertEquals(90.0, tbl.getColumnWidth(0)); - assertEquals(240.0, tbl.getColumnWidth(1)); - assertEquals(150.0, tbl.getColumnWidth(2)); + assertEquals(90.0, tbl.getColumnWidth(0), 0); + assertEquals(240.0, tbl.getColumnWidth(1), 0); + assertEquals(150.0, tbl.getColumnWidth(2), 0); for(XSLFTableRow row : tbl){ // all rows have the same height - assertEquals(29.2, row.getHeight()); + assertEquals(29.2, row.getHeight(), 0); } XSLFTableRow row0 = rows.get(0); @@ -70,6 +71,7 @@ public class TestXSLFTable extends TestCase { assertEquals("C1", cells1.get(2).getText()); } + @Test public void testCreate() { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -92,9 +94,9 @@ public class TestXSLFTable extends TestCase { assertNotNull(row0.getXmlObject()); assertEquals(1, tbl.getNumberOfRows()); assertSame(row0, tbl.getRows().get(0)); - assertEquals(20.0, row0.getHeight()); + assertEquals(20.0, row0.getHeight(), 0); row0.setHeight(30.0); - assertEquals(30.0, row0.getHeight()); + assertEquals(30.0, row0.getHeight(), 0); assertEquals(0, row0.getCells().size()); XSLFTableCell cell0 = row0.addCell(); @@ -108,41 +110,41 @@ public class TestXSLFTable extends TestCase { assertSame(cell0, row0.getCells().get(0)); assertEquals(1, tbl.getNumberOfColumns()); - assertEquals(100.0, tbl.getColumnWidth(0)); + assertEquals(100.0, tbl.getColumnWidth(0), 0); cell0.addNewTextParagraph().addNewTextRun().setText("POI"); assertEquals("POI", cell0.getText()); XSLFTableCell cell1 = row0.addCell(); assertSame(cell1, row0.getCells().get(1)); assertEquals(2, tbl.getNumberOfColumns()); - assertEquals(100.0, tbl.getColumnWidth(1)); + assertEquals(100.0, tbl.getColumnWidth(1), 0); cell1.addNewTextParagraph().addNewTextRun().setText("Apache"); assertEquals("Apache", cell1.getText()); - assertEquals(1.0, cell1.getBorderBottom()); + assertEquals(1.0, cell1.getBorderBottom(), 0); cell1.setBorderBottom(2.0); - assertEquals(2.0, cell1.getBorderBottom()); + assertEquals(2.0, cell1.getBorderBottom(), 0); assertNull(cell1.getBorderBottomColor()); cell1.setBorderBottomColor(Color.yellow); assertEquals(Color.yellow, cell1.getBorderBottomColor()); - assertEquals(1.0, cell1.getBorderTop()); + assertEquals(1.0, cell1.getBorderTop(), 0); cell1.setBorderTop(2.0); - assertEquals(2.0, cell1.getBorderTop()); + assertEquals(2.0, cell1.getBorderTop(), 0); assertNull(cell1.getBorderTopColor()); cell1.setBorderTopColor(Color.yellow); assertEquals(Color.yellow, cell1.getBorderTopColor()); - assertEquals(1.0, cell1.getBorderLeft()); + assertEquals(1.0, cell1.getBorderLeft(), 0); cell1.setBorderLeft(2.0); - assertEquals(2.0, cell1.getBorderLeft()); + assertEquals(2.0, cell1.getBorderLeft(), 0); assertNull(cell1.getBorderLeftColor()); cell1.setBorderLeftColor(Color.yellow); assertEquals(Color.yellow, cell1.getBorderLeftColor()); - assertEquals(1.0, cell1.getBorderRight()); + assertEquals(1.0, cell1.getBorderRight(), 0); cell1.setBorderRight(2.0); - assertEquals(2.0, cell1.getBorderRight()); + assertEquals(2.0, cell1.getBorderRight(), 0); assertNull(cell1.getBorderRightColor()); cell1.setBorderRightColor(Color.yellow); assertEquals(Color.yellow, cell1.getBorderRightColor()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableStyles.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableStyles.java index 3ce6c3b6d2..49b5fd4944 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableStyles.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableStyles.java @@ -16,14 +16,18 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.CTTableStyle; /** * @author Yegor Kozlov */ -public class TestXSLFTableStyles extends TestCase { +public class TestXSLFTableStyles { + @Test public void testRead(){ XMLSlideShow ppt = new XMLSlideShow(); XSLFTableStyles tblStyles = ppt.getTableStyles(); @@ -32,6 +36,8 @@ public class TestXSLFTableStyles extends TestCase { assertEquals(0, tblStyles.getStyles().size()); } + @SuppressWarnings("unused") + @Test public void testStyle(){ CTTableStyle obj = CTTableStyle.Factory.newInstance(); XSLFTableStyle style = new XSLFTableStyle(obj); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java index 2176a1b2ea..40e07a6910 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java @@ -16,14 +16,18 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; /** * @author Yegor Kozlov */ -public class TestXSLFTextBox extends TestCase { +public class TestXSLFTextBox { + @Test public void testPlaceholder() { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -40,6 +44,7 @@ public class TestXSLFTextBox extends TestCase { /** * text box inherits default text proeprties from presentation.xml */ + @Test public void testDefaultTextStyle() { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -55,12 +60,12 @@ public class TestXSLFTextBox extends TestCase { XSLFTextRun r = shape.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(1800, pPr.getSz()); - assertEquals(18.0, r.getFontSize()); + assertEquals(18.0, r.getFontSize(), 0); assertEquals("Calibri", r.getFontFamily()); pPr.setSz(900); pPr.getLatin().setTypeface("Arial"); - assertEquals(9.0, r.getFontSize()); + assertEquals(9.0, r.getFontSize(), 0); assertEquals("Arial", r.getFontFamily()); // unset font size in presentation.xml. The value should be taken from master slide @@ -68,12 +73,12 @@ public class TestXSLFTextBox extends TestCase { ppt.getCTPresentation().getDefaultTextStyle().getLvl1PPr().getDefRPr().unsetSz(); pPr = slide.getSlideMaster().getXmlObject().getTxStyles().getOtherStyle().getLvl1PPr().getDefRPr(); assertEquals(1800, pPr.getSz()); - assertEquals(18.0, r.getFontSize()); + assertEquals(18.0, r.getFontSize(), 0); pPr.setSz(2000); - assertEquals(20.0, r.getFontSize()); + assertEquals(20.0, r.getFontSize(), 0); pPr.unsetSz(); // Should never be - assertEquals(-1.0, r.getFontSize()); + assertEquals(-1.0, r.getFontSize(), 0); } } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index fb906ed3a1..0998ee8e72 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -242,14 +242,14 @@ public class TestXSLFTextParagraph { @Test public void testThemeInheritance(){ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("prProps.pptx"); - XSLFShape[] shapes = ppt.getSlides()[0].getShapes(); - XSLFTextShape sh1 = (XSLFTextShape)shapes[0]; + List shapes = ppt.getSlides().get(0).getShapes(); + XSLFTextShape sh1 = (XSLFTextShape)shapes.get(0); assertEquals("Apache", sh1.getText()); assertEquals(TextAlign.CENTER, sh1.getTextParagraphs().get(0).getTextAlign()); - XSLFTextShape sh2 = (XSLFTextShape)shapes[1]; + XSLFTextShape sh2 = (XSLFTextShape)shapes.get(1); assertEquals("Software", sh2.getText()); assertEquals(TextAlign.CENTER, sh2.getTextParagraphs().get(0).getTextAlign()); - XSLFTextShape sh3 = (XSLFTextShape)shapes[2]; + XSLFTextShape sh3 = (XSLFTextShape)shapes.get(2); assertEquals("Foundation", sh3.getText()); assertEquals(TextAlign.CENTER, sh3.getTextParagraphs().get(0).getTextAlign()); } @@ -350,7 +350,7 @@ public class TestXSLFTextParagraph { XSLFTextRun r1 = p.addNewTextRun(); r1.setText("Hello,"); XSLFTextRun r2 = p.addLineBreak(); - assertEquals("\n", r2.getText()); + assertEquals("\n", r2.getRawText()); r2.setFontSize(10.0); assertEquals(10.0, r2.getFontSize(), 0); XSLFTextRun r3 = p.addNewTextRun(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java index f9232a1733..b19d069b0d 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java @@ -16,9 +16,10 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import java.awt.Color; +import static org.junit.Assert.*; -import junit.framework.TestCase; +import java.awt.Color; +import java.util.List; import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; import org.apache.poi.sl.usermodel.VerticalAlignment; @@ -30,28 +31,28 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; /** * @author Yegor Kozlov */ -public class TestXSLFTextShape extends TestCase { +public class TestXSLFTextShape { public void testLayouts(){ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("layouts.pptx"); - XSLFSlide[] slide = ppt.getSlides(); + List slide = ppt.getSlides(); - verifySlide1(slide[0]); - verifySlide2(slide[1]); - verifySlide3(slide[2]); - verifySlide4(slide[3]); - verifySlide7(slide[6]); - verifySlide8(slide[7]); - verifySlide10(slide[9]); + verifySlide1(slide.get(0)); + verifySlide2(slide.get(1)); + verifySlide3(slide.get(2)); + verifySlide4(slide.get(3)); + verifySlide7(slide.get(6)); + verifySlide8(slide.get(7)); + verifySlide10(slide.get(9)); } void verifySlide1(XSLFSlide slide){ XSLFSlideLayout layout = slide.getSlideLayout(); - XSLFShape[] shapes = slide.getShapes(); + List shapes = slide.getShapes(); assertEquals("Title Slide",layout.getName()); - XSLFTextShape shape1 = (XSLFTextShape)shapes[0]; + XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0); CTPlaceholder ph1 = shape1.getCTPlaceholder(); assertEquals(STPlaceholderType.CTR_TITLE, ph1.getType()); // anchor is not defined in the shape @@ -68,20 +69,20 @@ public class TestXSLFTextShape extends TestCase { !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() && !bodyPr1.isSetAnchor() ); - assertEquals(7.2, shape1.getLeftInset()); // 0.1" - assertEquals(7.2, shape1.getRightInset()); // 0.1" - assertEquals(3.6, shape1.getTopInset()); // 0.05" - assertEquals(3.6, shape1.getBottomInset()); // 0.05" + assertEquals(7.2, shape1.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape1.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape1.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.MIDDLE, shape1.getVerticalAlignment()); // now check text properties assertEquals("Centered Title", shape1.getText()); XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals("Calibri", r1.getFontFamily()); - assertEquals(44.0, r1.getFontSize()); + assertEquals(44.0, r1.getFontSize(), 0); assertEquals(Color.black, r1.getFontColor()); - XSLFTextShape shape2 = (XSLFTextShape)shapes[1]; + XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1); CTPlaceholder ph2 = shape2.getCTPlaceholder(); assertEquals(STPlaceholderType.SUB_TITLE, ph2.getType()); // anchor is not defined in the shape @@ -98,26 +99,26 @@ public class TestXSLFTextShape extends TestCase { !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() && !bodyPr2.isSetAnchor() ); - assertEquals(7.2, shape2.getLeftInset()); // 0.1" - assertEquals(7.2, shape2.getRightInset()); // 0.1" - assertEquals(3.6, shape2.getTopInset()); // 0.05" - assertEquals(3.6, shape2.getBottomInset()); // 0.05" + assertEquals(7.2, shape2.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape2.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape2.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment()); assertEquals("subtitle", shape2.getText()); XSLFTextRun r2 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals("Calibri", r2.getFontFamily()); - assertEquals(32.0, r2.getFontSize()); + assertEquals(32.0, r2.getFontSize(), 0); // TODO fix calculation of tint //assertEquals(new Color(137, 137, 137), r2.getFontColor()); } void verifySlide2(XSLFSlide slide){ XSLFSlideLayout layout = slide.getSlideLayout(); - XSLFShape[] shapes = slide.getShapes(); + List shapes = slide.getShapes(); assertEquals("Title and Content",layout.getName()); - XSLFTextShape shape1 = (XSLFTextShape)shapes[0]; + XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0); CTPlaceholder ph1 = shape1.getCTPlaceholder(); assertEquals(STPlaceholderType.TITLE, ph1.getType()); // anchor is not defined in the shape @@ -137,20 +138,20 @@ public class TestXSLFTextShape extends TestCase { !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() && !bodyPr1.isSetAnchor() ); - assertEquals(7.2, shape1.getLeftInset()); // 0.1" - assertEquals(7.2, shape1.getRightInset()); // 0.1" - assertEquals(3.6, shape1.getTopInset()); // 0.05" - assertEquals(3.6, shape1.getBottomInset()); // 0.05" + assertEquals(7.2, shape1.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape1.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape1.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.MIDDLE, shape1.getVerticalAlignment()); // now check text properties assertEquals("Title", shape1.getText()); XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals("Calibri", r1.getFontFamily()); - assertEquals(44.0, r1.getFontSize()); + assertEquals(44.0, r1.getFontSize(), 0); assertEquals(Color.black, r1.getFontColor()); - XSLFTextShape shape2 = (XSLFTextShape)shapes[1]; + XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1); CTPlaceholder ph2 = shape2.getCTPlaceholder(); assertFalse(ph2.isSetType()); // assertTrue(ph2.isSetIdx()); @@ -172,54 +173,54 @@ public class TestXSLFTextShape extends TestCase { !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() && !bodyPr2.isSetAnchor() ); - assertEquals(7.2, shape2.getLeftInset()); // 0.1" - assertEquals(7.2, shape2.getRightInset()); // 0.1" - assertEquals(3.6, shape2.getTopInset()); // 0.05" - assertEquals(3.6, shape2.getBottomInset()); // 0.05" + assertEquals(7.2, shape2.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape2.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape2.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment()); XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(0, pr1.getParentParagraph().getLevel()); - assertEquals("Content", pr1.getText()); + assertEquals("Content", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); - assertEquals(32.0, pr1.getFontSize()); - assertEquals(27.0, pr1.getParentParagraph().getLeftMargin()); + assertEquals(32.0, pr1.getFontSize(), 0); + assertEquals(27.0, pr1.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2022", pr1.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr1.getParentParagraph().getBulletFont()); XSLFTextRun pr2 = shape2.getTextParagraphs().get(1).getTextRuns().get(0); assertEquals(1, pr2.getParentParagraph().getLevel()); - assertEquals("Level 2", pr2.getText()); + assertEquals("Level 2", pr2.getRawText()); assertEquals("Calibri", pr2.getFontFamily()); - assertEquals(28.0, pr2.getFontSize()); - assertEquals(58.5, pr2.getParentParagraph().getLeftMargin()); + assertEquals(28.0, pr2.getFontSize(), 0); + assertEquals(58.5, pr2.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2013", pr2.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr2.getParentParagraph().getBulletFont()); XSLFTextRun pr3 = shape2.getTextParagraphs().get(2).getTextRuns().get(0); assertEquals(2, pr3.getParentParagraph().getLevel()); - assertEquals("Level 3", pr3.getText()); + assertEquals("Level 3", pr3.getRawText()); assertEquals("Calibri", pr3.getFontFamily()); - assertEquals(24.0, pr3.getFontSize()); - assertEquals(90.0, pr3.getParentParagraph().getLeftMargin()); + assertEquals(24.0, pr3.getFontSize(), 0); + assertEquals(90.0, pr3.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2022", pr3.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr3.getParentParagraph().getBulletFont()); XSLFTextRun pr4 = shape2.getTextParagraphs().get(3).getTextRuns().get(0); assertEquals(3, pr4.getParentParagraph().getLevel()); - assertEquals("Level 4", pr4.getText()); + assertEquals("Level 4", pr4.getRawText()); assertEquals("Calibri", pr4.getFontFamily()); - assertEquals(20.0, pr4.getFontSize()); - assertEquals(126.0, pr4.getParentParagraph().getLeftMargin()); + assertEquals(20.0, pr4.getFontSize(), 0); + assertEquals(126.0, pr4.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2013", pr4.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr4.getParentParagraph().getBulletFont()); XSLFTextRun pr5 = shape2.getTextParagraphs().get(4).getTextRuns().get(0); assertEquals(4, pr5.getParentParagraph().getLevel()); - assertEquals("Level 5", pr5.getText()); + assertEquals("Level 5", pr5.getRawText()); assertEquals("Calibri", pr5.getFontFamily()); - assertEquals(20.0, pr5.getFontSize()); - assertEquals(162.0, pr5.getParentParagraph().getLeftMargin()); + assertEquals(20.0, pr5.getFontSize(), 0); + assertEquals(162.0, pr5.getParentParagraph().getLeftMargin(), 0); assertEquals("\u00bb", pr5.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr5.getParentParagraph().getBulletFont()); @@ -227,10 +228,10 @@ public class TestXSLFTextShape extends TestCase { void verifySlide3(XSLFSlide slide){ XSLFSlideLayout layout = slide.getSlideLayout(); - XSLFShape[] shapes = slide.getShapes(); + List shapes = slide.getShapes(); assertEquals("Section Header",layout.getName()); - XSLFTextShape shape1 = (XSLFTextShape)shapes[0]; + XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0); CTPlaceholder ph1 = shape1.getCTPlaceholder(); assertEquals(STPlaceholderType.TITLE, ph1.getType()); // anchor is not defined in the shape @@ -247,10 +248,10 @@ public class TestXSLFTextShape extends TestCase { !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() && !bodyPr1.isSetAnchor() ); - assertEquals(7.2, shape1.getLeftInset()); // 0.1" - assertEquals(7.2, shape1.getRightInset()); // 0.1" - assertEquals(3.6, shape1.getTopInset()); // 0.05" - assertEquals(3.6, shape1.getBottomInset()); // 0.05" + assertEquals(7.2, shape1.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape1.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape1.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.TOP, shape1.getVerticalAlignment()); // now check text properties @@ -258,13 +259,13 @@ public class TestXSLFTextShape extends TestCase { XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(TextAlign.LEFT, r1.getParentParagraph().getTextAlign()); assertEquals("Calibri", r1.getFontFamily()); - assertEquals(40.0, r1.getFontSize()); + assertEquals(40.0, r1.getFontSize(), 0); assertEquals(Color.black, r1.getFontColor()); assertTrue(r1.isBold()); assertFalse(r1.isItalic()); - assertFalse(r1.isUnderline()); + assertFalse(r1.isUnderlined()); - XSLFTextShape shape2 = (XSLFTextShape)shapes[1]; + XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1); CTPlaceholder ph2 = shape2.getCTPlaceholder(); assertEquals(STPlaceholderType.BODY, ph2.getType()); // anchor is not defined in the shape @@ -281,27 +282,27 @@ public class TestXSLFTextShape extends TestCase { !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() && !bodyPr2.isSetAnchor() ); - assertEquals(7.2, shape2.getLeftInset()); // 0.1" - assertEquals(7.2, shape2.getRightInset()); // 0.1" - assertEquals(3.6, shape2.getTopInset()); // 0.05" - assertEquals(3.6, shape2.getBottomInset()); // 0.05" + assertEquals(7.2, shape2.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape2.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape2.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.BOTTOM, shape2.getVerticalAlignment()); assertEquals("Section Header", shape2.getText()); XSLFTextRun r2 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(TextAlign.LEFT, r2.getParentParagraph().getTextAlign()); assertEquals("Calibri", r2.getFontFamily()); - assertEquals(20.0, r2.getFontSize()); + assertEquals(20.0, r2.getFontSize(), 0); // TODO fix calculation of tint //assertEquals(new Color(137, 137, 137), r2.getFontColor()); } void verifySlide4(XSLFSlide slide){ XSLFSlideLayout layout = slide.getSlideLayout(); - XSLFShape[] shapes = slide.getShapes(); + List shapes = slide.getShapes(); assertEquals("Two Content",layout.getName()); - XSLFTextShape shape1 = (XSLFTextShape)shapes[0]; + XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0); CTPlaceholder ph1 = shape1.getCTPlaceholder(); assertEquals(STPlaceholderType.TITLE, ph1.getType()); // anchor is not defined in the shape @@ -321,10 +322,10 @@ public class TestXSLFTextShape extends TestCase { !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() && !bodyPr1.isSetAnchor() ); - assertEquals(7.2, shape1.getLeftInset()); // 0.1" - assertEquals(7.2, shape1.getRightInset()); // 0.1" - assertEquals(3.6, shape1.getTopInset()); // 0.05" - assertEquals(3.6, shape1.getBottomInset()); // 0.05" + assertEquals(7.2, shape1.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape1.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape1.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.MIDDLE, shape1.getVerticalAlignment()); // now check text properties @@ -332,10 +333,10 @@ public class TestXSLFTextShape extends TestCase { XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(TextAlign.CENTER, r1.getParentParagraph().getTextAlign()); assertEquals("Calibri", r1.getFontFamily()); - assertEquals(44.0, r1.getFontSize()); + assertEquals(44.0, r1.getFontSize(), 0); assertEquals(Color.black, r1.getFontColor()); - XSLFTextShape shape2 = (XSLFTextShape)shapes[1]; + XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1); CTPlaceholder ph2 = shape2.getCTPlaceholder(); assertFalse(ph2.isSetType()); assertTrue(ph2.isSetIdx()); @@ -354,18 +355,18 @@ public class TestXSLFTextShape extends TestCase { !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() && !bodyPr2.isSetAnchor() ); - assertEquals(7.2, shape2.getLeftInset()); // 0.1" - assertEquals(7.2, shape2.getRightInset()); // 0.1" - assertEquals(3.6, shape2.getTopInset()); // 0.05" - assertEquals(3.6, shape2.getBottomInset()); // 0.05" + assertEquals(7.2, shape2.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape2.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape2.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment()); XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(0, pr1.getParentParagraph().getLevel()); - assertEquals("Left", pr1.getText()); + assertEquals("Left", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); - assertEquals(28.0, pr1.getFontSize()); - assertEquals(27.0, pr1.getParentParagraph().getLeftMargin()); + assertEquals(28.0, pr1.getFontSize(), 0); + assertEquals(27.0, pr1.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2022", pr1.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr1.getParentParagraph().getBulletFont()); @@ -373,8 +374,8 @@ public class TestXSLFTextShape extends TestCase { assertEquals(1, pr2.getParentParagraph().getLevel()); assertEquals("Level 2", pr2.getParentParagraph().getText()); assertEquals("Calibri", pr2.getFontFamily()); - assertEquals(24.0, pr2.getFontSize()); - assertEquals(58.5, pr2.getParentParagraph().getLeftMargin()); + assertEquals(24.0, pr2.getFontSize(), 0); + assertEquals(58.5, pr2.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2013", pr2.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr2.getParentParagraph().getBulletFont()); @@ -382,8 +383,8 @@ public class TestXSLFTextShape extends TestCase { assertEquals(2, pr3.getParentParagraph().getLevel()); assertEquals("Level 3", pr3.getParentParagraph().getText()); assertEquals("Calibri", pr3.getFontFamily()); - assertEquals(20.0, pr3.getFontSize()); - assertEquals(90.0, pr3.getParentParagraph().getLeftMargin()); + assertEquals(20.0, pr3.getFontSize(), 0); + assertEquals(90.0, pr3.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2022", pr3.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr3.getParentParagraph().getBulletFont()); @@ -391,31 +392,32 @@ public class TestXSLFTextShape extends TestCase { assertEquals(3, pr4.getParentParagraph().getLevel()); assertEquals("Level 4", pr4.getParentParagraph().getText()); assertEquals("Calibri", pr4.getFontFamily()); - assertEquals(18.0, pr4.getFontSize()); - assertEquals(126.0, pr4.getParentParagraph().getLeftMargin()); + assertEquals(18.0, pr4.getFontSize(), 0); + assertEquals(126.0, pr4.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2013", pr4.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr4.getParentParagraph().getBulletFont()); - XSLFTextShape shape3 = (XSLFTextShape)shapes[2]; + XSLFTextShape shape3 = (XSLFTextShape)shapes.get(2); XSLFTextRun pr5 = shape3.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(0, pr5.getParentParagraph().getLevel()); - assertEquals("Right", pr5.getText()); + assertEquals("Right", pr5.getRawText()); assertEquals("Calibri", pr5.getFontFamily()); assertEquals(Color.black, pr5.getFontColor()); } + @SuppressWarnings("unused") void verifySlide5(XSLFSlide slide){ XSLFSlideLayout layout = slide.getSlideLayout(); - XSLFShape[] shapes = slide.getShapes(); + List shapes = slide.getShapes(); // TODO } void verifySlide7(XSLFSlide slide){ XSLFSlideLayout layout = slide.getSlideLayout(); - XSLFShape[] shapes = slide.getShapes(); + List shapes = slide.getShapes(); assertEquals("Blank",layout.getName()); - XSLFTextShape shape1 = (XSLFTextShape)shapes[0]; + XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0); CTPlaceholder ph1 = shape1.getCTPlaceholder(); assertEquals(STPlaceholderType.TITLE, ph1.getType()); // anchor is not defined in the shape @@ -428,10 +430,10 @@ public class TestXSLFTextShape extends TestCase { !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() && !bodyPr1.isSetAnchor() ); - assertEquals(7.2, shape1.getLeftInset()); // 0.1" - assertEquals(7.2, shape1.getRightInset()); // 0.1" - assertEquals(3.6, shape1.getTopInset()); // 0.05" - assertEquals(3.6, shape1.getBottomInset()); // 0.05" + assertEquals(7.2, shape1.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape1.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape1.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.MIDDLE, shape1.getVerticalAlignment()); // now check text properties @@ -439,11 +441,11 @@ public class TestXSLFTextShape extends TestCase { XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(TextAlign.CENTER, r1.getParentParagraph().getTextAlign()); assertEquals("Calibri", r1.getFontFamily()); - assertEquals(44.0, r1.getFontSize()); + assertEquals(44.0, r1.getFontSize(), 0); assertEquals(Color.black, r1.getFontColor()); assertFalse(r1.isBold()); - XSLFTextShape shape2 = (XSLFTextShape)shapes[1]; + XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1); CTTextBodyProperties bodyPr2 = shape2.getTextBodyPr(); // none of the following properties are set in the shapes and fetched from the master shape @@ -452,19 +454,19 @@ public class TestXSLFTextShape extends TestCase { !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() && !bodyPr2.isSetAnchor() ); - assertEquals(7.2, shape2.getLeftInset()); // 0.1" - assertEquals(7.2, shape2.getRightInset()); // 0.1" - assertEquals(3.6, shape2.getTopInset()); // 0.05" - assertEquals(3.6, shape2.getBottomInset()); // 0.05" + assertEquals(7.2, shape2.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape2.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape2.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment()); XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(0, pr1.getParentParagraph().getLevel()); - assertEquals("Default Text", pr1.getText()); + assertEquals("Default Text", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); - assertEquals(18.0, pr1.getFontSize()); + assertEquals(18.0, pr1.getFontSize(), 0); - XSLFTextShape shape3 = (XSLFTextShape)shapes[2]; + XSLFTextShape shape3 = (XSLFTextShape)shapes.get(2); assertEquals("Default", shape3.getTextParagraphs().get(0).getText()); assertEquals("Text with levels", shape3.getTextParagraphs().get(1).getText()); assertEquals("Level 1", shape3.getTextParagraphs().get(2).getText()); @@ -474,16 +476,16 @@ public class TestXSLFTextShape extends TestCase { for(int p = 0; p < 5; p++) { XSLFTextParagraph pr = shape3.getTextParagraphs().get(p); assertEquals("Calibri", pr.getTextRuns().get(0).getFontFamily()); - assertEquals(18.0, pr.getTextRuns().get(0).getFontSize()); + assertEquals(18.0, pr.getTextRuns().get(0).getFontSize(), 0); } } void verifySlide8(XSLFSlide slide){ XSLFSlideLayout layout = slide.getSlideLayout(); - XSLFShape[] shapes = slide.getShapes(); + List shapes = slide.getShapes(); assertEquals("Content with Caption",layout.getName()); - XSLFTextShape shape1 = (XSLFTextShape)shapes[0]; + XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0); CTPlaceholder ph1 = shape1.getCTPlaceholder(); assertEquals(STPlaceholderType.TITLE, ph1.getType()); // anchor is not defined in the shape @@ -501,10 +503,10 @@ public class TestXSLFTextShape extends TestCase { !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() && !bodyPr1.isSetAnchor() ); - assertEquals(7.2, shape1.getLeftInset()); // 0.1" - assertEquals(7.2, shape1.getRightInset()); // 0.1" - assertEquals(3.6, shape1.getTopInset()); // 0.05" - assertEquals(3.6, shape1.getBottomInset()); // 0.05" + assertEquals(7.2, shape1.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape1.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape1.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.BOTTOM, shape1.getVerticalAlignment()); // now check text properties @@ -512,11 +514,11 @@ public class TestXSLFTextShape extends TestCase { XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(TextAlign.LEFT, r1.getParentParagraph().getTextAlign()); assertEquals("Calibri", r1.getFontFamily()); - assertEquals(20.0, r1.getFontSize()); + assertEquals(20.0, r1.getFontSize(), 0); assertEquals(Color.black, r1.getFontColor()); assertTrue(r1.isBold()); - XSLFTextShape shape2 = (XSLFTextShape)shapes[1]; + XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1); CTPlaceholder ph2 = shape2.getCTPlaceholder(); assertFalse(ph2.isSetType()); assertTrue(ph2.isSetIdx()); @@ -535,18 +537,18 @@ public class TestXSLFTextShape extends TestCase { !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() && !bodyPr2.isSetAnchor() ); - assertEquals(7.2, shape2.getLeftInset()); // 0.1" - assertEquals(7.2, shape2.getRightInset()); // 0.1" - assertEquals(3.6, shape2.getTopInset()); // 0.05" - assertEquals(3.6, shape2.getBottomInset()); // 0.05" + assertEquals(7.2, shape2.getLeftInset(), 0); // 0.1" + assertEquals(7.2, shape2.getRightInset(), 0); // 0.1" + assertEquals(3.6, shape2.getTopInset(), 0); // 0.05" + assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05" assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment()); XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(0, pr1.getParentParagraph().getLevel()); - assertEquals("Level 1", pr1.getText()); + assertEquals("Level 1", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); - assertEquals(32.0, pr1.getFontSize()); - assertEquals(27.0, pr1.getParentParagraph().getLeftMargin()); + assertEquals(32.0, pr1.getFontSize(), 0); + assertEquals(27.0, pr1.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2022", pr1.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr1.getParentParagraph().getBulletFont()); @@ -554,8 +556,8 @@ public class TestXSLFTextShape extends TestCase { assertEquals(1, pr2.getParentParagraph().getLevel()); assertEquals("Level 2", pr2.getParentParagraph().getText()); assertEquals("Calibri", pr2.getFontFamily()); - assertEquals(28.0, pr2.getFontSize()); - assertEquals(58.5, pr2.getParentParagraph().getLeftMargin()); + assertEquals(28.0, pr2.getFontSize(), 0); + assertEquals(58.5, pr2.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2013", pr2.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr2.getParentParagraph().getBulletFont()); @@ -563,8 +565,8 @@ public class TestXSLFTextShape extends TestCase { assertEquals(2, pr3.getParentParagraph().getLevel()); assertEquals("Level 3", pr3.getParentParagraph().getText()); assertEquals("Calibri", pr3.getFontFamily()); - assertEquals(24.0, pr3.getFontSize()); - assertEquals(90.0, pr3.getParentParagraph().getLeftMargin()); + assertEquals(24.0, pr3.getFontSize(), 0); + assertEquals(90.0, pr3.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2022", pr3.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr3.getParentParagraph().getBulletFont()); @@ -572,20 +574,20 @@ public class TestXSLFTextShape extends TestCase { assertEquals(3, pr4.getParentParagraph().getLevel()); assertEquals("Level 4", pr4.getParentParagraph().getText()); assertEquals("Calibri", pr4.getFontFamily()); - assertEquals(20.0, pr4.getFontSize()); - assertEquals(126.0, pr4.getParentParagraph().getLeftMargin()); + assertEquals(20.0, pr4.getFontSize(), 0); + assertEquals(126.0, pr4.getParentParagraph().getLeftMargin(), 0); assertEquals("\u2013", pr4.getParentParagraph().getBulletCharacter()); assertEquals("Arial", pr4.getParentParagraph().getBulletFont()); - XSLFTextShape shape3 = (XSLFTextShape)shapes[2]; + XSLFTextShape shape3 = (XSLFTextShape)shapes.get(2); assertEquals(VerticalAlignment.TOP, shape3.getVerticalAlignment()); assertEquals("Content with caption", shape3.getText()); pr1 = shape3.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(0, pr1.getParentParagraph().getLevel()); - assertEquals("Content with caption", pr1.getText()); + assertEquals("Content with caption", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); - assertEquals(14.0, pr1.getFontSize()); + assertEquals(14.0, pr1.getFontSize(), 0); } @@ -599,7 +601,7 @@ public class TestXSLFTextShape extends TestCase { XSLFTextRun r1 = footer.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(TextAlign.CENTER, r1.getParentParagraph().getTextAlign()); assertEquals("Calibri", r1.getFontFamily()); - assertEquals(12.0, r1.getFontSize()); + assertEquals(12.0, r1.getFontSize(), 0); // TODO calculation of tint is incorrect assertEquals(new Color(64,64,64), r1.getFontColor()); @@ -614,14 +616,14 @@ public class TestXSLFTextShape extends TestCase { public void testTitleStyles(){ XMLSlideShow ppt = new XMLSlideShow(); - XSLFSlideMaster master = ppt.getSlideMasters()[0]; + XSLFSlideMaster master = ppt.getSlideMasters().get(0); XSLFTheme theme = master.getTheme(); XSLFSlideLayout layout = master.getLayout(SlideLayout.TITLE); XSLFSlide slide = ppt.createSlide(layout) ; assertSame(layout, slide.getSlideLayout()); assertSame(master, slide.getSlideMaster()); - XSLFTextShape titleShape = (XSLFTextShape)slide.getPlaceholder(0); + XSLFTextShape titleShape = slide.getPlaceholder(0); titleShape.setText("Apache POI"); XSLFTextParagraph paragraph = titleShape.getTextParagraphs().get(0); XSLFTextRun textRun = paragraph.getTextRuns().get(0); @@ -631,12 +633,12 @@ public class TestXSLFTextShape extends TestCase { CTTextParagraphProperties lv1PPr = master.getXmlObject().getTxStyles().getTitleStyle().getLvl1PPr(); CTTextCharacterProperties lv1CPr = lv1PPr.getDefRPr(); assertEquals(4400, lv1CPr.getSz()); - assertEquals(44.0, textRun.getFontSize()); + assertEquals(44.0, textRun.getFontSize(), 0); assertEquals("+mj-lt", lv1CPr.getLatin().getTypeface()); assertEquals("Calibri", theme.getMajorFont()); assertEquals("Calibri", textRun.getFontFamily()); lv1CPr.setSz(3200); - assertEquals(32.0, textRun.getFontSize()); + assertEquals(32.0, textRun.getFontSize(), 0); lv1CPr.getLatin().setTypeface("Arial"); assertEquals("Arial", textRun.getFontFamily()); assertEquals(STTextAlignType.CTR, lv1PPr.getAlgn()); @@ -650,7 +652,7 @@ public class TestXSLFTextShape extends TestCase { CTTextParagraphProperties lv2PPr = tx2.getTextBody(true).getLstStyle().addNewLvl1PPr(); CTTextCharacterProperties lv2CPr = lv2PPr.addNewDefRPr(); lv2CPr.setSz(3300); - assertEquals(33.0, textRun.getFontSize()); + assertEquals(33.0, textRun.getFontSize(), 0); lv2CPr.addNewLatin().setTypeface("Times"); assertEquals("Times", textRun.getFontFamily()); lv2PPr.setAlgn(STTextAlignType.R); @@ -663,7 +665,7 @@ public class TestXSLFTextShape extends TestCase { CTTextParagraphProperties lv3PPr = tx3.getTextBody(true).getLstStyle().addNewLvl1PPr(); CTTextCharacterProperties lv3CPr = lv3PPr.addNewDefRPr(); lv3CPr.setSz(3400); - assertEquals(34.0, textRun.getFontSize()); + assertEquals(34.0, textRun.getFontSize(), 0); lv3CPr.addNewLatin().setTypeface("Courier New"); assertEquals("Courier New", textRun.getFontFamily()); lv3PPr.setAlgn(STTextAlignType.CTR); @@ -674,7 +676,7 @@ public class TestXSLFTextShape extends TestCase { CTTextParagraphProperties lv4PPr = titleShape.getTextBody(true).getLstStyle().addNewLvl1PPr(); CTTextCharacterProperties lv4CPr = lv4PPr.addNewDefRPr(); lv4CPr.setSz(3500); - assertEquals(35.0, textRun.getFontSize()); + assertEquals(35.0, textRun.getFontSize(), 0); lv4CPr.addNewLatin().setTypeface("Arial"); assertEquals("Arial", textRun.getFontFamily()); lv4PPr.setAlgn(STTextAlignType.L); @@ -684,7 +686,7 @@ public class TestXSLFTextShape extends TestCase { CTTextParagraphProperties lv5PPr = paragraph.getXmlObject().addNewPPr(); CTTextCharacterProperties lv5CPr = textRun.getXmlObject().getRPr(); lv5CPr.setSz(3600); - assertEquals(36.0, textRun.getFontSize()); + assertEquals(36.0, textRun.getFontSize(), 0); lv5CPr.addNewLatin().setTypeface("Calibri"); assertEquals("Calibri", textRun.getFontFamily()); lv5PPr.setAlgn(STTextAlignType.CTR); @@ -694,14 +696,14 @@ public class TestXSLFTextShape extends TestCase { public void testBodyStyles(){ XMLSlideShow ppt = new XMLSlideShow(); - XSLFSlideMaster master = ppt.getSlideMasters()[0]; + XSLFSlideMaster master = ppt.getSlideMasters().get(0); XSLFTheme theme = master.getTheme(); XSLFSlideLayout layout = master.getLayout(SlideLayout.TITLE_AND_CONTENT); XSLFSlide slide = ppt.createSlide(layout) ; assertSame(layout, slide.getSlideLayout()); assertSame(master, slide.getSlideMaster()); - XSLFTextShape tx1 = (XSLFTextShape)slide.getPlaceholder(1); + XSLFTextShape tx1 = slide.getPlaceholder(1); tx1.clearText(); XSLFTextParagraph p1 = tx1.addNewTextParagraph(); @@ -731,12 +733,12 @@ public class TestXSLFTextShape extends TestCase { CTTextCharacterProperties lv3CPr = lv3PPr.getDefRPr(); // lv1 assertEquals(3200, lv1CPr.getSz()); - assertEquals(32.0, r1.getFontSize()); + assertEquals(32.0, r1.getFontSize(), 0); assertEquals("+mn-lt", lv1CPr.getLatin().getTypeface()); assertEquals("Calibri", theme.getMinorFont()); assertEquals("Calibri", r1.getFontFamily()); lv1CPr.setSz(3300); - assertEquals(33.0, r1.getFontSize()); + assertEquals(33.0, r1.getFontSize(), 0); lv1CPr.getLatin().setTypeface("Arial"); assertEquals("Arial", r1.getFontFamily()); assertEquals(STTextAlignType.L, lv1PPr.getAlgn()); @@ -745,9 +747,9 @@ public class TestXSLFTextShape extends TestCase { assertEquals(TextAlign.RIGHT, p1.getTextAlign()); //lv2 assertEquals(2800, lv2CPr.getSz()); - assertEquals(28.0, r2.getFontSize()); + assertEquals(28.0, r2.getFontSize(), 0); lv2CPr.setSz(3300); - assertEquals(33.0, r2.getFontSize()); + assertEquals(33.0, r2.getFontSize(), 0); lv2CPr.getLatin().setTypeface("Times"); assertEquals("Times", r2.getFontFamily()); assertEquals(STTextAlignType.L, lv2PPr.getAlgn()); @@ -756,9 +758,9 @@ public class TestXSLFTextShape extends TestCase { assertEquals(TextAlign.RIGHT, p2.getTextAlign()); //lv3 assertEquals(2400, lv3CPr.getSz()); - assertEquals(24.0, r3.getFontSize()); + assertEquals(24.0, r3.getFontSize(), 0); lv3CPr.setSz(2500); - assertEquals(25.0, r3.getFontSize()); + assertEquals(25.0, r3.getFontSize(), 0); lv3CPr.getLatin().setTypeface("Courier New"); assertEquals("Courier New", r3.getFontFamily()); assertEquals(STTextAlignType.L, lv3PPr.getAlgn()); @@ -780,21 +782,21 @@ public class TestXSLFTextShape extends TestCase { lv3CPr = lv3PPr.addNewDefRPr(); lv1CPr.setSz(3300); - assertEquals(33.0, r1.getFontSize()); + assertEquals(33.0, r1.getFontSize(), 0); lv1CPr.addNewLatin().setTypeface("Times"); assertEquals("Times", r1.getFontFamily()); lv1PPr.setAlgn(STTextAlignType.L); assertEquals(TextAlign.LEFT, p1.getTextAlign()); lv2CPr.setSz(3300); - assertEquals(33.0, r2.getFontSize()); + assertEquals(33.0, r2.getFontSize(), 0); lv2CPr.addNewLatin().setTypeface("Times"); assertEquals("Times", r2.getFontFamily()); lv2PPr.setAlgn(STTextAlignType.L); assertEquals(TextAlign.LEFT, p2.getTextAlign()); lv3CPr.setSz(3300); - assertEquals(33.0, r3.getFontSize()); + assertEquals(33.0, r3.getFontSize(), 0); lv3CPr.addNewLatin().setTypeface("Times"); assertEquals("Times", r3.getFontFamily()); lv3PPr.setAlgn(STTextAlignType.L); @@ -812,21 +814,21 @@ public class TestXSLFTextShape extends TestCase { lv3CPr = lv3PPr.addNewDefRPr(); lv1CPr.setSz(3400); - assertEquals(34.0, r1.getFontSize()); + assertEquals(34.0, r1.getFontSize(), 0); lv1CPr.addNewLatin().setTypeface("Courier New"); assertEquals("Courier New", r1.getFontFamily()); lv1PPr.setAlgn(STTextAlignType.CTR); assertEquals(TextAlign.CENTER, p1.getTextAlign()); lv2CPr.setSz(3400); - assertEquals(34.0, r2.getFontSize()); + assertEquals(34.0, r2.getFontSize(), 0); lv2CPr.addNewLatin().setTypeface("Courier New"); assertEquals("Courier New", r2.getFontFamily()); lv2PPr.setAlgn(STTextAlignType.CTR); assertEquals(TextAlign.CENTER, p2.getTextAlign()); lv3CPr.setSz(3400); - assertEquals(34.0, r3.getFontSize()); + assertEquals(34.0, r3.getFontSize(), 0); lv3CPr.addNewLatin().setTypeface("Courier New"); assertEquals("Courier New", r3.getFontFamily()); lv3PPr.setAlgn(STTextAlignType.CTR); @@ -842,21 +844,21 @@ public class TestXSLFTextShape extends TestCase { lv3CPr = lv3PPr.addNewDefRPr(); lv1CPr.setSz(3500); - assertEquals(35.0, r1.getFontSize()); + assertEquals(35.0, r1.getFontSize(), 0); lv1CPr.addNewLatin().setTypeface("Arial"); assertEquals("Arial", r1.getFontFamily()); lv1PPr.setAlgn(STTextAlignType.L); assertEquals(TextAlign.LEFT, p1.getTextAlign()); lv2CPr.setSz(3500); - assertEquals(35.0, r2.getFontSize()); + assertEquals(35.0, r2.getFontSize(), 0); lv2CPr.addNewLatin().setTypeface("Arial"); assertEquals("Arial", r2.getFontFamily()); lv2PPr.setAlgn(STTextAlignType.L); assertEquals(TextAlign.LEFT, p2.getTextAlign()); lv3CPr.setSz(3500); - assertEquals(35.0, r3.getFontSize()); + assertEquals(35.0, r3.getFontSize(), 0); lv3CPr.addNewLatin().setTypeface("Arial"); assertEquals("Arial", r3.getFontFamily()); lv3PPr.setAlgn(STTextAlignType.L); @@ -871,21 +873,21 @@ public class TestXSLFTextShape extends TestCase { lv3CPr = r3.getXmlObject().getRPr(); lv1CPr.setSz(3600); - assertEquals(36.0, r1.getFontSize()); + assertEquals(36.0, r1.getFontSize(), 0); lv1CPr.addNewLatin().setTypeface("Calibri"); assertEquals("Calibri", r1.getFontFamily()); lv1PPr.setAlgn(STTextAlignType.CTR); assertEquals(TextAlign.CENTER, p1.getTextAlign()); lv2CPr.setSz(3600); - assertEquals(36.0, r2.getFontSize()); + assertEquals(36.0, r2.getFontSize(), 0); lv2CPr.addNewLatin().setTypeface("Calibri"); assertEquals("Calibri", r2.getFontFamily()); lv2PPr.setAlgn(STTextAlignType.CTR); assertEquals(TextAlign.CENTER, p2.getTextAlign()); lv3CPr.setSz(3600); - assertEquals(36.0, r3.getFontSize()); + assertEquals(36.0, r3.getFontSize(), 0); lv3CPr.addNewLatin().setTypeface("Calibri"); assertEquals("Calibri", r3.getFontFamily()); lv3PPr.setAlgn(STTextAlignType.CTR); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java index 650bfcd0cf..3e85f75c57 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java @@ -16,32 +16,39 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import junit.framework.TestCase; -import org.apache.poi.xslf.XSLFTestDataSamples; +import static org.junit.Assert.*; import java.awt.Color; -import java.awt.TexturePaint; +import java.util.List; + +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; +import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint; +import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; /** * test reading properties from a multi-theme and multi-master document * * @author Yegor Kozlov */ -public class TestXSLFTheme extends TestCase { +public class TestXSLFTheme { + @Test public void testRead(){ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("themes.pptx"); - XSLFSlide[] slides = ppt.getSlides(); + List slides = ppt.getSlides(); - slide1(slides[0]); - slide2(slides[1]); - slide3(slides[2]); - slide4(slides[3]); - slide5(slides[4]); - slide6(slides[5]); - slide7(slides[6]); - slide8(slides[7]); - slide9(slides[8]); - slide10(slides[9]); + slide1(slides.get(0)); + slide2(slides.get(1)); + slide3(slides.get(2)); + slide4(slides.get(3)); + slide5(slides.get(4)); + slide6(slides.get(5)); + slide7(slides.get(6)); + slide8(slides.get(7)); + slide9(slides.get(8)); + slide10(slides.get(9)); } private XSLFShape getShape(XSLFSheet sheet, String name){ @@ -58,11 +65,10 @@ public class TestXSLFTheme extends TestCase { assertEquals("Office Theme", theme.getName()); XSLFTextShape sh1 = (XSLFTextShape)getShape(slide, "Rectangle 3"); - RenderableShape rsh1 = new RenderableShape(sh1); XSLFTextRun run1 = sh1.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(Color.white, run1.getFontColor()); assertEquals(new Color(79, 129, 189), sh1.getFillColor()); - assertTrue(rsh1.getFillPaint(null) instanceof Color) ; // solid fill + assertTrue(sh1.getFillStyle().getPaint() instanceof SolidPaint) ; // solid fill } @@ -73,20 +79,19 @@ public class TestXSLFTheme extends TestCase { } void slide3(XSLFSlide slide){ - assertNull(slide.getBackground().getFillColor()); - assertTrue(slide.getBackground().getPaint(null).getClass().getName().indexOf("Gradient") > 0); + PaintStyle fs = slide.getBackground().getFillStyle().getPaint(); + assertTrue(fs instanceof GradientPaint); } void slide4(XSLFSlide slide){ - assertNull(slide.getBackground().getFillColor()); - assertTrue(slide.getBackground().getPaint(null).getClass().getName().indexOf("Gradient") > 0); + PaintStyle fs = slide.getBackground().getFillStyle().getPaint(); + assertTrue(fs instanceof GradientPaint); XSLFTextShape sh1 = (XSLFTextShape)getShape(slide, "Rectangle 4"); - RenderableShape rsh1 = new RenderableShape(sh1); XSLFTextRun run1 = sh1.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(Color.white, run1.getFontColor()); assertEquals(new Color(148, 198, 0), sh1.getFillColor()); - assertTrue(rsh1.getFillPaint(null) instanceof Color) ; // solid fill + assertTrue(sh1.getFillStyle().getPaint() instanceof SolidPaint) ; // solid fill XSLFTextShape sh2 = (XSLFTextShape)getShape(slide, "Title 3"); XSLFTextRun run2 = sh2.getTextParagraphs().get(0).getTextRuns().get(0); @@ -97,14 +102,15 @@ public class TestXSLFTheme extends TestCase { } void slide5(XSLFSlide slide){ - assertTrue(slide.getBackground().getPaint(null) instanceof TexturePaint); + PaintStyle fs = slide.getBackground().getFillStyle().getPaint(); + assertTrue(fs instanceof TexturePaint); XSLFTextShape sh2 = (XSLFTextShape)getShape(slide, "Title 1"); XSLFTextRun run2 = sh2.getTextParagraphs().get(0).getTextRuns().get(0); assertEquals(new Color(148, 198, 0), run2.getFontColor()); assertNull(sh2.getFillColor()); // no fill // font size is 40pt and scale factor is 90% - assertEquals(36.0, run2.getFontSize()); + assertEquals(36.0, run2.getFontSize(), 0); assertTrue(slide.getSlideLayout().getFollowMasterGraphics()); } @@ -133,15 +139,18 @@ public class TestXSLFTheme extends TestCase { } void slide8(XSLFSlide slide){ - assertTrue(slide.getBackground().getPaint(null) instanceof TexturePaint); + PaintStyle fs = slide.getBackground().getFillStyle().getPaint(); + assertTrue(fs instanceof TexturePaint); } void slide9(XSLFSlide slide){ - assertTrue(slide.getBackground().getPaint(null) instanceof TexturePaint); + PaintStyle fs = slide.getBackground().getFillStyle().getPaint(); + assertTrue(fs instanceof TexturePaint); } void slide10(XSLFSlide slide){ - assertTrue(slide.getBackground().getPaint(null).getClass().getName().indexOf("Gradient") > 0); + PaintStyle fs = slide.getBackground().getFillStyle().getPaint(); + assertTrue(fs instanceof GradientPaint); XSLFTextShape sh1 = (XSLFTextShape)getShape(slide, "Title 3"); XSLFTextRun run1 = sh1.getTextParagraphs().get(0).getTextRuns().get(0); diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java b/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java index 6795601a6c..cfeffb8008 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java @@ -18,13 +18,14 @@ package org.apache.poi.hslf.blip; import org.apache.poi.hslf.usermodel.HSLFPictureData; -import org.apache.poi.hslf.model.HSLFPictureShape; +import org.apache.poi.hslf.usermodel.HSLFPictureShape; import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogFactory; + /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java index 401ac43476..5eb8149b12 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.model.HSLFPictureShape; +import org.apache.poi.hslf.usermodel.HSLFPictureShape; import org.apache.poi.util.LittleEndian; import java.io.IOException; @@ -35,7 +35,7 @@ public final class DIB extends Bitmap { /** * @return type of this picture - * @see org.apache.poi.hslf.model.HSLFPictureShape#DIB + * @see org.apache.poi.hslf.usermodel.HSLFPictureShape#DIB */ public int getType(){ return HSLFPictureShape.DIB; diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java index 5fe55f1819..d7dadb6c5a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java @@ -17,8 +17,8 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.model.HSLFPictureShape; -import org.apache.poi.hslf.model.HSLFShape; +import org.apache.poi.hslf.usermodel.HSLFPictureShape; +import org.apache.poi.hslf.usermodel.HSLFShape; import org.apache.poi.hslf.exceptions.HSLFException; import java.io.ByteArrayOutputStream; diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java b/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java index 0f1afecb98..76359dc304 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java @@ -17,8 +17,8 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.model.HSLFPictureShape; import org.apache.poi.hslf.usermodel.HSLFPictureData; +import org.apache.poi.hslf.usermodel.HSLFPictureShape; import java.awt.*; diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java b/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java index 567fc996ee..08ba5ceb98 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.model.HSLFPictureShape; +import org.apache.poi.hslf.usermodel.HSLFPictureShape; /** * Represents a JPEG picture data in a PPT file @@ -28,7 +28,7 @@ public final class JPEG extends Bitmap { /** * @return type of this picture - * @see org.apache.poi.hslf.model.HSLFPictureShape#JPEG + * @see org.apache.poi.hslf.usermodel.HSLFPictureShape#JPEG */ public int getType(){ return HSLFPictureShape.JPEG; diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java index 9b2df64262..016c50f875 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java @@ -23,8 +23,8 @@ import java.io.IOException; import java.util.zip.InflaterInputStream; import org.apache.poi.hslf.exceptions.HSLFException; -import org.apache.poi.hslf.model.HSLFPictureShape; -import org.apache.poi.hslf.model.HSLFShape; +import org.apache.poi.hslf.usermodel.HSLFPictureShape; +import org.apache.poi.hslf.usermodel.HSLFShape; /** * Represents Macintosh PICT picture data. @@ -102,7 +102,7 @@ public final class PICT extends Metafile { } /** - * @see org.apache.poi.hslf.model.HSLFPictureShape#PICT + * @see org.apache.poi.hslf.usermodel.HSLFPictureShape#PICT */ public int getType(){ return HSLFPictureShape.PICT; diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java b/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java index a1d9aa50a9..114b736bfa 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.blip; -import org.apache.poi.hslf.model.HSLFPictureShape; +import org.apache.poi.hslf.usermodel.HSLFPictureShape; import org.apache.poi.util.PngUtils; /** @@ -46,7 +46,7 @@ public final class PNG extends Bitmap { /** * @return type of this picture - * @see org.apache.poi.hslf.model.HSLFPictureShape#PNG + * @see org.apache.poi.hslf.usermodel.HSLFPictureShape#PNG */ public int getType(){ return HSLFPictureShape.PNG; diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java index 3270b32596..a84aed2e6f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java @@ -19,8 +19,8 @@ package org.apache.poi.hslf.blip; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.POILogger; -import org.apache.poi.hslf.model.HSLFPictureShape; -import org.apache.poi.hslf.model.HSLFShape; +import org.apache.poi.hslf.usermodel.HSLFPictureShape; +import org.apache.poi.hslf.usermodel.HSLFShape; import org.apache.poi.hslf.exceptions.HSLFException; import java.io.*; diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java index e437f9504e..c26e5cae1e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java @@ -18,8 +18,8 @@ package org.apache.poi.hslf.dev; import org.apache.poi.hslf.*; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java index d0ab5ec98f..91d6086b1b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java @@ -17,11 +17,11 @@ package org.apache.poi.hslf.dev; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.Document; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; import org.apache.poi.hslf.record.SlideListWithText; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; /** * Uses record level code to Documents. diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java index fc9b224801..0f4f5db60b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java @@ -18,8 +18,8 @@ package org.apache.poi.hslf.dev; import org.apache.poi.hslf.*; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; /** * Uses record level code to locate SlideListWithText entries. diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java index 2a69c17d81..44c2cd8b4a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java @@ -18,8 +18,8 @@ package org.apache.poi.hslf.dev; import org.apache.poi.hslf.*; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java index b4f487ab8a..1398175f42 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java @@ -20,7 +20,6 @@ package org.apache.poi.hslf.dev; import java.io.ByteArrayOutputStream; import java.util.Map; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.Document; import org.apache.poi.hslf.record.Notes; import org.apache.poi.hslf.record.NotesAtom; @@ -32,6 +31,7 @@ import org.apache.poi.hslf.record.SlideAtom; import org.apache.poi.hslf.record.SlideListWithText; import org.apache.poi.hslf.record.SlidePersistAtom; import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.util.LittleEndian; /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java index 77415ff2dc..45ededed15 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java @@ -21,7 +21,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Iterator; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.Record; import org.apache.poi.util.HexDump; import org.apache.poi.ddf.DefaultEscherRecordFactory; @@ -32,6 +31,7 @@ import org.apache.poi.hslf.record.EscherTextboxWrapper; import org.apache.poi.hslf.record.TextCharsAtom; import org.apache.poi.hslf.record.TextBytesAtom; import org.apache.poi.hslf.record.StyleTextPropAtom; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; /** * This class provides a way to view the contents of a powerpoint file. diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java index d7fcbc6fd1..14b7706fbd 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java @@ -17,14 +17,11 @@ package org.apache.poi.hslf.dev; -import org.apache.poi.hslf.*; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; -import org.apache.poi.hslf.model.textproperties.BitMaskTextProp; -import org.apache.poi.hslf.model.textproperties.TextProp; -import org.apache.poi.hslf.model.textproperties.TextPropCollection; -import org.apache.poi.hslf.record.*; +import java.util.List; -import java.util.LinkedList; +import org.apache.poi.hslf.model.textproperties.*; +import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; /** * Uses record level code to locate StyleTextPropAtom entries. @@ -73,19 +70,19 @@ public final class TextStyleListing { public static void showStyleTextPropAtom(StyleTextPropAtom stpa) { System.out.println("\nFound a StyleTextPropAtom"); - LinkedList paragraphStyles = stpa.getParagraphStyles(); + List paragraphStyles = stpa.getParagraphStyles(); System.out.println("Contains " + paragraphStyles.size() + " paragraph styles:"); for(int i=0; i charStyles = stpa.getCharacterStyles(); System.out.println("Contains " + charStyles.size() + " character styles:"); for(int i=0; i textProps = tpc.getTextPropList(); System.out.println(" Contains " + textProps.size() + " TextProps"); for(int i=0; i _slides; private boolean _slidesByDefault = true; private boolean _notesByDefault = false; @@ -74,6 +68,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { PowerPointExtractor ppe = new PowerPointExtractor(file); System.out.println(ppe.getText(true, notes, comments, master)); + ppe.close(); } /** @@ -188,13 +183,10 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { public List getOLEShapes() { List list = new ArrayList(); - for (int i = 0; i < _slides.length; i++) { - HSLFSlide slide = _slides[i]; - - HSLFShape[] shapes = slide.getShapes(); - for (int j = 0; j < shapes.length; j++) { - if (shapes[j] instanceof OLEShape) { - list.add((OLEShape) shapes[j]); + for (HSLFSlide slide : _slides) { + for (HSLFShape shape : slide.getShapes()) { + if (shape instanceof OLEShape) { + list.add((OLEShape) shape); } } } @@ -219,7 +211,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { if (getSlideText) { if (getMasterText) { - for (SlideMaster master : _show.getSlidesMasters()) { + for (HSLFSlideMaster master : _show.getSlideMasters()) { for(HSLFShape sh : master.getShapes()){ if(sh instanceof HSLFTextShape){ if(HSLFMasterSheet.isPlaceholder(sh)) { @@ -241,8 +233,8 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { } } - for (int i = 0; i < _slides.length; i++) { - HSLFSlide slide = _slides[i]; + for (int i = 0; i < _slides.size(); i++) { + HSLFSlide slide = _slides.get(i); // Slide header, if set HeadersFooters hf = slide.getHeadersFooters(); @@ -251,7 +243,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { } // Slide text - textRunsToText(ret, slide.getTextRuns()); + textRunsToText(ret, slide.getTextParagraphs()); // Table text for (HSLFShape shape : slide.getShapes()){ @@ -284,8 +276,8 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { HashSet seenNotes = new HashSet(); HeadersFooters hf = _show.getNotesHeadersFooters(); - for (int i = 0; i < _slides.length; i++) { - HSLFNotes notes = _slides[i].getNotesSheet(); + for (int i = 0; i < _slides.size(); i++) { + HSLFNotes notes = _slides.get(i).getNotes(); if (notes == null) { continue; } @@ -301,7 +293,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { } // Notes text - textRunsToText(ret, notes.getTextRuns()); + textRunsToText(ret, notes.getTextParagraphs()); // Repeat the notes footer, if set if (hf != null && hf.isFooterVisible() && hf.getFooterText() != null) { @@ -330,17 +322,17 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { ret.append('\n'); } } - private void textRunsToText(StringBuffer ret, HSLFTextParagraph[] runs) { - if (runs==null) { + private void textRunsToText(StringBuffer ret, List> paragraphs) { + if (paragraphs==null) { return; } - for (int j = 0; j < runs.length; j++) { - HSLFTextParagraph run = runs[j]; - if (run != null) { - String text = run.getText(); - ret.append(text); - if (!text.endsWith("\n")) { + for (List lp : paragraphs) { + for (HSLFTextParagraph p : lp) { + for (HSLFTextRun r : p.getTextRuns()) { + ret.append(r.getRawText()); + } + if (ret.length() > 0 && ret.charAt(ret.length()-1) != '\n') { ret.append("\n"); } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java index 9c92c5c591..260eebd60f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java +++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java @@ -17,20 +17,13 @@ package org.apache.poi.hslf.extractor; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.util.ArrayList; import java.util.List; -import org.apache.poi.hslf.model.HSLFTextParagraph; -import org.apache.poi.hslf.record.CString; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.RecordTypes; -import org.apache.poi.hslf.record.StyleTextPropAtom; -import org.apache.poi.hslf.record.TextBytesAtom; -import org.apache.poi.hslf.record.TextCharsAtom; -import org.apache.poi.hslf.record.TextHeaderAtom; +import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.usermodel.HSLFTextParagraph; +import org.apache.poi.hslf.usermodel.HSLFTextShape; import org.apache.poi.poifs.filesystem.DocumentEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.LittleEndian; @@ -174,18 +167,19 @@ public final class QuickButCruddyTextExtractor { } // Otherwise, check the type to see if it's text - long type = LittleEndian.getUShort(pptContents,startPos+2); - HSLFTextParagraph trun = null; + int type = LittleEndian.getUShort(pptContents,startPos+2); // TextBytesAtom if(type == RecordTypes.TextBytesAtom.typeID) { TextBytesAtom tba = (TextBytesAtom)Record.createRecordForType(type, pptContents, startPos, len+8); - trun = new HSLFTextParagraph((TextHeaderAtom)null,tba,(StyleTextPropAtom)null); + String text = HSLFTextParagraph.toExternalString(tba.getText(), -1); + textV.add(text); } // TextCharsAtom if(type == RecordTypes.TextCharsAtom.typeID) { TextCharsAtom tca = (TextCharsAtom)Record.createRecordForType(type, pptContents, startPos, len+8); - trun = new HSLFTextParagraph((TextHeaderAtom)null,tca,(StyleTextPropAtom)null); + String text = HSLFTextParagraph.toExternalString(tca.getText(), -1); + textV.add(text); } // CString (doesn't go via a TextRun) @@ -201,10 +195,6 @@ public final class QuickButCruddyTextExtractor { } } - // If we found text via a TextRun, save it in the vector - if(trun != null) { - textV.add(trun.getText()); - } // Wind on by the atom length, and check we're not at the end int newPos = (startPos + 8 + len); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java index 95f83a3834..567b8297e0 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java @@ -34,6 +34,7 @@ import org.apache.poi.hslf.record.ExObjList; import org.apache.poi.hslf.record.OEShapeAtom; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.LittleEndian; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java deleted file mode 100644 index 0afc71076b..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java +++ /dev/null @@ -1,388 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Arc2D; -import java.awt.geom.Ellipse2D; -import java.awt.geom.GeneralPath; -import java.awt.geom.Line2D; -import java.awt.geom.Rectangle2D; -import java.awt.geom.RoundRectangle2D; - -import org.apache.poi.ddf.EscherProperties; -import org.apache.poi.sl.usermodel.ShapeType; - -/** - * Stores definition of auto-shapes. - * See the Office Drawing 97-2007 Binary Format Specification for details. - * - * TODO: follow the spec and define all the auto-shapes - * - * @author Yegor Kozlov - */ -public final class AutoShapes { - protected static final ShapeOutline[] shapes; - - - /** - * Return shape outline by shape type - * @param type shape type see {@link ShapeTypes} - * - * @return the shape outline - */ - public static ShapeOutline getShapeOutline(ShapeType type){ - ShapeOutline outline = shapes[type.nativeId]; - return outline; - } - - /** - * Auto-shapes are defined in the [0,21600] coordinate system. - * We need to transform it into normal slide coordinates - * - */ - public static java.awt.Shape transform(java.awt.Shape outline, Rectangle2D anchor){ - AffineTransform at = new AffineTransform(); - at.translate(anchor.getX(), anchor.getY()); - at.scale( - 1.0f/21600*anchor.getWidth(), - 1.0f/21600*anchor.getHeight() - ); - return at.createTransformedShape(outline); - } - - static { - shapes = new ShapeOutline[255]; - - shapes[ShapeType.RECT.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - Rectangle2D path = new Rectangle2D.Float(0, 0, 21600, 21600); - return path; - } - }; - - shapes[ShapeType.ROUND_RECT.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); - RoundRectangle2D path = new RoundRectangle2D.Float(0, 0, 21600, 21600, adjval, adjval); - return path; - } - }; - - shapes[ShapeType.ELLIPSE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - Ellipse2D path = new Ellipse2D.Float(0, 0, 21600, 21600); - return path; - } - }; - - shapes[ShapeType.DIAMOND.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - GeneralPath path = new GeneralPath(); - path.moveTo(10800, 0); - path.lineTo(21600, 10800); - path.lineTo(10800, 21600); - path.lineTo(0, 10800); - path.closePath(); - return path; - } - }; - - //m@0,l,21600r21600 - shapes[ShapeType.TRIANGLE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 10800); - GeneralPath path = new GeneralPath(); - path.moveTo(adjval, 0); - path.lineTo(0, 21600); - path.lineTo(21600, 21600); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.RT_TRIANGLE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - GeneralPath path = new GeneralPath(); - path.moveTo(0, 0); - path.lineTo(21600, 21600); - path.lineTo(0, 21600); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.PARALLELOGRAM.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); - - GeneralPath path = new GeneralPath(); - path.moveTo(adjval, 0); - path.lineTo(21600, 0); - path.lineTo(21600 - adjval, 21600); - path.lineTo(0, 21600); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.TRAPEZOID.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); - - GeneralPath path = new GeneralPath(); - path.moveTo(0, 0); - path.lineTo(adjval, 21600); - path.lineTo(21600 - adjval, 21600); - path.lineTo(21600, 0); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.HEXAGON.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); - - GeneralPath path = new GeneralPath(); - path.moveTo(adjval, 0); - path.lineTo(21600 - adjval, 0); - path.lineTo(21600, 10800); - path.lineTo(21600 - adjval, 21600); - path.lineTo(adjval, 21600); - path.lineTo(0, 10800); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.OCTAGON.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 6326); - - GeneralPath path = new GeneralPath(); - path.moveTo(adjval, 0); - path.lineTo(21600 - adjval, 0); - path.lineTo(21600, adjval); - path.lineTo(21600, 21600-adjval); - path.lineTo(21600-adjval, 21600); - path.lineTo(adjval, 21600); - path.lineTo(0, 21600-adjval); - path.lineTo(0, adjval); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.PLUS.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); - - GeneralPath path = new GeneralPath(); - path.moveTo(adjval, 0); - path.lineTo(21600 - adjval, 0); - path.lineTo(21600 - adjval, adjval); - path.lineTo(21600, adjval); - path.lineTo(21600, 21600-adjval); - path.lineTo(21600-adjval, 21600-adjval); - path.lineTo(21600-adjval, 21600); - path.lineTo(adjval, 21600); - path.lineTo(adjval, 21600-adjval); - path.lineTo(0, 21600-adjval); - path.lineTo(0, adjval); - path.lineTo(adjval, adjval); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.PENTAGON.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - - GeneralPath path = new GeneralPath(); - path.moveTo(10800, 0); - path.lineTo(21600, 8259); - path.lineTo(21600 - 4200, 21600); - path.lineTo(4200, 21600); - path.lineTo(0, 8259); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.DOWN_ARROW.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - //m0@0 l@1@0 @1,0 @2,0 @2@0,21600@0,10800,21600xe - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200); - int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400); - GeneralPath path = new GeneralPath(); - path.moveTo(0, adjval); - path.lineTo(adjval2, adjval); - path.lineTo(adjval2, 0); - path.lineTo(21600-adjval2, 0); - path.lineTo(21600-adjval2, adjval); - path.lineTo(21600, adjval); - path.lineTo(10800, 21600); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.UP_ARROW.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - //m0@0 l@1@0 @1,21600@2,21600@2@0,21600@0,10800,xe - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); - int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400); - GeneralPath path = new GeneralPath(); - path.moveTo(0, adjval); - path.lineTo(adjval2, adjval); - path.lineTo(adjval2, 21600); - path.lineTo(21600-adjval2, 21600); - path.lineTo(21600-adjval2, adjval); - path.lineTo(21600, adjval); - path.lineTo(10800, 0); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.RIGHT_ARROW.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - //m@0, l@0@1 ,0@1,0@2@0@2@0,21600,21600,10800xe - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200); - int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400); - GeneralPath path = new GeneralPath(); - path.moveTo(adjval, 0); - path.lineTo(adjval, adjval2); - path.lineTo(0, adjval2); - path.lineTo(0, 21600-adjval2); - path.lineTo(adjval, 21600-adjval2); - path.lineTo(adjval, 21600); - path.lineTo(21600, 10800); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.LEFT_ARROW.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - //m@0, l@0@1,21600@1,21600@2@0@2@0,21600,,10800xe - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); - int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400); - GeneralPath path = new GeneralPath(); - path.moveTo(adjval, 0); - path.lineTo(adjval, adjval2); - path.lineTo(21600, adjval2); - path.lineTo(21600, 21600-adjval2); - path.lineTo(adjval, 21600-adjval2); - path.lineTo(adjval, 21600); - path.lineTo(0, 10800); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.CAN.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - //m10800,qx0@1l0@2qy10800,21600,21600@2l21600@1qy10800,xem0@1qy10800@0,21600@1nfe - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400); - - GeneralPath path = new GeneralPath(); - - path.append(new Arc2D.Float(0, 0, 21600, adjval, 0, 180, Arc2D.OPEN), false); - path.moveTo(0, adjval/2); - - path.lineTo(0, 21600 - adjval/2); - path.closePath(); - - path.append(new Arc2D.Float(0, 21600 - adjval, 21600, adjval, 180, 180, Arc2D.OPEN), false); - path.moveTo(21600, 21600 - adjval/2); - - path.lineTo(21600, adjval/2); - path.append(new Arc2D.Float(0, 0, 21600, adjval, 180, 180, Arc2D.OPEN), false); - path.moveTo(0, adjval/2); - path.closePath(); - return path; - } - }; - - shapes[ShapeType.LEFT_BRACE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - //m21600,qx10800@0l10800@2qy0@11,10800@3l10800@1qy21600,21600e - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800); - int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800); - - GeneralPath path = new GeneralPath(); - path.moveTo(21600, 0); - - path.append(new Arc2D.Float(10800, 0, 21600, adjval*2, 90, 90, Arc2D.OPEN), false); - path.moveTo(10800, adjval); - - path.lineTo(10800, adjval2 - adjval); - - path.append(new Arc2D.Float(-10800, adjval2 - 2*adjval, 21600, adjval*2, 270, 90, Arc2D.OPEN), false); - path.moveTo(0, adjval2); - - path.append(new Arc2D.Float(-10800, adjval2, 21600, adjval*2, 0, 90, Arc2D.OPEN), false); - path.moveTo(10800, adjval2 + adjval); - - path.lineTo(10800, 21600 - adjval); - - path.append(new Arc2D.Float(10800, 21600 - 2*adjval, 21600, adjval*2, 180, 90, Arc2D.OPEN), false); - - return path; - } - }; - - shapes[ShapeType.RIGHT_BRACE.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - //m,qx10800@0 l10800@2qy21600@11,10800@3l10800@1qy,21600e - int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800); - int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800); - - GeneralPath path = new GeneralPath(); - path.moveTo(0, 0); - - path.append(new Arc2D.Float(-10800, 0, 21600, adjval*2, 0, 90, Arc2D.OPEN), false); - path.moveTo(10800, adjval); - - path.lineTo(10800, adjval2 - adjval); - - path.append(new Arc2D.Float(10800, adjval2 - 2*adjval, 21600, adjval*2, 180, 90, Arc2D.OPEN), false); - path.moveTo(21600, adjval2); - - path.append(new Arc2D.Float(10800, adjval2, 21600, adjval*2, 90, 90, Arc2D.OPEN), false); - path.moveTo(10800, adjval2 + adjval); - - path.lineTo(10800, 21600 - adjval); - - path.append(new Arc2D.Float(-10800, 21600 - 2*adjval, 21600, adjval*2, 270, 90, Arc2D.OPEN), false); - - return path; - } - }; - - shapes[ShapeType.STRAIGHT_CONNECTOR_1.nativeId] = new ShapeOutline(){ - public java.awt.Shape getOutline(HSLFShape shape){ - return new Line2D.Float(0, 0, 21600, 21600); - } - }; - - - } -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextParagraph.java deleted file mode 100644 index b23c997dbe..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextParagraph.java +++ /dev/null @@ -1,744 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import org.apache.poi.hslf.model.textproperties.TextPropCollection; -import org.apache.poi.hslf.record.PPDrawing; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.RecordContainer; -import org.apache.poi.hslf.record.SlideListWithText; -import org.apache.poi.hslf.record.StyleTextProp9Atom; -import org.apache.poi.hslf.record.StyleTextPropAtom; -import org.apache.poi.hslf.record.TextBytesAtom; -import org.apache.poi.hslf.record.TextCharsAtom; -import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.record.TextRulerAtom; -import org.apache.poi.hslf.record.TextSpecInfoAtom; -import org.apache.poi.hslf.usermodel.HSLFTextRun; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.sl.usermodel.TextParagraph; -import org.apache.poi.util.StringUtil; - -/** - * This class represents a run of text in a powerpoint document. That - * run could be text on a sheet, or text in a note. - * It is only a very basic class for now - * - * @author Nick Burch - */ - -public final class HSLFTextParagraph implements TextParagraph -{ - // Note: These fields are protected to help with unit testing - // Other classes shouldn't really go playing with them! - protected TextHeaderAtom _headerAtom; - protected TextBytesAtom _byteAtom; - protected TextCharsAtom _charAtom; - protected StyleTextPropAtom _styleAtom; - protected TextRulerAtom _ruler; - protected boolean _isUnicode; - protected HSLFTextRun[] _rtRuns; - protected HSLFTextShape _parentShape; - // private SlideShow slideShow; - private HSLFSheet _sheet; - private int shapeId; - private int slwtIndex = -1; //position in the owning SlideListWithText - /** - * all text run records that follow TextHeaderAtom. - * (there can be misc InteractiveInfo, TxInteractiveInfo and other records) - */ - protected Record[] _records; - // private StyleTextPropAtom styleTextPropAtom; - private StyleTextProp9Atom styleTextProp9Atom; - - /** - * Constructs a Text Run from a Unicode text block - * - * @param tha the TextHeaderAtom that defines what's what - * @param tca the TextCharsAtom containing the text - * @param sta the StyleTextPropAtom which defines the character stylings - */ - public HSLFTextParagraph(TextHeaderAtom tha, TextCharsAtom tca, StyleTextPropAtom sta) { - this(tha,null,tca,sta); - } - - /** - * Constructs a Text Run from a Ascii text block - * - * @param tha the TextHeaderAtom that defines what's what - * @param tba the TextBytesAtom containing the text - * @param sta the StyleTextPropAtom which defines the character stylings - */ - public HSLFTextParagraph(TextHeaderAtom tha, TextBytesAtom tba, StyleTextPropAtom sta) { - this(tha,tba,null,sta); - } - - /** - * Internal constructor and initializer - */ - private HSLFTextParagraph(TextHeaderAtom tha, TextBytesAtom tba, TextCharsAtom tca, StyleTextPropAtom sta) { - _headerAtom = tha; - _styleAtom = sta; - if(tba != null) { - _byteAtom = tba; - _isUnicode = false; - } else { - _charAtom = tca; - _isUnicode = true; - } - String runRawText = getText(); - - // Figure out the rich text runs - LinkedList pStyles = new LinkedList(); - LinkedList cStyles = new LinkedList(); - if(_styleAtom != null) { - // Get the style atom to grok itself - _styleAtom.setParentTextSize(runRawText.length()); - pStyles = _styleAtom.getParagraphStyles(); - cStyles = _styleAtom.getCharacterStyles(); - } - buildRichTextRuns(pStyles, cStyles, runRawText); - } - - public void buildRichTextRuns(LinkedList pStyles, LinkedList cStyles, String runRawText){ - - // Handle case of no current style, with a default - if(pStyles.size() == 0 || cStyles.size() == 0) { - _rtRuns = new HSLFTextRun[1]; - _rtRuns[0] = new HSLFTextRun(this, 0, runRawText.length()); - } else { - // Build up Rich Text Runs, one for each - // character/paragraph style pair - List rtrs = new ArrayList(); - - int pos = 0; - - int curP = 0; - int curC = 0; - int pLenRemain = -1; - int cLenRemain = -1; - - // Build one for each run with the same style - while(pos <= runRawText.length() && curP < pStyles.size() && curC < cStyles.size()) { - // Get the Props to use - TextPropCollection pProps = pStyles.get(curP); - TextPropCollection cProps = cStyles.get(curC); - - int pLen = pProps.getCharactersCovered(); - int cLen = cProps.getCharactersCovered(); - - // Handle new pass - boolean freshSet = false; - if(pLenRemain == -1 && cLenRemain == -1) { freshSet = true; } - if(pLenRemain == -1) { pLenRemain = pLen; } - if(cLenRemain == -1) { cLenRemain = cLen; } - - // So we know how to build the eventual run - int runLen = -1; - boolean pShared = false; - boolean cShared = false; - - // Same size, new styles - neither shared - if(pLen == cLen && freshSet) { - runLen = cLen; - pShared = false; - cShared = false; - curP++; - curC++; - pLenRemain = -1; - cLenRemain = -1; - } else { - // Some sharing - - // See if we are already in a shared block - if(pLenRemain < pLen) { - // Existing shared p block - pShared = true; - - // Do we end with the c block, or either side of it? - if(pLenRemain == cLenRemain) { - // We end at the same time - cShared = false; - runLen = pLenRemain; - curP++; - curC++; - pLenRemain = -1; - cLenRemain = -1; - } else if(pLenRemain < cLenRemain) { - // We end before the c block - cShared = true; - runLen = pLenRemain; - curP++; - cLenRemain -= pLenRemain; - pLenRemain = -1; - } else { - // We end after the c block - cShared = false; - runLen = cLenRemain; - curC++; - pLenRemain -= cLenRemain; - cLenRemain = -1; - } - } else if(cLenRemain < cLen) { - // Existing shared c block - cShared = true; - - // Do we end with the p block, or either side of it? - if(pLenRemain == cLenRemain) { - // We end at the same time - pShared = false; - runLen = cLenRemain; - curP++; - curC++; - pLenRemain = -1; - cLenRemain = -1; - } else if(cLenRemain < pLenRemain) { - // We end before the p block - pShared = true; - runLen = cLenRemain; - curC++; - pLenRemain -= cLenRemain; - cLenRemain = -1; - } else { - // We end after the p block - pShared = false; - runLen = pLenRemain; - curP++; - cLenRemain -= pLenRemain; - pLenRemain = -1; - } - } else { - // Start of a shared block - if(pLenRemain < cLenRemain) { - // Shared c block - pShared = false; - cShared = true; - runLen = pLenRemain; - curP++; - cLenRemain -= pLenRemain; - pLenRemain = -1; - } else { - // Shared p block - pShared = true; - cShared = false; - runLen = cLenRemain; - curC++; - pLenRemain -= cLenRemain; - cLenRemain = -1; - } - } - } - - // Wind on - int prevPos = pos; - pos += runLen; - // Adjust for end-of-run extra 1 length - if(pos > runRawText.length()) { - runLen--; - } - - // Save - HSLFTextRun rtr = new HSLFTextRun(this, prevPos, runLen, pProps, cProps, pShared, cShared); - rtrs.add(rtr); - } - - // Build the array - _rtRuns = rtrs.toArray(new HSLFTextRun[rtrs.size()]); - } - - } - - // Update methods follow - - /** - * Adds the supplied text onto the end of the TextRun, - * creating a new RichTextRun (returned) for it to - * sit in. - * In many cases, before calling this, you'll want to add - * a newline onto the end of your last RichTextRun - */ - public HSLFTextRun appendText(String s) { - // We will need a StyleTextProp atom - ensureStyleAtomPresent(); - - // First up, append the text to the - // underlying text atom - int oldSize = getRawText().length(); - storeText( - getRawText() + s - ); - - // If either of the previous styles overran - // the text by one, we need to shuffle that - // extra character onto the new ones - int pOverRun = _styleAtom.getParagraphTextLengthCovered() - oldSize; - int cOverRun = _styleAtom.getCharacterTextLengthCovered() - oldSize; - if(pOverRun > 0) { - TextPropCollection tpc = _styleAtom.getParagraphStyles().getLast(); - tpc.updateTextSize( - tpc.getCharactersCovered() - pOverRun - ); - } - if(cOverRun > 0) { - TextPropCollection tpc = _styleAtom.getCharacterStyles().getLast(); - tpc.updateTextSize( - tpc.getCharactersCovered() - cOverRun - ); - } - - // Next, add the styles for its paragraph and characters - TextPropCollection newPTP = - _styleAtom.addParagraphTextPropCollection(s.length()+pOverRun); - TextPropCollection newCTP = - _styleAtom.addCharacterTextPropCollection(s.length()+cOverRun); - - // Now, create the new RichTextRun - HSLFTextRun nr = new HSLFTextRun( - this, oldSize, s.length(), - newPTP, newCTP, false, false - ); - - // Add the new RichTextRun onto our list - HSLFTextRun[] newRuns = new HSLFTextRun[_rtRuns.length+1]; - System.arraycopy(_rtRuns, 0, newRuns, 0, _rtRuns.length); - newRuns[newRuns.length-1] = nr; - _rtRuns = newRuns; - - // And return the new run to the caller - return nr; - } - - /** - * Saves the given string to the records. Doesn't - * touch the stylings. - */ - private void storeText(String s) { - // Store in the appropriate record - if(_isUnicode) { - // The atom can safely convert to unicode - _charAtom.setText(s); - } else { - // Will it fit in a 8 bit atom? - boolean hasMultibyte = StringUtil.hasMultibyte(s); - if(! hasMultibyte) { - // Fine to go into 8 bit atom - byte[] text = new byte[s.length()]; - StringUtil.putCompressedUnicode(s,text,0); - _byteAtom.setText(text); - } else { - // Need to swap a TextBytesAtom for a TextCharsAtom - - // Build the new TextCharsAtom - _charAtom = new TextCharsAtom(); - _charAtom.setText(s); - - // Use the TextHeaderAtom to do the swap on the parent - RecordContainer parent = _headerAtom.getParentRecord(); - Record[] cr = parent.getChildRecords(); - for(int i=0; i pStyles = _styleAtom.getParagraphStyles(); - while(pStyles.size() > 1) { pStyles.removeLast(); } - - if (!pStyles.isEmpty()) { - pStyles.getFirst().updateTextSize( s.length()+1 ); - } - - LinkedList cStyles = _styleAtom.getCharacterStyles(); - while(cStyles.size() > 1) { cStyles.removeLast(); } - - if (!cStyles.isEmpty()) { - cStyles.getFirst().updateTextSize( s.length()+1 ); - } - - _rtRuns[0].setText(s); - } else { - // Recreate rich text run with no styling - _rtRuns[0] = new HSLFTextRun(this,0,s.length()); - } - - } - - /** - * Changes the text. - * Converts '\r' into '\n' - */ - public void setText(String s) { - String text = normalize(s); - setRawText(text); - } - - /** - * Ensure a StyleTextPropAtom is present for this run, - * by adding if required. Normally for internal TextRun use. - */ - public void ensureStyleAtomPresent() { - if(_styleAtom != null) { - // All there - return; - } - - // Create a new one at the right size - _styleAtom = new StyleTextPropAtom(getRawText().length() + 1); - - // Use the TextHeader atom to get at the parent - RecordContainer runAtomsParent = _headerAtom.getParentRecord(); - - // Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom - Record addAfter = _byteAtom; - if(_byteAtom == null) { addAfter = _charAtom; } - runAtomsParent.addChildAfter(_styleAtom, addAfter); - - // Feed this to our sole rich text run - if(_rtRuns.length != 1) { - throw new IllegalStateException("Needed to add StyleTextPropAtom when had many rich text runs"); - } - // These are the only styles for now - _rtRuns[0].supplyTextProps( - _styleAtom.getParagraphStyles().get(0), - _styleAtom.getCharacterStyles().get(0), - false, - false - ); - } - - // Accesser methods follow - - /** - * Returns the text content of the run, which has been made safe - * for printing and other use. - */ - public String getText() { - String rawText = getRawText(); - - // PowerPoint seems to store files with \r as the line break - // The messes things up on everything but a Mac, so translate - // them to \n - String text = rawText.replace('\r','\n'); - - int type = _headerAtom == null ? 0 : _headerAtom.getTextType(); - if(type == TextHeaderAtom.TITLE_TYPE || type == TextHeaderAtom.CENTER_TITLE_TYPE){ - //0xB acts like cariage return in page titles and like blank in the others - text = text.replace((char) 0x0B, '\n'); - } else { - text = text.replace((char) 0x0B, ' '); - } - return text; - } - - /** - * Returns the raw text content of the run. This hasn't had any - * changes applied to it, and so is probably unlikely to print - * out nicely. - */ - public String getRawText() { - if(_isUnicode) { - return _charAtom.getText(); - } - return _byteAtom.getText(); - } - - /** - * Fetch the rich text runs (runs of text with the same styling) that - * are contained within this block of text - */ - public HSLFTextRun[] getRichTextRuns() { - return _rtRuns; - } - - /** - * Returns the type of the text, from the TextHeaderAtom. - * Possible values can be seen from TextHeaderAtom - * @see org.apache.poi.hslf.record.TextHeaderAtom - */ - public int getRunType() { - return _headerAtom.getTextType(); - } - - /** - * Changes the type of the text. Values should be taken - * from TextHeaderAtom. No checking is done to ensure you - * set this to a valid value! - * @see org.apache.poi.hslf.record.TextHeaderAtom - */ - public void setRunType(int type) { - _headerAtom.setTextType(type); - } - - /** - * Supply the Sheet we belong to, which might have an assigned SlideShow - * Also passes it on to our child RichTextRuns - */ - public void supplySheet(HSLFSheet sheet){ - this._sheet = sheet; - - if (_rtRuns == null) return; - for(HSLFTextRun rt : _rtRuns) { - rt.updateSheet(); - } - } - - public HSLFSheet getSheet(){ - return this._sheet; - } - - /** - * @return Shape ID - */ - protected int getShapeId(){ - return shapeId; - } - - /** - * @param id Shape ID - */ - protected void setShapeId(int id){ - shapeId = id; - } - - /** - * @return 0-based index of the text run in the SLWT container - */ - protected int getIndex(){ - return slwtIndex; - } - - /** - * @param id 0-based index of the text run in the SLWT container - */ - protected void setIndex(int id){ - slwtIndex = id; - } - - /** - * Is this Text Run one from a {@link PPDrawing}, or is it - * one from the {@link SlideListWithText}? - */ - public boolean isDrawingBased() { - return (slwtIndex == -1); - } - - /** - * Returns the array of all hyperlinks in this text run - * - * @return the array of all hyperlinks in this text run - * or null if not found. - */ - public Hyperlink[] getHyperlinks(){ - return Hyperlink.find(this); - } - - /** - * Fetch RichTextRun at a given position - * - * @param pos 0-based index in the text - * @return RichTextRun or null if not found - */ - public HSLFTextRun getRichTextRunAt(int pos){ - for (int i = 0; i < _rtRuns.length; i++) { - int start = _rtRuns[i].getStartIndex(); - int end = _rtRuns[i].getEndIndex(); - if(pos >= start && pos < end) return _rtRuns[i]; - } - return null; - } - - public TextRulerAtom getTextRuler(){ - if(_ruler == null){ - if(_records != null) for (int i = 0; i < _records.length; i++) { - if(_records[i] instanceof TextRulerAtom) { - _ruler = (TextRulerAtom)_records[i]; - break; - } - } - - } - return _ruler; - - } - - public TextRulerAtom createTextRuler(){ - _ruler = getTextRuler(); - if(_ruler == null){ - _ruler = TextRulerAtom.getParagraphInstance(); - _headerAtom.getParentRecord().appendChildRecord(_ruler); - } - return _ruler; - } - - /** - * Returns a new string with line breaks converted into internal ppt representation - */ - public String normalize(String s){ - String ns = s.replaceAll("\\r?\\n", "\r"); - return ns; - } - - /** - * Returns records that make up this text run - * - * @return text run records - */ - public Record[] getRecords(){ - return _records; - } - /** Numbered List info */ - public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) { - this.styleTextProp9Atom = styleTextProp9Atom; - } - /** Numbered List info */ - public StyleTextProp9Atom getStyleTextProp9Atom() { - return this.styleTextProp9Atom; - } - - /** Characters covered */ - public StyleTextPropAtom getStyleTextPropAtom() { - return this._styleAtom; - } - -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextShape.java deleted file mode 100644 index 17e8b81d21..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextShape.java +++ /dev/null @@ -1,639 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - -import java.awt.Font; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.font.FontRenderContext; -import java.awt.font.TextLayout; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.io.IOException; - -import org.apache.poi.ddf.EscherContainerRecord; -import org.apache.poi.ddf.EscherOptRecord; -import org.apache.poi.ddf.EscherProperties; -import org.apache.poi.ddf.EscherSimpleProperty; -import org.apache.poi.ddf.EscherSpRecord; -import org.apache.poi.ddf.EscherTextboxRecord; -import org.apache.poi.hslf.exceptions.HSLFException; -import org.apache.poi.hslf.record.EscherTextboxWrapper; -import org.apache.poi.hslf.record.InteractiveInfo; -import org.apache.poi.hslf.record.InteractiveInfoAtom; -import org.apache.poi.hslf.record.OEPlaceholderAtom; -import org.apache.poi.hslf.record.OutlineTextRefAtom; -import org.apache.poi.hslf.record.PPDrawing; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.RecordTypes; -import org.apache.poi.hslf.record.RoundTripHFPlaceholder12; -import org.apache.poi.hslf.record.StyleTextPropAtom; -import org.apache.poi.hslf.record.TextBytesAtom; -import org.apache.poi.hslf.record.TextCharsAtom; -import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.record.TxInteractiveInfoAtom; -import org.apache.poi.hslf.usermodel.HSLFTextRun; -import org.apache.poi.sl.usermodel.ShapeContainer; -import org.apache.poi.util.POILogger; - -/** - * A common superclass of all shapes that can hold text. - * - * @author Yegor Kozlov - */ -public abstract class HSLFTextShape extends HSLFSimpleShape { - - /** - * How to anchor the text - */ - public static final int AnchorTop = 0; - public static final int AnchorMiddle = 1; - public static final int AnchorBottom = 2; - public static final int AnchorTopCentered = 3; - public static final int AnchorMiddleCentered = 4; - public static final int AnchorBottomCentered = 5; - public static final int AnchorTopBaseline = 6; - public static final int AnchorBottomBaseline = 7; - public static final int AnchorTopCenteredBaseline = 8; - public static final int AnchorBottomCenteredBaseline = 9; - - /** - * How to wrap the text - */ - public static final int WrapSquare = 0; - public static final int WrapByPoints = 1; - public static final int WrapNone = 2; - public static final int WrapTopBottom = 3; - public static final int WrapThrough = 4; - - /** - * How to align the text - */ - public static final int AlignLeft = 0; - public static final int AlignCenter = 1; - public static final int AlignRight = 2; - public static final int AlignJustify = 3; - - /** - * TextRun object which holds actual text and format data - */ - protected HSLFTextParagraph _txtrun; - - /** - * Escher container which holds text attributes such as - * TextHeaderAtom, TextBytesAtom ot TextCharsAtom, StyleTextPropAtom etc. - */ - protected EscherTextboxWrapper _txtbox; - - /** - * Used to calculate text bounds - */ - protected static final FontRenderContext _frc = new FontRenderContext(null, true, true); - - /** - * Create a TextBox object and initialize it from the supplied Record container. - * - * @param escherRecord EscherSpContainer container which holds information about this shape - * @param parent the parent of the shape - */ - protected HSLFTextShape(EscherContainerRecord escherRecord, ShapeContainer parent){ - super(escherRecord, parent); - - } - - /** - * Create a new TextBox. This constructor is used when a new shape is created. - * - * @param parent the parent of this Shape. For example, if this text box is a cell - * in a table then the parent is Table. - */ - public HSLFTextShape(ShapeContainer parent){ - super(null, parent); - _escherContainer = createSpContainer(parent instanceof HSLFGroupShape); - } - - /** - * Create a new TextBox. This constructor is used when a new shape is created. - * - */ - public HSLFTextShape(){ - this(null); - } - - public HSLFTextParagraph createTextRun(){ - _txtbox = getEscherTextboxWrapper(); - if(_txtbox == null) _txtbox = new EscherTextboxWrapper(); - - _txtrun = getTextParagraph(); - if(_txtrun == null){ - TextHeaderAtom tha = new TextHeaderAtom(); - tha.setParentRecord(_txtbox); - _txtbox.appendChildRecord(tha); - - TextCharsAtom tca = new TextCharsAtom(); - _txtbox.appendChildRecord(tca); - - StyleTextPropAtom sta = new StyleTextPropAtom(0); - _txtbox.appendChildRecord(sta); - - _txtrun = new HSLFTextParagraph(tha,tca,sta); - _txtrun._records = new Record[]{tha, tca, sta}; - _txtrun.setText(""); - - _escherContainer.addChildRecord(_txtbox.getEscherRecord()); - - setDefaultTextProperties(_txtrun); - } - - return _txtrun; - } - - /** - * Set default properties for the TextRun. - * Depending on the text and shape type the defaults are different: - * TextBox: align=left, valign=top - * AutoShape: align=center, valign=middle - * - */ - protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){ - - } - - /** - * Returns the text contained in this text frame. - * - * @return the text string for this textbox. - */ - public String getText(){ - HSLFTextParagraph tx = getTextParagraph(); - return tx == null ? null : tx.getText(); - } - - /** - * Sets the text contained in this text frame. - * - * @param text the text string used by this object. - */ - public void setText(String text){ - HSLFTextParagraph tx = getTextParagraph(); - if(tx == null){ - tx = createTextRun(); - } - tx.setText(text); - setTextId(text.hashCode()); - } - - /** - * When a textbox is added to a sheet we need to tell upper-level - * PPDrawing about it. - * - * @param sh the sheet we are adding to - */ - protected void afterInsert(HSLFSheet sh){ - super.afterInsert(sh); - - EscherTextboxWrapper _txtbox = getEscherTextboxWrapper(); - if(_txtbox != null){ - PPDrawing ppdrawing = sh.getPPDrawing(); - ppdrawing.addTextboxWrapper(_txtbox); - // Ensure the escher layer knows about the added records - try { - _txtbox.writeOut(null); - } catch (IOException e){ - throw new HSLFException(e); - } - if(getAnchor().equals(new Rectangle()) && !"".equals(getText())) resizeToFitText(); - } - if(_txtrun != null) { - _txtrun.setShapeId(getShapeId()); - sh.onAddTextShape(this); - } - } - - protected EscherTextboxWrapper getEscherTextboxWrapper(){ - if(_txtbox == null){ - EscherTextboxRecord textRecord = getEscherChild(EscherTextboxRecord.RECORD_ID); - if(textRecord != null) _txtbox = new EscherTextboxWrapper(textRecord); - } - return _txtbox; - } - /** - * Adjust the size of the TextShape so it encompasses the text inside it. - * - * @return a Rectangle2D that is the bounds of this TextShape. - */ - public Rectangle2D resizeToFitText(){ - String txt = getText(); - if(txt == null || txt.length() == 0) return new Rectangle2D.Float(); - - HSLFTextRun rt = getTextParagraph().getRichTextRuns()[0]; - int size = rt.getFontSize(); - int style = 0; - if (rt.isBold()) style |= Font.BOLD; - if (rt.isItalic()) style |= Font.ITALIC; - String fntname = rt.getFontName(); - Font font = new Font(fntname, style, size); - - float width = 0, height = 0, leading = 0; - String[] lines = txt.split("\n"); - for (int i = 0; i < lines.length; i++) { - if(lines[i].length() == 0) continue; - - TextLayout layout = new TextLayout(lines[i], font, _frc); - - leading = Math.max(leading, layout.getLeading()); - width = Math.max(width, layout.getAdvance()); - height = Math.max(height, (height + (layout.getDescent() + layout.getAscent()))); - } - - // add one character to width - Rectangle2D charBounds = font.getMaxCharBounds(_frc); - width += getMarginLeft() + getMarginRight() + charBounds.getWidth(); - - // add leading to height - height += getMarginTop() + getMarginBottom() + leading; - - Rectangle2D anchor = getAnchor2D(); - anchor.setRect(anchor.getX(), anchor.getY(), width, height); - setAnchor(anchor); - - return anchor; - } - - /** - * Returns the type of vertical alignment for the text. - * One of the Anchor* constants defined in this class. - * - * @return the type of alignment - */ - public int getVerticalAlignment(){ - EscherOptRecord opt = getEscherOptRecord(); - EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__ANCHORTEXT); - int valign = HSLFTextShape.AnchorTop; - if (prop == null){ - /** - * If vertical alignment was not found in the shape properties then try to - * fetch the master shape and search for the align property there. - */ - int type = getTextParagraph().getRunType(); - HSLFMasterSheet master = getSheet().getMasterSheet(); - if(master != null){ - HSLFTextShape masterShape = master.getPlaceholderByTextType(type); - if(masterShape != null) valign = masterShape.getVerticalAlignment(); - } else { - //not found in the master sheet. Use the hardcoded defaults. - switch (type){ - case TextHeaderAtom.TITLE_TYPE: - case TextHeaderAtom.CENTER_TITLE_TYPE: - valign = HSLFTextShape.AnchorMiddle; - break; - default: - valign = HSLFTextShape.AnchorTop; - break; - } - } - } else { - valign = prop.getPropertyValue(); - } - return valign; - } - - /** - * Sets the type of vertical alignment for the text. - * One of the Anchor* constants defined in this class. - * - * @param align - the type of alignment - */ - public void setVerticalAlignment(int align){ - setEscherProperty(EscherProperties.TEXT__ANCHORTEXT, align); - } - - /** - * Sets the type of horizontal alignment for the text. - * One of the Align* constants defined in this class. - * - * @param align - the type of horizontal alignment - */ - public void setHorizontalAlignment(int align){ - HSLFTextParagraph tx = getTextParagraph(); - if(tx != null) tx.getRichTextRuns()[0].setAlignment(align); - } - - /** - * Gets the type of horizontal alignment for the text. - * One of the Align* constants defined in this class. - * - * @return align - the type of horizontal alignment - */ - public int getHorizontalAlignment(){ - HSLFTextParagraph tx = getTextParagraph(); - return tx == null ? -1 : tx.getRichTextRuns()[0].getAlignment(); - } - - /** - * Returns the distance (in points) between the bottom of the text frame - * and the bottom of the inscribed rectangle of the shape that contains the text. - * Default value is 1/20 inch. - * - * @return the botom margin - */ - public float getMarginBottom(){ - EscherOptRecord opt = getEscherOptRecord(); - EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTBOTTOM); - int val = prop == null ? EMU_PER_INCH/20 : prop.getPropertyValue(); - return (float)val/EMU_PER_POINT; - } - - /** - * Sets the botom margin. - * @see #getMarginBottom() - * - * @param margin the bottom margin - */ - public void setMarginBottom(float margin){ - setEscherProperty(EscherProperties.TEXT__TEXTBOTTOM, (int)(margin*EMU_PER_POINT)); - } - - /** - * Returns the distance (in points) between the left edge of the text frame - * and the left edge of the inscribed rectangle of the shape that contains - * the text. - * Default value is 1/10 inch. - * - * @return the left margin - */ - public float getMarginLeft(){ - EscherOptRecord opt = getEscherOptRecord(); - EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTLEFT); - int val = prop == null ? EMU_PER_INCH/10 : prop.getPropertyValue(); - return (float)val/EMU_PER_POINT; - } - - /** - * Sets the left margin. - * @see #getMarginLeft() - * - * @param margin the left margin - */ - public void setMarginLeft(float margin){ - setEscherProperty(EscherProperties.TEXT__TEXTLEFT, (int)(margin*EMU_PER_POINT)); - } - - /** - * Returns the distance (in points) between the right edge of the - * text frame and the right edge of the inscribed rectangle of the shape - * that contains the text. - * Default value is 1/10 inch. - * - * @return the right margin - */ - public float getMarginRight(){ - EscherOptRecord opt = getEscherOptRecord(); - EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTRIGHT); - int val = prop == null ? EMU_PER_INCH/10 : prop.getPropertyValue(); - return (float)val/EMU_PER_POINT; - } - - /** - * Sets the right margin. - * @see #getMarginRight() - * - * @param margin the right margin - */ - public void setMarginRight(float margin){ - setEscherProperty(EscherProperties.TEXT__TEXTRIGHT, (int)(margin*EMU_PER_POINT)); - } - - /** - * Returns the distance (in points) between the top of the text frame - * and the top of the inscribed rectangle of the shape that contains the text. - * Default value is 1/20 inch. - * - * @return the top margin - */ - public float getMarginTop(){ - EscherOptRecord opt = getEscherOptRecord(); - EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTTOP); - int val = prop == null ? EMU_PER_INCH/20 : prop.getPropertyValue(); - return (float)val/EMU_PER_POINT; - } - - /** - * Sets the top margin. - * @see #getMarginTop() - * - * @param margin the top margin - */ - public void setMarginTop(float margin){ - setEscherProperty(EscherProperties.TEXT__TEXTTOP, (int)(margin*EMU_PER_POINT)); - } - - - /** - * Returns the value indicating word wrap. - * - * @return the value indicating word wrap. - * Must be one of the Wrap* constants defined in this class. - */ - public int getWordWrap(){ - EscherOptRecord opt = getEscherOptRecord(); - EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__WRAPTEXT); - return prop == null ? WrapSquare : prop.getPropertyValue(); - } - - /** - * Specifies how the text should be wrapped - * - * @param wrap the value indicating how the text should be wrapped. - * Must be one of the Wrap* constants defined in this class. - */ - public void setWordWrap(int wrap){ - setEscherProperty(EscherProperties.TEXT__WRAPTEXT, wrap); - } - - /** - * @return id for the text. - */ - public int getTextId(){ - EscherOptRecord opt = getEscherOptRecord(); - EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTID); - return prop == null ? 0 : prop.getPropertyValue(); - } - - /** - * Sets text ID - * - * @param id of the text - */ - public void setTextId(int id){ - setEscherProperty(EscherProperties.TEXT__TEXTID, id); - } - - /** - * @return the TextRun object for this text box - */ - public HSLFTextParagraph getTextParagraph(){ - if (null == this._txtrun) initTextRun(); - if (null == this._txtrun && null != this._txtbox) { - TextHeaderAtom tha = null; - TextBytesAtom tba = null; - TextCharsAtom tca = null; - StyleTextPropAtom sta = null; - Record[] childRecords = this._txtbox.getChildRecords(); - for (Record r : childRecords) { - if (r instanceof TextHeaderAtom) { - tha = (TextHeaderAtom) r; - } else if (r instanceof TextBytesAtom) { - tba = (TextBytesAtom) r; - } else if (r instanceof TextCharsAtom) { - tca = (TextCharsAtom) r; - } else if (r instanceof StyleTextPropAtom) { - sta = (StyleTextPropAtom) r; - } - } - if (tba != null) { - this._txtrun = new HSLFTextParagraph(tha, tba, sta); - } else if (tca != null) { - this._txtrun = new HSLFTextParagraph(tha, tca, sta); - } - } - return _txtrun; - } - - public void setSheet(HSLFSheet sheet) { - _sheet = sheet; - - // Initialize _txtrun object. - // (We can't do it in the constructor because the sheet - // is not assigned then, it's only built once we have - // all the records) - HSLFTextParagraph tx = getTextParagraph(); - if (tx != null) { - // Supply the sheet to our child RichTextRuns - tx.supplySheet(_sheet); - } - } - - protected void initTextRun(){ - EscherTextboxWrapper txtbox = getEscherTextboxWrapper(); - HSLFSheet sheet = getSheet(); - - if(sheet == null || txtbox == null) return; - - OutlineTextRefAtom ota = null; - - Record[] child = txtbox.getChildRecords(); - for (int i = 0; i < child.length; i++) { - if (child[i] instanceof OutlineTextRefAtom) { - ota = (OutlineTextRefAtom)child[i]; - break; - } - } - - HSLFTextParagraph[] runs = _sheet.getTextRuns(); - if (ota != null) { - int idx = ota.getTextIndex(); - for (int i = 0; i < runs.length; i++) { - if(runs[i].getIndex() == idx){ - _txtrun = runs[i]; - break; - } - } - if(_txtrun == null) { - logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx); - } - } else { - EscherSpRecord escherSpRecord = getEscherChild(EscherSpRecord.RECORD_ID); - int shapeId = escherSpRecord.getShapeId(); - if(runs != null) for (int i = 0; i < runs.length; i++) { - if(runs[i].getShapeId() == shapeId){ - _txtrun = runs[i]; - break; - } - } - } - - // ensure the same references child records of TextRun - if(_txtrun != null) { - for (int i = 0; i < child.length; i++) { - for (Record r : _txtrun.getRecords()) { - if (child[i].getRecordType() == r.getRecordType()) { - child[i] = r; - } - } - } - } - } - - public void draw(Graphics2D graphics){ - AffineTransform at = graphics.getTransform(); - ShapePainter.paint(this, graphics); - new TextPainter(this).paint(graphics); - graphics.setTransform(at); - } - - /** - * Return OEPlaceholderAtom, the atom that describes a placeholder. - * - * @return OEPlaceholderAtom or null if not found - */ - public OEPlaceholderAtom getPlaceholderAtom(){ - return getClientDataRecord(RecordTypes.OEPlaceholderAtom.typeID); - } - - /** - * - * Assigns a hyperlink to this text shape - * - * @param linkId id of the hyperlink, @see org.apache.poi.hslf.usermodel.SlideShow#addHyperlink(Hyperlink) - * @param beginIndex the beginning index, inclusive. - * @param endIndex the ending index, exclusive. - * @see org.apache.poi.hslf.usermodel.HSLFSlideShow#addHyperlink(Hyperlink) - */ - public void setHyperlink(int linkId, int beginIndex, int endIndex){ - //TODO validate beginIndex and endIndex and throw IllegalArgumentException - - InteractiveInfo info = new InteractiveInfo(); - InteractiveInfoAtom infoAtom = info.getInteractiveInfoAtom(); - infoAtom.setAction(InteractiveInfoAtom.ACTION_HYPERLINK); - infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_Url); - infoAtom.setHyperlinkID(linkId); - - _txtbox.appendChildRecord(info); - - TxInteractiveInfoAtom txiatom = new TxInteractiveInfoAtom(); - txiatom.setStartIndex(beginIndex); - txiatom.setEndIndex(endIndex); - _txtbox.appendChildRecord(txiatom); - - } - - @Override - public boolean isPlaceholder() { - OEPlaceholderAtom oep = getPlaceholderAtom(); - if (oep != null) return true; - - //special case for files saved in Office 2007 - RoundTripHFPlaceholder12 hldr = getClientDataRecord(RecordTypes.RoundTripHFPlaceholder12.typeID); - if (hldr != null) return true; - - return false; - } - - -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java b/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java index bd3a6da399..63ec3d7a6f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.hslf.record.*; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; /** * Header / Footer settings. @@ -240,7 +240,7 @@ public final class HeadersFooters { private boolean isVisible(int flag, int placeholderId){ boolean visible; if(_ppt2007){ - HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlidesMasters()[0]; + HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlideMasters().get(0); HSLFTextShape placeholder = master.getPlaceholder(placeholderId); visible = placeholder != null && placeholder.getText() != null; } else { @@ -252,7 +252,7 @@ public final class HeadersFooters { private String getPlaceholderText(int placeholderId, CString cs){ String text = null; if(_ppt2007){ - HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlidesMasters()[0]; + HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlideMasters().get(0); HSLFTextShape placeholder = master.getPlaceholder(placeholderId); if(placeholder != null) text = placeholder.getText(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java index b2e0b35884..b28c88ec68 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java @@ -18,6 +18,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; @@ -30,7 +31,7 @@ import java.awt.geom.Line2D; * @author Yegor Kozlov */ public final class Line extends HSLFSimpleShape { - protected Line(EscherContainerRecord escherRecord, ShapeContainer parent){ + public Line(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java index e366fdbe92..27b0000537 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java @@ -24,7 +24,7 @@ import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherProperties; import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.hslf.record.*; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; /** @@ -67,7 +67,7 @@ public final class MovieShape extends HSLFPictureShape { * this picture in the Slide * @param parent the parent shape of this picture */ - protected MovieShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + public MovieShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java index 49ed8c2073..be680bfd81 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java @@ -18,8 +18,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.HSLFObjectData; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hslf.record.ExObjList; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.ExEmbed; @@ -63,7 +62,7 @@ public final class OLEShape extends HSLFPictureShape { * this picture in the Slide * @param parent the parent shape of this picture */ - protected OLEShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + public OLEShape(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java index 47500df2f6..526ccc7dc1 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java @@ -19,19 +19,20 @@ package org.apache.poi.hslf.model; import java.awt.*; -import java.awt.Shape; -import java.awt.font.FontRenderContext; -import java.awt.font.GlyphVector; -import java.awt.font.TextLayout; +import java.awt.font.*; +import java.awt.geom.*; import java.awt.image.*; import java.awt.image.renderable.RenderableImage; -import java.awt.geom.*; import java.text.AttributedCharacterIterator; import java.util.Map; -import org.apache.poi.hslf.usermodel.HSLFTextRun; + import org.apache.poi.hslf.exceptions.HSLFException; -import org.apache.poi.util.POILogger; +import org.apache.poi.hslf.usermodel.*; +import org.apache.poi.sl.usermodel.StrokeStyle; +import org.apache.poi.sl.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; /** * Translates Graphics2D calls into PowerPoint. @@ -251,10 +252,10 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { */ public void drawString(String s, float x, float y) { HSLFTextBox txt = new HSLFTextBox(_group); - txt.getTextParagraph().supplySheet(_group.getSheet()); + txt.getTextParagraphs().get(0).supplySheet(_group.getSheet()); txt.setText(s); - HSLFTextRun rt = txt.getTextParagraph().getRichTextRuns()[0]; + HSLFTextRun rt = txt.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontSize(_font.getSize()); rt.setFontName(_font.getFamily()); @@ -262,13 +263,13 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { if (_font.isBold()) rt.setBold(true); if (_font.isItalic()) rt.setItalic(true); - txt.setMarginBottom(0); - txt.setMarginTop(0); - txt.setMarginLeft(0); - txt.setMarginRight(0); + txt.setBottomInset(0); + txt.setTopInset(0); + txt.setLeftInset(0); + txt.setRightInset(0); txt.setWordWrap(HSLFTextBox.WrapNone); - txt.setHorizontalAlignment(HSLFTextBox.AlignLeft); - txt.setVerticalAlignment(HSLFTextBox.AnchorMiddle); + txt.setHorizontalCentered(false); + txt.setVerticalAlignment(VerticalAlignment.MIDDLE); TextLayout layout = new TextLayout(s, _font, getFontRenderContext()); @@ -1794,7 +1795,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { float[] dash = bs.getDashArray(); if (dash != null) { //TODO: implement more dashing styles - shape.setLineDashing(Line.PEN_DASH); + shape.setLineDashing(StrokeStyle.LineDash.DASH); } } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java index 470f6a4204..78e7a47350 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java @@ -19,6 +19,8 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; import org.apache.poi.hslf.record.OEPlaceholderAtom; +import org.apache.poi.hslf.usermodel.HSLFShape; +import org.apache.poi.hslf.usermodel.HSLFTextBox; import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.sl.usermodel.ShapeContainer; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java index 7bfd95a571..25f93a4e89 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java @@ -18,6 +18,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.LittleEndian; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java deleted file mode 100644 index 52e5a86bb1..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java +++ /dev/null @@ -1,28 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - -/** - * Date: Apr 17, 2008 - * - * @author Yegor Kozlov - */ -public interface ShapeOutline { - java.awt.Shape getOutline(HSLFShape shape); - -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java deleted file mode 100644 index e9686a6120..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java +++ /dev/null @@ -1,105 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.Stroke; -import java.awt.geom.Rectangle2D; - -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; - -/** - * Paint a shape into java.awt.Graphics2D - * - * @author Yegor Kozlov - */ -public final class ShapePainter { - protected static final POILogger logger = POILogFactory.getLogger(ShapePainter.class); - - public static void paint(HSLFSimpleShape shape, Graphics2D graphics){ - Rectangle2D anchor = shape.getLogicalAnchor2D(); - java.awt.Shape outline = shape.getOutline(); - - //flip vertical - if(shape.getFlipVertical()){ - graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight()); - graphics.scale(1, -1); - graphics.translate(-anchor.getX(), -anchor.getY()); - } - //flip horizontal - if(shape.getFlipHorizontal()){ - graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY()); - graphics.scale(-1, 1); - graphics.translate(-anchor.getX() , -anchor.getY()); - } - - //rotate transform - double angle = shape.getRotation(); - - if(angle != 0){ - double centerX = anchor.getX() + anchor.getWidth()/2; - double centerY = anchor.getY() + anchor.getHeight()/2; - - graphics.translate(centerX, centerY); - graphics.rotate(Math.toRadians(angle)); - graphics.translate(-centerX, -centerY); - } - - //fill - Color fillColor = shape.getFill().getForegroundColor(); - if (fillColor != null) { - //TODO: implement gradient and texture fill patterns - graphics.setPaint(fillColor); - graphics.fill(outline); - } - - //border - Color lineColor = shape.getLineColor(); - if (lineColor != null){ - graphics.setPaint(lineColor); - float width = (float)shape.getLineWidth(); - - int dashing = shape.getLineDashing(); - //TODO: implement more dashing styles - float[] dashptrn = null; - switch(dashing){ - case Line.PEN_SOLID: - dashptrn = null; - break; - case Line.PEN_PS_DASH: - dashptrn = new float[]{width, width}; - break; - case Line.PEN_DOTGEL: - dashptrn = new float[]{width*4, width*3}; - break; - default: - logger.log(POILogger.WARN, "unsupported dashing: " + dashing); - dashptrn = new float[]{width, width}; - break; - } - - Stroke stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dashptrn, 0.0f); - graphics.setStroke(stroke); - graphics.draw(outline); - } - } -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java index 99ee13f211..c2cc0ce80b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java @@ -18,6 +18,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.ddf.*; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.util.LittleEndian; @@ -319,9 +320,9 @@ public final class Table extends HSLFGroupShape { private Line cloneBorder(Line line){ Line border = createBorder(); border.setLineWidth(line.getLineWidth()); - border.setLineStyle(line.getStrokeStyle()); border.setLineDashing(line.getLineDashing()); border.setLineColor(line.getLineColor()); + border.setLineCompound(line.getLineCompound()); return border; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java b/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java index 18431a720c..cfdee76633 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java @@ -22,6 +22,8 @@ import java.awt.Rectangle; import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherOptRecord; import org.apache.poi.ddf.EscherProperties; +import org.apache.poi.hslf.usermodel.HSLFShape; +import org.apache.poi.hslf.usermodel.HSLFTextBox; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java deleted file mode 100644 index 038e28a04d..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java +++ /dev/null @@ -1,418 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.font.FontRenderContext; -import java.awt.font.LineBreakMeasurer; -import java.awt.font.TextAttribute; -import java.awt.font.TextLayout; -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.text.AttributedCharacterIterator; -import java.text.AttributedString; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.poi.hslf.record.TextRulerAtom; -import org.apache.poi.hslf.usermodel.HSLFTextRun; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; - -/** - * Paint text into java.awt.Graphics2D - * - * @author Yegor Kozlov - */ -public final class TextPainter { - public static final Key KEY_FONTFALLBACK = new Key(50, "Font fallback map"); - public static final Key KEY_FONTMAP = new Key(51, "Font map"); - - protected POILogger logger = POILogFactory.getLogger(this.getClass()); - - /** - * Display unicode square if a bullet char can't be displayed, - * for example, if Wingdings font is used. - * TODO: map Wingdngs and Symbol to unicode Arial - */ - protected static final char DEFAULT_BULLET_CHAR = '\u25a0'; - - protected HSLFTextShape _shape; - - public TextPainter(HSLFTextShape shape){ - _shape = shape; - } - - public AttributedString getAttributedString(HSLFTextParagraph txrun) { - return getAttributedString(txrun, null); - } - - /** - * Convert the underlying set of rich text runs into java.text.AttributedString - */ - public AttributedString getAttributedString(HSLFTextParagraph txrun, Graphics2D graphics){ - String text = txrun.getText(); - //TODO: properly process tabs - text = text.replace('\t', ' '); - text = text.replace((char)160, ' '); - - AttributedString at = new AttributedString(text); - HSLFTextRun[] rt = txrun.getRichTextRuns(); - for (int i = 0; i < rt.length; i++) { - int start = rt[i].getStartIndex(); - int end = rt[i].getEndIndex(); - if(start == end) { - logger.log(POILogger.INFO, "Skipping RichTextRun with zero length"); - continue; - } - - String mappedFont = rt[i].getFontName(); - String fallbackFont = Font.SANS_SERIF; - if (graphics != null) { - @SuppressWarnings("unchecked") - Map fontMap = (Map)graphics.getRenderingHint(KEY_FONTMAP); - if (fontMap != null && fontMap.containsKey(mappedFont)) { - mappedFont = fontMap.get(mappedFont); - } - @SuppressWarnings("unchecked") - Map fallbackMap = (Map)graphics.getRenderingHint(KEY_FONTFALLBACK); - if (fallbackMap != null && fallbackMap.containsKey(mappedFont)) { - fallbackFont = fallbackMap.get(mappedFont); - } - } - - at.addAttribute(TextAttribute.FAMILY, mappedFont, start, end); - at.addAttribute(TextAttribute.SIZE, new Float(rt[i].getFontSize()), start, end); - at.addAttribute(TextAttribute.FOREGROUND, rt[i].getFontColor(), start, end); - if(rt[i].isBold()) at.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, start, end); - if(rt[i].isItalic()) at.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, start, end); - if(rt[i].isUnderlined()) { - at.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, start, end); - at.addAttribute(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, start, end); - } - if(rt[i].isStrikethrough()) at.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, start, end); - int superScript = rt[i].getSuperscript(); - if(superScript != 0) at.addAttribute(TextAttribute.SUPERSCRIPT, superScript > 0 ? TextAttribute.SUPERSCRIPT_SUPER : TextAttribute.SUPERSCRIPT_SUB, start, end); - - - int style = (rt[i].isBold() ? Font.BOLD : 0) | (rt[i].isItalic() ? Font.ITALIC : 0); - Font f = new Font(mappedFont, style, rt[i].getFontSize()); - - // check for unsupported characters and add a fallback font for these - char textChr[] = text.toCharArray(); - int nextEnd = f.canDisplayUpTo(textChr, start, end); - boolean isNextValid = nextEnd == start; - for (int last = start; nextEnd != -1 && nextEnd <= end; ) { - if (isNextValid) { - nextEnd = f.canDisplayUpTo(textChr, nextEnd, end); - isNextValid = false; - } else { - if (nextEnd >= end || f.canDisplay(Character.codePointAt(textChr, nextEnd, end)) ) { - at.addAttribute(TextAttribute.FAMILY, fallbackFont, last, Math.min(nextEnd,end)); - if (nextEnd >= end) break; - last = nextEnd; - isNextValid = true; - } else { - boolean isHS = Character.isHighSurrogate(textChr[nextEnd]); - nextEnd+=(isHS?2:1); - } - } - } - } - return at; - } - - public void paint(Graphics2D graphics){ - AffineTransform tx = graphics.getTransform(); - - Rectangle2D anchor = _shape.getLogicalAnchor2D(); - TextElement[] elem = getTextElements((float)anchor.getWidth(), graphics.getFontRenderContext(), graphics); - if(elem == null) return; - - float textHeight = 0; - for (int i = 0; i < elem.length; i++) { - textHeight += elem[i].ascent + elem[i].descent; - } - - int valign = _shape.getVerticalAlignment(); - double y0 = anchor.getY(); - switch (valign){ - case HSLFTextShape.AnchorTopBaseline: - case HSLFTextShape.AnchorTop: - y0 += _shape.getMarginTop(); - break; - case HSLFTextShape.AnchorBottom: - y0 += anchor.getHeight() - textHeight - _shape.getMarginBottom(); - break; - default: - case HSLFTextShape.AnchorMiddle: - float delta = (float)anchor.getHeight() - textHeight - _shape.getMarginTop() - _shape.getMarginBottom(); - y0 += _shape.getMarginTop() + delta/2; - break; - } - - - // Transform of text in flipped shapes is special. - // At this point the flip and rotation transform is already applied - // (see XSLFShape#applyTransform ), but we need to restore it to avoid painting "upside down". - // See Bugzilla 54210. - if(_shape.getFlipVertical()){ - graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight()); - graphics.scale(1, -1); - graphics.translate(-anchor.getX(), -anchor.getY()); - - // text in vertically flipped shapes is rotated by 180 degrees - double centerX = anchor.getX() + anchor.getWidth()/2; - double centerY = anchor.getY() + anchor.getHeight()/2; - graphics.translate(centerX, centerY); - graphics.rotate(Math.toRadians(180)); - graphics.translate(-centerX, -centerY); - } - - // Horizontal flipping applies only to shape outline and not to the text in the shape. - // Applying flip second time restores the original not-flipped transform - if(_shape.getFlipHorizontal()){ - graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY()); - graphics.scale(-1, 1); - graphics.translate(-anchor.getX() , -anchor.getY()); - } - - //finally draw the text fragments - for (int i = 0; i < elem.length; i++) { - y0 += elem[i].ascent; - - Point2D.Double pen = new Point2D.Double(); - pen.y = y0; - switch (elem[i]._align) { - default: - case HSLFTextShape.AlignLeft: - pen.x = anchor.getX() + _shape.getMarginLeft(); - break; - case HSLFTextShape.AlignCenter: - pen.x = anchor.getX() + _shape.getMarginLeft() + - (anchor.getWidth() - elem[i].advance - _shape.getMarginLeft() - _shape.getMarginRight()) / 2; - break; - case HSLFTextShape.AlignRight: - pen.x = anchor.getX() + _shape.getMarginLeft() + - (anchor.getWidth() - elem[i].advance - _shape.getMarginLeft() - _shape.getMarginRight()); - break; - } - if(elem[i]._bullet != null){ - graphics.drawString(elem[i]._bullet.getIterator(), (float)(pen.x + elem[i]._bulletOffset), (float)pen.y); - } - AttributedCharacterIterator chIt = elem[i]._text.getIterator(); - if(chIt.getEndIndex() > chIt.getBeginIndex()) { - graphics.drawString(chIt, (float)(pen.x + elem[i]._textOffset), (float)pen.y); - } - y0 += elem[i].descent; - } - - graphics.setTransform(tx); - } - - public TextElement[] getTextElements(float textWidth, FontRenderContext frc){ - return getTextElements(textWidth, frc, null); - } - - public TextElement[] getTextElements(float textWidth, FontRenderContext frc, Graphics2D graphics){ - HSLFTextParagraph run = _shape.getTextParagraph(); - if (run == null) return null; - - String text = run.getText(); - if (text == null || text.equals("")) return null; - - AttributedString at = getAttributedString(run, graphics); - - AttributedCharacterIterator it = at.getIterator(); - int paragraphStart = it.getBeginIndex(); - int paragraphEnd = it.getEndIndex(); - - List lines = new ArrayList(); - LineBreakMeasurer measurer = new LineBreakMeasurer(it, frc); - measurer.setPosition(paragraphStart); - while (measurer.getPosition() < paragraphEnd) { - int startIndex = measurer.getPosition(); - int nextBreak = text.indexOf('\n', measurer.getPosition() + 1); - - boolean prStart = text.charAt(startIndex) == '\n'; - if(prStart) measurer.setPosition(startIndex++); - - HSLFTextRun rt = run.getRichTextRunAt(startIndex == text.length() ? (startIndex-1) : startIndex); - if(rt == null) { - logger.log(POILogger.WARN, "RichTextRun not found at pos" + startIndex + "; text.length: " + text.length()); - break; - } - - float wrappingWidth = textWidth - _shape.getMarginLeft() - _shape.getMarginRight(); - int bulletOffset = rt.getBulletOffset(); - int textOffset = rt.getTextOffset(); - int indent = rt.getIndentLevel(); - - TextRulerAtom ruler = run.getTextRuler(); - if(ruler != null) { - int bullet_val = ruler.getBulletOffsets()[indent]*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; - int text_val = ruler.getTextOffsets()[indent]*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; - if(bullet_val > text_val){ - int a = bullet_val; - bullet_val = text_val; - text_val = a; - } - if(bullet_val != 0 ) bulletOffset = bullet_val; - if(text_val != 0) textOffset = text_val; - } - - if(bulletOffset > 0 || prStart || startIndex == 0) wrappingWidth -= textOffset; - - if (_shape.getWordWrap() == HSLFTextShape.WrapNone) { - wrappingWidth = _shape.getSheet().getSlideShow().getPageSize().width; - } - - TextLayout textLayout = measurer.nextLayout(wrappingWidth + 1, - nextBreak == -1 ? paragraphEnd : nextBreak, true); - if (textLayout == null) { - textLayout = measurer.nextLayout(textWidth, - nextBreak == -1 ? paragraphEnd : nextBreak, false); - } - if(textLayout == null){ - logger.log(POILogger.WARN, "Failed to break text into lines: wrappingWidth: "+wrappingWidth+ - "; text: " + rt.getText()); - measurer.setPosition(rt.getEndIndex()); - continue; - } - int endIndex = measurer.getPosition(); - - float lineHeight = (float)textLayout.getBounds().getHeight(); - int linespacing = rt.getLineSpacing(); - if(linespacing == 0) linespacing = 100; - - TextElement el = new TextElement(); - if(linespacing >= 0){ - el.ascent = textLayout.getAscent()*linespacing/100; - } else { - el.ascent = -linespacing*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; - } - - el._align = rt.getAlignment(); - el.advance = textLayout.getAdvance(); - el._textOffset = textOffset; - el._text = new AttributedString(it, startIndex, endIndex); - el.textStartIndex = startIndex; - el.textEndIndex = endIndex; - - if (prStart){ - int sp = rt.getSpaceBefore(); - float spaceBefore; - if(sp >= 0){ - spaceBefore = lineHeight * sp/100; - } else { - spaceBefore = -sp*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; - } - el.ascent += spaceBefore; - } - - float descent; - if(linespacing >= 0){ - descent = (textLayout.getDescent() + textLayout.getLeading())*linespacing/100; - } else { - descent = -linespacing*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; - } - if (prStart){ - int sp = rt.getSpaceAfter(); - float spaceAfter; - if(sp >= 0){ - spaceAfter = lineHeight * sp/100; - } else { - spaceAfter = -sp*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; - } - el.ascent += spaceAfter; - } - el.descent = descent; - - if(rt.isBullet() && (prStart || startIndex == 0)){ - it.setIndex(startIndex); - - AttributedString bat = new AttributedString(Character.toString(rt.getBulletChar())); - Color clr = rt.getBulletColor(); - if (clr != null) bat.addAttribute(TextAttribute.FOREGROUND, clr); - else bat.addAttribute(TextAttribute.FOREGROUND, it.getAttribute(TextAttribute.FOREGROUND)); - - int fontIdx = rt.getBulletFont(); - if(fontIdx == -1) fontIdx = rt.getFontIndex(); - PPFont bulletFont = _shape.getSheet().getSlideShow().getFont(fontIdx); - bat.addAttribute(TextAttribute.FAMILY, bulletFont.getFontName()); - - int bulletSize = rt.getBulletSize(); - int fontSize = rt.getFontSize(); - if(bulletSize != -1) fontSize = Math.round(fontSize*bulletSize*0.01f); - bat.addAttribute(TextAttribute.SIZE, new Float(fontSize)); - - if(!new Font(bulletFont.getFontName(), Font.PLAIN, 1).canDisplay(rt.getBulletChar())){ - bat.addAttribute(TextAttribute.FAMILY, "Arial"); - bat = new AttributedString("" + DEFAULT_BULLET_CHAR, bat.getIterator().getAttributes()); - } - - if(text.substring(startIndex, endIndex).length() > 1){ - el._bullet = bat; - el._bulletOffset = bulletOffset; - } - } - lines.add(el); - } - - //finally draw the text fragments - TextElement[] elems = new TextElement[lines.size()]; - return lines.toArray(elems); - } - - public static class TextElement { - public AttributedString _text; - public int _textOffset; - public AttributedString _bullet; - public int _bulletOffset; - public int _align; - public float ascent, descent; - public float advance; - public int textStartIndex, textEndIndex; - } - - public static class Key extends RenderingHints.Key { - String description; - - public Key(int paramInt, String paramString) { - super(paramInt); - this.description = paramString; - } - - public final int getIndex() { - return intKey(); - } - - public final String toString() { - return this.description; - } - - public boolean isCompatibleValue(Object paramObject) { - return true; - } - } -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java index cf25eb6cd1..0f8bab418c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java @@ -24,7 +24,7 @@ package org.apache.poi.hslf.model.textproperties; * of the property is itself a mask, encoding several different * (but related) properties */ -public class BitMaskTextProp extends TextProp implements Cloneable { +public abstract class BitMaskTextProp extends TextProp implements Cloneable { private String[] subPropNames; private int[] subPropMasks; private boolean[] subPropMatches; @@ -91,7 +91,8 @@ public class BitMaskTextProp extends TextProp implements Cloneable { subPropMatches[idx] = value; } - public Object clone(){ + @Override + public BitMaskTextProp clone(){ BitMaskTextProp newObj = (BitMaskTextProp)super.clone(); // Don't carry over matches, but keep everything diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java index 662833203f..40adf46d8f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java @@ -41,7 +41,7 @@ public class IndentProp { public int getCharactersCovered() { return charactersCovered; } public int getIndentLevel() { - return (int)indentLevel; + return indentLevel; } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java new file mode 100644 index 0000000000..786b373382 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java @@ -0,0 +1,113 @@ +/* ==================================================================== + 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.hslf.model.textproperties; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianConsts; + +/** + * Container for tabstop lists + */ +public class TabStopPropCollection extends TextProp { + public enum TabStopType { + LEFT(0), CENTER(1), RIGHT(2), DECIMAL(3); + private final int val; + TabStopType(int val) { + this.val = val; + } + public static TabStopType fromRecordVal(int val) { + for (TabStopType tst : values()) { + if (tst.val == val) return tst; + } + return LEFT; + } + } + + public static class TabStop { + /** + * If the TextPFException record that contains this TabStop structure also contains a + * leftMargin, then the value of position is relative to the left margin of the paragraph; + * otherwise, the value is relative to the left side of the paragraph. + * + * If a TextRuler record contains this TabStop structure, the value is relative to the + * left side of the text ruler. + */ + private int position; + + /** + * A enumeration that specifies how text aligns at the tab stop. + */ + private TabStopType type; + + public TabStop(int position, TabStopType type) { + this.position = position; + this.type = type; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public TabStopType getType() { + return type; + } + + public void setType(TabStopType type) { + this.type = type; + } + } + + private List tabStops = new ArrayList(); + + public TabStopPropCollection() { + super(0, 0x100000, "tabStops"); + } + + /** + * Parses the tabstops from TxMasterStyle record + * + * @param data the data stream + * @param offset the offset within the data + * @return the new offset + */ + public void parseProperty(byte data[], int offset) { + int count = LittleEndian.getUShort(data, offset); + offset += LittleEndianConsts.SHORT_SIZE; + for (int i=0; i textPropList; + private List textPropList; private int maskSpecial = 0; public int getSpecialMask() { return maskSpecial; } @@ -41,7 +41,7 @@ public class TextPropCollection { /** Fetch the number of characters this styling applies to */ public int getCharactersCovered() { return charactersCovered; } /** Fetch the TextProps that define this styling */ - public LinkedList getTextPropList() { return textPropList; } + public List getTextPropList() { return textPropList; } /** Fetch the TextProp with this name, or null if it isn't present */ public TextProp findByName(String textPropName) { @@ -73,7 +73,7 @@ public class TextPropCollection { } // Add a copy of this property, in the right place to the list - TextProp textProp = (TextProp)base.clone(); + TextProp textProp = base.clone(); int pos = 0; for(int i=0; i= data.length) { // Out of data, can't be any more properties to go // remember the mask and return - maskSpecial |= potentialProperties[i].getMask(); + maskSpecial |= tp.getMask(); return bytesPassed; } // Bingo, data contains this property - TextProp prop = (TextProp)potentialProperties[i].clone(); + TextProp prop = tp.clone(); int val = 0; - if(prop.getSize() == 2) { + if (prop instanceof TabStopPropCollection) { + ((TabStopPropCollection)prop).parseProperty(data, dataOffset+bytesPassed); + } else if (prop.getSize() == 2) { val = LittleEndian.getShort(data,dataOffset+bytesPassed); - } else if(prop.getSize() == 4){ + } else if(prop.getSize() == 4) { val = LittleEndian.getInt(data,dataOffset+bytesPassed); - } else if (prop.getSize() == 0){ + } else if (prop.getSize() == 0) { //remember "special" bits. - maskSpecial |= potentialProperties[i].getMask(); + maskSpecial |= tp.getMask(); continue; } prop.setValue(val); @@ -137,7 +139,7 @@ public class TextPropCollection { public TextPropCollection(int charactersCovered, short reservedField) { this.charactersCovered = charactersCovered; this.reservedField = reservedField; - textPropList = new LinkedList(); + textPropList = new ArrayList(); } /** @@ -147,7 +149,27 @@ public class TextPropCollection { public TextPropCollection(int textSize) { charactersCovered = textSize; reservedField = -1; - textPropList = new LinkedList(); + textPropList = new ArrayList(); + } + + /** + * Clones the given text properties + */ + public void copy(TextPropCollection other) { + this.charactersCovered = other.charactersCovered; + this.reservedField = other.reservedField; + this.textPropList.clear(); + for (TextProp tp : other.textPropList) { + TextProp tpCopy = tp.clone(); + if (tpCopy instanceof BitMaskTextProp) { + BitMaskTextProp bmt = (BitMaskTextProp)tpCopy; + boolean matches[] = ((BitMaskTextProp)tp).getSubPropMatches(); + for (int i=0; i m = new HashMap(); + for (TextProp tp : o.textPropList) { + m.put(tp.getName(), tp); + } + + for (TextProp tp : this.textPropList) { + TextProp otp = m.get(tp.getName()); + if (!tp.equals(otp)) return false; + } + + return true; + } + } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java index 3d99e0a716..a306058341 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java @@ -273,8 +273,8 @@ public final class RecordTypes { * offers methods to get either back out. */ public static class Type { - public int typeID; - public Class handlingClass; + public final int typeID; + public final Class handlingClass; public Type(int typeID, Class handlingClass) { this.typeID = typeID; this.handlingClass = handlingClass; diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java index 5730021c90..4e0654a8a6 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java @@ -22,11 +22,7 @@ import java.io.IOException; import java.io.OutputStream; import java.util.LinkedList; -import org.apache.poi.hslf.model.textproperties.AlignmentTextProp; -import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; -import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp; -import org.apache.poi.hslf.model.textproperties.TextProp; -import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.hslf.model.textproperties.*; import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.POILogger; @@ -51,7 +47,7 @@ import org.apache.poi.util.POILogger; public final class StyleTextPropAtom extends RecordAtom { private byte[] _header; - private static long _type = 4001l; + private static final long _type = RecordTypes.StyleTextPropAtom.typeID; private byte[] reserved; private byte[] rawContents; // Holds the contents between write-outs @@ -118,7 +114,9 @@ public final class StyleTextPropAtom extends RecordAtom } /** All the different kinds of paragraph properties we might handle */ - public static final TextProp[] paragraphTextPropTypes = new TextProp[] { + public static final TextProp[] paragraphTextPropTypes = { + // TextProp order is according to 2.9.20 TextPFException, + // bitmask order can be different new TextProp(0, 0x1, "hasBullet"), new TextProp(0, 0x2, "hasBulletFont"), new TextProp(0, 0x4, "hasBulletColor"), @@ -129,16 +127,22 @@ public final class StyleTextPropAtom extends RecordAtom new TextProp(2, 0x40, "bullet.size"), new TextProp(4, 0x20, "bullet.color"), new AlignmentTextProp(), - new TextProp(2, 0x100, "text.offset"), - new TextProp(2, 0x400, "bullet.offset"), new TextProp(2, 0x1000, "linespacing"), new TextProp(2, 0x2000, "spacebefore"), new TextProp(2, 0x4000, "spaceafter"), + new TextProp(2, 0x100, "text.offset"), // left margin + // 0x200 - Undefined and MUST be ignored + new TextProp(2, 0x400, "bullet.offset"), // indent new TextProp(2, 0x8000, "defaultTabSize"), - new TextProp(2, 0x100000, "tabStops"), + new TabStopPropCollection(), // tabstops size is variable! new TextProp(2, 0x10000, "fontAlign"), - new TextProp(2, 0xA0000, "wrapFlags"), - new TextProp(2, 0x200000, "textDirection") + new TextProp(2, 0xE0000, "wrapFlags"), // charWrap | wordWrap | overflow + new TextProp(2, 0x200000, "textDirection"), + // 0x400000 MUST be zero and MUST be ignored + new TextProp(0, 0x800000, "bullet.blip"), // TODO: check size + new TextProp(0, 0x1000000, "bullet.scheme"), // TODO: check size + new TextProp(0, 0x2000000, "hasBulletScheme"), // TODO: check size + // 0xFC000000 MUST be zero and MUST be ignored }; /** All the different kinds of character properties we might handle */ public static final TextProp[] characterTextPropTypes = new TextProp[] { @@ -391,6 +395,14 @@ public final class StyleTextPropAtom extends RecordAtom initialised = false; } + /** + * Clear styles, so new collections can be added + */ + public void clearStyles() { + paragraphStyles.clear(); + charStyles.clear(); + } + /** * Create a new Paragraph TextPropCollection, and add it to the list * @param charactersCovered The number of characters this TextPropCollection will cover diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java index b793613764..a576146d09 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java @@ -35,7 +35,7 @@ import java.io.OutputStream; public final class TextBytesAtom extends RecordAtom { private byte[] _header; - private static long _type = 4008l; + private static long _type = RecordTypes.TextBytesAtom.typeID; /** The bytes that make up the text */ private byte[] _text; diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java index e279af060d..3449250ada 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java @@ -33,7 +33,7 @@ import java.io.OutputStream; public final class TextCharsAtom extends RecordAtom { private byte[] _header; - private static long _type = 4000l; + private static long _type = RecordTypes.TextCharsAtom.typeID; /** The bytes that make up the text */ private byte[] _text; diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextHeaderAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextHeaderAtom.java index d19a6c1c01..a63d8934d5 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TextHeaderAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextHeaderAtom.java @@ -32,7 +32,7 @@ import java.io.OutputStream; public final class TextHeaderAtom extends RecordAtom implements ParentAwareRecord { private byte[] _header; - private static long _type = 3999l; + private static long _type = RecordTypes.TextHeaderAtom.typeID; private RecordContainer parentRecord; public static final int TITLE_TYPE = 0; @@ -46,9 +46,21 @@ public final class TextHeaderAtom extends RecordAtom implements ParentAwareRecor /** The kind of text it is */ private int textType; + /** position in the owning SlideListWithText */ + private int index = -1; public int getTextType() { return textType; } public void setTextType(int type) { textType = type; } + + /** + * @return 0-based index of the text run in the SLWT container + */ + public int getIndex() { return index; } + + /** + * @param id 0-based index of the text run in the SLWT container + */ + public void setIndex(int index) { this.index = index; } public RecordContainer getParentRecord() { return parentRecord; } public void setParentRecord(RecordContainer record) { this.parentRecord = record; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoAtom.java index f1452bcf58..a3624678a0 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoAtom.java @@ -30,6 +30,8 @@ import java.util.ArrayList; * @author Yegor Kozlov */ public final class TextSpecInfoAtom extends RecordAtom { + private static final long _type = RecordTypes.TextSpecInfoAtom.typeID; + /** * Record header. */ @@ -62,7 +64,7 @@ public final class TextSpecInfoAtom extends RecordAtom { * Gets the record type. * @return the record type. */ - public long getRecordType() { return RecordTypes.TextSpecInfoAtom.typeID; } + public long getRecordType() { return _type; } /** * Write the contents of the record back, so it can be written diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java index 966c8eb8e3..4037d11e44 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java @@ -48,6 +48,37 @@ public final class TxMasterStyleAtom extends RecordAtom { */ public static final int MAX_INDENT = 5; +/* + private static TextProp paragraphSpecialPropTypes[] = { + new ParagraphFlagsTextProp(), + new TextProp(2, 0x80, "bullet.char"), + new TextProp(2, 0x10, "bullet.font"), + new TextProp(2, 0x40, "bullet.size"), + new TextProp(4, 0x20, "bullet.color"), + new TextProp(2, 0xD00, "alignment"), + new TextProp(2, 0x1000, "linespacing"), + new TextProp(2, 0x2000, "spacebefore"), + new TextProp(2, 0x4000, "spaceafter"), + new TextProp(2, 0x8000, "text.offset"), + new TextProp(2, 0x10000, "bullet.offset"), + new TextProp(2, 0x20000, "defaulttab"), + new TextProp(2, 0x40000, "para_unknown_2"), + new TextProp(2, 0x80000, "para_unknown_3"), + new TextProp(2, 0x100000, "para_unknown_4"), + new TextProp(2, 0x200000, "para_unknown_5") + }; + + private static TextProp characterSpecialPropTypes[] = { + new CharFlagsTextProp(), + new TextProp(2, 0x10000, "font.index"), + new TextProp(2, 0x20000, "char_unknown_1"), + new TextProp(4, 0x40000, "char_unknown_2"), + new TextProp(2, 0x80000, "font.size"), + new TextProp(2, 0x100000, "char_unknown_3"), + new TextProp(4, 0x200000, "font.color"), + new TextProp(2, 0x800000, "char_unknown_4") + }; +*/ private byte[] _header; private static long _type = 4003; private byte[] _data; @@ -126,6 +157,7 @@ public final class TxMasterStyleAtom extends RecordAtom { /** * parse the record data and initialize styles */ + @SuppressWarnings("unused") protected void init(){ //type of the text int type = getTextType(); @@ -170,28 +202,10 @@ public final class TxMasterStyleAtom extends RecordAtom { * ones, or the standard StyleTextPropAtom ones */ protected TextProp[] getParagraphProps(int type, int level){ - if (level != 0 || type >= MAX_INDENT){ - return StyleTextPropAtom.paragraphTextPropTypes; - } - return new TextProp[] { - new ParagraphFlagsTextProp(), - new TextProp(2, 0x80, "bullet.char"), - new TextProp(2, 0x10, "bullet.font"), - new TextProp(2, 0x40, "bullet.size"), - new TextProp(4, 0x20, "bullet.color"), - new TextProp(2, 0xD00, "alignment"), - new TextProp(2, 0x1000, "linespacing"), - new TextProp(2, 0x2000, "spacebefore"), - new TextProp(2, 0x4000, "spaceafter"), - new TextProp(2, 0x8000, "text.offset"), - new TextProp(2, 0x10000, "bullet.offset"), - new TextProp(2, 0x20000, "defaulttab"), - new TextProp(2, 0x40000, "para_unknown_2"), - new TextProp(2, 0x80000, "para_unknown_3"), - new TextProp(2, 0x100000, "para_unknown_4"), - new TextProp(2, 0x200000, "para_unknown_5") - }; - + return StyleTextPropAtom.paragraphTextPropTypes; +// return (level != 0 || type >= MAX_INDENT) +// ? StyleTextPropAtom.paragraphTextPropTypes +// : paragraphSpecialPropTypes; } /** @@ -201,18 +215,9 @@ public final class TxMasterStyleAtom extends RecordAtom { * ones, or the standard StyleTextPropAtom ones */ protected TextProp[] getCharacterProps(int type, int level){ - if (level != 0 || type >= MAX_INDENT){ - return StyleTextPropAtom.characterTextPropTypes; - } - return new TextProp[] { - new CharFlagsTextProp(), - new TextProp(2, 0x10000, "font.index"), - new TextProp(2, 0x20000, "char_unknown_1"), - new TextProp(4, 0x40000, "char_unknown_2"), - new TextProp(2, 0x80000, "font.size"), - new TextProp(2, 0x100000, "char_unknown_3"), - new TextProp(4, 0x200000, "font.color"), - new TextProp(2, 0x800000, "char_unknown_4") - }; + return StyleTextPropAtom.characterTextPropTypes; +// return (level != 0 || type >= MAX_INDENT) +// ? StyleTextPropAtom.characterTextPropTypes +// : characterSpecialPropTypes; } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFAutoShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java similarity index 83% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFAutoShape.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java index 1f74f2ceb5..ceb655250c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFAutoShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java @@ -15,16 +15,12 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; -import org.apache.poi.ddf.*; -import org.apache.poi.sl.draw.geom.CustomGeometry; -import org.apache.poi.sl.draw.geom.Guide; +import org.apache.poi.ddf.EscherContainerRecord; +import org.apache.poi.ddf.EscherProperties; import org.apache.poi.sl.usermodel.*; -import org.apache.poi.util.POILogger; - -import java.awt.geom.Rectangle2D; -import java.util.Iterator; +import org.apache.poi.ss.usermodel.ShapeTypes; /** * Represents an AutoShape. @@ -69,8 +65,8 @@ public class HSLFAutoShape extends HSLFTextShape implements AutoShape shapeList = getShapeList(); - HSLFShape[] shapes = shapeList.toArray(new HSLFShape[shapeList.size()]); - return shapes; + @Override + public List getShapes() { + return getShapeList(); } /** @@ -196,11 +183,11 @@ public class HSLFGroupShape extends HSLFShape implements ShapeContainernull. */ - public Hyperlink getHyperlink(){ + public HSLFHyperlink getHyperlink(){ return null; } - public void draw(Graphics2D graphics){ - - AffineTransform at = graphics.getTransform(); - - HSLFShape[] sh = getShapes(); - for (int i = 0; i < sh.length; i++) { - sh[i].draw(graphics); - } - - graphics.setTransform(at); - } - @Override public T getEscherChild(int recordId){ EscherContainerRecord groupInfoContainer = (EscherContainerRecord)_escherContainer.getChild(0); @@ -298,7 +273,7 @@ public class HSLFGroupShape extends HSLFShape implements ShapeContainerTextRun to lookup hyperlinks in + * @param shape TextRun to lookup hyperlinks in * @return found hyperlinks or null if not found */ - protected static Hyperlink[] find(HSLFTextParagraph run){ - List lst = new ArrayList(); - HSLFSlideShow ppt = run.getSheet().getSlideShow(); + public static HSLFHyperlink[] find(HSLFTextShape shape){ + List lst = new ArrayList(); + HSLFSlideShow ppt = shape.getSheet().getSlideShow(); //document-level container which stores info about all links in a presentation ExObjList exobj = ppt.getDocumentRecord().getExObjList(); if (exobj == null) { return null; } - Record[] records = run._records; - if(records != null) find(records, exobj, lst); + + Record[] records = shape.getClientRecords(); + find(records, exobj, lst); - Hyperlink[] links = null; + HSLFHyperlink[] links = null; if (lst.size() > 0){ - links = new Hyperlink[lst.size()]; + links = new HSLFHyperlink[lst.size()]; + lst.toArray(links); + } + return links; + } + + /** + * Find hyperlinks in a text paragraph + * + * @param paragraph TextParagraph to lookup hyperlinks in + * @return found hyperlinks or null if not found + */ + public static HSLFHyperlink[] find(HSLFTextParagraph paragraph){ + List lst = new ArrayList(); + HSLFSlideShow ppt = paragraph.getSheet().getSlideShow(); + //document-level container which stores info about all links in a presentation + ExObjList exobj = ppt.getDocumentRecord().getExObjList(); + if (exobj == null) { + return null; + } + + Record[] records = paragraph.getRecords(); + find(records, exobj, lst); + + HSLFHyperlink[] links = null; + if (lst.size() > 0){ + links = new HSLFHyperlink[lst.size()]; lst.toArray(links); } return links; @@ -176,8 +198,8 @@ public final class Hyperlink { * @param shape Shape to lookup hyperlink in * @return found hyperlink or null */ - protected static Hyperlink find(HSLFShape shape){ - List lst = new ArrayList(); + public static HSLFHyperlink find(HSLFShape shape){ + List lst = new ArrayList(); HSLFSlideShow ppt = shape.getSheet().getSlideShow(); //document-level container which stores info about all links in a presentation ExObjList exobj = ppt.getDocumentRecord().getExObjList(); @@ -191,14 +213,15 @@ public final class Hyperlink { if (obj.getRecordId() == EscherClientDataRecord.RECORD_ID){ byte[] data = obj.serialize(); Record[] records = Record.findChildRecords(data, 8, data.length-8); - if(records != null) find(records, exobj, lst); + find(records, exobj, lst); } } - return lst.size() == 1 ? (Hyperlink)lst.get(0) : null; + return lst.size() == 1 ? (HSLFHyperlink)lst.get(0) : null; } - private static void find(Record[] records, ExObjList exobj, List out){ + private static void find(Record[] records, ExObjList exobj, List out){ + if (records == null) return; for (int i = 0; i < records.length; i++) { //see if we have InteractiveInfo in the textrun's records if( records[i] instanceof InteractiveInfo){ @@ -207,7 +230,7 @@ public final class Hyperlink { int id = info.getHyperlinkID(); ExHyperlink linkRecord = exobj.get(id); if (linkRecord != null){ - Hyperlink link = new Hyperlink(); + HSLFHyperlink link = new HSLFHyperlink(); link.title = linkRecord.getLinkTitle(); link.address = linkRecord.getLinkURL(); link.type = info.getAction(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFMasterSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFMasterSheet.java similarity index 96% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFMasterSheet.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFMasterSheet.java index 6c7574b8a7..974a858616 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFMasterSheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFMasterSheet.java @@ -15,10 +15,9 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import org.apache.poi.hslf.record.SheetContainer; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hslf.model.textproperties.TextProp; import org.apache.poi.sl.usermodel.MasterSheet; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFNotes.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFNotes.java similarity index 73% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFNotes.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFNotes.java index 2a7698d21c..50eb3a6db2 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFNotes.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFNotes.java @@ -15,13 +15,14 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.Notes; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; /** * This class represents a slide's notes in a PowerPoint Document. It @@ -32,7 +33,9 @@ import org.apache.poi.sl.usermodel.Notes; */ public final class HSLFNotes extends HSLFSheet implements Notes { - private HSLFTextParagraph[] _runs; + protected static POILogger logger = POILogFactory.getLogger(HSLFNotes.class); + + private List> _runs; /** * Constructs a Notes Sheet from the given Notes record. @@ -46,26 +49,27 @@ public final class HSLFNotes extends HSLFSheet implements Notes ltp : _runs) { + for (HSLFTextParagraph tp : ltp) { + tp.supplySheet(this); + } } } /** - * Returns an array of all the TextRuns found + * Returns an array of all the TextParagraphs found */ - public HSLFTextParagraph[] getTextRuns() { + @Override + public List> getTextParagraphs() { return _runs; } - @Override - public List getTextParagraphs() { - return Arrays.asList(_runs); - } - /** * Return null - Notes Masters are not yet supported */ diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java index 9d9b0dc594..b848a2cb9b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java @@ -30,7 +30,6 @@ import org.apache.poi.hslf.blip.JPEG; import org.apache.poi.hslf.blip.PICT; import org.apache.poi.hslf.blip.PNG; import org.apache.poi.hslf.blip.WMF; -import org.apache.poi.hslf.model.HSLFPictureShape; import org.apache.poi.poifs.crypt.CryptoFunctions; import org.apache.poi.poifs.crypt.HashAlgorithm; import org.apache.poi.util.LittleEndian; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFPictureShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java similarity index 90% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFPictureShape.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java index e6b72a60fb..c97c281680 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFPictureShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java @@ -15,11 +15,9 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; -import java.awt.Graphics2D; import java.awt.Insets; -import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -27,23 +25,12 @@ import java.util.List; import javax.imageio.ImageIO; -import org.apache.poi.ddf.EscherBSERecord; -import org.apache.poi.ddf.EscherComplexProperty; -import org.apache.poi.ddf.EscherContainerRecord; -import org.apache.poi.ddf.EscherOptRecord; -import org.apache.poi.ddf.EscherProperties; -import org.apache.poi.ddf.EscherRecord; -import org.apache.poi.ddf.EscherSimpleProperty; -import org.apache.poi.ddf.EscherSpRecord; +import org.apache.poi.ddf.*; import org.apache.poi.hslf.blip.Bitmap; import org.apache.poi.hslf.record.Document; -import org.apache.poi.hslf.usermodel.HSLFPictureData; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; -import org.apache.poi.util.POILogger; -import org.apache.poi.util.StringUtil; -import org.apache.poi.util.Units; +import org.apache.poi.util.*; /** @@ -259,16 +246,6 @@ public class HSLFPictureShape extends HSLFSimpleShape { } } - public void draw(Graphics2D graphics){ - AffineTransform at = graphics.getTransform(); - ShapePainter.paint(this, graphics); - - HSLFPictureData data = getPictureData(); - if(data != null) data.draw(graphics, this); - - graphics.setTransform(at); - } - /** * Returns the clipping values as percent ratio relatively to the image size. * The anchor specified by {@link #getLogicalAnchor2D()} is the displayed size, diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java similarity index 99% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java index 4e2229982e..adb61e6d9e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java @@ -15,7 +15,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import java.awt.Color; import java.awt.Graphics2D; @@ -466,8 +466,8 @@ public abstract class HSLFShape implements Shape { * @return the hyperlink assigned to this shape * or null if not found. */ - public Hyperlink getHyperlink(){ - return Hyperlink.find(this); + public HSLFHyperlink getHyperlink(){ + return HSLFHyperlink.find(this); } public void draw(Graphics2D graphics){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java similarity index 94% rename from src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java index d21cf9dd2b..0f9dd2815e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java @@ -15,7 +15,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import java.util.Iterator; import java.util.List; @@ -29,11 +29,13 @@ import org.apache.poi.ddf.EscherPropertyFactory; import org.apache.poi.ddf.EscherRecord; import org.apache.poi.ddf.EscherSimpleProperty; import org.apache.poi.ddf.EscherSpRecord; +import org.apache.poi.hslf.model.*; import org.apache.poi.hslf.record.InteractiveInfo; import org.apache.poi.hslf.record.InteractiveInfoAtom; import org.apache.poi.hslf.record.OEShapeAtom; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.POILogFactory; @@ -44,9 +46,9 @@ import org.apache.poi.util.POILogger; * * @author Yegor Kozlov */ -public final class ShapeFactory { +public final class HSLFShapeFactory { // For logging - protected static final POILogger logger = POILogFactory.getLogger(ShapeFactory.class); + protected static final POILogger logger = POILogFactory.getLogger(HSLFShapeFactory.class); /** * Create a new shape from the data provided. @@ -55,7 +57,7 @@ public final class ShapeFactory { if (spContainer.getRecordId() == EscherContainerRecord.SPGR_CONTAINER){ return createShapeGroup(spContainer, parent); } - return createSimpeShape(spContainer, parent); + return createSimpleShape(spContainer, parent); } public static HSLFGroupShape createShapeGroup(EscherContainerRecord spContainer, ShapeContainer parent){ @@ -82,7 +84,7 @@ public final class ShapeFactory { return group; } - public static HSLFShape createSimpeShape(EscherContainerRecord spContainer, ShapeContainer parent){ + public static HSLFShape createSimpleShape(EscherContainerRecord spContainer, ShapeContainer parent){ HSLFShape shape = null; EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java similarity index 64% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFSheet.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java index 5156f37b60..e5b704b777 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java @@ -15,14 +15,13 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import java.awt.Graphics2D; import java.util.*; import org.apache.poi.ddf.*; import org.apache.poi.hslf.record.*; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.Sheet; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -66,7 +65,7 @@ public abstract class HSLFSheet implements Sheet { /** * Returns an array of all the TextRuns in the sheet. */ - public abstract HSLFTextParagraph[] getTextRuns(); + public abstract List> getTextParagraphs(); /** * Returns the (internal, RefID based) sheet number, as used @@ -87,7 +86,7 @@ public abstract class HSLFSheet implements Sheet { /** * Fetch the PPDrawing from the underlying record */ - protected PPDrawing getPPDrawing() { + public PPDrawing getPPDrawing() { return _container.getPPDrawing(); } @@ -111,147 +110,24 @@ public abstract class HSLFSheet implements Sheet { */ public void setSlideShow(HSLFSlideShow ss) { _slideShow = ss; - HSLFTextParagraph[] trs = getTextRuns(); + List> trs = getTextParagraphs(); if (trs == null) return; - for (HSLFTextParagraph tp : trs) { - tp.supplySheet(this); - } - } - - - /** - * For a given PPDrawing, grab all the TextRuns - */ - public static HSLFTextParagraph[] findTextRuns(PPDrawing ppdrawing) { - final List runsV = new ArrayList(); - final EscherTextboxWrapper[] wrappers = ppdrawing.getTextboxWrappers(); - for (int i = 0; i < wrappers.length; i++) { - int s1 = runsV.size(); - - // propagate parents to parent-aware records - RecordContainer.handleParentAwareRecords(wrappers[i]); - findTextRuns(wrappers[i], runsV); - int s2 = runsV.size(); - if (s2 != s1){ - HSLFTextParagraph t = runsV.get(runsV.size()-1); - t.setShapeId(wrappers[i].getShapeId()); - } - } - return runsV.toArray(new HSLFTextParagraph[runsV.size()]); - } - /** - * Scans through the supplied record array, looking for - * a TextHeaderAtom followed by one of a TextBytesAtom or - * a TextCharsAtom. Builds up TextRuns from these - * - * @param records the records to build from - * @param found vector to add any found to - */ - protected static void findTextParagraphs(final Record[] records, final List found) { - findTextRuns(records, found, null); - } - /** - * Scans through the supplied record array, looking for - * a TextHeaderAtom followed by one of a TextBytesAtom or - * a TextCharsAtom. Builds up TextRuns from these - * - * @param wrapper an EscherTextboxWrapper - * @param found vector to add any found to - */ - protected static void findTextRuns(final EscherTextboxWrapper wrapper, final List found) { - findTextRuns(wrapper.getChildRecords(), found, wrapper.getStyleTextProp9Atom()); - } - /** - * Scans through the supplied record array, looking for - * a TextHeaderAtom followed by one of a TextBytesAtom or - * a TextCharsAtom. Builds up TextRuns from these - * - * @param records the records to build from - * @param found vector to add any found to - * @param styleTextProp9Atom a StyleTextProp9Atom with numbered lists info - */ - protected static void findTextRuns(final Record[] records, final List found, final StyleTextProp9Atom styleTextProp9Atom) { - for (int i = 0, slwtIndex=0; i < (records.length - 1); i++) { - if (records[i] instanceof TextHeaderAtom) { - TextHeaderAtom tha = (TextHeaderAtom) records[i]; - StyleTextPropAtom stpa = null; - HSLFTextParagraph trun = null; - Record next = null; - Record subs = null; - - // See what follows the TextHeaderAtom - next = records[i+1]; - if (i < records.length - 2) { - subs = records[i+2]; - } - - // Is the next record one we need to skip over? - if (subs != null) { - if (next instanceof TextRulerAtom || - next instanceof MasterTextPropAtom || - next instanceof TextSpecInfoAtom) { - // Ignore this one, check the one after - next = subs; - if (i < records.length - 3) { - subs = records[i+3]; - } else { - subs = null; - } - } - } - - // Is the subsequent record a style one? - if (subs != null && subs instanceof StyleTextPropAtom) { - stpa = (StyleTextPropAtom)subs; - } - - // Now, check if the next record is one to record - if (next instanceof TextCharsAtom) { - TextCharsAtom tca = (TextCharsAtom)next; - trun = new HSLFTextParagraph(tha, tca, stpa); - } else if (next instanceof TextBytesAtom) { - TextBytesAtom tba = (TextBytesAtom)next; - trun = new HSLFTextParagraph(tha, tba, stpa); - } else if (next instanceof StyleTextPropAtom) { - stpa = (StyleTextPropAtom)next; - } else if (next instanceof TextHeaderAtom) { - // Seems to be a mostly, but not completely deleted block of - // text. Only the header remains, which isn't useful alone - // Skip on to the next TextHeaderAtom - continue; - } else { - logger.log(POILogger.ERROR, "Found a TextHeaderAtom not followed by a TextBytesAtom or TextCharsAtom: Followed by " + next.getRecordType()); - } - - if (trun != null) { - List lst = new ArrayList(); - for (int j = i; j < records.length; j++) { - if(j > i && records[j] instanceof TextHeaderAtom) break; - lst.add(records[j]); - } - Record[] recs = new Record[lst.size()]; - lst.toArray(recs); - trun._records = recs; - trun.setIndex(slwtIndex); - trun.setStyleTextProp9Atom(styleTextProp9Atom); - found.add(trun); - i++; - } else { - // Not a valid one, so skip on to next and look again - } - slwtIndex++; + for (List ltp : trs) { + for (HSLFTextParagraph tp : ltp) { + tp.supplySheet(this); } } } + /** * Returns all shapes contained in this Sheet * * @return all shapes contained in this Sheet (Slide or Notes) */ - public HSLFShape[] getShapes() { - List shapeList = getShapeList(); - return shapeList.toArray(new HSLFShape[shapeList.size()]); + @Override + public List getShapes() { + return getShapeList(); } /** @@ -404,12 +280,10 @@ public abstract class HSLFSheet implements Sheet { * @return TextShape or null */ public HSLFTextShape getPlaceholderByTextType(int type){ - HSLFShape[] shape = getShapes(); - for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof HSLFTextShape){ - HSLFTextShape tx = (HSLFTextShape)shape[i]; - HSLFTextParagraph run = tx.getTextParagraph(); - if(run != null && run.getRunType() == type){ + for (HSLFShape shape : getShapes()) { + if(shape instanceof HSLFTextShape){ + HSLFTextShape tx = (HSLFTextShape)shape; + if (tx != null && tx.getRunType() == type) { return tx; } } @@ -424,10 +298,9 @@ public abstract class HSLFSheet implements Sheet { * @return TextShape or null */ public HSLFTextShape getPlaceholder(int type){ - HSLFShape[] shape = getShapes(); - for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof HSLFTextShape){ - HSLFTextShape tx = (HSLFTextShape)shape[i]; + for (HSLFShape shape : getShapes()) { + if(shape instanceof HSLFTextShape){ + HSLFTextShape tx = (HSLFTextShape)shape; int placeholderId = 0; OEPlaceholderAtom oep = tx.getPlaceholderAtom(); if(oep != null) { @@ -509,7 +382,7 @@ public abstract class HSLFSheet implements Sheet { } for (; it.hasNext();) { EscherContainerRecord sp = (EscherContainerRecord) it.next(); - HSLFShape sh = ShapeFactory.createShape(sp, null); + HSLFShape sh = HSLFShapeFactory.createShape(sp, null); sh.setSheet(this); shapeList.add(sh); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSimpleShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java similarity index 85% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFSimpleShape.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java index 71c3c34d77..6c053d49f4 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java @@ -15,31 +15,21 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import java.awt.Color; -import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.io.ByteArrayOutputStream; import java.util.ArrayList; -import org.apache.poi.ddf.DefaultEscherRecordFactory; -import org.apache.poi.ddf.EscherChildAnchorRecord; -import org.apache.poi.ddf.EscherClientAnchorRecord; -import org.apache.poi.ddf.EscherClientDataRecord; -import org.apache.poi.ddf.EscherContainerRecord; -import org.apache.poi.ddf.EscherOptRecord; -import org.apache.poi.ddf.EscherProperties; -import org.apache.poi.ddf.EscherRecord; -import org.apache.poi.ddf.EscherSimpleProperty; -import org.apache.poi.ddf.EscherSpRecord; +import org.apache.poi.ddf.*; import org.apache.poi.hslf.exceptions.HSLFException; -import org.apache.poi.hslf.record.InteractiveInfo; -import org.apache.poi.hslf.record.InteractiveInfoAtom; -import org.apache.poi.hslf.record.Record; +import org.apache.poi.hslf.record.*; +import org.apache.poi.sl.draw.geom.*; import org.apache.poi.sl.usermodel.*; -import org.apache.poi.sl.usermodel.StrokeStyle.*; +import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound; +import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.Units; @@ -299,12 +289,6 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { return anchor; } - public void draw(Graphics2D graphics){ - AffineTransform at = graphics.getTransform(); - ShapePainter.paint(this, graphics); - graphics.setTransform(at); - } - /** * Find a record in the underlying EscherClientDataRecord * @@ -360,7 +344,7 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { } } - public void setHyperlink(Hyperlink link){ + public void setHyperlink(HSLFHyperlink link){ if(link.getId() == -1){ throw new HSLFException("You must call SlideShow.addHyperlink(Hyperlink link) first"); } @@ -373,32 +357,32 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { InteractiveInfoAtom infoAtom = info.getInteractiveInfoAtom(); switch(link.getType()){ - case Hyperlink.LINK_FIRSTSLIDE: + case HSLFHyperlink.LINK_FIRSTSLIDE: infoAtom.setAction(InteractiveInfoAtom.ACTION_JUMP); infoAtom.setJump(InteractiveInfoAtom.JUMP_FIRSTSLIDE); infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_FirstSlide); break; - case Hyperlink.LINK_LASTSLIDE: + case HSLFHyperlink.LINK_LASTSLIDE: infoAtom.setAction(InteractiveInfoAtom.ACTION_JUMP); infoAtom.setJump(InteractiveInfoAtom.JUMP_LASTSLIDE); infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_LastSlide); break; - case Hyperlink.LINK_NEXTSLIDE: + case HSLFHyperlink.LINK_NEXTSLIDE: infoAtom.setAction(InteractiveInfoAtom.ACTION_JUMP); infoAtom.setJump(InteractiveInfoAtom.JUMP_NEXTSLIDE); infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_NextSlide); break; - case Hyperlink.LINK_PREVIOUSSLIDE: + case HSLFHyperlink.LINK_PREVIOUSSLIDE: infoAtom.setAction(InteractiveInfoAtom.ACTION_JUMP); infoAtom.setJump(InteractiveInfoAtom.JUMP_PREVIOUSSLIDE); infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_PreviousSlide); break; - case Hyperlink.LINK_URL: + case HSLFHyperlink.LINK_URL: infoAtom.setAction(InteractiveInfoAtom.ACTION_HYPERLINK); infoAtom.setJump(InteractiveInfoAtom.JUMP_NONE); infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_Url); break; - case Hyperlink.LINK_SLIDENUMBER: + case HSLFHyperlink.LINK_SLIDENUMBER: infoAtom.setAction(InteractiveInfoAtom.ACTION_HYPERLINK); infoAtom.setJump(InteractiveInfoAtom.JUMP_NONE); infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_SlideNumber); @@ -417,4 +401,52 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { } + public Guide getAdjustValue(String name) { + if (name == null || !name.matches("adj([1-9]|10)")) { + throw new IllegalArgumentException("Adjust value '"+name+"' not supported."); + } + short escherProp; + switch (Integer.parseInt(name.substring(3))) { + case 1: escherProp = EscherProperties.GEOMETRY__ADJUSTVALUE; break; + case 2: escherProp = EscherProperties.GEOMETRY__ADJUST2VALUE; break; + case 3: escherProp = EscherProperties.GEOMETRY__ADJUST3VALUE; break; + case 4: escherProp = EscherProperties.GEOMETRY__ADJUST4VALUE; break; + case 5: escherProp = EscherProperties.GEOMETRY__ADJUST5VALUE; break; + case 6: escherProp = EscherProperties.GEOMETRY__ADJUST6VALUE; break; + case 7: escherProp = EscherProperties.GEOMETRY__ADJUST7VALUE; break; + case 8: escherProp = EscherProperties.GEOMETRY__ADJUST8VALUE; break; + case 9: escherProp = EscherProperties.GEOMETRY__ADJUST9VALUE; break; + case 10: escherProp = EscherProperties.GEOMETRY__ADJUST10VALUE; break; + default: throw new RuntimeException(); + } + + int adjval = getEscherProperty(escherProp, -1); + return (adjval == -1) ? null : new Guide(name, "val "+adjval); + } + + public LineDecoration getLineDecoration() { + // TODO Auto-generated method stub + return null; + } + + public CustomGeometry getGeometry() { + ShapeType st = getShapeType(); + String name = st.getOoxmlName(); + + PresetGeometries dict = PresetGeometries.getInstance(); + CustomGeometry geom = dict.get(name); + if(geom == null) { + throw new IllegalStateException("Unknown shape geometry: " + name); + } + + return geom; + } + + public Shadow getShadow() { + // TODO Auto-generated method stub + return null; + } + + + } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlide.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java similarity index 77% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlide.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java index 7030ce73e1..2fbd5c201f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlide.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java @@ -15,29 +15,15 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; -import java.awt.Graphics2D; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; -import org.apache.poi.ddf.EscherContainerRecord; -import org.apache.poi.ddf.EscherDgRecord; -import org.apache.poi.ddf.EscherDggRecord; -import org.apache.poi.ddf.EscherSpRecord; -import org.apache.poi.hslf.record.ColorSchemeAtom; -import org.apache.poi.hslf.record.Comment2000; -import org.apache.poi.hslf.record.EscherTextboxWrapper; -import org.apache.poi.hslf.record.HeadersFootersContainer; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.RecordContainer; -import org.apache.poi.hslf.record.RecordTypes; -import org.apache.poi.hslf.record.SSSlideInfoAtom; -import org.apache.poi.hslf.record.SlideAtom; +import org.apache.poi.ddf.*; +import org.apache.poi.hslf.model.*; +import org.apache.poi.hslf.record.*; import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet; -import org.apache.poi.hslf.record.StyleTextProp9Atom; -import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.sl.usermodel.Slide; @@ -50,10 +36,10 @@ import org.apache.poi.sl.usermodel.Slide; * @author Yegor Kozlov */ -public final class HSLFSlide extends HSLFSheet implements Slide { +public final class HSLFSlide extends HSLFSheet implements Slide { private int _slideNo; private SlideAtomsSet _atomSet; - private HSLFTextParagraph[] _runs; + private final List> _paragraphs = new ArrayList>(); private HSLFNotes _notes; // usermodel needs to set this /** @@ -72,33 +58,36 @@ public final class HSLFSlide extends HSLFSheet implements Slide textParagraphs = new LinkedList(); - if(_atomSet != null) { - findTextParagraphs(_atomSet.getSlideRecords(),textParagraphs); + if (_atomSet != null && _atomSet.getSlideRecords().length > 0) { + List> llhtp = HSLFTextParagraph.findTextParagraphs(_atomSet.getSlideRecords()); + _paragraphs.addAll(llhtp); + if (_paragraphs.isEmpty()) { + throw new RuntimeException("No text records found for slide"); + } } else { // No text on the slide, must just be pictures } - // Build an array, more useful than a vector - _runs = new HSLFTextParagraph[textParagraphs.size()+_otherRuns.length]; // Grab text from SlideListWithTexts entries - int i=0; - for(HSLFTextParagraph tp : textParagraphs) { - _runs[i++] = tp; - tp.supplySheet(this); + for(List ltp : _paragraphs) { + for (HSLFTextParagraph tp : ltp) { + tp.supplySheet(this); + } } - // Grab text from slide's PPDrawing - for(HSLFTextParagraph tp : _otherRuns) { - _runs[i++] = tp; - tp.supplySheet(this); - tp.setIndex(-1); // runs found in PPDrawing are not linked with SlideListWithTexts + + // Grab the TextRuns from the PPDrawing + List> llOtherRuns = HSLFTextParagraph.findTextParagraphs(getPPDrawing()); + for (List otherRuns : llOtherRuns) { + // Grab text from slide's PPDrawing + for(HSLFTextParagraph tp : otherRuns) { + tp.supplySheet(this); + tp.setIndex(-1); // runs found in PPDrawing are not linked with SlideListWithTexts + } } + _paragraphs.addAll(llOtherRuns); } /** @@ -112,22 +101,31 @@ public final class HSLFSlide extends HSLFSheet implements Slide tp : getTextParagraphs()) { + if (tp.isEmpty()) continue; + int type = tp.get(0).getRunType(); + switch (type) { + case TextHeaderAtom.CENTER_TITLE_TYPE: + case TextHeaderAtom.TITLE_TYPE: + String str = HSLFTextParagraph.getRawText(tp); + return HSLFTextParagraph.toExternalString(str, type); } } return null; @@ -222,7 +221,7 @@ public final class HSLFSlide extends HSLFSheet implements Slide> getTextParagraphs() { return _paragraphs; } /** * Returns the (public facing) page number of this slide @@ -236,11 +235,6 @@ public final class HSLFSlide extends HSLFSheet implements SlideSlideListWithtext container * which hold text data for this slide (typically for placeholders). @@ -254,26 +248,14 @@ public final class HSLFSlide extends HSLFSheet implements Slide newParas = shape.getTextParagraphs(); + _paragraphs.add(newParas); } /** This will return an atom per TextBox, so if the page has two text boxes the method should return two atoms. */ @@ -512,4 +467,14 @@ public final class HSLFSlide extends HSLFSheet implements Slide> _runs = new ArrayList>(); /** * all TxMasterStyleAtoms available in this master @@ -41,17 +43,21 @@ public final class SlideMaster extends HSLFMasterSheet { * Constructs a SlideMaster from the MainMaster record, * */ - public SlideMaster(MainMaster record, int sheetNo) { + public HSLFSlideMaster(MainMaster record, int sheetNo) { super(record, sheetNo); - _runs = findTextRuns(getPPDrawing()); - for (int i = 0; i < _runs.length; i++) _runs[i].setSheet(this); + _runs.addAll(HSLFTextParagraph.findTextParagraphs(getPPDrawing())); + for (List p : _runs) { + for (HSLFTextParagraph htp : p) { + htp.supplySheet(this); + } + } } /** * Returns an array of all the TextRuns found */ - public HSLFTextParagraph[] getTextRuns() { + public List> getTextParagraphs() { return _runs; } @@ -131,15 +137,8 @@ public final class SlideMaster extends HSLFMasterSheet { } protected void onAddTextShape(HSLFTextShape shape) { - HSLFTextParagraph run = shape.getTextParagraph(); - - if(_runs == null) _runs = new HSLFTextParagraph[]{run}; - else { - HSLFTextParagraph[] tmp = new HSLFTextParagraph[_runs.length + 1]; - System.arraycopy(_runs, 0, tmp, 0, _runs.length); - tmp[tmp.length-1] = run; - _runs = tmp; - } + List runs = shape.getTextParagraphs(); + _runs.add(runs); } public TxMasterStyleAtom[] getTxMasterStyleAtoms(){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java index 1f9f6ca027..cf91e56953 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java @@ -25,12 +25,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import org.apache.poi.ddf.EscherBSERecord; import org.apache.poi.ddf.EscherContainerRecord; @@ -69,7 +64,7 @@ import org.apache.poi.hslf.record.SlidePersistAtom; import org.apache.poi.hslf.record.UserEditAtom; import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.POIFSFileSystem; -import org.apache.poi.sl.usermodel.SlideShow; +import org.apache.poi.sl.usermodel.*; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -97,10 +92,10 @@ public final class HSLFSlideShow implements SlideShow { private Document _documentRecord; // Friendly objects for people to deal with - private SlideMaster[] _masters; - private TitleMaster[] _titleMasters; - private HSLFSlide[] _slides; - private HSLFNotes[] _notes; + private final List _masters = new ArrayList(); + private final List _titleMasters = new ArrayList(); + private final List _slides = new ArrayList(); + private final List _notes = new ArrayList(); private FontCollection _fonts; // For logging @@ -310,27 +305,21 @@ public final class HSLFSlideShow implements SlideShow { if (masterSLWT != null) { masterSets = masterSLWT.getSlideAtomsSets(); - ArrayList mmr = new ArrayList(); - ArrayList tmr = new ArrayList(); - for (SlideAtomsSet sas : masterSets) { Record r = getCoreRecordForSAS(sas); int sheetNo = sas.getSlidePersistAtom().getSlideIdentifier(); if (r instanceof org.apache.poi.hslf.record.Slide) { - TitleMaster master = new TitleMaster((org.apache.poi.hslf.record.Slide) r, + HSLFTitleMaster master = new HSLFTitleMaster((org.apache.poi.hslf.record.Slide) r, sheetNo); master.setSlideShow(this); - tmr.add(master); + _titleMasters.add(master); } else if (r instanceof org.apache.poi.hslf.record.MainMaster) { - SlideMaster master = new SlideMaster((org.apache.poi.hslf.record.MainMaster) r, + HSLFSlideMaster master = new HSLFSlideMaster((org.apache.poi.hslf.record.MainMaster) r, sheetNo); master.setSlideShow(this); - mmr.add(master); + _masters.add(master); } } - - _masters = mmr.toArray(new SlideMaster[mmr.size()]); - _titleMasters = tmr.toArray(new TitleMaster[tmr.size()]); } // Having sorted out the masters, that leaves the notes and slides @@ -408,16 +397,14 @@ public final class HSLFSlideShow implements SlideShow { // Finally, generate model objects for everything // Notes first - _notes = new HSLFNotes[notesRecords.length]; - for (int i = 0; i < _notes.length; i++) { - if (notesRecords[i] != null) { - _notes[i] = new HSLFNotes(notesRecords[i]); - _notes[i].setSlideShow(this); - } + for (org.apache.poi.hslf.record.Notes n : notesRecords) { + if (n == null) continue; + HSLFNotes hn = new HSLFNotes(n); + hn.setSlideShow(this); + _notes.add(hn); } // Then slides - _slides = new HSLFSlide[slidesRecords.length]; - for (int i = 0; i < _slides.length; i++) { + for (int i = 0; i < slidesRecords.length; i++) { SlideAtomsSet sas = slidesSets[i]; int slideIdentifier = sas.getSlidePersistAtom().getSlideIdentifier(); @@ -429,15 +416,16 @@ public final class HSLFSlideShow implements SlideShow { if (noteId != 0) { Integer notesPos = slideIdToNotes.get(noteId); if (notesPos != null) { - notes = _notes[notesPos]; + notes = _notes.get(notesPos); } else { logger.log(POILogger.ERROR, "Notes not found for noteId=" + noteId); } } // Now, build our slide - _slides[i] = new HSLFSlide(slidesRecords[i], notes, sas, slideIdentifier, (i + 1)); - _slides[i].setSlideShow(this); + HSLFSlide hs = new HSLFSlide(slidesRecords[i], notes, sas, slideIdentifier, (i + 1)); + hs.setSlideShow(this); + _slides.add(hs); } } @@ -472,28 +460,30 @@ public final class HSLFSlideShow implements SlideShow { /** * Returns an array of all the normal Slides found in the slideshow */ - public HSLFSlide[] getSlides() { + @Override + public List getSlides() { return _slides; } /** * Returns an array of all the normal Notes found in the slideshow */ - public HSLFNotes[] getNotes() { + public List getNotes() { return _notes; } /** * Returns an array of all the normal Slide Masters found in the slideshow */ - public SlideMaster[] getSlidesMasters() { + @Override + public List getSlideMasters() { return _masters; } - + /** * Returns an array of all the normal Title Masters found in the slideshow */ - public TitleMaster[] getTitleMasters() { + public List getTitleMasters() { return _titleMasters; } @@ -573,12 +563,16 @@ public final class HSLFSlideShow implements SlideShow { if (oldSlideNumber < 1 || newSlideNumber < 1) { throw new IllegalArgumentException("Old and new slide numbers must be greater than 0"); } - if (oldSlideNumber > _slides.length || newSlideNumber > _slides.length) { + if (oldSlideNumber > _slides.size() || newSlideNumber > _slides.size()) { throw new IllegalArgumentException( "Old and new slide numbers must not exceed the number of slides (" - + _slides.length + ")"); + + _slides.size() + ")"); } + _slides.get(newSlideNumber).setSlideNumber(oldSlideNumber); + _slides.get(oldSlideNumber).setSlideNumber(newSlideNumber); + Collections.swap(_slides, oldSlideNumber-1, newSlideNumber-1); + // The order of slides is defined by the order of slide atom sets in the // SlideListWithText container. SlideListWithText slwt = _documentRecord.getSlideSlideListWithText(); @@ -589,13 +583,9 @@ public final class HSLFSlideShow implements SlideShow { sas[newSlideNumber - 1] = tmp; ArrayList lst = new ArrayList(); - for (int i = 0; i < sas.length; i++) { - lst.add(sas[i].getSlidePersistAtom()); - Record[] r = sas[i].getSlideRecords(); - for (int j = 0; j < r.length; j++) { - lst.add(r[j]); - } - _slides[i].setSlideNumber(i + 1); + for (SlideAtomsSet s : sas) { + lst.add(s.getSlidePersistAtom()); + lst.addAll(Arrays.asList(s.getSlideRecords())); } Record[] r = lst.toArray(new Record[lst.size()]); slwt.setChildRecord(r); @@ -613,7 +603,7 @@ public final class HSLFSlideShow implements SlideShow { * @return the slide that was removed from the slide show. */ public HSLFSlide removeSlide(int index) { - int lastSlideIdx = _slides.length - 1; + int lastSlideIdx = _slides.size() - 1; if (index < 0 || index > lastSlideIdx) { throw new IllegalArgumentException("Slide index (" + index + ") is out of range (0.." + lastSlideIdx + ")"); @@ -622,26 +612,19 @@ public final class HSLFSlideShow implements SlideShow { SlideListWithText slwt = _documentRecord.getSlideSlideListWithText(); SlideAtomsSet[] sas = slwt.getSlideAtomsSets(); - HSLFSlide removedSlide = null; - ArrayList records = new ArrayList(); - ArrayList sa = new ArrayList(); - ArrayList sl = new ArrayList(); + List records = new ArrayList(); + List sa = Arrays.asList(sas); - ArrayList nt = new ArrayList(); - for (HSLFNotes notes : getNotes()) - nt.add(notes); - - for (int i = 0, num = 0; i < _slides.length; i++) { - if (i != index) { - sl.add(_slides[i]); - sa.add(sas[i]); - _slides[i].setSlideNumber(num++); - records.add(sas[i].getSlidePersistAtom()); - records.addAll(Arrays.asList(sas[i].getSlideRecords())); - } else { - removedSlide = _slides[i]; - nt.remove(_slides[i].getNotesSheet()); - } + HSLFSlide removedSlide = _slides.remove(index); + _notes.remove(removedSlide.getNotes()); + sa.remove(index); + + int i=0; + for (HSLFSlide s : _slides) s.setSlideNumber(i++); + + for (SlideAtomsSet s : sa) { + records.add(s.getSlidePersistAtom()); + records.addAll(Arrays.asList(s.getSlideRecords())); } if (sa.size() == 0) { _documentRecord.removeSlideListWithText(slwt); @@ -649,34 +632,29 @@ public final class HSLFSlideShow implements SlideShow { slwt.setSlideAtomsSets(sa.toArray(new SlideAtomsSet[sa.size()])); slwt.setChildRecord(records.toArray(new Record[records.size()])); } - _slides = sl.toArray(new HSLFSlide[sl.size()]); // if the removed slide had notes - remove references to them too - if (removedSlide != null) { - int notesId = removedSlide.getSlideRecord().getSlideAtom().getNotesID(); - if (notesId != 0) { - SlideListWithText nslwt = _documentRecord.getNotesSlideListWithText(); - records = new ArrayList(); - ArrayList na = new ArrayList(); - for (SlideAtomsSet ns : nslwt.getSlideAtomsSets()) { - if (ns.getSlidePersistAtom().getSlideIdentifier() != notesId) { - na.add(ns); - records.add(ns.getSlidePersistAtom()); - if (ns.getSlideRecords() != null) - records.addAll(Arrays.asList(ns.getSlideRecords())); - } + int notesId = (removedSlide != null) ? removedSlide.getSlideRecord().getSlideAtom().getNotesID() : 0; + if (notesId != 0) { + SlideListWithText nslwt = _documentRecord.getNotesSlideListWithText(); + records = new ArrayList(); + ArrayList na = new ArrayList(); + for (SlideAtomsSet ns : nslwt.getSlideAtomsSets()) { + if (ns.getSlidePersistAtom().getSlideIdentifier() == notesId) continue; + na.add(ns); + records.add(ns.getSlidePersistAtom()); + if (ns.getSlideRecords() != null) { + records.addAll(Arrays.asList(ns.getSlideRecords())); } - if (na.size() == 0) { - _documentRecord.removeSlideListWithText(nslwt); - } else { - nslwt.setSlideAtomsSets(na.toArray(new SlideAtomsSet[na.size()])); - nslwt.setChildRecord(records.toArray(new Record[records.size()])); - } - + } + if (na.isEmpty()) { + _documentRecord.removeSlideListWithText(nslwt); + } else { + nslwt.setSlideAtomsSets(na.toArray(new SlideAtomsSet[na.size()])); + nslwt.setChildRecord(records.toArray(new Record[records.size()])); } } - _notes = nt.toArray(new HSLFNotes[nt.size()]); return removedSlide; } @@ -736,16 +714,13 @@ public final class HSLFSlideShow implements SlideShow { slist.addSlidePersistAtom(sp); // Create a new Slide - HSLFSlide slide = new HSLFSlide(sp.getSlideIdentifier(), sp.getRefID(), _slides.length + 1); + HSLFSlide slide = new HSLFSlide(sp.getSlideIdentifier(), sp.getRefID(), _slides.size() + 1); slide.setSlideShow(this); slide.onCreate(); // Add in to the list of Slides - HSLFSlide[] s = new HSLFSlide[_slides.length + 1]; - System.arraycopy(_slides, 0, s, 0, _slides.length); - s[_slides.length] = slide; - _slides = s; - logger.log(POILogger.INFO, "Added slide " + _slides.length + " with ref " + sp.getRefID() + _slides.add(slide); + logger.log(POILogger.INFO, "Added slide " + _slides.size() + " with ref " + sp.getRefID() + " and identifier " + sp.getSlideIdentifier()); // Add the core records for this new Slide to the record tree @@ -754,7 +729,7 @@ public final class HSLFSlideShow implements SlideShow { sp.setRefID(psrId); slideRecord.setSheetId(psrId); - slide.setMasterSheet(_masters[0]); + slide.setMasterSheet(_masters.get(0)); // All done and added return slide; } @@ -901,7 +876,7 @@ public final class HSLFSlideShow implements SlideShow { */ public HeadersFooters getSlideHeadersFooters() { // detect if this ppt was saved in Office2007 - String tag = getSlidesMasters()[0].getProgrammableTag(); + String tag = getSlideMasters().get(0).getProgrammableTag(); boolean ppt2007 = "___PPT12".equals(tag); HeadersFootersContainer hdd = null; @@ -927,7 +902,7 @@ public final class HSLFSlideShow implements SlideShow { */ public HeadersFooters getNotesHeadersFooters() { // detect if this ppt was saved in Office2007 - String tag = getSlidesMasters()[0].getProgrammableTag(); + String tag = getSlideMasters().get(0).getProgrammableTag(); boolean ppt2007 = "___PPT12".equals(tag); HeadersFootersContainer hdd = null; @@ -943,8 +918,8 @@ public final class HSLFSlideShow implements SlideShow { hdd = new HeadersFootersContainer(HeadersFootersContainer.NotesHeadersFootersContainer); newRecord = true; } - if (ppt2007 && _notes.length > 0) { - return new HeadersFooters(hdd, _notes[0], newRecord, ppt2007); + if (ppt2007 && !_notes.isEmpty()) { + return new HeadersFooters(hdd, _notes.get(0), newRecord, ppt2007); } return new HeadersFooters(hdd, this, newRecord, ppt2007); } @@ -1010,10 +985,10 @@ public final class HSLFSlideShow implements SlideShow { * * @return 0-based index of the hyperlink */ - public int addHyperlink(Hyperlink link) { + public int addHyperlink(HSLFHyperlink link) { ExHyperlink ctrl = new ExHyperlink(); ExHyperlinkAtom obj = ctrl.getExHyperlinkAtom(); - if(link.getType() == Hyperlink.LINK_SLIDENUMBER) { + if(link.getType() == HSLFHyperlink.LINK_SLIDENUMBER) { ctrl.setLinkURL(link.getAddress(), 0x30); } else { ctrl.setLinkURL(link.getAddress()); @@ -1160,4 +1135,15 @@ public final class HSLFSlideShow implements SlideShow { return psrId; } + + public MasterSheet createMasterSheet() + throws IOException { + // TODO Auto-generated method stub + return null; + } + + public Resources getResources() { + // TODO Auto-generated method stub + return null; + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowEncrypted.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java similarity index 99% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowEncrypted.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java index 803aeacaf3..30397bfab8 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowEncrypted.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java @@ -15,7 +15,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import java.io.OutputStream; import java.security.GeneralSecurityException; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowImpl.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java similarity index 99% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowImpl.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java index 48e52da65c..ec5f735d17 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFSlideShowImpl.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java @@ -15,7 +15,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -45,8 +45,6 @@ import org.apache.poi.hslf.record.PositionDependentRecord; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.RecordTypes; import org.apache.poi.hslf.record.UserEditAtom; -import org.apache.poi.hslf.usermodel.HSLFObjectData; -import org.apache.poi.hslf.usermodel.HSLFPictureData; import org.apache.poi.poifs.crypt.cryptoapi.CryptoAPIEncryptor; import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.DocumentEntry; @@ -203,7 +201,7 @@ public final class HSLFSlideShowImpl extends POIDocument { * Constructs a new, empty, Powerpoint document. */ public static final HSLFSlideShowImpl create() { - InputStream is = HSLFSlideShowImpl.class.getResourceAsStream("data/empty.ppt"); + InputStream is = HSLFSlideShowImpl.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt"); if (is == null) { throw new RuntimeException("Missing resource 'empty.ppt'"); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextBox.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextBox.java similarity index 93% rename from src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextBox.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextBox.java index 25ea585c95..b7895a6ac5 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/HSLFTextBox.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextBox.java @@ -15,11 +15,10 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import org.apache.poi.ddf.*; -import org.apache.poi.sl.usermodel.ShapeContainer; -import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.usermodel.*; /** * Represents a TextFrame shape in PowerPoint. @@ -79,13 +78,14 @@ public class HSLFTextBox extends HSLFTextShape { setEscherProperty(EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x80000); setEscherProperty(EscherProperties.SHADOWSTYLE__COLOR, 0x8000002); - _txtrun = createTextRun(); + // init paragraphs + getTextParagraphs(); return _escherContainer; } protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){ - setVerticalAlignment(HSLFTextBox.AnchorTop); + setVerticalAlignment(VerticalAlignment.TOP); setEscherProperty(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE, 0x20002); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java new file mode 100644 index 0000000000..0b90f15a9d --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -0,0 +1,1089 @@ +/* ==================================================================== + 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.hslf.usermodel; + +import java.awt.Color; +import java.util.*; + +import org.apache.poi.hslf.model.textproperties.*; +import org.apache.poi.hslf.record.*; +import org.apache.poi.sl.usermodel.TextParagraph; +import org.apache.poi.util.*; + +/** + * This class represents a run of text in a powerpoint document. That + * run could be text on a sheet, or text in a note. + * It is only a very basic class for now + * + * @author Nick Burch + */ + +public final class HSLFTextParagraph implements TextParagraph { + protected static POILogger logger = POILogFactory.getLogger(HSLFTextParagraph.class); + + /** + * How to align the text + */ + /* package */ static final int AlignLeft = 0; + /* package */ static final int AlignCenter = 1; + /* package */ static final int AlignRight = 2; + /* package */ static final int AlignJustify = 3; + + + // Note: These fields are protected to help with unit testing + // Other classes shouldn't really go playing with them! + private final TextHeaderAtom _headerAtom; + private final TextBytesAtom _byteAtom; + private final TextCharsAtom _charAtom; + private StyleTextPropAtom _styleAtom; + private TextPropCollection _paragraphStyle = new TextPropCollection(1); + + protected TextRulerAtom _ruler; + protected List _runs = new ArrayList(); + protected HSLFTextShape _parentShape; + private HSLFSheet _sheet; + private int shapeId; + + /** + * all text run records that follow TextHeaderAtom. + * (there can be misc InteractiveInfo, TxInteractiveInfo and other records) + */ + private Record[] _records; + // private StyleTextPropAtom styleTextPropAtom; + private StyleTextProp9Atom styleTextProp9Atom; + + /** + * Constructs a Text Run from a Unicode text block. + * Either a {@link TextCharsAtom} or a {@link TextBytesAtom} needs to be provided. + * + * @param tha the TextHeaderAtom that defines what's what + * @param tba the TextBytesAtom containing the text or null if {@link TextCharsAtom} is provided + * @param tca the TextCharsAtom containing the text or null if {@link TextBytesAtom} is provided + * @param sta the StyleTextPropAtom which defines the character stylings + */ + /* package */ HSLFTextParagraph( + TextHeaderAtom tha, + TextBytesAtom tba, + TextCharsAtom tca, + StyleTextPropAtom sta + ) { + _headerAtom = tha; + _styleAtom = sta; + _byteAtom = tba; + _charAtom = tca; + } + + /* package */ HSLFTextParagraph(HSLFTextParagraph other) { + _headerAtom = other._headerAtom; + _styleAtom = other._styleAtom; + _byteAtom = other._byteAtom; + _charAtom = other._charAtom; + _paragraphStyle = other._paragraphStyle; + _parentShape = other._parentShape; + _sheet = other._sheet; + _ruler = other._ruler; // ???? + shapeId = other.shapeId; + _records = other._records; + } + + public void addTextRun(HSLFTextRun run) { + _runs.add(run); + } + + /** + * Fetch the rich text runs (runs of text with the same styling) that + * are contained within this block of text + */ + public List getTextRuns() { + return _runs; + } + + public TextPropCollection getParagraphStyle() { + return _paragraphStyle; + } + + public void setParagraphStyle(TextPropCollection paragraphStyle) { + _paragraphStyle = paragraphStyle; + } + + /** + * Supply the Sheet we belong to, which might have an assigned SlideShow + * Also passes it on to our child RichTextRuns + */ + public void supplySheet(HSLFSheet sheet){ + this._sheet = sheet; + + if (_runs == null) return; + for(HSLFTextRun rt : _runs) { + rt.updateSheet(); + } + } + + public HSLFSheet getSheet(){ + return this._sheet; + } + + /** + * @return Shape ID + */ + protected int getShapeId(){ + return shapeId; + } + + /** + * @param id Shape ID + */ + protected void setShapeId(int id){ + shapeId = id; + } + + /** + * @return 0-based index of the text run in the SLWT container + */ + protected int getIndex(){ + return (_headerAtom != null) ? _headerAtom.getIndex() : -1; + } + + /** + * Sets the index of the paragraph in the SLWT container + * + * @param index + */ + protected void setIndex(int index) { + if (_headerAtom != null) _headerAtom.setIndex(index); + } + + /** + * Returns the type of the text, from the TextHeaderAtom. + * Possible values can be seen from TextHeaderAtom + * @see org.apache.poi.hslf.record.TextHeaderAtom + */ + public int getRunType() { + return (_headerAtom != null) ? _headerAtom.getTextType() : -1; + } + + /** + * Is this Text Run one from a {@link PPDrawing}, or is it + * one from the {@link SlideListWithText}? + */ + public boolean isDrawingBased() { + return (getIndex() == -1); + } + + public TextRulerAtom getTextRuler(){ + return _ruler; + + } + + public TextRulerAtom createTextRuler(){ + _ruler = getTextRuler(); + if (_ruler == null) { + _ruler = TextRulerAtom.getParagraphInstance(); + _headerAtom.getParentRecord().appendChildRecord(_ruler); + } + return _ruler; + } + + /** + * Returns records that make up this text run + * + * @return text run records + */ + public Record[] getRecords(){ + return _records; + } + + /** Numbered List info */ + public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) { + this.styleTextProp9Atom = styleTextProp9Atom; + } + + /** Numbered List info */ + public StyleTextProp9Atom getStyleTextProp9Atom() { + return this.styleTextProp9Atom; + } + + /** Characters covered */ + public StyleTextPropAtom getStyleTextPropAtom() { + return this._styleAtom; + } + + /** + * Fetch the value of the given Paragraph related TextProp. + * Returns -1 if that TextProp isn't present. + * If the TextProp isn't present, the value from the appropriate + * Master Sheet will apply. + */ + private int getParaTextPropVal(String propName) { + TextProp prop = null; + boolean hardAttribute = false; + if (_paragraphStyle != null){ + prop = _paragraphStyle.findByName(propName); + + BitMaskTextProp maskProp = (BitMaskTextProp)_paragraphStyle.findByName(ParagraphFlagsTextProp.NAME); + hardAttribute = maskProp != null && maskProp.getValue() == 0; + } + if (prop == null && !hardAttribute){ + HSLFSheet sheet = _parentShape.getSheet(); + int txtype = _parentShape.getRunType(); + HSLFMasterSheet master = sheet.getMasterSheet(); + if (master != null) + prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); + } + + return prop == null ? -1 : prop.getValue(); + } + + /** + * Sets the value of the given Character TextProp, add if required + * @param propName The name of the Character TextProp + * @param val The value to set for the TextProp + */ + public void setParaTextPropVal(String propName, int val) { + // Ensure we have the StyleTextProp atom we're going to need + if(_paragraphStyle == null) { + ensureStyleAtomPresent(); + // paragraphStyle will now be defined + } + + assert(_paragraphStyle!=null); + TextProp tp = fetchOrAddTextProp(_paragraphStyle, propName); + tp.setValue(val); + } + + /** + * Ensure a StyleTextPropAtom is present for this run, + * by adding if required. Normally for internal TextRun use. + */ + protected StyleTextPropAtom ensureStyleAtomPresent() { + if (_styleAtom != null) { + return _styleAtom; + } + + _styleAtom = ensureStyleAtomPresent(_headerAtom, _byteAtom, _charAtom); + _paragraphStyle = _styleAtom.getParagraphStyles().get(0); + + return _styleAtom; + } + + protected static StyleTextPropAtom ensureStyleAtomPresent(TextHeaderAtom header, TextBytesAtom tbytes, TextCharsAtom tchars) { + RecordContainer wrapper = header.getParentRecord(); + StyleTextPropAtom styleAtom = null; + + boolean afterHeader = false; + for (Record record : wrapper.getChildRecords()) { + if (afterHeader && record.getRecordType() == RecordTypes.TextHeaderAtom.typeID) break; + afterHeader |= (header == record); + if (afterHeader && record.getRecordType() == RecordTypes.StyleTextPropAtom.typeID) { + styleAtom = (StyleTextPropAtom)record; + break; + } + } + + if (styleAtom != null) return styleAtom; + + String rawText = (tchars != null) ? tchars.getText() : tbytes.getText(); + + // Create a new one at the right size + styleAtom = new StyleTextPropAtom(rawText.length()+1); + + // Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom + wrapper.addChildAfter(styleAtom, (tbytes == null ? tchars : tbytes)); + + return styleAtom; + } + + @Override + public Iterator iterator() { + return _runs.iterator(); + } + + @Override + public double getLeftMargin() { + int val = getParaTextPropVal("text.offset"); + return val*HSLFShape.POINT_DPI/((double)HSLFShape.MASTER_DPI); + } + + @Override + public void setLeftMargin(double leftMargin) { + int val = (int)(leftMargin*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); + setParaTextPropVal("text.offset", val); + } + + @Override + public double getRightMargin() { + // TODO: find out, how to determine this value + return 0; + } + + @Override + public void setRightMargin(double rightMargin) { + // TODO: find out, how to set this value + } + + @Override + public double getIndent() { + int val = getParaTextPropVal("bullet.offset"); + return val*HSLFShape.POINT_DPI/((double)HSLFShape.MASTER_DPI); + } + + @Override + public void setIndent(double intent) { + int val = (int)(intent*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); + setParaTextPropVal("bullet.offset", val); + } + + @Override + public String getDefaultFontFamily() { + return (_runs.isEmpty() ? "Arial" : _runs.get(0).getFontFamily()); + } + + @Override + public double getDefaultFontSize() { + return (_runs.isEmpty() ? 12 : _runs.get(0).getFontSize()); + } + + /** + * Sets the type of horizontal alignment for the paragraph. + * + * @param align - the type of alignment + */ + public void setAlignment(org.apache.poi.sl.usermodel.TextParagraph.TextAlign align) { + int alignInt; + switch (align) { + default: + case LEFT: alignInt = AlignmentTextProp.LEFT; break; + case CENTER: alignInt = AlignmentTextProp.CENTER; break; + case RIGHT: alignInt = AlignmentTextProp.RIGHT; break; + case DIST: // TODO: DIST doesn't not exist within hslf, check mapping + case JUSTIFY: alignInt = AlignmentTextProp.JUSTIFY; break; + case JUSTIFY_LOW: alignInt = AlignmentTextProp.JUSTIFYLOW; break; + case THAI_DIST: alignInt = AlignmentTextProp.THAIDISTRIBUTED; break; + } + setParaTextPropVal("alignment", alignInt); + } + + @Override + public org.apache.poi.sl.usermodel.TextParagraph.TextAlign getTextAlign() { + switch (getParaTextPropVal("alignment")) { + default: + case AlignmentTextProp.LEFT: return TextAlign.LEFT; + case AlignmentTextProp.CENTER: return TextAlign.CENTER; + case AlignmentTextProp.RIGHT: return TextAlign.RIGHT; + case AlignmentTextProp.JUSTIFY: return TextAlign.JUSTIFY; + case AlignmentTextProp.JUSTIFYLOW: return TextAlign.JUSTIFY_LOW; + case AlignmentTextProp.THAIDISTRIBUTED: return TextAlign.THAI_DIST; + } + } + + public org.apache.poi.sl.usermodel.TextParagraph.FontAlign getFontAlign() { + // TODO Auto-generated method stub + return null; + } + + public org.apache.poi.sl.usermodel.TextParagraph.BulletStyle getBulletStyle() { + // TODO Auto-generated method stub + return null; + } + + @Override + public HSLFTextShape getParentShape() { + return _parentShape; + } + + public void setParentShape(HSLFTextShape parentShape) { + _parentShape = parentShape; + } + + + /** + * + * @return indentation level + */ + public int getIndentLevel() { + return _paragraphStyle == null ? 0 : _paragraphStyle.getReservedField(); + } + + /** + * Sets indentation level + * + * @param level indentation level. Must be in the range [0, 4] + */ + public void setIndentLevel(int level) { + if( _paragraphStyle != null ) _paragraphStyle.setReservedField((short)level); + } + + /** + * Sets whether this rich text run has bullets + */ + public void setBullet(boolean flag) { + setFlag(ParagraphFlagsTextProp.BULLET_IDX, flag); + } + + /** + * Returns whether this rich text run has bullets + */ + public boolean isBullet() { + return getFlag(ParagraphFlagsTextProp.BULLET_IDX); + } + + /** + * Returns whether this rich text run has bullets + */ + public boolean isBulletHard() { + return getFlag(ParagraphFlagsTextProp.BULLET_IDX); + } + + /** + * Sets the bullet character + */ + public void setBulletChar(char c) { + setParaTextPropVal("bullet.char", c); + } + + /** + * Returns the bullet character + */ + public char getBulletChar() { + return (char)getParaTextPropVal("bullet.char"); + } + + /** + * Sets the bullet size + */ + public void setBulletSize(int size) { + setParaTextPropVal("bullet.size", size); + } + + /** + * Returns the bullet size + */ + public int getBulletSize() { + return getParaTextPropVal("bullet.size"); + } + + /** + * Sets the bullet color + */ + public void setBulletColor(Color color) { + int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB(); + setParaTextPropVal("bullet.color", rgb); + } + + /** + * Returns the bullet color + */ + public Color getBulletColor() { + int rgb = getParaTextPropVal("bullet.color"); + if (rgb == -1) { + // if bullet color is undefined, return color of first run + if (_runs.isEmpty()) return null; + return _runs.get(0).getFontColor(); + } + + int cidx = rgb >> 24; + if (rgb % 0x1000000 == 0){ + if (_sheet == null) return null; + ColorSchemeAtom ca = _sheet.getColorScheme(); + if(cidx >= 0 && cidx <= 7) rgb = ca.getColor(cidx); + } + Color tmp = new Color(rgb, true); + return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); + } + + /** + * Sets the bullet font + */ + public void setBulletFont(int idx) { + setParaTextPropVal("bullet.font", idx); + setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, true); + } + + /** + * Returns the bullet font + */ + public int getBulletFont() { + return getParaTextPropVal("bullet.font"); + } + + /** + * Sets the line spacing. + *

+ * If linespacing >= 0, then linespacing is a percentage of normal line height. + * If linespacing < 0, the absolute value of linespacing is the spacing in master coordinates. + *

+ */ + public void setLineSpacing(int val) { + setParaTextPropVal("linespacing", val); + } + + /** + * Returns the line spacing + *

+ * If linespacing >= 0, then linespacing is a percentage of normal line height. + * If linespacing < 0, the absolute value of linespacing is the spacing in master coordinates. + *

+ * + * @return the spacing between lines + */ + @Override + public double getLineSpacing() { + int val = getParaTextPropVal("linespacing"); + return val == -1 ? 0 : val; + } + + /** + * Sets spacing before a paragraph. + *

+ * If spacebefore >= 0, then spacebefore is a percentage of normal line height. + * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates. + *

+ */ + public void setSpaceBefore(int val) { + setParaTextPropVal("spacebefore", val); + } + + /** + * Returns spacing before a paragraph + *

+ * If spacebefore >= 0, then spacebefore is a percentage of normal line height. + * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates. + *

+ * + * @return the spacing before a paragraph + */ + @Override + public double getSpaceBefore() { + int val = getParaTextPropVal("spacebefore"); + return val == -1 ? 0 : val; + } + + /** + * Sets spacing after a paragraph. + *

+ * If spaceafter >= 0, then spaceafter is a percentage of normal line height. + * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates. + *

+ */ + public void setSpaceAfter(int val) { + setParaTextPropVal("spaceafter", val); + } + + /** + * Returns spacing after a paragraph + *

+ * If spaceafter >= 0, then spaceafter is a percentage of normal line height. + * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates. + *

+ * + * @return the spacing before a paragraph + */ + @Override + public double getSpaceAfter() { + int val = getParaTextPropVal("spaceafter"); + return val == -1 ? 0 : val; + } + + /** + * Returns the named TextProp, either by fetching it (if it exists) or adding it + * (if it didn't) + * @param textPropCol The TextPropCollection to fetch from / add into + * @param textPropName The name of the TextProp to fetch/add + */ + protected static TextProp fetchOrAddTextProp(TextPropCollection textPropCol, String textPropName) { + // Fetch / Add the TextProp + TextProp tp = textPropCol.findByName(textPropName); + if (tp == null) { + tp = textPropCol.addWithName(textPropName); + } + return tp; + } + + protected boolean getFlag(int index) { + if (_paragraphStyle == null) return false; + + BitMaskTextProp prop = (BitMaskTextProp) _paragraphStyle.findByName(ParagraphFlagsTextProp.NAME); + + if (prop == null) { + if (_sheet != null) { + int txtype = getParentShape().getRunType(); + HSLFMasterSheet master = _sheet.getMasterSheet(); + if (master != null) { + prop = (BitMaskTextProp) master.getStyleAttribute(txtype, getIndentLevel(), ParagraphFlagsTextProp.NAME, false); + } + } else { + logger.log(POILogger.WARN, "MasterSheet is not available"); + } + } + + return prop == null ? false : prop.getSubValue(index); + } + + protected void setFlag(int index, boolean value) { + // Ensure we have the StyleTextProp atom we're going to need + if(_paragraphStyle == null) { + _paragraphStyle = new TextPropCollection(1); + } + + BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(_paragraphStyle, ParagraphFlagsTextProp.NAME); + prop.setSubValue(value,index); + } + + /** + * Saves the modified paragraphs/textrun to the records. + * Also updates the styles to the correct text length. + */ + protected static void storeText(List paragraphs) { + String rawText = toInternalString(getRawText(paragraphs)); + + // Will it fit in a 8 bit atom? + boolean isUnicode = StringUtil.hasMultibyte(rawText); + + TextHeaderAtom headerAtom = paragraphs.get(0)._headerAtom; + TextBytesAtom byteAtom = paragraphs.get(0)._byteAtom; + TextCharsAtom charAtom = paragraphs.get(0)._charAtom; + + // Store in the appropriate record + Record oldRecord = null, newRecord = null; + if (isUnicode) { + if (byteAtom != null) { + oldRecord = byteAtom; + newRecord = charAtom = new TextCharsAtom(); + } + charAtom.setText(rawText); + } else { + if (charAtom != null) { + oldRecord = charAtom; + newRecord = byteAtom = new TextBytesAtom(); + } + byte[] byteText = new byte[rawText.length()]; + StringUtil.putCompressedUnicode(rawText,byteText,0); + byteAtom.setText(byteText); + } + + RecordContainer _txtbox = headerAtom.getParentRecord(); + + if (oldRecord != null) { + // swap not appropriated records + Record[] cr = _txtbox.getChildRecords(); + int idx=0; + for (Record r : cr) { + if(r.equals(oldRecord)) break; + idx++; + } + if (idx >= cr.length) { + throw new RuntimeException("child record not found - malformed container record"); + } + cr[idx] = newRecord; + } + + // Ensure a StyleTextPropAtom is present, adding if required + StyleTextPropAtom styleAtom = ensureStyleAtomPresent(headerAtom, byteAtom, charAtom); + + // Update the text length for its Paragraph and Character stylings + // If it's shared: + // * calculate the new length based on the run's old text + // * this should leave in any +1's for the end of block if needed + // If it isn't shared: + // * reset the length, to the new string's length + // * add on +1 if the last block + // The last run needs its stylings to be 1 longer than the raw + // text is. This is to define the stylings that any new text + // that is added will inherit + + styleAtom.clearStyles(); + + TextPropCollection lastPTPC = null, lastRTPC = null; + for (HSLFTextParagraph para : paragraphs) { + TextPropCollection ptpc = para.getParagraphStyle(); + ptpc.updateTextSize(0); + if (!ptpc.equals(lastPTPC)) { + lastPTPC = styleAtom.addParagraphTextPropCollection(0); + lastPTPC.copy(ptpc); + } + for (HSLFTextRun tr : para.getTextRuns()) { + TextPropCollection rtpc = tr.getCharacterStyle(); + if (!rtpc.equals(lastRTPC)) { + lastRTPC = styleAtom.addCharacterTextPropCollection(0); + lastRTPC.copy(rtpc); + } + int len = tr.getLength(); + ptpc.updateTextSize(ptpc.getCharactersCovered()+len); + rtpc.updateTextSize(len); + lastPTPC.updateTextSize(lastPTPC.getCharactersCovered()+len); + lastRTPC.updateTextSize(lastRTPC.getCharactersCovered()+len); + } + } + + assert(lastPTPC != null && lastRTPC != null); + lastPTPC.updateTextSize(lastPTPC.getCharactersCovered()+1); + lastRTPC.updateTextSize(lastRTPC.getCharactersCovered()+1); + + /** + * If TextSpecInfoAtom is present, we must update the text size in it, + * otherwise the ppt will be corrupted + */ + TextSpecInfoAtom specAtom = (TextSpecInfoAtom)_txtbox.findFirstOfType(RecordTypes.TextSpecInfoAtom.typeID); + int len = rawText.length() + 1; + if(specAtom != null && len != specAtom.getCharactersCovered()) { + specAtom.reset(len); + } + } + + /** + * Adds the supplied text onto the end of the TextParagraphs, + * creating a new RichTextRun for it to sit in. + * + * @param text the text string used by this object. + */ + protected static void appendText(List paragraphs, String text, boolean newParagraph) { + text = toInternalString(text); + + // init paragraphs + assert(!paragraphs.isEmpty()); + + HSLFTextParagraph lastHTP = paragraphs.get(paragraphs.size()-1); + HSLFTextRun lastHTR = lastHTP.getTextRuns().get(lastHTP.getTextRuns().size()-1); + HSLFTextParagraph htp = (newParagraph) ? new HSLFTextParagraph(lastHTP) : lastHTP; + HSLFTextRun htr = new HSLFTextRun(htp); + htr.setText(text); + htr.getCharacterStyle().copy(lastHTR.getCharacterStyle()); + htp.addTextRun(htr); + } + + /** + * Sets (overwrites) the current text. + * Uses the properties of the first paragraph / textrun + * + * @param text the text string used by this object. + */ + public static void setText(List paragraphs, String text) { + text = HSLFTextParagraph.toInternalString(text); + + // init paragraphs + assert(!paragraphs.isEmpty()); + + Iterator paraIter = paragraphs.iterator(); + HSLFTextParagraph firstHTP = paraIter.next(); // keep first + assert(firstHTP != null); + while (paraIter.hasNext()) { + paraIter.next(); + paraIter.remove(); + } + + Iterator runIter = firstHTP.getTextRuns().iterator(); + HSLFTextRun firstHTR = runIter.next(); + assert(firstHTR != null); + while (runIter.hasNext()) { + runIter.next(); + runIter.remove(); + } + + firstHTR.setText(text); + } + + public static String getRawText(List paragraphs) { + StringBuilder sb = new StringBuilder(); + for (HSLFTextParagraph p : paragraphs) { + for (HSLFTextRun r : p.getTextRuns()) { + sb.append(r.getRawText()); + } + sb.append("\r"); + } + sb.deleteCharAt(sb.length()-1); // remove last line break + return sb.toString(); + } + + /** + * Returns a new string with line breaks converted into internal ppt + * representation + */ + protected static String toInternalString(String s) { + String ns = s.replaceAll("\\r?\\n", "\r"); + return ns; + } + + /** + * Converts raw text from the text paragraphs to a formatted string, + * i.e. it converts certain control characters used in the raw txt + * + * @param rawText the raw text + * @param runType the run type of the shape, paragraph or headerAtom. + * use -1 if unknown + * @return the formatted string + */ + public static String toExternalString(String rawText, int runType) { + // PowerPoint seems to store files with \r as the line break + // The messes things up on everything but a Mac, so translate + // them to \n + String text = rawText.replace('\r', '\n'); + + switch (runType) { + // 0xB acts like cariage return in page titles and like blank in the + // others + case -1: + case org.apache.poi.hslf.record.TextHeaderAtom.TITLE_TYPE: + case org.apache.poi.hslf.record.TextHeaderAtom.CENTER_TITLE_TYPE: + text = text.replace((char) 0x0B, '\n'); + break; + default: + text = text.replace((char) 0x0B, ' '); + break; + } + + return text; + } + + /** + * For a given PPDrawing, grab all the TextRuns + */ + public static List> findTextParagraphs(PPDrawing ppdrawing) { + List> runsV = new ArrayList>(); + for (EscherTextboxWrapper wrapper : ppdrawing.getTextboxWrappers()) { + // propagate parents to parent-aware records + RecordContainer.handleParentAwareRecords(wrapper); + int shapeId = wrapper.getShapeId(); + List> rv = findTextParagraphs(wrapper); + for (List htpList : rv) { + for (HSLFTextParagraph htp : htpList) { + htp.setShapeId(shapeId); + } + } + runsV.addAll(rv); + } + return runsV; + } + /** + * Scans through the supplied record array, looking for + * a TextHeaderAtom followed by one of a TextBytesAtom or + * a TextCharsAtom. Builds up TextRuns from these + * + * @param records the records to build from + * @param found vector to add any found to + */ + protected static List> findTextParagraphs(final Record[] records) { + return findTextParagraphs(records, null); + } + /** + * Scans through the supplied record array, looking for + * a TextHeaderAtom followed by one of a TextBytesAtom or + * a TextCharsAtom. Builds up TextRuns from these + * + * @param wrapper an EscherTextboxWrapper + */ + protected static List> findTextParagraphs(final EscherTextboxWrapper wrapper) { + return findTextParagraphs(wrapper.getChildRecords(), wrapper.getStyleTextProp9Atom()); + } + + /** + * Scans through the supplied record array, looking for + * a TextHeaderAtom followed by one of a TextBytesAtom or + * a TextCharsAtom. Builds up TextRuns from these + * + * @param records the records to build from + * @param styleTextProp9Atom an optional StyleTextProp9Atom with numbered lists info + */ + protected static List> findTextParagraphs(Record[] records, StyleTextProp9Atom styleTextProp9Atom) { + List> paragraphCollection = new ArrayList>(); + + if (records == null) { + throw new NullPointerException("records need to be filled."); + } + + int recordIdx; + for (recordIdx = 0; recordIdx < records.length; recordIdx++) { + if (records[recordIdx] instanceof TextHeaderAtom) break; + } + + if (recordIdx == records.length) { + logger.log(POILogger.INFO, "No text records found."); + return paragraphCollection; + } + + for (int slwtIndex = 0; recordIdx < records.length-2; slwtIndex++) { + List paragraphs = new ArrayList(); + paragraphCollection.add(paragraphs); + + TextHeaderAtom header = (TextHeaderAtom)records[recordIdx++]; + TextBytesAtom tbytes = null; + TextCharsAtom tchars = null; + StyleTextPropAtom styles = null; + TextRulerAtom ruler = null; + MasterTextPropAtom indents = null; + + List otherRecordList = new ArrayList(); + + for (; recordIdx < records.length; recordIdx++) { + Record r = records[recordIdx]; + long rt = r.getRecordType(); + if (RecordTypes.TextHeaderAtom.typeID == rt) break; + else if (RecordTypes.TextBytesAtom.typeID == rt) tbytes = (TextBytesAtom)r; + else if (RecordTypes.TextCharsAtom.typeID == rt) tchars = (TextCharsAtom)r; + else if (RecordTypes.StyleTextPropAtom.typeID == rt) styles = (StyleTextPropAtom)r; + else if (RecordTypes.TextRulerAtom.typeID == rt) ruler = (TextRulerAtom)r; + else if (RecordTypes.MasterTextPropAtom.typeID == rt) { + indents = (MasterTextPropAtom)r; + otherRecordList.add(indents); + } else { + otherRecordList.add(r); + } + } + + assert(header != null); + if (header.getIndex() == -1) { + header.setIndex(slwtIndex); + } + + Record otherRecords[] = otherRecordList.toArray(new Record[otherRecordList.size()]); + + if (tbytes == null && tchars == null) { + tbytes = new TextBytesAtom(); + logger.log(POILogger.INFO, "bytes nor chars atom doesn't exist. Creating dummy record for later saving."); + } + + String rawText = (tchars != null) ? tchars.getText() : tbytes.getText(); + + for (String para : rawText.split("\r")) { + HSLFTextParagraph tpara = new HSLFTextParagraph(header, tbytes, tchars, styles); + paragraphs.add(tpara); + tpara.setStyleTextProp9Atom(styleTextProp9Atom); + tpara._ruler = ruler; + tpara._records = otherRecords; + tpara.getParagraphStyle().updateTextSize(para.length()); + + HSLFTextRun trun = new HSLFTextRun(tpara); + tpara.addTextRun(trun); + trun.setText(para); + } + + if (styles == null) { + styles = ensureStyleAtomPresent(header, tbytes, tchars); + } else { + styles.setParentTextSize(rawText.length()); + } + + applyCharacterStyles(paragraphs, styles.getCharacterStyles()); + applyParagraphStyles(paragraphs, styles.getParagraphStyles()); + if (indents != null) { + applyParagraphIndents(paragraphs, indents.getIndents()); + } + } + + return paragraphCollection; + } + + protected static void applyCharacterStyles(List paragraphs, List charStyles) { + int paraIdx = 0, runIdx = 0; + for (TextPropCollection p : charStyles) { + for (int ccRun = 0, ccStyle = p.getCharactersCovered(); ccRun < ccStyle; ) { + HSLFTextParagraph para = paragraphs.get(paraIdx); + List runs = para.getTextRuns(); + HSLFTextRun trun = runs.get(runIdx); + int len = trun.getLength(); + + if (runIdx+1 >= runs.size()) { + // need to add +1 to the last run of the paragraph + len++; + } + + TextPropCollection pCopy = new TextPropCollection(1); + pCopy.copy(p); + if (ccRun+len <= ccStyle) { + trun.setCharacterStyle(pCopy); + pCopy.updateTextSize(len); + ccRun += len; + } else { + String text = trun.getRawText(); + trun.setText(text.substring(0,ccStyle-ccRun)); + pCopy.updateTextSize(ccStyle-ccRun); + trun.setCharacterStyle(pCopy); + + HSLFTextRun nextRun = new HSLFTextRun(para); + nextRun.setText(text.substring(ccStyle-ccRun)); + runs.add(runIdx+1, nextRun); + + ccRun += ccStyle-ccRun; + } + + // need to compare it again, in case a run has been added afer + if (++runIdx >= runs.size()) { + paraIdx++; + runIdx = 0; + } + } + } + } + + protected static void applyParagraphStyles(List paragraphs, List paraStyles) { + int paraIdx = 0; + for (TextPropCollection p : paraStyles) { + for (int ccPara = 0, ccStyle = p.getCharactersCovered(); ccPara < ccStyle; paraIdx++) { + HSLFTextParagraph para = paragraphs.get(paraIdx); + TextPropCollection pCopy = new TextPropCollection(1); + pCopy.copy(p); + int len = 0; + for (HSLFTextRun trun : para.getTextRuns()) { + len += trun.getLength(); + } + pCopy.updateTextSize(len+1); + para.setParagraphStyle(pCopy); + ccPara += len+1; + } + } + } + + protected static void applyParagraphIndents(List paragraphs, List paraStyles) { + int paraIdx = 0; + for (IndentProp p : paraStyles) { + for (int ccPara = 0, ccStyle = p.getCharactersCovered(); ccPara < ccStyle; paraIdx++) { + HSLFTextParagraph para = paragraphs.get(paraIdx); + int len = 0; + for (HSLFTextRun trun : para.getTextRuns()) { + len += trun.getLength(); + } + para.setIndentLevel(p.getIndentLevel()); + ccPara += len+1; + } + } + } + + protected static List createEmptyParagraph() { + EscherTextboxWrapper wrapper = new EscherTextboxWrapper(); + + TextHeaderAtom tha = new TextHeaderAtom(); + tha.setParentRecord(wrapper); + wrapper.appendChildRecord(tha); + + TextCharsAtom tca = new TextCharsAtom(); + wrapper.appendChildRecord(tca); + + StyleTextPropAtom sta = new StyleTextPropAtom(0); + wrapper.appendChildRecord(sta); + + HSLFTextParagraph htp = new HSLFTextParagraph(tha, null, tca, sta); + htp._records = new Record[0]; + HSLFTextRun htr = new HSLFTextRun(htp); + htp.addTextRun(htr); + + return Arrays.asList(htp); + } + + public EscherTextboxWrapper getTextboxWrapper() { + return (EscherTextboxWrapper)_headerAtom.getParentRecord(); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index 06980e9ff5..9a10a9b125 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -17,14 +17,11 @@ package org.apache.poi.hslf.usermodel; +import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.fetchOrAddTextProp; + import java.awt.Color; -import org.apache.poi.hslf.model.*; -import org.apache.poi.hslf.model.textproperties.BitMaskTextProp; -import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; -import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp; -import org.apache.poi.hslf.model.textproperties.TextProp; -import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.hslf.model.textproperties.*; import org.apache.poi.hslf.record.ColorSchemeAtom; import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.POILogFactory; @@ -40,70 +37,31 @@ public final class HSLFTextRun implements TextRun { /** The TextRun we belong to */ private HSLFTextParagraph parentParagraph; - /** The SlideShow we belong to */ - // private SlideShow slideShow; - - /** Where in the parent TextRun we start from */ - private int startPos; - - /** How long a string (in the parent TextRun) we represent */ - private int length; - + private String _runText = "\r"; private String _fontname; + /** * Our paragraph and character style. * Note - we may share these styles with other RichTextRuns */ - private TextPropCollection paragraphStyle; - private TextPropCollection characterStyle; - private boolean sharingParagraphStyle; - private boolean sharingCharacterStyle; + private TextPropCollection characterStyle = new TextPropCollection(1); - /** - * Create a new wrapper around a (currently not) - * rich text string - * @param parent - * @param startAt - * @param len - */ - public HSLFTextRun(HSLFTextParagraph parent, int startAt, int len) { - this(parent, startAt, len, null, null, false, false); - } /** * Create a new wrapper around a rich text string - * @param parent The parent TextRun - * @param startAt The start position of this run - * @param len The length of this run - * @param pStyle The paragraph style property collection - * @param cStyle The character style property collection - * @param pShared The paragraph styles are shared with other runs - * @param cShared The character styles are shared with other runs + * @param parent The parent paragraph */ - public HSLFTextRun(HSLFTextParagraph parent, int startAt, int len, - TextPropCollection pStyle, TextPropCollection cStyle, - boolean pShared, boolean cShared) { - parentParagraph = parent; - startPos = startAt; - length = len; - paragraphStyle = pStyle; - characterStyle = cStyle; - sharingParagraphStyle = pShared; - sharingCharacterStyle = cShared; + public HSLFTextRun(HSLFTextParagraph parentParagraph) { + this.parentParagraph = parentParagraph; + } + + public TextPropCollection getCharacterStyle() { + return characterStyle; } - /** - * Supply (normally default) textprops, and if they're shared, - * when a run gets them - */ - public void supplyTextProps(TextPropCollection pStyle, TextPropCollection cStyle, boolean pShared, boolean cShared) { - if(paragraphStyle != null || characterStyle != null) { - throw new IllegalStateException("Can't call supplyTextProps if run already has some"); - } - paragraphStyle = pStyle; - characterStyle = cStyle; - sharingParagraphStyle = pShared; - sharingCharacterStyle = cShared; + public void setCharacterStyle(TextPropCollection characterStyle) { + this.characterStyle = characterStyle; } + /** * Supply the SlideShow we belong to */ @@ -118,65 +76,23 @@ public final class HSLFTextRun implements TextRun { * Get the length of the text */ public int getLength() { - return length; + return _runText.length(); } - /** - * The beginning index, inclusive. - * - * @return the beginning index, inclusive. - */ - public int getStartIndex(){ - return startPos; - } - - /** - * The ending index, exclusive. - * - * @return the ending index, exclusive. - */ - public int getEndIndex(){ - return startPos + length; - } - - /** - * Fetch the text, in output suitable form - */ - public String getText() { - return parentParagraph.getText().substring(startPos, startPos+length); - } /** * Fetch the text, in raw storage form */ public String getRawText() { - return parentParagraph.getRawText().substring(startPos, startPos+length); + return _runText; } /** * Change the text */ public void setText(String text) { - String s = parentParagraph.normalize(text); - setRawText(s); + _runText = text; } - /** - * Change the text - */ - public void setRawText(String text) { - length = text.length(); - parentParagraph.changeTextInRichTextRun(this,text); - } - - /** - * Tells the RichTextRun its new position in the parent TextRun - * @param startAt - */ - public void updateStartPosition(int startAt) { - startPos = startAt; - } - - // --------------- Internal helpers on rich text properties ------- /** @@ -185,31 +101,21 @@ public final class HSLFTextRun implements TextRun { * text property won't be set if there's no CharFlagsTextProp. */ private boolean isCharFlagsTextPropVal(int index) { - return getFlag(true, index); + return getFlag(index); } - private boolean getFlag(boolean isCharacter, int index) { - TextPropCollection props; - String propname; - if (isCharacter){ - props = characterStyle; - propname = CharFlagsTextProp.NAME; - } else { - props = paragraphStyle; - propname = ParagraphFlagsTextProp.NAME; - } + protected boolean getFlag(int index) { + if (characterStyle == null) return false; + + BitMaskTextProp prop = (BitMaskTextProp)characterStyle.findByName(CharFlagsTextProp.NAME); - BitMaskTextProp prop = null; - if (props != null){ - prop = (BitMaskTextProp)props.findByName(propname); - } if (prop == null){ HSLFSheet sheet = parentParagraph.getSheet(); if(sheet != null){ - int txtype = parentParagraph.getRunType(); + int txtype = parentParagraph.getParentShape().getRunType(); HSLFMasterSheet master = sheet.getMasterSheet(); if (master != null){ - prop = (BitMaskTextProp)master.getStyleAttribute(txtype, getIndentLevel(), propname, isCharacter); + prop = (BitMaskTextProp)master.getStyleAttribute(txtype, parentParagraph.getIndentLevel(), CharFlagsTextProp.NAME, true); } } else { logger.log(POILogger.WARN, "MasterSheet is not available"); @@ -224,43 +130,7 @@ public final class HSLFTextRun implements TextRun { * it if required. */ private void setCharFlagsTextPropVal(int index, boolean value) { - if(getFlag(true, index) != value) setFlag(true, index, value); - } - - public void setFlag(boolean isCharacter, int index, boolean value) { - TextPropCollection props; - String propname; - if (isCharacter){ - props = characterStyle; - propname = CharFlagsTextProp.NAME; - } else { - props = paragraphStyle; - propname = ParagraphFlagsTextProp.NAME; - } - - // Ensure we have the StyleTextProp atom we're going to need - if(props == null) { - parentParagraph.ensureStyleAtomPresent(); - props = isCharacter ? characterStyle : paragraphStyle; - } - - BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(props, propname); - prop.setSubValue(value,index); - } - - /** - * Returns the named TextProp, either by fetching it (if it exists) or adding it - * (if it didn't) - * @param textPropCol The TextPropCollection to fetch from / add into - * @param textPropName The name of the TextProp to fetch/add - */ - private TextProp fetchOrAddTextProp(TextPropCollection textPropCol, String textPropName) { - // Fetch / Add the TextProp - TextProp tp = textPropCol.findByName(textPropName); - if(tp == null) { - tp = textPropCol.addWithName(textPropName); - } - return tp; + if(getFlag(index) != value) setFlag(index, value); } /** @@ -277,55 +147,14 @@ public final class HSLFTextRun implements TextRun { if (prop == null){ HSLFSheet sheet = parentParagraph.getSheet(); - int txtype = parentParagraph.getRunType(); + int txtype = parentParagraph.getParentShape().getRunType(); HSLFMasterSheet master = sheet.getMasterSheet(); if (master != null) - prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, true); + prop = master.getStyleAttribute(txtype, parentParagraph.getIndentLevel(), propName, true); } return prop == null ? -1 : prop.getValue(); } - /** - * Fetch the value of the given Paragraph related TextProp. - * Returns -1 if that TextProp isn't present. - * If the TextProp isn't present, the value from the appropriate - * Master Sheet will apply. - */ - private int getParaTextPropVal(String propName) { - TextProp prop = null; - boolean hardAttribute = false; - if (paragraphStyle != null){ - prop = paragraphStyle.findByName(propName); - - BitMaskTextProp maskProp = (BitMaskTextProp)paragraphStyle.findByName(ParagraphFlagsTextProp.NAME); - hardAttribute = maskProp != null && maskProp.getValue() == 0; - } - if (prop == null && !hardAttribute){ - HSLFSheet sheet = parentParagraph.getSheet(); - int txtype = parentParagraph.getRunType(); - HSLFMasterSheet master = sheet.getMasterSheet(); - if (master != null) - prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); - } - - return prop == null ? -1 : prop.getValue(); - } - - /** - * Sets the value of the given Character TextProp, add if required - * @param propName The name of the Character TextProp - * @param val The value to set for the TextProp - */ - public void setParaTextPropVal(String propName, int val) { - // Ensure we have the StyleTextProp atom we're going to need - if(paragraphStyle == null) { - parentParagraph.ensureStyleAtomPresent(); - // paragraphStyle will now be defined - } - - assert(paragraphStyle!=null); - TextProp tp = fetchOrAddTextProp(paragraphStyle, propName); - tp.setValue(val); - } + /** * Sets the value of the given Paragraph TextProp, add if required * @param propName The name of the Paragraph TextProp @@ -334,11 +163,10 @@ public final class HSLFTextRun implements TextRun { public void setCharTextPropVal(String propName, int val) { // Ensure we have the StyleTextProp atom we're going to need if(characterStyle == null) { - parentParagraph.ensureStyleAtomPresent(); + characterStyle = new TextPropCollection(1); // characterStyle will now be defined } - assert(characterStyle!=null); TextProp tp = fetchOrAddTextProp(characterStyle, propName); tp.setValue(val); } @@ -377,14 +205,14 @@ public final class HSLFTextRun implements TextRun { /** * Is the text underlined? */ - public boolean isUnderline() { + public boolean isUnderlined() { return isCharFlagsTextPropVal(CharFlagsTextProp.UNDERLINE_IDX); } /** * Is the text underlined? */ - public void setUnderline(boolean underlined) { + public void setUnderlined(boolean underlined) { setCharFlagsTextPropVal(CharFlagsTextProp.UNDERLINE_IDX, underlined); } @@ -452,7 +280,7 @@ public final class HSLFTextRun implements TextRun { /** * Gets the font size */ - public int getFontSize() { + public double getFontSize() { return getCharTextPropVal("font.size"); } @@ -484,7 +312,7 @@ public final class HSLFTextRun implements TextRun { */ public void setFontName(String fontName) { HSLFSheet sheet = parentParagraph.getSheet(); - HSLFSlideShowImpl slideShow = (sheet == null) ? null : sheet.getSlideShow(); + HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow(); if (sheet == null || slideShow == null) { //we can't set font since slideshow is not assigned yet _fontname = fontName; @@ -498,9 +326,10 @@ public final class HSLFTextRun implements TextRun { /** * Gets the font name */ - public String getFontName() { + @Override + public String getFontFamily() { HSLFSheet sheet = parentParagraph.getSheet(); - HSLFSlideShowImpl slideShow = (sheet == null) ? null : sheet.getSlideShow(); + HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow(); if (sheet == null || slideShow == null) { return _fontname; } @@ -544,250 +373,29 @@ public final class HSLFTextRun implements TextRun { setFontColor(rgb); } - /** - * Sets the type of horizontal alignment for the text. - * One of the Align* constants defined in the TextBox class. - * - * @param align - the type of alignment - */ - public void setAlignment(int align) { - setParaTextPropVal("alignment", align); - } - /** - * Returns the type of horizontal alignment for the text. - * One of the Align* constants defined in the TextBox class. - * - * @return the type of alignment - */ - public int getAlignment() { - return getParaTextPropVal("alignment"); - } + protected void setFlag(int index, boolean value) { + // Ensure we have the StyleTextProp atom we're going to need + if (characterStyle == null) { + characterStyle = new TextPropCollection(1); + } - /** - * - * @return indentation level - */ - public int getIndentLevel() { - return paragraphStyle == null ? 0 : paragraphStyle.getReservedField(); - } + BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(characterStyle, CharFlagsTextProp.NAME); + prop.setSubValue(value, index); + } - /** - * Sets indentation level - * - * @param level indentation level. Must be in the range [0, 4] - */ - public void setIndentLevel(int level) { - if(paragraphStyle != null ) paragraphStyle.setReservedField((short)level); - } + public TextCap getTextCap() { + return TextCap.NONE; + } - /** - * Sets whether this rich text run has bullets - */ - public void setBullet(boolean flag) { - setFlag(false, ParagraphFlagsTextProp.BULLET_IDX, flag); - } + public boolean isSubscript() { + return false; + } - /** - * Returns whether this rich text run has bullets - */ - public boolean isBullet() { - return getFlag(false, ParagraphFlagsTextProp.BULLET_IDX); - } + public boolean isSuperscript() { + return false; + } - /** - * Returns whether this rich text run has bullets - */ - public boolean isBulletHard() { - return getFlag(false, ParagraphFlagsTextProp.BULLET_IDX); - } - - /** - * Sets the bullet character - */ - public void setBulletChar(char c) { - setParaTextPropVal("bullet.char", c); - } - - /** - * Returns the bullet character - */ - public char getBulletChar() { - return (char)getParaTextPropVal("bullet.char"); - } - - /** - * Sets the bullet offset - */ - public void setBulletOffset(int offset) { - setParaTextPropVal("bullet.offset", offset*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); - } - - /** - * Returns the bullet offset - */ - public int getBulletOffset() { - return getParaTextPropVal("bullet.offset")*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; - } - - /** - * Sets the text offset - */ - public void setTextOffset(int offset) { - setParaTextPropVal("text.offset", offset*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); - } - - /** - * Returns the text offset - */ - public int getTextOffset() { - return getParaTextPropVal("text.offset")*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI; - } - - /** - * Sets the bullet size - */ - public void setBulletSize(int size) { - setParaTextPropVal("bullet.size", size); - } - - /** - * Returns the bullet size - */ - public int getBulletSize() { - return getParaTextPropVal("bullet.size"); - } - - /** - * Sets the bullet color - */ - public void setBulletColor(Color color) { - int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB(); - setParaTextPropVal("bullet.color", rgb); - } - - /** - * Returns the bullet color - */ - public Color getBulletColor() { - int rgb = getParaTextPropVal("bullet.color"); - if(rgb == -1) return getFontColor(); - - int cidx = rgb >> 24; - if (rgb % 0x1000000 == 0){ - ColorSchemeAtom ca = parentParagraph.getSheet().getColorScheme(); - if(cidx >= 0 && cidx <= 7) rgb = ca.getColor(cidx); - } - Color tmp = new Color(rgb, true); - return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); - } - - /** - * Sets the bullet font - */ - public void setBulletFont(int idx) { - setParaTextPropVal("bullet.font", idx); - setFlag(false, ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, true); - } - - /** - * Returns the bullet font - */ - public int getBulletFont() { - return getParaTextPropVal("bullet.font"); - } - - /** - * Sets the line spacing. - *

- * If linespacing >= 0, then linespacing is a percentage of normal line height. - * If linespacing < 0, the absolute value of linespacing is the spacing in master coordinates. - *

- */ - public void setLineSpacing(int val) { - setParaTextPropVal("linespacing", val); - } - - /** - * Returns the line spacing - *

- * If linespacing >= 0, then linespacing is a percentage of normal line height. - * If linespacing < 0, the absolute value of linespacing is the spacing in master coordinates. - *

- * - * @return the spacing between lines - */ - public int getLineSpacing() { - int val = getParaTextPropVal("linespacing"); - return val == -1 ? 0 : val; - } - - /** - * Sets spacing before a paragraph. - *

- * If spacebefore >= 0, then spacebefore is a percentage of normal line height. - * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates. - *

- */ - public void setSpaceBefore(int val) { - setParaTextPropVal("spacebefore", val); - } - - /** - * Returns spacing before a paragraph - *

- * If spacebefore >= 0, then spacebefore is a percentage of normal line height. - * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates. - *

- * - * @return the spacing before a paragraph - */ - public int getSpaceBefore() { - int val = getParaTextPropVal("spacebefore"); - return val == -1 ? 0 : val; - } - - /** - * Sets spacing after a paragraph. - *

- * If spaceafter >= 0, then spaceafter is a percentage of normal line height. - * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates. - *

- */ - public void setSpaceAfter(int val) { - setParaTextPropVal("spaceafter", val); - } - - /** - * Returns spacing after a paragraph - *

- * If spaceafter >= 0, then spaceafter is a percentage of normal line height. - * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates. - *

- * - * @return the spacing before a paragraph - */ - public int getSpaceAfter() { - int val = getParaTextPropVal("spaceafter"); - return val == -1 ? 0 : val; - } - // --------------- Internal HSLF methods, not intended for end-user use! ------- - - /** - * Internal Use Only - get the underlying paragraph style collection. - * For normal use, use the friendly setters and getters - */ - public TextPropCollection _getRawParagraphStyle() { return paragraphStyle; } - /** - * Internal Use Only - get the underlying character style collection. - * For normal use, use the friendly setters and getters - */ - public TextPropCollection _getRawCharacterStyle() { return characterStyle; } - /** - * Internal Use Only - are the Paragraph styles shared? - */ - public boolean _isParagraphStyleShared() { return sharingParagraphStyle; } - /** - * Internal Use Only - are the Character styles shared? - */ - public boolean _isCharacterStyleShared() { return sharingCharacterStyle; } + public byte getPitchAndFamily() { + return 0; + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java new file mode 100644 index 0000000000..2c4e73b690 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java @@ -0,0 +1,754 @@ +/* ==================================================================== + 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.hslf.usermodel; + +import static org.apache.poi.hslf.record.RecordTypes.*; + +import java.awt.Rectangle; +import java.awt.font.FontRenderContext; +import java.awt.geom.Rectangle2D; +import java.awt.geom.Rectangle2D.Double; +import java.io.IOException; +import java.util.*; + +import org.apache.poi.POIXMLException; +import org.apache.poi.ddf.*; +import org.apache.poi.hslf.exceptions.HSLFException; +import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.hslf.record.*; +import org.apache.poi.sl.draw.DrawFactory; +import org.apache.poi.sl.draw.DrawTextShape; +import org.apache.poi.sl.usermodel.*; +import org.apache.poi.util.POILogger; + +/** + * A common superclass of all shapes that can hold text. + * + * @author Yegor Kozlov + */ +public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape { + + /** + * How to anchor the text + */ + /* package */ static final int AnchorTop = 0; + /* package */ static final int AnchorMiddle = 1; + /* package */ static final int AnchorBottom = 2; + /* package */ static final int AnchorTopCentered = 3; + /* package */ static final int AnchorMiddleCentered = 4; + /* package */ static final int AnchorBottomCentered = 5; + /* package */ static final int AnchorTopBaseline = 6; + /* package */ static final int AnchorBottomBaseline = 7; + /* package */ static final int AnchorTopCenteredBaseline = 8; + /* package */ static final int AnchorBottomCenteredBaseline = 9; + + /** + * How to wrap the text + */ + public static final int WrapSquare = 0; + public static final int WrapByPoints = 1; + public static final int WrapNone = 2; + public static final int WrapTopBottom = 3; + public static final int WrapThrough = 4; + + /** + * TextRun object which holds actual text and format data + */ + protected List _paragraphs = new ArrayList(); + + /** + * Escher container which holds text attributes such as + * TextHeaderAtom, TextBytesAtom ot TextCharsAtom, StyleTextPropAtom etc. + */ + protected EscherTextboxWrapper _txtbox; + + /** + * This setting is used for supporting a deprecated alignment + * + * @see + */ + boolean alignToBaseline = false; + + /** + * Used to calculate text bounds + */ + protected static final FontRenderContext _frc = new FontRenderContext(null, true, true); + + /** + * Create a TextBox object and initialize it from the supplied Record container. + * + * @param escherRecord EscherSpContainer container which holds information about this shape + * @param parent the parent of the shape + */ + protected HSLFTextShape(EscherContainerRecord escherRecord, ShapeContainer parent){ + super(escherRecord, parent); + + } + + /** + * Create a new TextBox. This constructor is used when a new shape is created. + * + * @param parent the parent of this Shape. For example, if this text box is a cell + * in a table then the parent is Table. + */ + public HSLFTextShape(ShapeContainer parent){ + super(null, parent); + _escherContainer = createSpContainer(parent instanceof HSLFGroupShape); + } + + /** + * Create a new TextBox. This constructor is used when a new shape is created. + * + */ + public HSLFTextShape(){ + this(null); + } + + /** + * Set default properties for the TextRun. + * Depending on the text and shape type the defaults are different: + * TextBox: align=left, valign=top + * AutoShape: align=center, valign=middle + * + */ + protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){ + + } + + /** + * When a textbox is added to a sheet we need to tell upper-level + * PPDrawing about it. + * + * @param sh the sheet we are adding to + */ + protected void afterInsert(HSLFSheet sh){ + super.afterInsert(sh); + + EscherTextboxWrapper _txtbox = getEscherTextboxWrapper(); + if(_txtbox != null){ + PPDrawing ppdrawing = sh.getPPDrawing(); + ppdrawing.addTextboxWrapper(_txtbox); + // Ensure the escher layer knows about the added records + try { + _txtbox.writeOut(null); + } catch (IOException e){ + throw new HSLFException(e); + } + if(getAnchor().equals(new Rectangle()) && !"".equals(getText())) resizeToFitText(); + } + for (HSLFTextParagraph htp : _paragraphs) { + htp.setShapeId(getShapeId()); + } + sh.onAddTextShape(this); + } + + protected EscherTextboxWrapper getEscherTextboxWrapper(){ + if(_txtbox == null){ + EscherTextboxRecord textRecord = getEscherChild(EscherTextboxRecord.RECORD_ID); + if(textRecord != null) _txtbox = new EscherTextboxWrapper(textRecord); + } + return _txtbox; + } + + /** + * Adjust the size of the shape so it encompasses the text inside it. + * + * @return a Rectangle2D that is the bounds of this shape. + */ + public Rectangle2D resizeToFitText(){ + Rectangle2D anchor = getAnchor(); + if(anchor.getWidth() == 0.) { + logger.log(POILogger.WARN, "Width of shape wasn't set. Defaulting to 200px"); + anchor = new Rectangle2D.Double(anchor.getX(), anchor.getY(), 200, anchor.getHeight()); + setAnchor(anchor); + } + double height = getTextHeight(); + height += 1; // add a pixel to compensate rounding errors + + anchor.setRect(anchor.getX(), anchor.getY(), anchor.getWidth(), height); + setAnchor(anchor); + + return anchor; + } + + /** + * Returns the type of the text, from the TextHeaderAtom. + * Possible values can be seen from TextHeaderAtom + * @see org.apache.poi.hslf.record.TextHeaderAtom + */ + public int getRunType() { + getEscherTextboxWrapper(); + if (_txtbox == null) return -1; + TextHeaderAtom headerAtom = (TextHeaderAtom)_txtbox.findFirstOfType(TextHeaderAtom.typeID); + assert(headerAtom != null); + return headerAtom.getTextType(); + } + + /** + * Changes the type of the text. Values should be taken + * from TextHeaderAtom. No checking is done to ensure you + * set this to a valid value! + * @see org.apache.poi.hslf.record.TextHeaderAtom + */ + public void setRunType(int type) { + getEscherTextboxWrapper(); + if (_txtbox == null) return; + TextHeaderAtom headerAtom = (TextHeaderAtom)_txtbox.findFirstOfType(TextHeaderAtom.typeID); + assert(headerAtom != null); + headerAtom.setTextType(type); + } + + /** + * Returns the type of vertical alignment for the text. + * One of the Anchor* constants defined in this class. + * + * @return the type of alignment + */ + /* package */ int getAlignment(){ + EscherOptRecord opt = getEscherOptRecord(); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__ANCHORTEXT); + int align = HSLFTextShape.AnchorTop; + if (prop == null){ + /** + * If vertical alignment was not found in the shape properties then try to + * fetch the master shape and search for the align property there. + */ + int type = getRunType(); + HSLFMasterSheet master = getSheet().getMasterSheet(); + if(master != null){ + HSLFTextShape masterShape = master.getPlaceholderByTextType(type); + if(masterShape != null) align = masterShape.getAlignment(); + } else { + //not found in the master sheet. Use the hardcoded defaults. + switch (type){ + case org.apache.poi.hslf.record.TextHeaderAtom.TITLE_TYPE: + case org.apache.poi.hslf.record.TextHeaderAtom.CENTER_TITLE_TYPE: + align = HSLFTextShape.AnchorMiddle; + break; + default: + align = HSLFTextShape.AnchorTop; + break; + } + } + } else { + align = prop.getPropertyValue(); + } + + alignToBaseline = (align == AnchorBottomBaseline || align == AnchorBottomCenteredBaseline + || align == AnchorTopBaseline || align == AnchorTopCenteredBaseline); + + return align; + } + + /** + * Sets the type of alignment for the text. + * One of the Anchor* constants defined in this class. + * + * @param align - the type of alignment + */ + /* package */ void setAlignment(Boolean isCentered, VerticalAlignment vAlign) { + int align[]; + switch (vAlign) { + case TOP: + align = new int[]{AnchorTop, AnchorTopCentered, AnchorTopBaseline, AnchorTopCenteredBaseline}; + break; + default: + case MIDDLE: + align = new int[]{AnchorMiddle, AnchorMiddleCentered, AnchorMiddle, AnchorMiddleCentered}; + break; + case BOTTOM: + align = new int[]{AnchorBottom, AnchorBottomCentered, AnchorBottomBaseline, AnchorBottomCenteredBaseline}; + break; + } + + int align2 = align[(isCentered ? 1 : 0)+(alignToBaseline ? 2 : 0)]; + + setEscherProperty(EscherProperties.TEXT__ANCHORTEXT, align2); + } + + @Override + public VerticalAlignment getVerticalAlignment() { + int va = getAlignment(); + switch (va) { + case AnchorTop: + case AnchorTopCentered: + case AnchorTopBaseline: + case AnchorTopCenteredBaseline: return VerticalAlignment.TOP; + case AnchorBottom: + case AnchorBottomCentered: + case AnchorBottomBaseline: + case AnchorBottomCenteredBaseline: return VerticalAlignment.BOTTOM; + default: + case AnchorMiddle: + case AnchorMiddleCentered: return VerticalAlignment.MIDDLE; + } + } + + /** + * @return true, if vertical alignment is relative to baseline + * this is only used for older versions less equals Office 2003 + */ + public boolean isAlignToBaseline() { + getAlignment(); + return alignToBaseline; + } + + /** + * Sets the vertical alignment relative to the baseline + * + * @param alignToBaseline if true, vertical alignment is relative to baseline + */ + public void setAlignToBaseline(boolean alignToBaseline) { + this.alignToBaseline = alignToBaseline; + setAlignment(isHorizontalCentered(), getVerticalAlignment()); + } + + @Override + public boolean isHorizontalCentered() { + int va = getAlignment(); + switch (va) { + case AnchorTopCentered: + case AnchorTopCenteredBaseline: + case AnchorBottomCentered: + case AnchorBottomCenteredBaseline: + case AnchorMiddleCentered: + return true; + default: + return false; + } + } + + public void setVerticalAlignment(VerticalAlignment vAlign) { + setAlignment(isHorizontalCentered(), vAlign); + } + + /** + * Sets if the paragraphs are horizontal centered + * + * @param isCentered true, if the paragraphs are horizontal centered + * A {@code null} values unsets this property. + * + * @see TextShape#isHorizontalCentered() + */ + public void setHorizontalCentered(Boolean isCentered){ + setAlignment(isCentered, getVerticalAlignment()); + } + + /** + * Returns the distance (in points) between the bottom of the text frame + * and the bottom of the inscribed rectangle of the shape that contains the text. + * Default value is 1/20 inch. + * + * @return the botom margin + */ + public double getBottomInset(){ + EscherOptRecord opt = getEscherOptRecord(); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTBOTTOM); + int val = prop == null ? EMU_PER_INCH/20 : prop.getPropertyValue(); + return val/EMU_PER_POINT; + } + + /** + * Sets the botom margin. + * @see #getBottomInset() + * + * @param margin the bottom margin + */ + public void setBottomInset(double margin){ + setEscherProperty(EscherProperties.TEXT__TEXTBOTTOM, (int)(margin*EMU_PER_POINT)); + } + + /** + * Returns the distance (in points) between the left edge of the text frame + * and the left edge of the inscribed rectangle of the shape that contains + * the text. + * Default value is 1/10 inch. + * + * @return the left margin + */ + public double getLeftInset(){ + EscherOptRecord opt = getEscherOptRecord(); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTLEFT); + int val = prop == null ? EMU_PER_INCH/10 : prop.getPropertyValue(); + return val/EMU_PER_POINT; + } + + /** + * Sets the left margin. + * @see #getLeftInset() + * + * @param margin the left margin + */ + public void setLeftInset(double margin){ + setEscherProperty(EscherProperties.TEXT__TEXTLEFT, (int)(margin*EMU_PER_POINT)); + } + + /** + * Returns the distance (in points) between the right edge of the + * text frame and the right edge of the inscribed rectangle of the shape + * that contains the text. + * Default value is 1/10 inch. + * + * @return the right margin + */ + public double getRightInset(){ + EscherOptRecord opt = getEscherOptRecord(); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTRIGHT); + int val = prop == null ? EMU_PER_INCH/10 : prop.getPropertyValue(); + return val/EMU_PER_POINT; + } + + /** + * Sets the right margin. + * @see #getRightInset() + * + * @param margin the right margin + */ + public void setRightInset(double margin){ + setEscherProperty(EscherProperties.TEXT__TEXTRIGHT, (int)(margin*EMU_PER_POINT)); + } + + /** + * Returns the distance (in points) between the top of the text frame + * and the top of the inscribed rectangle of the shape that contains the text. + * Default value is 1/20 inch. + * + * @return the top margin + */ + public double getTopInset(){ + EscherOptRecord opt = getEscherOptRecord(); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTTOP); + int val = prop == null ? EMU_PER_INCH/20 : prop.getPropertyValue(); + return val/EMU_PER_POINT; + } + + /** + * Sets the top margin. + * @see #getTopInset() + * + * @param margin the top margin + */ + public void setTopInset(double margin){ + setEscherProperty(EscherProperties.TEXT__TEXTTOP, (int)(margin*EMU_PER_POINT)); + } + + @Override + public boolean getWordWrap(){ + int ww = getWordWrapEx(); + return (ww != WrapNone); + } + + /** + * Returns the value indicating word wrap. + * + * @return the value indicating word wrap. + * Must be one of the Wrap* constants defined in this class. + * + * @see MSOWRAPMODE + */ + public int getWordWrapEx() { + EscherOptRecord opt = getEscherOptRecord(); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__WRAPTEXT); + return prop == null ? WrapSquare : prop.getPropertyValue(); + } + + /** + * Specifies how the text should be wrapped + * + * @param wrap the value indicating how the text should be wrapped. + * Must be one of the Wrap* constants defined in this class. + */ + public void setWordWrap(int wrap){ + setEscherProperty(EscherProperties.TEXT__WRAPTEXT, wrap); + } + + /** + * @return id for the text. + */ + public int getTextId(){ + EscherOptRecord opt = getEscherOptRecord(); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTID); + return prop == null ? 0 : prop.getPropertyValue(); + } + + /** + * Sets text ID + * + * @param id of the text + */ + public void setTextId(int id){ + setEscherProperty(EscherProperties.TEXT__TEXTID, id); + } + + /** + * @return the TextRun object for this text box + */ + public List getTextParagraphs(){ + if (!_paragraphs.isEmpty()) return _paragraphs; + + _txtbox = getEscherTextboxWrapper(); + if (_txtbox == null) { + _paragraphs.addAll(HSLFTextParagraph.createEmptyParagraph()); + _txtbox = _paragraphs.get(0).getTextboxWrapper(); + } else { + initParagraphsFromSheetRecords(); + if (_paragraphs.isEmpty()) { + List> llhtp = HSLFTextParagraph.findTextParagraphs(_txtbox); + if (!llhtp.isEmpty()) { + _paragraphs.addAll(llhtp.get(0)); + } + } + } + + for (HSLFTextParagraph p : _paragraphs) { + p.setParentShape(this); + } + + return _paragraphs; + } + + public void setSheet(HSLFSheet sheet) { + _sheet = sheet; + + // Initialize _txtrun object. + // (We can't do it in the constructor because the sheet + // is not assigned then, it's only built once we have + // all the records) + for (HSLFTextParagraph htp : getTextParagraphs()) { + // Supply the sheet to our child RichTextRuns + htp.supplySheet(_sheet); + } + } + + protected void initParagraphsFromSheetRecords(){ + EscherTextboxWrapper txtbox = getEscherTextboxWrapper(); + HSLFSheet sheet = getSheet(); + + if(sheet == null || txtbox == null) return; + + OutlineTextRefAtom ota = null; + + Record[] child = txtbox.getChildRecords(); + for (int i = 0; i < child.length; i++) { + if (child[i] instanceof OutlineTextRefAtom) { + ota = (OutlineTextRefAtom)child[i]; + break; + } + } + + List> sheetRuns = _sheet.getTextParagraphs(); + _paragraphs.clear(); + if (sheetRuns != null) { + if (ota != null) { + int idx = ota.getTextIndex(); + for (List r : sheetRuns) { + if (r.isEmpty()) continue; + int ridx = r.get(0).getIndex(); + if (ridx > idx) break; + if (ridx == idx) _paragraphs.addAll(r); + } + if(_paragraphs.isEmpty()) { + logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx); + } + } else { + int shapeId = getShapeId(); + for (List r : sheetRuns) { + if (r.isEmpty()) continue; + if (r.get(0).getShapeId() == shapeId) _paragraphs.addAll(r); + } + } + } + + // ensure the same references child records of TextRun + // TODO: check the purpose of this ... +// if(_txtrun != null) { +// for (int i = 0; i < child.length; i++) { +// for (Record r : _txtrun.getRecords()) { +// if (child[i].getRecordType() == r.getRecordType()) { +// child[i] = r; +// } +// } +// } +// } + } + + /* + // 0xB acts like cariage return in page titles and like blank in the others + char replChr; + switch(tha == null ? -1 : tha.getTextType()) { + case -1: + case TextHeaderAtom.TITLE_TYPE: + case TextHeaderAtom.CENTER_TITLE_TYPE: + replChr = '\n'; + break; + default: + replChr = ' '; + break; + } + + // PowerPoint seems to store files with \r as the line break + // The messes things up on everything but a Mac, so translate + // them to \n + String text = rawText.replace('\r','\n').replace('\u000b', replChr); + */ + + /** + * Return OEPlaceholderAtom, the atom that describes a placeholder. + * + * @return OEPlaceholderAtom or null if not found + */ + public OEPlaceholderAtom getPlaceholderAtom(){ + return getClientDataRecord(OEPlaceholderAtom.typeID); + } + + /** + * + * Assigns a hyperlink to this text shape + * + * @param linkId id of the hyperlink, @see org.apache.poi.hslf.usermodel.SlideShow#addHyperlink(Hyperlink) + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @see org.apache.poi.hslf.usermodel.HSLFSlideShow#addHyperlink(HSLFHyperlink) + */ + public void setHyperlink(int linkId, int beginIndex, int endIndex){ + //TODO validate beginIndex and endIndex and throw IllegalArgumentException + + InteractiveInfo info = new InteractiveInfo(); + InteractiveInfoAtom infoAtom = info.getInteractiveInfoAtom(); + infoAtom.setAction(org.apache.poi.hslf.record.InteractiveInfoAtom.ACTION_HYPERLINK); + infoAtom.setHyperlinkType(org.apache.poi.hslf.record.InteractiveInfoAtom.LINK_Url); + infoAtom.setHyperlinkID(linkId); + + _txtbox.appendChildRecord(info); + + TxInteractiveInfoAtom txiatom = new TxInteractiveInfoAtom(); + txiatom.setStartIndex(beginIndex); + txiatom.setEndIndex(endIndex); + _txtbox.appendChildRecord(txiatom); + + } + + @Override + public boolean isPlaceholder() { + OEPlaceholderAtom oep = getPlaceholderAtom(); + if (oep != null) return true; + + //special case for files saved in Office 2007 + RoundTripHFPlaceholder12 hldr = getClientDataRecord(RoundTripHFPlaceholder12.typeID); + if (hldr != null) return true; + + return false; + } + + + @Override + public Iterator iterator() { + return _paragraphs.iterator(); + } + + @Override + public Insets2D getInsets() { + Insets2D insets = new Insets2D(getTopInset(), getLeftInset(), getBottomInset(), getRightInset()); + return insets; + } + + @Override + public double getTextHeight(){ + DrawFactory drawFact = DrawFactory.getInstance(null); + DrawTextShape dts = drawFact.getDrawable(this); + return dts.getTextHeight(); + } + + @Override + public TextDirection getTextDirection() { + // TODO: determine vertical text setting + return TextDirection.HORIZONTAL; + } + + /** + * Returns the raw text content of the shape. This hasn't had any + * changes applied to it, and so is probably unlikely to print + * out nicely. + */ + public String getRawText() { + return HSLFTextParagraph.getRawText(getTextParagraphs()); + } + + /** + * Returns the text contained in this text frame, which has been made safe + * for printing and other use. + * + * @return the text string for this textbox. + */ + public String getText() { + String rawText = getRawText(); + TextHeaderAtom _headerAtom = (TextHeaderAtom)_txtbox.findFirstOfType(TextHeaderAtom.typeID); + int runType = (_headerAtom == null) ? -1 : _headerAtom.getTextType(); + + return HSLFTextParagraph.toExternalString(rawText, runType); + } + + + // Update methods follow + + /** + * Adds the supplied text onto the end of the TextParagraphs, + * creating a new RichTextRun for it to sit in. + * + * @param text the text string used by this object. + */ + public void appendText(String text, boolean newParagraph) { + // init paragraphs + List paras = getTextParagraphs(); + HSLFTextParagraph.appendText(paras, text, newParagraph); + } + + /** + * Sets (overwrites) the current text. + * Uses the properties of the first paragraph / textrun + * + * @param text the text string used by this object. + */ + public void setText(String text) { + // init paragraphs + List paras = getTextParagraphs(); + HSLFTextParagraph.setText(paras, text); + setTextId(text.hashCode()); + } + + /** + * Saves the modified paragraphs/textrun to the records. + * Also updates the styles to the correct text length. + */ + protected void storeText() { + HSLFTextParagraph.storeText(_paragraphs); + } + // Accesser methods follow + + /** + * Returns the array of all hyperlinks in this text run + * + * @return the array of all hyperlinks in this text run or null + * if not found. + */ + public HSLFHyperlink[] getHyperlinks() { + return HSLFHyperlink.find(this); + } + + +} \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java similarity index 73% rename from src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java index 8184c030fa..fc6131d952 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java @@ -15,34 +15,36 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; + +import java.util.ArrayList; +import java.util.List; import org.apache.poi.hslf.model.textproperties.TextProp; -import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.record.SlideAtom; /** * Title masters define the design template for slides with a Title Slide layout. * * @author Yegor Kozlov */ -public final class TitleMaster extends HSLFMasterSheet { - private HSLFTextParagraph[] _runs; +public final class HSLFTitleMaster extends HSLFMasterSheet { + private final List> _runs = new ArrayList>(); /** * Constructs a TitleMaster * */ - public TitleMaster(org.apache.poi.hslf.record.Slide record, int sheetNo) { + public HSLFTitleMaster(org.apache.poi.hslf.record.Slide record, int sheetNo) { super(record, sheetNo); - _runs = findTextRuns(getPPDrawing()); - for (int i = 0; i < _runs.length; i++) _runs[i].setSheet(this); + _runs.addAll(HSLFTextParagraph.findTextParagraphs(getPPDrawing())); } /** * Returns an array of all the TextRuns found */ - public HSLFTextParagraph[] getTextRuns() { + public List> getTextParagraphs() { return _runs; } @@ -58,11 +60,11 @@ public final class TitleMaster extends HSLFMasterSheet { * Returns the slide master for this title master. */ public HSLFMasterSheet getMasterSheet(){ - SlideMaster[] master = getSlideShow().getSlidesMasters(); + List master = getSlideShow().getSlideMasters(); SlideAtom sa = ((org.apache.poi.hslf.record.Slide)getSheetContainer()).getSlideAtom(); int masterId = sa.getMasterID(); - for (int i = 0; i < master.length; i++) { - if (masterId == master[i]._getSheetNumber()) return master[i]; + for (HSLFSlideMaster sm : master) { + if (masterId == sm._getSheetNumber()) return sm; } return null; } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java index bf82208cdc..df4d635a69 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java @@ -76,7 +76,7 @@ public class DrawFactory { } else if (shape instanceof Background) { return getDrawable((Background)shape); } else if (shape instanceof Slide) { - return getDrawable((Slide)shape); + return getDrawable((Slide>)shape); } else if (shape instanceof MasterSheet) { return getDrawable((MasterSheet)shape); } else if (shape instanceof Sheet) { @@ -86,7 +86,7 @@ public class DrawFactory { throw new IllegalArgumentException("Unsupported shape type: "+shape.getClass()); } - public > DrawSlide getDrawable(T sheet) { + public >> DrawSlide getDrawable(T sheet) { return new DrawSlide(sheet); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java index cada314ece..4f5f631aee 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java @@ -5,7 +5,7 @@ import java.awt.Graphics2D; import org.apache.poi.sl.usermodel.*; -public class DrawSlide> extends DrawSheet { +public class DrawSlide>> extends DrawSheet { public DrawSlide(T slide) { super(slide); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java index 700edf0eb0..3db3c6f6d0 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java @@ -237,7 +237,7 @@ public class DrawTextParagraph implements Drawable { protected String getRenderableText(TextRun tr) { StringBuilder buf = new StringBuilder(); TextCap cap = tr.getTextCap(); - for (char c : tr.getText().toCharArray()) { + for (char c : tr.getRawText().toCharArray()) { if(c == '\t') { // TODO: finish support for tabs buf.append(" "); @@ -346,7 +346,7 @@ public class DrawTextParagraph implements Drawable { if(run.isItalic()) { attList.add(new AttributedStringData(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, beginIndex, endIndex)); } - if(run.isUnderline()) { + if(run.isUnderlined()) { attList.add(new AttributedStringData(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, beginIndex, endIndex)); attList.add(new AttributedStringData(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, beginIndex, endIndex)); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java index 736dc0d668..e2caa084dd 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/geom/PresetGeometries.java @@ -19,8 +19,7 @@ package org.apache.poi.sl.draw.geom; -import java.io.*; -import java.nio.charset.Charset; +import java.io.InputStream; import java.util.LinkedHashMap; import javax.xml.bind.*; diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Line.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Line.java index 630c37de45..b06764e54d 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Line.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Line.java @@ -17,6 +17,6 @@ package org.apache.poi.sl.usermodel; -public interface Line extends AutoShape { +public interface Line> extends AutoShape { } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java index 08f023cd9f..3e4b924721 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Notes.java @@ -20,5 +20,5 @@ package org.apache.poi.sl.usermodel; import java.util.List; public interface Notes extends Sheet { - List> getTextParagraphs(); + List>> getTextParagraphs(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java index 11a5039c66..1741a732d3 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeContainer.java @@ -17,18 +17,20 @@ package org.apache.poi.sl.usermodel; +import java.util.List; + public interface ShapeContainer extends Iterable { /** - * Returns an array containing all of the elements in this container in proper + * Returns an list containing all of the elements in this container in proper * sequence (from first to last element). * - * @return an array containing all of the elements in this container in proper + * @return an list containing all of the elements in this container in proper * sequence */ - public T[] getShapes(); + List getShapes(); - public void addShape(T shape); + void addShape(T shape); /** * Removes the specified shape from this sheet, if it is present @@ -40,5 +42,5 @@ public interface ShapeContainer extends Iterable { * @throws IllegalArgumentException if the type of the specified shape * is incompatible with this sheet (optional) */ - public boolean removeShape(T shape); + boolean removeShape(T shape); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java index 0c25f5be4c..f151e0c082 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java @@ -285,6 +285,25 @@ public enum ShapeType { this.nativeName = nativeName; } + /** name of the presetShapeDefinit(i)on entry */ + public String getOoxmlName() { + if (this == SEAL) return STAR_16.getOoxmlName(); + if (ooxmlId == -1) return null; + + StringBuilder sb = new StringBuilder(); + boolean toLower = true; + for (char ch : name().toCharArray()) { + if (ch == '_') { + toLower = false; + continue; + } + sb.append(toLower ? Character.toLowerCase(ch) : Character.toUpperCase(ch)); + toLower = true; + } + + return sb.toString(); + } + public static ShapeType forId(int id, boolean isOoxmlId){ for(ShapeType t : values()){ if((isOoxmlId && t.ooxmlId == id) || diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java index b2027c182c..a9095c80ff 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java @@ -17,16 +17,16 @@ package org.apache.poi.sl.usermodel; -public interface Slide extends Sheet { - public Notes getNotes(); - public void setNotes(Notes notes); +public interface Slide> extends Sheet { + N getNotes(); + void setNotes(N notes); - public boolean getFollowMasterBackground(); - public void setFollowMasterBackground(boolean follow); + boolean getFollowMasterBackground(); + void setFollowMasterBackground(boolean follow); - public boolean getFollowMasterColourScheme(); - public void setFollowMasterColourScheme(boolean follow); + boolean getFollowMasterColourScheme(); + void setFollowMasterColourScheme(boolean follow); - public boolean getFollowMasterObjects(); - public void setFollowMasterObjects(boolean follow); + boolean getFollowMasterObjects(); + void setFollowMasterObjects(boolean follow); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java index e3007f6c17..ca0ddf3918 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/SlideShow.java @@ -19,13 +19,20 @@ package org.apache.poi.sl.usermodel; import java.awt.Dimension; import java.io.IOException; +import java.util.List; public interface SlideShow { - Slide createSlide() throws IOException; - MasterSheet createMasterSheet() throws IOException; + Slide> createSlide() throws IOException; - Slide[] getSlides(); - MasterSheet[] getMasterSheet(); + List>> getSlides(); + + MasterSheet createMasterSheet() throws IOException; + + /** + * Returns all slide masters. + * This doesn't include notes master and other arbitrary masters. + */ + List> getSlideMasters(); Resources getResources(); diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java index 348cc703d6..c4cf8bc57e 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java @@ -22,7 +22,7 @@ import java.awt.Color; public interface TextParagraph extends Iterable { /** - * Specified a list of text alignment types + * Specifies a list of text alignment types */ public enum TextAlign { /** @@ -50,6 +50,13 @@ public interface TextParagraph extends Iterable { THAI_DIST } + /** + * + */ + public enum FontAlign { + AUTO, TOP, CENTER, BASELINE, BOTTOM; + } + public interface BulletStyle { String getBulletCharacter(); String getBulletFont(); @@ -86,16 +93,32 @@ public interface TextParagraph extends Iterable { */ double getLeftMargin(); + /** + * @param leftMargin the left margin (in points) + */ + void setLeftMargin(double leftMargin); + + /** * @return the right margin (in points) of the paragraph */ double getRightMargin(); /** - * @return the indent applied (in points) to the first line of text in the paragraph. + * @param rightMargin the right margin (in points) of the paragraph + */ + void setRightMargin(double rightMargin); + + /** + * @return the indent (in points) applied to the first line of text in the paragraph. */ double getIndent(); + /** + * @param indent the indent (in points) applied to the first line of text in the paragraph + */ + void setIndent(double indent); + /** * Returns the vertical line spacing that is to be used within a paragraph. * This may be specified in two different ways, percentage spacing and font point spacing: @@ -123,6 +146,15 @@ public interface TextParagraph extends Iterable { */ TextAlign getTextAlign(); + + /** + * Returns the font alignment that is applied to the paragraph. + * + * If this attribute is omitted, then a value of auto (~ left) is implied. + * @return ??? alignment that is applied to the paragraph + */ + FontAlign getFontAlign(); + /** * @return the bullet style of the paragraph, if {@code null} then no bullets are used */ diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java index 87758c105f..8ac40c1892 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java @@ -31,7 +31,7 @@ public interface TextRun { ALL } - public String getText(); + public String getRawText(); public void setText(String text); TextCap getTextCap(); @@ -42,7 +42,7 @@ public interface TextRun { boolean isBold(); boolean isItalic(); - boolean isUnderline(); + boolean isUnderlined(); boolean isStrikethrough(); boolean isSubscript(); boolean isSuperscript(); diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java index a6a53fe1bd..927fdf1f9d 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextShape.java @@ -17,6 +17,8 @@ package org.apache.poi.sl.usermodel; +import org.apache.poi.ss.usermodel.HorizontalAlignment; + public interface TextShape> extends SimpleShape, Iterable { @@ -104,6 +106,16 @@ public interface TextShape> extends S */ VerticalAlignment getVerticalAlignment(); + /** + * Returns if the text is centered. + * If true and if the individual paragraph settings allow it, + * the whole text block will be displayed centered, i.e. its left and right + * margin will be maximized while still keeping the alignment of the paragraphs + * + * @return true, if the text anchor is horizontal centered + */ + boolean isHorizontalCentered(); + /** * @return whether to wrap words within the bounding rectangle */ diff --git a/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java index 134f3e8ac0..652314c204 100644 --- a/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java +++ b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java @@ -25,7 +25,7 @@ import junit.framework.TestCase; import java.io.*; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.hwpf.HWPFTestDataSamples; import org.apache.poi.poifs.filesystem.*; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java b/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java index 6207a4597d..34d5aee93d 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java @@ -24,8 +24,8 @@ import java.io.IOException; import java.io.InputStream; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; public class HSLFTestDataSamples { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java index 3de6032ae5..ae43394273 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java @@ -21,7 +21,7 @@ package org.apache.poi.hslf; import junit.framework.TestCase; import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.POIDataSamples; /** diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java index ae64b3614d..a742528e21 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java @@ -25,8 +25,8 @@ import java.io.FileNotFoundException; import junit.framework.TestCase; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.poifs.filesystem.DocumentEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java index 31a80ae306..50d2370d6a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java @@ -23,8 +23,8 @@ import junit.framework.TestCase; import java.io.*; import java.util.*; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.poifs.filesystem.*; import org.apache.poi.POIDataSamples; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java index 732f609381..d40a1e6437 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java @@ -20,8 +20,8 @@ package org.apache.poi.hslf; import junit.framework.TestCase; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.POIDataSamples; /** diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java index a00d75d03e..55a4ca8bbd 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java @@ -23,9 +23,9 @@ import java.util.List; import org.apache.poi.POIDataSamples; import org.apache.poi.POITestCase; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.model.OLEShape; import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.poifs.filesystem.DirectoryNode; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java index 71cd5f570d..f43f168ee7 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java @@ -17,6 +17,7 @@ package org.apache.poi.hslf.model; +import org.apache.poi.hslf.usermodel.TestTextRun; import org.junit.runner.RunWith; import org.junit.runners.Suite; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java index 0d1cfd9e09..92eca1ae5d 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java @@ -33,7 +33,7 @@ import org.apache.poi.ddf.EscherProperties; import org.apache.poi.ddf.EscherRecord; import org.apache.poi.ddf.EscherSimpleProperty; import org.apache.poi.hslf.record.Document; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeType; import org.junit.Test; @@ -53,7 +53,7 @@ public final class TestBackground { public void defaults() { HSLFSlideShow ppt = new HSLFSlideShow(); - assertEquals(HSLFFill.FILL_SOLID, ppt.getSlidesMasters()[0].getBackground().getFill().getFillType()); + assertEquals(HSLFFill.FILL_SOLID, ppt.getSlideMasters().get(0).getBackground().getFill().getFillType()); HSLFSlide slide = ppt.createSlide(); assertTrue(slide.getFollowMasterBackground()); @@ -72,26 +72,26 @@ public final class TestBackground { HSLFFill fill; HSLFShape shape; - HSLFSlide[] slide = ppt.getSlides(); + List slide = ppt.getSlides(); - fill = slide[0].getBackground().getFill(); + fill = slide.get(0).getBackground().getFill(); assertEquals(HSLFFill.FILL_PICTURE, fill.getFillType()); - shape = slide[0].getShapes()[0]; + shape = slide.get(0).getShapes().get(0); assertEquals(HSLFFill.FILL_SOLID, shape.getFill().getFillType()); - fill = slide[1].getBackground().getFill(); + fill = slide.get(1).getBackground().getFill(); assertEquals(HSLFFill.FILL_PATTERN, fill.getFillType()); - shape = slide[1].getShapes()[0]; + shape = slide.get(1).getShapes().get(0); assertEquals(HSLFFill.FILL_BACKGROUND, shape.getFill().getFillType()); - fill = slide[2].getBackground().getFill(); + fill = slide.get(2).getBackground().getFill(); assertEquals(HSLFFill.FILL_TEXTURE, fill.getFillType()); - shape = slide[2].getShapes()[0]; + shape = slide.get(2).getShapes().get(0); assertEquals(HSLFFill.FILL_PICTURE, shape.getFill().getFillType()); - fill = slide[3].getBackground().getFill(); + fill = slide.get(3).getBackground().getFill(); assertEquals(HSLFFill.FILL_SHADE_CENTER, fill.getFillType()); - shape = slide[3].getShapes()[0]; + shape = slide.get(3).getShapes().get(0); assertEquals(HSLFFill.FILL_SHADE, shape.getFill().getFillType()); } @@ -174,29 +174,29 @@ public final class TestBackground { out.close(); ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - HSLFSlide[] slides = ppt.getSlides(); + List slides = ppt.getSlides(); - fill = slides[0].getBackground().getFill(); + fill = slides.get(0).getBackground().getFill(); assertEquals(HSLFFill.FILL_PICTURE, fill.getFillType()); - assertEquals(3, getFillPictureRefCount(slides[0].getBackground(), fill)); - shape = slides[0].getShapes()[0]; + assertEquals(3, getFillPictureRefCount(slides.get(0).getBackground(), fill)); + shape = slides.get(0).getShapes().get(0); assertEquals(HSLFFill.FILL_SOLID, shape.getFill().getFillType()); - fill = slides[1].getBackground().getFill(); + fill = slides.get(1).getBackground().getFill(); assertEquals(HSLFFill.FILL_PATTERN, fill.getFillType()); - shape = slides[1].getShapes()[0]; + shape = slides.get(1).getShapes().get(0); assertEquals(HSLFFill.FILL_BACKGROUND, shape.getFill().getFillType()); - fill = slides[2].getBackground().getFill(); + fill = slides.get(2).getBackground().getFill(); assertEquals(HSLFFill.FILL_TEXTURE, fill.getFillType()); - assertEquals(3, getFillPictureRefCount(slides[2].getBackground(), fill)); - shape = slides[2].getShapes()[0]; + assertEquals(3, getFillPictureRefCount(slides.get(2).getBackground(), fill)); + shape = slides.get(2).getShapes().get(0); assertEquals(HSLFFill.FILL_PICTURE, shape.getFill().getFillType()); assertEquals(1, getFillPictureRefCount(shape, fill)); - fill = slides[3].getBackground().getFill(); + fill = slides.get(3).getBackground().getFill(); assertEquals(HSLFFill.FILL_SHADE_CENTER, fill.getFillType()); - shape = slides[3].getShapes()[0]; + shape = slides.get(3).getShapes().get(0); assertEquals(HSLFFill.FILL_SHADE, shape.getFill().getFillType()); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java index 6d1365efbe..cdbf28cb60 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java @@ -17,12 +17,13 @@ package org.apache.poi.hslf.model; -import java.awt.geom.Area; -import java.awt.geom.GeneralPath; -import java.awt.geom.Line2D; -import java.awt.geom.Rectangle2D; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; -import junit.framework.TestCase; +import java.awt.geom.*; + +import org.apache.poi.hslf.usermodel.HSLFFreeformShape; +import org.junit.Test; /** * Test Freeform object. @@ -32,8 +33,9 @@ import junit.framework.TestCase; * * @author Yegor Kozlov */ -public final class TestFreeform extends TestCase { +public final class TestFreeform { + @Test public void testClosedPath() { GeneralPath path1 = new GeneralPath(); @@ -50,6 +52,7 @@ public final class TestFreeform extends TestCase { assertTrue(new Area(path1).equals(new Area(path2))); } + @Test public void testLine() { GeneralPath path1 = new GeneralPath(new Line2D.Double(100, 100, 200, 100)); @@ -61,6 +64,7 @@ public final class TestFreeform extends TestCase { assertTrue(new Area(path1).equals(new Area(path2))); } + @Test public void testRectangle() { GeneralPath path1 = new GeneralPath(new Rectangle2D.Double(100, 100, 200, 50)); @@ -76,6 +80,7 @@ public final class TestFreeform extends TestCase { * Avoid NPE in Freeform.getOutline() if either GEOMETRY__VERTICES or * GEOMETRY__SEGMENTINFO is missing, see Bugzilla 54188 */ + @Test public void test54188() { HSLFFreeformShape p = new HSLFFreeformShape(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java index 8239a359d5..6a503fde4a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java @@ -17,22 +17,27 @@ package org.apache.poi.hslf.model; -import java.io.*; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.POIDataSamples; +import static org.junit.Assert.*; -import junit.framework.TestCase; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.util.List; + +import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.usermodel.HSLFSlide; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.junit.Test; /** * Test {@link org.apache.poi.hslf.model.HeadersFooters} object */ -public final class TestHeadersFooters extends TestCase +public final class TestHeadersFooters { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); - public void testRead() throws Exception - { + @Test + public void testRead() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("headers_footers.ppt")); HeadersFooters slideHdd = ppt.getSlideHeadersFooters(); @@ -53,9 +58,9 @@ public final class TestHeadersFooters extends TestCase assertTrue(notesHdd.isUserDateVisible()); assertNull(notesHdd.getDateTimeText()); - HSLFSlide[] slide = ppt.getSlides(); + List slide = ppt.getSlides(); //the first slide uses presentation-scope headers / footers - HeadersFooters hd1 = slide[0].getHeadersFooters(); + HeadersFooters hd1 = slide.get(0).getHeadersFooters(); assertEquals(slideHdd.isFooterVisible(), hd1.isFooterVisible()); assertEquals(slideHdd.getFooterText(), hd1.getFooterText()); assertEquals(slideHdd.isSlideNumberVisible(), hd1.isSlideNumberVisible()); @@ -65,7 +70,7 @@ public final class TestHeadersFooters extends TestCase assertEquals(slideHdd.getDateTimeText(), hd1.getDateTimeText()); //the first slide uses per-slide headers / footers - HeadersFooters hd2 = slide[1].getHeadersFooters(); + HeadersFooters hd2 = slide.get(1).getHeadersFooters(); assertEquals(true, hd2.isFooterVisible()); assertEquals("per-slide footer", hd2.getFooterText()); assertEquals(true, hd2.isUserDateVisible()); @@ -75,8 +80,8 @@ public final class TestHeadersFooters extends TestCase /** * If Headers / Footers are not set, all the getters should return false or null */ - public void testReadNoHeadersFooters() throws Exception - { + @Test + public void testReadNoHeadersFooters() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); HeadersFooters slideHdd = ppt.getSlideHeadersFooters(); @@ -97,9 +102,8 @@ public final class TestHeadersFooters extends TestCase assertFalse(notesHdd.isUserDateVisible()); assertNull(notesHdd.getDateTimeText()); - HSLFSlide[] slide = ppt.getSlides(); - for(int i=0 ; i < slide.length; i++){ - HeadersFooters hd1 = slide[i].getHeadersFooters(); + for(HSLFSlide s : ppt.getSlides()) { + HeadersFooters hd1 = s.getHeadersFooters(); assertFalse(hd1.isFooterVisible()); assertNull(hd1.getFooterText()); assertFalse(hd1.isHeaderVisible()); @@ -112,8 +116,8 @@ public final class TestHeadersFooters extends TestCase /** * Test extraction of headers / footers from PPTs saved in Office 2007 */ - public void testRead2007() throws Exception - { + @Test + public void testRead2007() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("headers_footers_2007.ppt")); HeadersFooters slideHdd = ppt.getSlideHeadersFooters(); @@ -137,9 +141,9 @@ public final class TestHeadersFooters extends TestCase //assertEquals("08/12/08", notesHdd.getDateTimeText()); //per-slide headers / footers - HSLFSlide[] slide = ppt.getSlides(); + List slide = ppt.getSlides(); //the first slide uses presentation-scope headers / footers - HeadersFooters hd1 = slide[0].getHeadersFooters(); + HeadersFooters hd1 = slide.get(0).getHeadersFooters(); assertTrue(hd1.isFooterVisible()); assertEquals("THE FOOTER TEXT", hd1.getFooterText()); assertTrue(hd1.isSlideNumberVisible()); @@ -150,7 +154,7 @@ public final class TestHeadersFooters extends TestCase assertEquals("Wednesday, August 06, 2008", hd1.getDateTimeText()); //the second slide uses custom per-slide headers / footers - HeadersFooters hd2 = slide[1].getHeadersFooters(); + HeadersFooters hd2 = slide.get(1).getHeadersFooters(); assertTrue(hd2.isFooterVisible()); assertEquals("THE FOOTER TEXT FOR SLIDE 2", hd2.getFooterText()); assertTrue(hd2.isSlideNumberVisible()); @@ -161,7 +165,7 @@ public final class TestHeadersFooters extends TestCase assertEquals("August 06, 2008", hd2.getDateTimeText()); //the third slide uses per-slide headers / footers - HeadersFooters hd3 = slide[2].getHeadersFooters(); + HeadersFooters hd3 = slide.get(2).getHeadersFooters(); assertTrue(hd3.isFooterVisible()); assertEquals("THE FOOTER TEXT", hd3.getFooterText()); assertTrue(hd3.isSlideNumberVisible()); @@ -172,8 +176,8 @@ public final class TestHeadersFooters extends TestCase assertEquals("Wednesday, August 06, 2008", hd3.getDateTimeText()); } - public void testCreateSlideFooters() throws Exception - { + @Test + public void testCreateSlideFooters() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(); HeadersFooters hdd = ppt.getSlideHeadersFooters(); hdd.setFootersText("My slide footer"); @@ -190,8 +194,8 @@ public final class TestHeadersFooters extends TestCase assertEquals("My slide footer", hdd2.getFooterText()); } - public void testCreateNotesFooters() throws Exception - { + @Test + public void testCreateNotesFooters() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(); HeadersFooters hdd = ppt.getNotesHeadersFooters(); hdd.setFootersText("My notes footer"); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java index 83e6ca6582..5438ac8af9 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java @@ -17,70 +17,68 @@ package org.apache.poi.hslf.model; -import junit.framework.TestCase; +import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.getRawText; +import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.toExternalString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.List; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.usermodel.*; +import org.junit.Test; /** * Test Hyperlink. * * @author Yegor Kozlov */ -public final class TestHyperlink extends TestCase { +public final class TestHyperlink { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); + @Test public void testTextRunHyperlinks() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("WithLinks.ppt")); - HSLFTextParagraph[] run; - HSLFSlide slide; - slide = ppt.getSlides()[0]; - run = slide.getTextRuns(); - for (int i = 0; i < run.length; i++) { - String text = run[i].getText(); - if (text.equals( - "This page has two links:\n" + - "http://jakarta.apache.org/poi/\n" + - "\n" + - "http://slashdot.org/\n" + - "\n" + - "In addition, its notes has one link")){ + HSLFSlide slide = ppt.getSlides().get(0); + List para = slide.getTextParagraphs().get(1); + + String rawText = toExternalString(getRawText(para), para.get(0).getRunType()); + String expected = + "This page has two links:\n"+ + "http://jakarta.apache.org/poi/\n"+ + "\n"+ + "http://slashdot.org/\n"+ + "\n"+ + "In addition, its notes has one link"; + assertEquals(expected, rawText); + + HSLFHyperlink[] links = HSLFHyperlink.find(para.get(1)); + assertNotNull(links); + assertEquals(2, links.length); - Hyperlink[] links = run[i].getHyperlinks(); - assertNotNull(links); - assertEquals(2, links.length); + assertEquals("http://jakarta.apache.org/poi/", links[0].getTitle()); + assertEquals("http://jakarta.apache.org/poi/", links[0].getAddress()); + assertEquals("http://jakarta.apache.org/poi/", rawText.substring(links[0].getStartIndex(), links[0].getEndIndex()-1)); - assertEquals("http://jakarta.apache.org/poi/", links[0].getTitle()); - assertEquals("http://jakarta.apache.org/poi/", links[0].getAddress()); - assertEquals("http://jakarta.apache.org/poi/", text.substring(links[0].getStartIndex(), links[0].getEndIndex()-1)); + assertEquals("http://slashdot.org/", links[1].getTitle()); + assertEquals("http://slashdot.org/", links[1].getAddress()); + assertEquals("http://slashdot.org/", rawText.substring(links[1].getStartIndex(), links[1].getEndIndex()-1)); - assertEquals("http://slashdot.org/", links[1].getTitle()); - assertEquals("http://slashdot.org/", links[1].getAddress()); - assertEquals("http://slashdot.org/", text.substring(links[1].getStartIndex(), links[1].getEndIndex()-1)); + slide = ppt.getSlides().get(1); + para = slide.getTextParagraphs().get(1); + rawText = toExternalString(getRawText(para), para.get(0).getRunType()); + expected = + "I have the one link:\n" + + "Jakarta HSSF"; + assertEquals(expected, rawText); - } - } - - slide = ppt.getSlides()[1]; - run = slide.getTextRuns(); - for (int i = 0; i < run.length; i++) { - String text = run[i].getText(); - if (text.equals( - "I have the one link:\n" + - "Jakarta HSSF")){ - - Hyperlink[] links = run[i].getHyperlinks(); - assertNotNull(links); - assertEquals(1, links.length); - - assertEquals("http://jakarta.apache.org/poi/hssf/", links[0].getTitle()); - assertEquals("http://jakarta.apache.org/poi/hssf/", links[0].getAddress()); - assertEquals("Jakarta HSSF", text.substring(links[0].getStartIndex(), links[0].getEndIndex()-1)); - - } - } + links = HSLFHyperlink.find(para.get(1)); + assertNotNull(links); + assertEquals(1, links.length); + assertEquals("http://jakarta.apache.org/poi/hssf/", links[0].getTitle()); + assertEquals("http://jakarta.apache.org/poi/hssf/", links[0].getAddress()); + assertEquals("Jakarta HSSF", rawText.substring(links[0].getStartIndex(), links[0].getEndIndex()-1)); } - } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java index 11a64f6379..963beeefbe 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java @@ -24,6 +24,7 @@ import junit.framework.TestCase; import org.apache.poi.hslf.blip.BitmapPainter; import org.apache.poi.hslf.blip.ImagePainter; import org.apache.poi.hslf.usermodel.HSLFPictureData; +import org.apache.poi.hslf.usermodel.HSLFPictureShape; /** * Test Picture shape. diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java index 413ff8ebe8..5d58b25383 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java @@ -19,17 +19,20 @@ package org.apache.poi.hslf.model; import java.awt.Color; -import junit.framework.TestCase; - +import org.apache.poi.hslf.usermodel.HSLFSlide; import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound; +import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; +import org.junit.Test; /** * Test Line shape. * * @author Yegor Kozlov */ -public final class TestLine extends TestCase { +public final class TestLine { + @Test public void testCreateLines() { HSLFSlideShow ppt = new HSLFSlideShow(); @@ -44,31 +47,31 @@ public final class TestLine extends TestCase { */ line = new Line(); line.setAnchor(new java.awt.Rectangle(75, 200, 300, 0)); - line.setLineStyle(Line.LINE_SIMPLE); + line.setLineCompound(LineCompound.SINGLE); line.setLineColor(Color.blue); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(75, 230, 300, 0)); - line.setLineStyle(Line.LINE_DOUBLE); + line.setLineCompound(LineCompound.DOUBLE); line.setLineWidth(3.5); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(75, 260, 300, 0)); - line.setLineStyle(Line.LINE_TRIPLE); + line.setLineCompound(LineCompound.TRIPLE); line.setLineWidth(6); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(75, 290, 300, 0)); - line.setLineStyle(Line.LINE_THICKTHIN); + line.setLineCompound(LineCompound.THICK_THIN); line.setLineWidth(4.5); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(75, 320, 300, 0)); - line.setLineStyle(Line.LINE_THINTHICK); + line.setLineCompound(LineCompound.THIN_THICK); line.setLineWidth(5.5); slide.addShape(line); @@ -77,27 +80,27 @@ public final class TestLine extends TestCase { */ line = new Line(); line.setAnchor(new java.awt.Rectangle(450, 200, 300, 0)); - line.setLineDashing(Line.PEN_SOLID); + line.setLineDashing(LineDash.SOLID); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(450, 230, 300, 0)); - line.setLineDashing(Line.PEN_PS_DASH); + line.setLineDashing(LineDash.DASH); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(450, 260, 300, 0)); - line.setLineDashing(Line.PEN_DOT); + line.setLineDashing(LineDash.DOT); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(450, 290, 300, 0)); - line.setLineDashing(Line.PEN_DOTGEL); + line.setLineDashing(LineDash.DASH_DOT); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(450, 320, 300, 0)); - line.setLineDashing(Line.PEN_LONGDASHDOTDOTGEL); + line.setLineDashing(LineDash.LG_DASH_DOT_DOT); slide.addShape(line); /** @@ -105,22 +108,22 @@ public final class TestLine extends TestCase { */ line = new Line(); line.setAnchor(new java.awt.Rectangle(75, 400, 300, 0)); - line.setLineDashing(Line.PEN_DASHDOT); - line.setLineStyle(Line.LINE_TRIPLE); + line.setLineDashing(LineDash.DASH_DOT); + line.setLineCompound(LineCompound.TRIPLE); line.setLineWidth(5.0); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(75, 430, 300, 0)); - line.setLineDashing(Line.PEN_DASH); - line.setLineStyle(Line.LINE_THICKTHIN); + line.setLineDashing(LineDash.DASH); + line.setLineCompound(LineCompound.THICK_THIN); line.setLineWidth(4.0); slide.addShape(line); line = new Line(); line.setAnchor(new java.awt.Rectangle(75, 460, 300, 0)); - line.setLineDashing(Line.PEN_DOT); - line.setLineStyle(Line.LINE_DOUBLE); + line.setLineDashing(LineDash.DOT); + line.setLineCompound(LineCompound.DOUBLE); line.setLineWidth(8.0); slide.addShape(line); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java index 1b5bbd3298..a83d820123 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java @@ -17,24 +17,26 @@ package org.apache.poi.hslf.model; +import static org.junit.Assert.*; + import java.awt.geom.Rectangle2D; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import junit.framework.TestCase; - -import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.usermodel.*; +import org.junit.Test; /** * Test MovieShape object. * * @author Yegor Kozlov */ -public final class TestMovieShape extends TestCase { +public final class TestMovieShape { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); + @Test public void testCreate() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(); @@ -57,8 +59,8 @@ public final class TestMovieShape extends TestCase { ppt.write(out); ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); - slide = ppt.getSlides()[0]; - shape = (MovieShape)slide.getShapes()[0]; + slide = ppt.getSlides().get(0); + shape = (MovieShape)slide.getShapes().get(0); assertEquals(path, shape.getPath()); assertFalse(shape.isAutoPlay()); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java index 410f48226a..f58949117f 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java @@ -18,32 +18,28 @@ package org.apache.poi.hslf.model; import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; import java.awt.geom.Rectangle2D; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.InputStream; - -import junit.framework.TestCase; +import java.io.*; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.usermodel.HSLFObjectData; -import org.apache.poi.hslf.usermodel.HSLFPictureData; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.IOUtils; +import org.junit.Test; -public final class TestOleEmbedding extends TestCase { +public final class TestOleEmbedding { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); /** * Tests support for OLE objects. * * @throws Exception if an error occurs. */ + @Test public void testOleEmbedding2003() throws Exception { HSLFSlideShowImpl slideShow = new HSLFSlideShowImpl(_slTests.openResourceAsStream("ole2-embedding-2003.ppt")); // Placeholder EMFs for clients that don't support the OLE components. @@ -59,16 +55,16 @@ public final class TestOleEmbedding extends TestCase { //assertDigestEquals("Wrong data for object 2", "b323604b2003a7299c77c2693b641495", objects[1].getData()); } + @Test public void testOLEShape() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("ole2-embedding-2003.ppt")); - HSLFSlide slide = ppt.getSlides()[0]; - HSLFShape[] sh = slide.getShapes(); + HSLFSlide slide = ppt.getSlides().get(0); int cnt = 0; - for (int i = 0; i < sh.length; i++) { - if(sh[i] instanceof OLEShape){ + for (HSLFShape sh : slide.getShapes()) { + if(sh instanceof OLEShape){ cnt++; - OLEShape ole = (OLEShape)sh[i]; + OLEShape ole = (OLEShape)sh; HSLFObjectData data = ole.getObjectData(); if("Worksheet".equals(ole.getInstanceName())){ //Voila! we created a workbook from the embedded OLE data @@ -80,6 +76,7 @@ public final class TestOleEmbedding extends TestCase { assertEquals(2, sheet.getRow(2).getCell(0).getNumericCellValue(), 0); assertEquals(3, sheet.getRow(3).getCell(0).getNumericCellValue(), 0); assertEquals(8, sheet.getRow(5).getCell(0).getNumericCellValue(), 0); + wb.close(); } else if ("Document".equals(ole.getInstanceName())){ //creating a HWPF document HWPFDocument doc = new HWPFDocument(data.getData()); @@ -92,6 +89,7 @@ public final class TestOleEmbedding extends TestCase { assertEquals("Expected 2 OLE shapes", 2, cnt); } + @Test public void testEmbedding() throws Exception { HSLFSlideShowImpl _hslfSlideShow = HSLFSlideShowImpl.create(); HSLFSlideShow ppt = new HSLFSlideShow(_hslfSlideShow); @@ -129,7 +127,7 @@ public final class TestOleEmbedding extends TestCase { ppt.write(bos); ppt = new HSLFSlideShow(new ByteArrayInputStream(bos.toByteArray())); - OLEShape comp = (OLEShape)ppt.getSlides()[0].getShapes()[0]; + OLEShape comp = (OLEShape)ppt.getSlides().get(0).getShapes().get(0); byte compData[] = IOUtils.toByteArray(comp.getObjectData().getData()); bos.reset(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java index fb04ccf5dd..4c69862c3b 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java @@ -17,16 +17,20 @@ package org.apache.poi.hslf.model; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; + import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.junit.Test; + /** * Test adding fonts to the presenataion resources * * @author Yegor Kozlov */ -public final class TestPPFont extends TestCase{ +public final class TestPPFont { + @Test public void testCreate() { HSLFSlideShow ppt = new HSLFSlideShow(); assertEquals(1, ppt.getNumberOfFonts()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java index b71ce01035..4fb06ddcf3 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java @@ -17,35 +17,41 @@ package org.apache.poi.hslf.model; -import junit.framework.TestCase; - -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.POIDataSamples; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.awt.*; -import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.util.List; + +import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.usermodel.*; +import org.junit.Before; +import org.junit.Test; /** * Test drawing shapes via Graphics2D * * @author Yegor Kozlov */ -public final class TestPPGraphics2D extends TestCase { +public final class TestPPGraphics2D { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); private HSLFSlideShow ppt; + @Before protected void setUp() throws Exception { ppt = new HSLFSlideShow(_slTests.openResourceAsStream("empty.ppt")); } + @Test public void testGraphics() throws Exception { // Starts off empty - assertEquals(0, ppt.getSlides().length); + assertTrue(ppt.getSlides().isEmpty()); // Add a slide HSLFSlide slide = ppt.createSlide(); - assertEquals(1, ppt.getSlides().length); + assertEquals(1, ppt.getSlides().size()); // Add some stuff into it HSLFGroupShape group = new HSLFGroupShape(); @@ -73,17 +79,17 @@ public final class TestPPGraphics2D extends TestCase { // And read it back in ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - assertEquals(1, ppt.getSlides().length); + assertEquals(1, ppt.getSlides().size()); - slide = ppt.getSlides()[0]; - HSLFShape[] shape = slide.getShapes(); - assertEquals(shape.length, 1); //group shape + slide = ppt.getSlides().get(0); + List shape = slide.getShapes(); + assertEquals(shape.size(), 1); //group shape - assertTrue(shape[0] instanceof HSLFGroupShape); //group shape + assertTrue(shape.get(0) instanceof HSLFGroupShape); //group shape - group = (HSLFGroupShape)shape[0]; + group = (HSLFGroupShape)shape.get(0); shape = group.getShapes(); - assertEquals(shape.length, 3); + assertEquals(shape.size(), 3); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java index 08077f0e00..ff4e1c5a7a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java @@ -36,8 +36,7 @@ import javax.imageio.ImageIO; import org.apache.poi.POIDataSamples; import org.apache.poi.ddf.EscherBSERecord; -import org.apache.poi.hslf.usermodel.HSLFPictureData; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.util.JvmBugs; import org.junit.Ignore; import org.junit.Test; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java index e1703626ca..febf9e3b20 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java @@ -17,24 +17,25 @@ package org.apache.poi.hslf.model; -import junit.framework.TestCase; +import static org.junit.Assert.*; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.HSLFTextRun; - -import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import org.apache.poi.hslf.usermodel.*; +import org.junit.Test; /** * Test setting text properties of newly added TextBoxes * * @author Yegor Kozlov */ -public final class TestSetBoldItalic extends TestCase { +public final class TestSetBoldItalic { /** * Verify that we can add TextBox shapes to a slide * and set some of the style attributes */ + @Test public void testTextBoxWrite() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlide sl = ppt.createSlide(); @@ -44,7 +45,7 @@ public final class TestSetBoldItalic extends TestCase { // Create a new textbox, and give it lots of properties HSLFTextBox txtbox = new HSLFTextBox(); - rt = txtbox.getTextParagraph().getRichTextRuns()[0]; + rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); txtbox.setText(val); rt.setFontSize(42); rt.setBold(true); @@ -53,9 +54,9 @@ public final class TestSetBoldItalic extends TestCase { sl.addShape(txtbox); // Check it before save - rt = txtbox.getTextParagraph().getRichTextRuns()[0]; - assertEquals(val, rt.getText()); - assertEquals(42, rt.getFontSize()); + rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); + assertEquals(val, rt.getRawText()); + assertEquals(42, rt.getFontSize(), 0); assertTrue(rt.isBold()); assertTrue(rt.isItalic()); @@ -65,14 +66,14 @@ public final class TestSetBoldItalic extends TestCase { out.close(); ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - sl = ppt.getSlides()[0]; + sl = ppt.getSlides().get(0); - txtbox = (HSLFTextBox)sl.getShapes()[0]; - rt = txtbox.getTextParagraph().getRichTextRuns()[0]; + txtbox = (HSLFTextBox)sl.getShapes().get(0); + rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); // Check after save - assertEquals(val, rt.getText()); - assertEquals(42, rt.getFontSize()); + assertEquals(val, rt.getRawText()); + assertEquals(42, rt.getFontSize(), 0); assertTrue(rt.isBold()); assertTrue(rt.isItalic()); assertFalse(rt.isUnderlined()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java index 9456c211f8..d38a21ecab 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java @@ -17,30 +17,18 @@ package org.apache.poi.hslf.model; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Rectangle; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; +import java.awt.*; +import java.io.*; import java.util.ArrayList; +import java.util.List; import org.apache.poi.POIDataSamples; -import org.apache.poi.ddf.EscherDgRecord; -import org.apache.poi.ddf.EscherDggRecord; -import org.apache.poi.ddf.EscherOptRecord; -import org.apache.poi.ddf.EscherProperties; -import org.apache.poi.ddf.EscherSimpleProperty; -import org.apache.poi.hslf.usermodel.HSLFTextRun; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.ddf.*; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.junit.Before; import org.junit.Test; @@ -77,7 +65,7 @@ public final class TestShapes { java.awt.Rectangle lineAnchor = new java.awt.Rectangle(100, 200, 50, 60); line.setAnchor(lineAnchor); line.setLineWidth(3); - line.setLineStyle(Line.PEN_DASH); + line.setLineDashing(LineDash.DASH); line.setLineColor(Color.red); slide.addShape(line); @@ -85,7 +73,7 @@ public final class TestShapes { java.awt.Rectangle ellipseAnchor = new Rectangle(320, 154, 55, 111); ellipse.setAnchor(ellipseAnchor); ellipse.setLineWidth(2); - ellipse.setLineStyle(Line.PEN_SOLID); + ellipse.setLineDashing(LineDash.SOLID); ellipse.setLineColor(Color.green); ellipse.setFillColor(Color.lightGray); slide.addShape(ellipse); @@ -97,17 +85,17 @@ public final class TestShapes { //read ppt from byte array ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - assertEquals(1, ppt.getSlides().length); + assertEquals(1, ppt.getSlides().size()); - slide = ppt.getSlides()[0]; - HSLFShape[] shape = slide.getShapes(); - assertEquals(2, shape.length); + slide = ppt.getSlides().get(0); + List shape = slide.getShapes(); + assertEquals(2, shape.size()); - assertTrue(shape[0] instanceof Line); //group shape - assertEquals(lineAnchor, shape[0].getAnchor()); //group shape + assertTrue(shape.get(0) instanceof Line); //group shape + assertEquals(lineAnchor, shape.get(0).getAnchor()); //group shape - assertTrue(shape[1] instanceof HSLFAutoShape); //group shape - assertEquals(ellipseAnchor, shape[1].getAnchor()); //group shape + assertTrue(shape.get(1) instanceof HSLFAutoShape); //group shape + assertEquals(ellipseAnchor, shape.get(1).getAnchor()); //group shape } /** @@ -117,31 +105,30 @@ public final class TestShapes { @Test public void textBoxRead() throws Exception { ppt = new HSLFSlideShow(_slTests.openResourceAsStream("with_textbox.ppt")); - HSLFSlide sl = ppt.getSlides()[0]; - HSLFShape[] sh = sl.getShapes(); - for (int i = 0; i < sh.length; i++) { - assertTrue(sh[i] instanceof HSLFTextBox); - HSLFTextBox txtbox = (HSLFTextBox)sh[i]; + HSLFSlide sl = ppt.getSlides().get(0); + for (HSLFShape sh : sl.getShapes()) { + assertTrue(sh instanceof HSLFTextBox); + HSLFTextBox txtbox = (HSLFTextBox)sh; String text = txtbox.getText(); assertNotNull(text); - assertEquals(txtbox.getTextParagraph().getRichTextRuns().length, 1); - HSLFTextRun rt = txtbox.getTextParagraph().getRichTextRuns()[0]; + assertEquals(txtbox.getTextParagraphs().get(0).getTextRuns().size(), 1); + HSLFTextRun rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); if (text.equals("Hello, World!!!")){ - assertEquals(32, rt.getFontSize()); + assertEquals(32, rt.getFontSize(), 0); assertTrue(rt.isBold()); assertTrue(rt.isItalic()); } else if (text.equals("I am just a poor boy")){ - assertEquals(44, rt.getFontSize()); + assertEquals(44, rt.getFontSize(), 0); assertTrue(rt.isBold()); } else if (text.equals("This is Times New Roman")){ - assertEquals(16, rt.getFontSize()); + assertEquals(16, rt.getFontSize(), 0); assertTrue(rt.isBold()); assertTrue(rt.isItalic()); assertTrue(rt.isUnderlined()); } else if (text.equals("Plain Text")){ - assertEquals(18, rt.getFontSize()); + assertEquals(18, rt.getFontSize(), 0); } } } @@ -160,7 +147,7 @@ public final class TestShapes { // Create a new textbox, and give it lots of properties HSLFTextBox txtbox = new HSLFTextBox(); - rt = txtbox.getTextParagraph().getRichTextRuns()[0]; + rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); txtbox.setText(val); rt.setFontName("Arial"); rt.setFontSize(42); @@ -171,13 +158,13 @@ public final class TestShapes { sl.addShape(txtbox); // Check it before save - rt = txtbox.getTextParagraph().getRichTextRuns()[0]; - assertEquals(val, rt.getText()); - assertEquals(42, rt.getFontSize()); + rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); + assertEquals(val, rt.getRawText()); + assertEquals(42, rt.getFontSize(), 0); assertTrue(rt.isBold()); assertTrue(rt.isItalic()); assertFalse(rt.isUnderlined()); - assertEquals("Arial", rt.getFontName()); + assertEquals("Arial", rt.getFontFamily()); assertEquals(Color.red, rt.getFontColor()); // Serialize and read again @@ -186,18 +173,18 @@ public final class TestShapes { out.close(); ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - sl = ppt.getSlides()[0]; + sl = ppt.getSlides().get(0); - txtbox = (HSLFTextBox)sl.getShapes()[0]; - rt = txtbox.getTextParagraph().getRichTextRuns()[0]; + txtbox = (HSLFTextBox)sl.getShapes().get(0); + rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); // Check after save - assertEquals(val, rt.getText()); - assertEquals(42, rt.getFontSize()); + assertEquals(val, rt.getRawText()); + assertEquals(42, rt.getFontSize(), 0); assertTrue(rt.isBold()); assertTrue(rt.isItalic()); assertFalse(rt.isUnderlined()); - assertEquals("Arial", rt.getFontName()); + assertEquals("Arial", rt.getFontFamily()); assertEquals(Color.red, rt.getFontColor()); } @@ -206,13 +193,13 @@ public final class TestShapes { */ @Test public void emptyTextBox() { - assertEquals(2, pptB.getSlides().length); - HSLFSlide s1 = pptB.getSlides()[0]; - HSLFSlide s2 = pptB.getSlides()[1]; + assertEquals(2, pptB.getSlides().size()); + HSLFSlide s1 = pptB.getSlides().get(0); + HSLFSlide s2 = pptB.getSlides().get(1); // Check we can get the shapes count - assertEquals(2, s1.getShapes().length); - assertEquals(2, s2.getShapes().length); + assertEquals(2, s1.getShapes().size()); + assertEquals(2, s2.getShapes().size()); } /** @@ -231,19 +218,20 @@ public final class TestShapes { private void textBoxSet(String filename) throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream(filename)); - HSLFSlide[] sl = ppt.getSlides(); - for (int k = 0; k < sl.length; k++) { + for (HSLFSlide sld : ppt.getSlides()) { ArrayList lst1 = new ArrayList(); - HSLFTextParagraph[] txt = sl[k].getTextRuns(); - for (int i = 0; i < txt.length; i++) { - lst1.add(txt[i].getText()); + for (List txt : sld.getTextParagraphs()) { + for (HSLFTextParagraph p : txt) { + for (HSLFTextRun r : p) { + lst1.add(r.getRawText()); + } + } } ArrayList lst2 = new ArrayList(); - HSLFShape[] sh = sl[k].getShapes(); - for (int i = 0; i < sh.length; i++) { - if (sh[i] instanceof HSLFTextShape){ - HSLFTextShape tbox = (HSLFTextShape)sh[i]; + for (HSLFShape sh : sld.getShapes()) { + if (sh instanceof HSLFTextShape){ + HSLFTextShape tbox = (HSLFTextShape)sh; lst2.add(tbox.getText()); } } @@ -285,22 +273,22 @@ public final class TestShapes { ppt = new HSLFSlideShow(is); is.close(); - slide = ppt.getSlides()[0]; + slide = ppt.getSlides().get(0); - HSLFShape[] shape = slide.getShapes(); - assertEquals(1, shape.length); - assertTrue(shape[0] instanceof HSLFGroupShape); + List shape = slide.getShapes(); + assertEquals(1, shape.size()); + assertTrue(shape.get(0) instanceof HSLFGroupShape); - group = (HSLFGroupShape)shape[0]; - HSLFShape[] grshape = group.getShapes(); - assertEquals(2, grshape.length); - assertTrue(grshape[0] instanceof HSLFPictureShape); - assertTrue(grshape[1] instanceof Line); + group = (HSLFGroupShape)shape.get(0); + List grshape = group.getShapes(); + assertEquals(2, grshape.size()); + assertTrue(grshape.get(0) instanceof HSLFPictureShape); + assertTrue(grshape.get(1) instanceof Line); - pict = (HSLFPictureShape)grshape[0]; + pict = (HSLFPictureShape)grshape.get(0); assertEquals(new Rectangle(0, 0, 200, 200), pict.getAnchor()); - line = (Line)grshape[1]; + line = (Line)grshape.get(1); assertEquals(new Rectangle(300, 300, 500, 0), line.getAnchor()); } @@ -311,16 +299,16 @@ public final class TestShapes { public void removeShapes() throws IOException { String file = "with_textbox.ppt"; HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream(file)); - HSLFSlide sl = ppt.getSlides()[0]; - HSLFShape[] sh = sl.getShapes(); - assertEquals("expected four shaped in " + file, 4, sh.length); + HSLFSlide sl = ppt.getSlides().get(0); + List sh = sl.getShapes(); + assertEquals("expected four shaped in " + file, 4, sh.size()); //remove all - for (int i = 0; i < sh.length; i++) { - boolean ok = sl.removeShape(sh[i]); + for (int i = 0; i < sh.size(); i++) { + boolean ok = sl.removeShape(sh.get(i)); assertTrue("Failed to delete shape #" + i, ok); } //now Slide.getShapes() should return an empty array - assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().length); + assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().size()); //serialize and read again. The file should be readable and contain no shapes ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -328,8 +316,8 @@ public final class TestShapes { out.close(); ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); - sl = ppt.getSlides()[0]; - assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().length); + sl = ppt.getSlides().get(0); + assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().size()); } @Test @@ -400,24 +388,24 @@ public final class TestShapes { @Test public void lineColor() throws IOException { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("51731.ppt")); - HSLFShape[] shape = ppt.getSlides()[0].getShapes(); + List shape = ppt.getSlides().get(0).getShapes(); - assertEquals(4, shape.length); + assertEquals(4, shape.size()); - HSLFTextShape sh1 = (HSLFTextShape)shape[0]; + HSLFTextShape sh1 = (HSLFTextShape)shape.get(0); assertEquals("Hello Apache POI", sh1.getText()); assertNull(sh1.getLineColor()); - HSLFTextShape sh2 = (HSLFTextShape)shape[1]; + HSLFTextShape sh2 = (HSLFTextShape)shape.get(1); assertEquals("Why are you showing this border?", sh2.getText()); assertNull(sh2.getLineColor()); - HSLFTextShape sh3 = (HSLFTextShape)shape[2]; + HSLFTextShape sh3 = (HSLFTextShape)shape.get(2); assertEquals("Text in a black border", sh3.getText()); assertEquals(Color.black, sh3.getLineColor()); assertEquals(0.75, sh3.getLineWidth(), 0); - HSLFTextShape sh4 = (HSLFTextShape)shape[3]; + HSLFTextShape sh4 = (HSLFTextShape)shape.get(3); assertEquals("Border width is 5 pt", sh4.getText()); assertEquals(Color.black, sh4.getLineColor()); assertEquals(5.0, sh4.getLineWidth(), 0); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java index 60b8ca42e2..330c832486 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java @@ -17,14 +17,17 @@ package org.apache.poi.hslf.model; -import junit.framework.AssertionFailedError; -import junit.framework.TestCase; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import java.util.List; + +import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; import org.apache.poi.hslf.record.ColorSchemeAtom; import org.apache.poi.hslf.record.PPDrawing; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.usermodel.*; +import org.junit.Test; /** * Test common functionality of the Sheet object. @@ -32,12 +35,13 @@ import org.apache.poi.POIDataSamples; * * @author Yegor Kozlov */ -public final class TestSheet extends TestCase { +public final class TestSheet { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); /** * For each ppt in the test directory check that all sheets are properly initialized */ + @Test public void testSheet() throws Exception { String[] tests = {"SampleShow.ppt", "backgrounds.ppt", "text_shapes.ppt", "pictures.ppt"}; for (String file : tests) { @@ -51,14 +55,13 @@ public final class TestSheet extends TestCase { } private void doSlideShow(HSLFSlideShow ppt) { - HSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - verify(slide[i]); + for (HSLFSlide slide : ppt.getSlides()) { + verify(slide); - HSLFNotes notes = slide[i].getNotesSheet(); + HSLFNotes notes = slide.getNotes(); if(notes != null) verify(notes); - HSLFMasterSheet master = slide[i].getMasterSheet(); + HSLFMasterSheet master = slide.getMasterSheet(); assertNotNull(master); verify(master); } @@ -79,23 +82,19 @@ public final class TestSheet extends TestCase { assertTrue(sheet._getSheetNumber() != 0); assertTrue(sheet._getSheetRefId() != 0); - HSLFTextParagraph[] txt = sheet.getTextRuns(); - if (txt == null) { - throw new AssertionFailedError("no text runs"); - } - for (int i = 0; i < txt.length; i++) { - assertNotNull(txt[i].getSheet()); + List txt = sheet.getTextParagraphs(); + assertTrue("no text runs", txt != null && !txt.isEmpty()); + for (HSLFTextParagraph t : txt) { + assertNotNull(t.getSheet()); } - HSLFShape[] shape = sheet.getShapes(); - if (shape == null) { - throw new AssertionFailedError("no shapes"); - } - for (int i = 0; i < shape.length; i++) { - assertNotNull(shape[i].getSpContainer()); - assertNotNull(shape[i].getSheet()); - assertNotNull(shape[i].getShapeName()); - assertNotNull(shape[i].getAnchor()); + List shape = sheet.getShapes(); + assertTrue("no shapes", shape != null && !shape.isEmpty()); + for (HSLFShape s : shape) { + assertNotNull(s.getSpContainer()); + assertNotNull(s.getSheet()); + assertNotNull(s.getShapeName()); + assertNotNull(s.getAnchor()); } } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java index 2d4fe15131..57f6f5adb9 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java @@ -18,29 +18,33 @@ package org.apache.poi.hslf.model; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; -import org.apache.poi.hslf.record.SlideAtom; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.record.SlideAtom; +import org.apache.poi.hslf.usermodel.*; +import org.junit.Before; +import org.junit.Test; /** * Tests that changing a slide's idea of what notes sheet is its works right * * @author Nick Burch (nick at torchbox dot com) */ -public final class TestSlideChangeNotes extends TestCase { +public final class TestSlideChangeNotes { // SlideShow primed on the test data private HSLFSlideShow ss; - public TestSlideChangeNotes() throws Exception { + @Before + public void init() throws Exception { POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); HSLFSlideShowImpl hss = new HSLFSlideShowImpl(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); ss = new HSLFSlideShow(hss); } + @Test public void testSetToNone() { - HSLFSlide slideOne = ss.getSlides()[0]; + HSLFSlide slideOne = ss.getSlides().get(0); SlideAtom sa = slideOne.getSlideRecord().getSlideAtom(); slideOne.setNotes(null); @@ -48,9 +52,10 @@ public final class TestSlideChangeNotes extends TestCase { assertEquals(0, sa.getNotesID()); } + @Test public void testSetToSomething() { - HSLFSlide slideOne = ss.getSlides()[0]; - HSLFNotes notesOne = ss.getNotes()[1]; + HSLFSlide slideOne = ss.getSlides().get(0); + HSLFNotes notesOne = ss.getNotes().get(1); SlideAtom sa = slideOne.getSlideRecord().getSlideAtom(); slideOne.setNotes(notesOne); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java index ffb6563da5..e6b24ce1b9 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java @@ -17,63 +17,66 @@ package org.apache.poi.hslf.model; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.util.List; -import junit.framework.TestCase; - +import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; import org.apache.poi.hslf.record.Environment; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.HSLFTextRun; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.usermodel.*; +import org.junit.Test; /** * Tests for SlideMaster * * @author Yegor Kozlov */ -public final class TestSlideMaster extends TestCase{ +public final class TestSlideMaster { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); /** * The reference ppt has two masters. * Check we can read their attributes. */ + @Test public void testSlideMaster() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); Environment env = ppt.getDocumentRecord().getEnvironment(); - SlideMaster[] master = ppt.getSlidesMasters(); - assertEquals(2, master.length); + List master = ppt.getSlideMasters(); + assertEquals(2, master.size()); //character attributes - assertEquals(40, master[0].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.size", true).getValue()); - assertEquals(48, master[1].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.size", true).getValue()); + assertEquals(40, master.get(0).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.size", true).getValue()); + assertEquals(48, master.get(1).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.size", true).getValue()); - int font1 = master[0].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.index", true).getValue(); - int font2 = master[1].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.index", true).getValue(); + int font1 = master.get(0).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.index", true).getValue(); + int font2 = master.get(1).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.index", true).getValue(); assertEquals("Arial", env.getFontCollection().getFontWithId(font1)); assertEquals("Georgia", env.getFontCollection().getFontWithId(font2)); - CharFlagsTextProp prop1 = (CharFlagsTextProp)master[0].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "char_flags", true); + CharFlagsTextProp prop1 = (CharFlagsTextProp)master.get(0).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "char_flags", true); assertEquals(false, prop1.getSubValue(CharFlagsTextProp.BOLD_IDX)); assertEquals(false, prop1.getSubValue(CharFlagsTextProp.ITALIC_IDX)); assertEquals(true, prop1.getSubValue(CharFlagsTextProp.UNDERLINE_IDX)); - CharFlagsTextProp prop2 = (CharFlagsTextProp)master[1].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "char_flags", true); + CharFlagsTextProp prop2 = (CharFlagsTextProp)master.get(1).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "char_flags", true); assertEquals(false, prop2.getSubValue(CharFlagsTextProp.BOLD_IDX)); assertEquals(true, prop2.getSubValue(CharFlagsTextProp.ITALIC_IDX)); assertEquals(false, prop2.getSubValue(CharFlagsTextProp.UNDERLINE_IDX)); //now paragraph attributes - assertEquals(0x266B, master[0].getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.char", false).getValue()); - assertEquals(0x2022, master[1].getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.char", false).getValue()); + assertEquals(0x266B, master.get(0).getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.char", false).getValue()); + assertEquals(0x2022, master.get(1).getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.char", false).getValue()); - int b1 = master[0].getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.font", false).getValue(); - int b2 = master[1].getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.font", false).getValue(); + int b1 = master.get(0).getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.font", false).getValue(); + int b2 = master.get(1).getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.font", false).getValue(); assertEquals("Arial", env.getFontCollection().getFontWithId(b1)); assertEquals("Georgia", env.getFontCollection().getFontWithId(b2)); } @@ -81,19 +84,20 @@ public final class TestSlideMaster extends TestCase{ /** * Test we can read default text attributes for a title master sheet */ + @Test public void testTitleMasterTextAttributes() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); - TitleMaster[] master = ppt.getTitleMasters(); - assertEquals(1, master.length); + List master = ppt.getTitleMasters(); + assertEquals(1, master.size()); - assertEquals(32, master[0].getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "font.size", true).getValue()); - CharFlagsTextProp prop1 = (CharFlagsTextProp)master[0].getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "char_flags", true); + assertEquals(32, master.get(0).getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "font.size", true).getValue()); + CharFlagsTextProp prop1 = (CharFlagsTextProp)master.get(0).getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "char_flags", true); assertEquals(true, prop1.getSubValue(CharFlagsTextProp.BOLD_IDX)); assertEquals(false, prop1.getSubValue(CharFlagsTextProp.ITALIC_IDX)); assertEquals(true, prop1.getSubValue(CharFlagsTextProp.UNDERLINE_IDX)); - assertEquals(20, master[0].getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "font.size", true).getValue()); - CharFlagsTextProp prop2 = (CharFlagsTextProp)master[0].getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "char_flags", true); + assertEquals(20, master.get(0).getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "font.size", true).getValue()); + CharFlagsTextProp prop2 = (CharFlagsTextProp)master.get(0).getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "char_flags", true); assertEquals(true, prop2.getSubValue(CharFlagsTextProp.BOLD_IDX)); assertEquals(false, prop2.getSubValue(CharFlagsTextProp.ITALIC_IDX)); assertEquals(false, prop2.getSubValue(CharFlagsTextProp.UNDERLINE_IDX)); @@ -102,25 +106,26 @@ public final class TestSlideMaster extends TestCase{ /** * Slide 3 has title layout and follows the TitleMaster. Verify that. */ + @Test public void testTitleMaster() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); - HSLFSlide slide = ppt.getSlides()[2]; + HSLFSlide slide = ppt.getSlides().get(2); HSLFMasterSheet masterSheet = slide.getMasterSheet(); - assertTrue(masterSheet instanceof TitleMaster); + assertTrue(masterSheet instanceof HSLFTitleMaster); - HSLFTextParagraph[] txt = slide.getTextRuns(); - for (int i = 0; i < txt.length; i++) { - HSLFTextRun rt = txt[i].getRichTextRuns()[0]; - switch(txt[i].getRunType()){ + List txt = slide.getTextParagraphs(); + for (int i = 0; i < txt.size(); i++) { + HSLFTextRun rt = txt.get(i).getTextRuns().get(0); + switch(txt.get(i).getRunType()){ case TextHeaderAtom.CENTER_TITLE_TYPE: - assertEquals("Arial", rt.getFontName()); - assertEquals(32, rt.getFontSize()); + assertEquals("Arial", rt.getFontFamily()); + assertEquals(32, rt.getFontSize(), 0); assertEquals(true, rt.isBold()); assertEquals(true, rt.isUnderlined()); break; case TextHeaderAtom.CENTRE_BODY_TYPE: - assertEquals("Courier New", rt.getFontName()); - assertEquals(20, rt.getFontSize()); + assertEquals("Courier New", rt.getFontFamily()); + assertEquals(20, rt.getFontSize(), 0); assertEquals(true, rt.isBold()); assertEquals(false, rt.isUnderlined()); break; @@ -131,47 +136,44 @@ public final class TestSlideMaster extends TestCase{ /** * If a style attribute is not set ensure it is read from the master */ + @Test public void testMasterAttributes() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); - HSLFSlide[] slide = ppt.getSlides(); - assertEquals(3, slide.length); - HSLFTextParagraph[] trun; - - trun = slide[0].getTextRuns(); - for (int i = 0; i < trun.length; i++) { - if (trun[i].getRunType() == TextHeaderAtom.TITLE_TYPE){ - HSLFTextRun rt = trun[i].getRichTextRuns()[0]; - assertEquals(40, rt.getFontSize()); + List slide = ppt.getSlides(); + assertEquals(3, slide.size()); + for (HSLFTextParagraph trun : slide.get(0).getTextParagraphs()) { + if (trun.getRunType() == TextHeaderAtom.TITLE_TYPE){ + HSLFTextRun rt = trun.getTextRuns().get(0); + assertEquals(40, rt.getFontSize(), 0); assertEquals(true, rt.isUnderlined()); - assertEquals("Arial", rt.getFontName()); - } else if (trun[i].getRunType() == TextHeaderAtom.BODY_TYPE){ - HSLFTextRun rt; - rt = trun[i].getRichTextRuns()[0]; - assertEquals(0, rt.getIndentLevel()); - assertEquals(32, rt.getFontSize()); - assertEquals("Arial", rt.getFontName()); + assertEquals("Arial", rt.getFontFamily()); + } else if (trun.getRunType() == TextHeaderAtom.BODY_TYPE){ + HSLFTextRun rt = trun.getTextRuns().get(0); + assertEquals(0, trun.getIndentLevel()); + assertEquals(32, rt.getFontSize(), 0); + assertEquals("Arial", rt.getFontFamily()); - rt = trun[i].getRichTextRuns()[1]; - assertEquals(1, rt.getIndentLevel()); - assertEquals(28, rt.getFontSize()); - assertEquals("Arial", rt.getFontName()); + rt = trun.getTextRuns().get(1); + assertEquals(1, trun.getIndentLevel()); + assertEquals(28, rt.getFontSize(), 0); + assertEquals("Arial", rt.getFontFamily()); } } - trun = slide[1].getTextRuns(); - for (int i = 0; i < trun.length; i++) { - if (trun[i].getRunType() == TextHeaderAtom.TITLE_TYPE){ - HSLFTextRun rt = trun[i].getRichTextRuns()[0]; - assertEquals(48, rt.getFontSize()); + ; + for (HSLFTextParagraph trun : slide.get(1).getTextParagraphs()) { + if (trun.getRunType() == TextHeaderAtom.TITLE_TYPE){ + HSLFTextRun rt = trun.getTextRuns().get(0); + assertEquals(48, rt.getFontSize(), 0); assertEquals(true, rt.isItalic()); - assertEquals("Georgia", rt.getFontName()); - } else if (trun[i].getRunType() == TextHeaderAtom.BODY_TYPE){ + assertEquals("Georgia", rt.getFontFamily()); + } else if (trun.getRunType() == TextHeaderAtom.BODY_TYPE){ HSLFTextRun rt; - rt = trun[i].getRichTextRuns()[0]; - assertEquals(0, rt.getIndentLevel()); - assertEquals(32, rt.getFontSize()); - assertEquals("Courier New", rt.getFontName()); + rt = trun.getTextRuns().get(0); + assertEquals(0, trun.getIndentLevel()); + assertEquals(32, rt.getFontSize(), 0); + assertEquals("Courier New", rt.getFontFamily()); } } @@ -180,20 +182,21 @@ public final class TestSlideMaster extends TestCase{ /** * Check we can dynamically assign a slide master to a slide. */ + @Test public void testChangeSlideMaster() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); - SlideMaster[] master = ppt.getSlidesMasters(); - HSLFSlide[] slide = ppt.getSlides(); + List master = ppt.getSlideMasters(); + List slide = ppt.getSlides(); int sheetNo; //each slide uses its own master - assertEquals(slide[0].getMasterSheet()._getSheetNumber(), master[0]._getSheetNumber()); - assertEquals(slide[1].getMasterSheet()._getSheetNumber(), master[1]._getSheetNumber()); + assertEquals(slide.get(0).getMasterSheet()._getSheetNumber(), master.get(0)._getSheetNumber()); + assertEquals(slide.get(1).getMasterSheet()._getSheetNumber(), master.get(1)._getSheetNumber()); //all slides use the first master slide - sheetNo = master[0]._getSheetNumber(); - for (int i = 0; i < slide.length; i++) { - slide[i].setMasterSheet(master[0]); + sheetNo = master.get(0)._getSheetNumber(); + for (HSLFSlide s : slide) { + s.setMasterSheet(master.get(0)); } ByteArrayOutputStream out; @@ -203,10 +206,10 @@ public final class TestSlideMaster extends TestCase{ out.close(); ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - master = ppt.getSlidesMasters(); + master = ppt.getSlideMasters(); slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - assertEquals(sheetNo, slide[i].getMasterSheet()._getSheetNumber()); + for (HSLFSlide s : slide) { + assertEquals(sheetNo, s.getMasterSheet()._getSheetNumber()); } } @@ -214,33 +217,22 @@ public final class TestSlideMaster extends TestCase{ * Varify we can read attrubutes for different identtation levels. * (typical for the "bullted body" placeholder) */ + @Test public void testIndentation() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); - HSLFSlide slide = ppt.getSlides()[0]; - HSLFTextParagraph[] trun; - - trun = slide.getTextRuns(); - for (int i = 0; i < trun.length; i++) { - if (trun[i].getRunType() == TextHeaderAtom.TITLE_TYPE){ - HSLFTextRun rt = trun[i].getRichTextRuns()[0]; - assertEquals(40, rt.getFontSize()); + HSLFSlide slide = ppt.getSlides().get(0); + + for (HSLFTextParagraph trun : slide.getTextParagraphs()) { + if (trun.getRunType() == TextHeaderAtom.TITLE_TYPE){ + HSLFTextRun rt = trun.getTextRuns().get(0); + assertEquals(40, rt.getFontSize(), 0); assertEquals(true, rt.isUnderlined()); - assertEquals("Arial", rt.getFontName()); - } else if (trun[i].getRunType() == TextHeaderAtom.BODY_TYPE){ - HSLFTextRun[] rt = trun[i].getRichTextRuns(); - for (int j = 0; j < rt.length; j++) { - int indent = rt[j].getIndentLevel(); - switch (indent){ - case 0: - assertEquals(32, rt[j].getFontSize()); - break; - case 1: - assertEquals(28, rt[j].getFontSize()); - break; - case 2: - assertEquals(24, rt[j].getFontSize()); - break; - } + assertEquals("Arial", rt.getFontFamily()); + } else if (trun.getRunType() == TextHeaderAtom.BODY_TYPE){ + int indents[] = { 32, 28, 24 }; + for (HSLFTextRun rt : trun.getTextRuns()) { + int indent = trun.getIndentLevel(); + assertEquals(indents[indent], rt.getFontSize(), 0); } } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java index f5e0abef59..a84caefd68 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java @@ -17,13 +17,15 @@ package org.apache.poi.hslf.model; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.POIDataSamples; - -import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.usermodel.*; +import org.junit.Test; /** * Test adding new slides to a ppt. @@ -32,18 +34,19 @@ import java.io.ByteArrayInputStream; * stuff does * @author Yegor Kozlov */ -public final class TestSlides extends TestCase { +public final class TestSlides { /** * Add 1 slide to an empty ppt. * @throws Exception */ + @Test public void testAddSlides1() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") )); - assertTrue(ppt.getSlides().length == 0); + assertTrue(ppt.getSlides().isEmpty()); HSLFSlide s1 = ppt.createSlide(); - assertTrue(ppt.getSlides().length == 1); + assertEquals(1, ppt.getSlides().size()); assertEquals(3, s1._getSheetRefId()); assertEquals(256, s1._getSheetNumber()); assertEquals(1, s1.getSlideNumber()); @@ -54,60 +57,62 @@ public final class TestSlides extends TestCase { out.close(); ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - assertTrue(ppt.getSlides().length == 1); + assertEquals(1, ppt.getSlides().size()); } /** * Add 2 slides to an empty ppt * @throws Exception */ + @Test public void testAddSlides2() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") )); - assertTrue(ppt.getSlides().length == 0); + assertTrue(ppt.getSlides().isEmpty()); HSLFSlide s1 = ppt.createSlide(); - assertTrue(ppt.getSlides().length == 1); + assertEquals(1, ppt.getSlides().size()); assertEquals(3, s1._getSheetRefId()); assertEquals(256, s1._getSheetNumber()); assertEquals(1, s1.getSlideNumber()); HSLFSlide s2 = ppt.createSlide(); - assertTrue(ppt.getSlides().length == 2); + assertEquals(2, ppt.getSlides().size()); assertEquals(4, s2._getSheetRefId()); assertEquals(257, s2._getSheetNumber()); assertEquals(2, s2.getSlideNumber()); //serialize and read again - ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); ppt.write(out); out.close(); ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - assertTrue(ppt.getSlides().length == 2); + assertEquals(2, ppt.getSlides().size()); } /** * Add 3 slides to an empty ppt * @throws Exception */ + @Test public void testAddSlides3() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") )); - assertTrue(ppt.getSlides().length == 0); + assertTrue(ppt.getSlides().isEmpty()); HSLFSlide s1 = ppt.createSlide(); - assertTrue(ppt.getSlides().length == 1); + assertEquals(1, ppt.getSlides().size()); assertEquals(3, s1._getSheetRefId()); assertEquals(256, s1._getSheetNumber()); assertEquals(1, s1.getSlideNumber()); HSLFSlide s2 = ppt.createSlide(); - assertTrue(ppt.getSlides().length == 2); + assertEquals(2, ppt.getSlides().size()); assertEquals(4, s2._getSheetRefId()); assertEquals(257, s2._getSheetNumber()); assertEquals(2, s2.getSlideNumber()); HSLFSlide s3 = ppt.createSlide(); - assertTrue(ppt.getSlides().length == 3); + assertEquals(3, ppt.getSlides().size()); assertEquals(5, s3._getSheetRefId()); assertEquals(258, s3._getSheetNumber()); assertEquals(3, s3.getSlideNumber()); @@ -119,17 +124,17 @@ public final class TestSlides extends TestCase { out.close(); ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - assertTrue(ppt.getSlides().length == 3); + assertEquals(3, ppt.getSlides().size()); // Check IDs are still right - s1 = ppt.getSlides()[0]; + s1 = ppt.getSlides().get(0); assertEquals(256, s1._getSheetNumber()); assertEquals(3, s1._getSheetRefId()); - s2 = ppt.getSlides()[1]; + s2 = ppt.getSlides().get(1); assertEquals(257, s2._getSheetNumber()); assertEquals(4, s2._getSheetRefId()); - s3 = ppt.getSlides()[2];; - assertTrue(ppt.getSlides().length == 3); + s3 = ppt.getSlides().get(2);; + assertEquals(3, ppt.getSlides().size()); assertEquals(258, s3._getSheetNumber()); assertEquals(5, s3._getSheetRefId()); } @@ -137,25 +142,26 @@ public final class TestSlides extends TestCase { /** * Add slides to ppt which already has two slides */ + @Test public void testAddSlides2to3() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - assertTrue(ppt.getSlides().length == 2); + assertEquals(2, ppt.getSlides().size()); // First slide is 256 / 4 - HSLFSlide s1 = ppt.getSlides()[0]; + HSLFSlide s1 = ppt.getSlides().get(0); assertEquals(256, s1._getSheetNumber()); assertEquals(4, s1._getSheetRefId()); // Last slide is 257 / 6 - HSLFSlide s2 = ppt.getSlides()[1]; + HSLFSlide s2 = ppt.getSlides().get(1); assertEquals(257, s2._getSheetNumber()); assertEquals(6, s2._getSheetRefId()); // Add another slide, goes in at the end HSLFSlide s3 = ppt.createSlide(); - assertTrue(ppt.getSlides().length == 3); + assertEquals(3, ppt.getSlides().size()); assertEquals(258, s3._getSheetNumber()); assertEquals(8, s3._getSheetRefId()); @@ -166,18 +172,18 @@ public final class TestSlides extends TestCase { out.close(); ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - assertTrue(ppt.getSlides().length == 3); + assertEquals(3, ppt.getSlides().size()); // Check IDs are still right - s1 = ppt.getSlides()[0]; + s1 = ppt.getSlides().get(0); assertEquals(256, s1._getSheetNumber()); assertEquals(4, s1._getSheetRefId()); - s2 = ppt.getSlides()[1]; + s2 = ppt.getSlides().get(1); assertEquals(257, s2._getSheetNumber()); assertEquals(6, s2._getSheetRefId()); - s3 = ppt.getSlides()[2];; - assertTrue(ppt.getSlides().length == 3); + s3 = ppt.getSlides().get(2); + assertEquals(3, ppt.getSlides().size()); assertEquals(258, s3._getSheetNumber()); assertEquals(8, s3._getSheetRefId()); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java index d3fb354063..0c5fcb69bb 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java @@ -17,24 +17,27 @@ package org.apache.poi.hslf.model; +import static org.junit.Assert.*; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; - -import junit.framework.TestCase; +import java.util.List; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; +import org.junit.Test; /** * Test Table object. * * @author Yegor Kozlov */ -public final class TestTable extends TestCase { +public final class TestTable { /** * Test that ShapeFactory works properly and returns Table */ + @Test public void testShapeFactory() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(); @@ -45,10 +48,10 @@ public final class TestTable extends TestCase { TableCell cell = tbl.getCell(0, 0); //table cells have type=TextHeaderAtom.OTHER_TYPE, see bug #46033 - assertEquals(TextHeaderAtom.OTHER_TYPE, cell.getTextParagraph().getRunType()); + assertEquals(TextHeaderAtom.OTHER_TYPE, cell.getTextParagraphs().get(0).getRunType()); - assertTrue(slide.getShapes()[0] instanceof Table); - Table tbl2 = (Table)slide.getShapes()[0]; + assertTrue(slide.getShapes().get(0) instanceof Table); + Table tbl2 = (Table)slide.getShapes().get(0); assertEquals(tbl.getNumberOfColumns(), tbl2.getNumberOfColumns()); assertEquals(tbl.getNumberOfRows(), tbl2.getNumberOfRows()); @@ -57,9 +60,9 @@ public final class TestTable extends TestCase { out.close(); ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); - slide = ppt.getSlides()[0]; - assertTrue(slide.getShapes()[0] instanceof Table); - Table tbl3 = (Table)slide.getShapes()[0]; + slide = ppt.getSlides().get(0); + assertTrue(slide.getShapes().get(0) instanceof Table); + Table tbl3 = (Table)slide.getShapes().get(0); assertEquals(tbl.getNumberOfColumns(), tbl3.getNumberOfColumns()); assertEquals(tbl.getNumberOfRows(), tbl3.getNumberOfRows()); } @@ -67,25 +70,27 @@ public final class TestTable extends TestCase { /** * Error constructing Table when rownum=1 */ + @Test public void test45889(){ HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlide slide = ppt.createSlide(); - HSLFShape[] shapes; + List shapes; Table tbl1 = new Table(1, 5); assertEquals(5, tbl1.getNumberOfColumns()); assertEquals(1, tbl1.getNumberOfRows()); slide.addShape(tbl1); shapes = slide.getShapes(); - assertEquals(1, shapes.length); + assertEquals(1, shapes.size()); - Table tbl2 = (Table)shapes[0]; + Table tbl2 = (Table)shapes.get(0); assertSame(tbl1.getSpContainer(), tbl2.getSpContainer()); assertEquals(tbl1.getNumberOfColumns(), tbl2.getNumberOfColumns()); assertEquals(tbl1.getNumberOfRows(), tbl2.getNumberOfRows()); } + @Test public void testIllegalCOnstruction(){ try { new Table(0, 5); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java deleted file mode 100644 index 01ce6a0534..0000000000 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java +++ /dev/null @@ -1,551 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - - -import java.awt.*; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import junit.framework.TestCase; - -import org.apache.poi.hslf.model.textproperties.TextPropCollection; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.TextBytesAtom; -import org.apache.poi.hslf.record.TextCharsAtom; -import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.HSLFTextRun; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.POIDataSamples; - -/** - * Tests for TextRuns - * - * @author Nick Burch (nick at torchbox dot com) - */ -public final class TestTextRun extends TestCase { - private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); - - // SlideShow primed on the test data - private HSLFSlideShow ss; - private HSLFSlideShow ssRich; - - protected void setUp() throws IOException { - - // Basic (non rich) test file - ss = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); - - // Rich test file - ssRich = new HSLFSlideShow(_slTests.openResourceAsStream("Single_Coloured_Page.ppt")); - } - - /** - * Test to ensure that getting the text works correctly - */ - public void testGetText() { - HSLFSlide slideOne = ss.getSlides()[0]; - HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); - - assertEquals(2, textRuns.length); - - // Get text works with \n - assertEquals("This is a test title", textRuns[0].getText()); - assertEquals("This is a test subtitle\nThis is on page 1", textRuns[1].getText()); - - // Raw text has \r instead - assertEquals("This is a test title", textRuns[0].getRawText()); - assertEquals("This is a test subtitle\rThis is on page 1", textRuns[1].getRawText()); - - - // Now check on a rich text run - HSLFSlide slideOneR = ssRich.getSlides()[0]; - HSLFTextParagraph[] textRunsR = slideOneR.getTextRuns(); - - assertEquals(2, textRunsR.length); - assertEquals("This is a title, it\u2019s in black", textRunsR[0].getText()); - assertEquals("This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)", textRunsR[1].getText()); - assertEquals("This is a title, it\u2019s in black", textRunsR[0].getRawText()); - assertEquals("This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)", textRunsR[1].getRawText()); - } - - /** - * Test to ensure changing non rich text bytes->bytes works correctly - */ - public void testSetText() { - HSLFSlide slideOne = ss.getSlides()[0]; - HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); - HSLFTextParagraph run = textRuns[0]; - - // Check current text - assertEquals("This is a test title", run.getText()); - - // Change - String changeTo = "New test title"; - run.setText(changeTo); - assertEquals(changeTo, run.getText()); - - // Ensure trailing \n's are NOT stripped, it is legal to set a text with a trailing '\r' - run.setText(changeTo + "\n"); - assertEquals(changeTo + "\n", run.getText()); - } - - /** - * Test to ensure that changing non rich text between bytes and - * chars works correctly - */ - public void testAdvancedSetText() { - HSLFSlide slideOne = ss.getSlides()[0]; - HSLFTextParagraph run = slideOne.getTextRuns()[0]; - - TextHeaderAtom tha = run._headerAtom; - TextBytesAtom tba = run._byteAtom; - TextCharsAtom tca = run._charAtom; - - // Bytes -> Bytes - assertNull(tca); - assertNotNull(tba); - assertFalse(run._isUnicode); - assertEquals("This is a test title", run.getText()); - - String changeBytesOnly = "New Test Title"; - run.setText(changeBytesOnly); - tba = run._byteAtom; - tca = run._charAtom; - - assertEquals(changeBytesOnly, run.getText()); - assertFalse(run._isUnicode); - assertNull(tca); - assertNotNull(tba); - - // Bytes -> Chars - assertNull(tca); - assertNotNull(tba); - assertFalse(run._isUnicode); - assertEquals(changeBytesOnly, run.getText()); - - String changeByteChar = "This is a test title with a '\u0121' g with a dot"; - run.setText(changeByteChar); - tba = run._byteAtom; - tca = run._charAtom; - - assertEquals(changeByteChar, run.getText()); - assertTrue(run._isUnicode); - assertNotNull(tca); - assertNull(tba); - - // Chars -> Chars - assertNull(tba); - assertNotNull(tca); - assertTrue(run._isUnicode); - assertEquals(changeByteChar, run.getText()); - - String changeCharChar = "This is a test title with a '\u0147' N with a hat"; - run.setText(changeCharChar); - tba = run._byteAtom; - tca = run._charAtom; - - assertEquals(changeCharChar, run.getText()); - assertTrue(run._isUnicode); - assertNotNull(tca); - assertNull(tba); - } - - /** - * Tests to ensure that non rich text has the right default rich text run - * set up for it - */ - public void testGetRichTextNonRich() { - HSLFSlide slideOne = ss.getSlides()[0]; - HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); - - assertEquals(2, textRuns.length); - - HSLFTextParagraph trA = textRuns[0]; - HSLFTextParagraph trB = textRuns[1]; - - assertEquals(1, trA.getRichTextRuns().length); - assertEquals(1, trB.getRichTextRuns().length); - - HSLFTextRun rtrA = trA.getRichTextRuns()[0]; - HSLFTextRun rtrB = trB.getRichTextRuns()[0]; - - assertEquals(trA.getText(), rtrA.getText()); - assertEquals(trB.getText(), rtrB.getText()); - - assertNull(rtrA._getRawCharacterStyle()); - assertNull(rtrA._getRawParagraphStyle()); - assertNull(rtrB._getRawCharacterStyle()); - assertNull(rtrB._getRawParagraphStyle()); - } - - /** - * Tests to ensure that the rich text runs are built up correctly - */ - public void testGetRichText() { - HSLFSlide slideOne = ssRich.getSlides()[0]; - HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); - - assertEquals(2, textRuns.length); - - HSLFTextParagraph trA = textRuns[0]; - HSLFTextParagraph trB = textRuns[1]; - - assertEquals(1, trA.getRichTextRuns().length); - assertEquals(3, trB.getRichTextRuns().length); - - HSLFTextRun rtrA = trA.getRichTextRuns()[0]; - HSLFTextRun rtrB = trB.getRichTextRuns()[0]; - HSLFTextRun rtrC = trB.getRichTextRuns()[1]; - HSLFTextRun rtrD = trB.getRichTextRuns()[2]; - - assertEquals(trA.getText(), rtrA.getText()); - - assertEquals(trB.getText().substring(0, 30), rtrB.getText()); - assertEquals(trB.getText().substring(30,58), rtrC.getText()); - assertEquals(trB.getText().substring(58,82), rtrD.getText()); - - assertNull(rtrA._getRawCharacterStyle()); - assertNull(rtrA._getRawParagraphStyle()); - assertNotNull(rtrB._getRawCharacterStyle()); - assertNotNull(rtrB._getRawParagraphStyle()); - assertNotNull(rtrC._getRawCharacterStyle()); - assertNotNull(rtrC._getRawParagraphStyle()); - assertNotNull(rtrD._getRawCharacterStyle()); - assertNotNull(rtrD._getRawParagraphStyle()); - - // Same paragraph styles - assertEquals(rtrB._getRawParagraphStyle(), rtrC._getRawParagraphStyle()); - assertEquals(rtrB._getRawParagraphStyle(), rtrD._getRawParagraphStyle()); - - // Different char styles - assertFalse( rtrB._getRawCharacterStyle().equals( rtrC._getRawCharacterStyle() )); - assertFalse( rtrB._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() )); - assertFalse( rtrC._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() )); - } - - /** - * Tests to ensure that setting the text where the text isn't rich, - * ensuring that everything stays with the same default styling - */ - public void testSetTextWhereNotRich() { - HSLFSlide slideOne = ss.getSlides()[0]; - HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); - HSLFTextParagraph trB = textRuns[1]; - assertEquals(1, trB.getRichTextRuns().length); - - HSLFTextRun rtrB = trB.getRichTextRuns()[0]; - assertEquals(trB.getText(), rtrB.getText()); - assertNull(rtrB._getRawCharacterStyle()); - assertNull(rtrB._getRawParagraphStyle()); - - // Change text via normal - trB.setText("Test Foo Test"); - rtrB = trB.getRichTextRuns()[0]; - assertEquals("Test Foo Test", trB.getText()); - assertEquals("Test Foo Test", rtrB.getText()); - assertNull(rtrB._getRawCharacterStyle()); - assertNull(rtrB._getRawParagraphStyle()); - } - - /** - * Tests to ensure that setting the text where the text is rich - * sets everything to the same styling - */ - public void testSetTextWhereRich() { - HSLFSlide slideOne = ssRich.getSlides()[0]; - HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); - HSLFTextParagraph trB = textRuns[1]; - assertEquals(3, trB.getRichTextRuns().length); - - HSLFTextRun rtrB = trB.getRichTextRuns()[0]; - HSLFTextRun rtrC = trB.getRichTextRuns()[1]; - HSLFTextRun rtrD = trB.getRichTextRuns()[2]; - TextPropCollection tpBP = rtrB._getRawParagraphStyle(); - TextPropCollection tpBC = rtrB._getRawCharacterStyle(); - TextPropCollection tpCP = rtrC._getRawParagraphStyle(); - TextPropCollection tpCC = rtrC._getRawCharacterStyle(); - TextPropCollection tpDP = rtrD._getRawParagraphStyle(); - TextPropCollection tpDC = rtrD._getRawCharacterStyle(); - - assertEquals(trB.getText().substring(0, 30), rtrB.getText()); - assertNotNull(tpBP); - assertNotNull(tpBC); - assertNotNull(tpCP); - assertNotNull(tpCC); - assertNotNull(tpDP); - assertNotNull(tpDC); - assertTrue(tpBP.equals(tpCP)); - assertTrue(tpBP.equals(tpDP)); - assertTrue(tpCP.equals(tpDP)); - assertFalse(tpBC.equals(tpCC)); - assertFalse(tpBC.equals(tpDC)); - assertFalse(tpCC.equals(tpDC)); - - // Change text via normal - trB.setText("Test Foo Test"); - - // Ensure now have first style - assertEquals(1, trB.getRichTextRuns().length); - rtrB = trB.getRichTextRuns()[0]; - assertEquals("Test Foo Test", trB.getText()); - assertEquals("Test Foo Test", rtrB.getText()); - assertNotNull(rtrB._getRawCharacterStyle()); - assertNotNull(rtrB._getRawParagraphStyle()); - assertEquals( tpBP, rtrB._getRawParagraphStyle() ); - assertEquals( tpBC, rtrB._getRawCharacterStyle() ); - } - - /** - * Test to ensure the right stuff happens if we change the text - * in a rich text run, that doesn't happen to actually be rich - */ - public void testChangeTextInRichTextRunNonRich() { - HSLFSlide slideOne = ss.getSlides()[0]; - HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); - HSLFTextParagraph trB = textRuns[1]; - assertEquals(1, trB.getRichTextRuns().length); - - HSLFTextRun rtrB = trB.getRichTextRuns()[0]; - assertEquals(trB.getText(), rtrB.getText()); - assertNull(rtrB._getRawCharacterStyle()); - assertNull(rtrB._getRawParagraphStyle()); - - // Change text via rich - rtrB.setText("Test Test Test"); - assertEquals("Test Test Test", trB.getText()); - assertEquals("Test Test Test", rtrB.getText()); - - // Will now have dummy props - assertNotNull(rtrB._getRawCharacterStyle()); - assertNotNull(rtrB._getRawParagraphStyle()); - } - - /** - * Tests to ensure changing the text within rich text runs works - * correctly - */ - public void testChangeTextInRichTextRun() { - HSLFSlide slideOne = ssRich.getSlides()[0]; - HSLFTextParagraph[] textRuns = slideOne.getTextRuns(); - HSLFTextParagraph trB = textRuns[1]; - assertEquals(3, trB.getRichTextRuns().length); - - // We start with 3 text runs, each with their own set of styles, - // but all sharing the same paragraph styles - HSLFTextRun rtrB = trB.getRichTextRuns()[0]; - HSLFTextRun rtrC = trB.getRichTextRuns()[1]; - HSLFTextRun rtrD = trB.getRichTextRuns()[2]; - TextPropCollection tpBP = rtrB._getRawParagraphStyle(); - TextPropCollection tpBC = rtrB._getRawCharacterStyle(); - TextPropCollection tpCP = rtrC._getRawParagraphStyle(); - TextPropCollection tpCC = rtrC._getRawCharacterStyle(); - TextPropCollection tpDP = rtrD._getRawParagraphStyle(); - TextPropCollection tpDC = rtrD._getRawCharacterStyle(); - - // Check text and stylings - assertEquals(trB.getText().substring(0, 30), rtrB.getText()); - assertNotNull(tpBP); - assertNotNull(tpBC); - assertNotNull(tpCP); - assertNotNull(tpCC); - assertNotNull(tpDP); - assertNotNull(tpDC); - assertTrue(tpBP.equals(tpCP)); - assertTrue(tpBP.equals(tpDP)); - assertTrue(tpCP.equals(tpDP)); - assertFalse(tpBC.equals(tpCC)); - assertFalse(tpBC.equals(tpDC)); - assertFalse(tpCC.equals(tpDC)); - - // Check text in the rich runs - assertEquals("This is the subtitle, in bold\n", rtrB.getText()); - assertEquals("This bit is blue and italic\n", rtrC.getText()); - assertEquals("This bit is red (normal)", rtrD.getText()); - - String newBText = "New Subtitle, will still be bold\n"; - String newCText = "New blue and italic text\n"; - String newDText = "Funky new normal red text"; - rtrB.setText(newBText); - rtrC.setText(newCText); - rtrD.setText(newDText); - assertEquals(newBText, rtrB.getText()); - assertEquals(newCText, rtrC.getText()); - assertEquals(newDText, rtrD.getText()); - - assertEquals(newBText + newCText + newDText, trB.getText()); - - // The styles should have been updated for the new sizes - assertEquals(newBText.length(), tpBC.getCharactersCovered()); - assertEquals(newCText.length(), tpCC.getCharactersCovered()); - assertEquals(newDText.length()+1, tpDC.getCharactersCovered()); // Last one is always one larger - - assertEquals( - newBText.length() + newCText.length() + newDText.length(), - tpBP.getCharactersCovered() - ); - - // Paragraph style should be sum of text length - assertEquals(newBText.length() + newCText.length() + newDText.length(), tpBP.getCharactersCovered()); - - // Check stylings still as expected - TextPropCollection ntpBC = rtrB._getRawCharacterStyle(); - TextPropCollection ntpCC = rtrC._getRawCharacterStyle(); - TextPropCollection ntpDC = rtrD._getRawCharacterStyle(); - assertEquals(tpBC.getTextPropList(), ntpBC.getTextPropList()); - assertEquals(tpCC.getTextPropList(), ntpCC.getTextPropList()); - assertEquals(tpDC.getTextPropList(), ntpDC.getTextPropList()); - } - - - /** - * Test case for Bug 41015. - * - * In some cases RichTextRun.getText() threw StringIndexOutOfBoundsException because - * of the wrong list of potential paragraph properties defined in StyleTextPropAtom. - * - */ - public void testBug41015() throws IOException { - HSLFTextRun[] rt; - - HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bug-41015.ppt")); - HSLFSlide sl = ppt.getSlides()[0]; - HSLFTextParagraph[] txt = sl.getTextRuns(); - assertEquals(2, txt.length); - - rt = txt[0].getRichTextRuns(); - assertEquals(1, rt.length); - assertEquals(0, rt[0].getIndentLevel()); - assertEquals("sdfsdfsdf", rt[0].getText()); - - rt = txt[1].getRichTextRuns(); - assertEquals(2, rt.length); - assertEquals(0, rt[0].getIndentLevel()); - assertEquals("Sdfsdfsdf\n" + - "Dfgdfg\n" + - "Dfgdfgdfg\n", rt[0].getText()); - assertEquals(1, rt[1].getIndentLevel()); - assertEquals("Sdfsdfs\n" + - "Sdfsdf\n", rt[1].getText()); - } - - /** - * Test creation of TextRun objects. - */ - public void testAddTextRun() { - HSLFSlideShow ppt = new HSLFSlideShow(); - HSLFSlide slide = ppt.createSlide(); - - assertNull(slide.getTextRuns()); - - HSLFTextBox shape1 = new HSLFTextBox(); - HSLFTextParagraph run1 = shape1.getTextParagraph(); - assertSame(run1, shape1.createTextRun()); - run1.setText("Text 1"); - slide.addShape(shape1); - - //The array of Slide's text runs must be updated when new text shapes are added. - HSLFTextParagraph[] runs = slide.getTextRuns(); - assertNotNull(runs); - assertSame(run1, runs[0]); - - HSLFTextBox shape2 = new HSLFTextBox(); - HSLFTextParagraph run2 = shape2.getTextParagraph(); - assertSame(run2, shape2.createTextRun()); - run2.setText("Text 2"); - slide.addShape(shape2); - - runs = slide.getTextRuns(); - assertEquals(2, runs.length); - - assertSame(run1, runs[0]); - assertSame(run2, runs[1]); - - //as getShapes() - HSLFShape[] sh = slide.getShapes(); - assertEquals(2, sh.length); - assertTrue(sh[0] instanceof HSLFTextBox); - HSLFTextBox box1 = (HSLFTextBox)sh[0]; - assertSame(run1, box1.getTextParagraph()); - HSLFTextBox box2 = (HSLFTextBox)sh[1]; - assertSame(run2, box2.getTextParagraph()); - - //test Table - a complex group of shapes containing text objects - HSLFSlide slide2 = ppt.createSlide(); - assertNull(slide2.getTextRuns()); - Table table = new Table(2, 2); - slide2.addShape(table); - runs = slide2.getTextRuns(); - assertNotNull(runs); - assertEquals(4, runs.length); - } - - public void test48916() throws IOException { - HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("SampleShow.ppt")); - for(HSLFSlide slide : ppt.getSlides()){ - for(HSLFShape sh : slide.getShapes()){ - if(sh instanceof HSLFTextShape){ - HSLFTextShape tx = (HSLFTextShape)sh; - HSLFTextParagraph run = tx.getTextParagraph(); - //verify that records cached in TextRun and EscherTextboxWrapper are the same - Record[] runChildren = run.getRecords(); - Record[] txboxChildren = tx.getEscherTextboxWrapper().getChildRecords(); - assertEquals(runChildren.length, txboxChildren.length); - for(int i=0; i < txboxChildren.length; i++){ - assertSame(txboxChildren[i], runChildren[i]); - } - //caused NPE prior to fix of Bugzilla #48916 - run.getRichTextRuns()[0].setBold(true); - run.getRichTextRuns()[0].setFontColor(Color.RED); - } - } - } - ByteArrayOutputStream out = new ByteArrayOutputStream(); - ppt.write(out); - ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); - for(HSLFSlide slide : ppt.getSlides()){ - for(HSLFShape sh : slide.getShapes()){ - if(sh instanceof HSLFTextShape){ - HSLFTextShape tx = (HSLFTextShape)sh; - HSLFTextParagraph run = tx.getTextParagraph(); - HSLFTextRun rt = run.getRichTextRuns()[0]; - assertTrue(rt.isBold()); - assertEquals(rt.getFontColor(), Color.RED); - } - } - } - - } - - public void test52244() throws IOException { - HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52244.ppt")); - HSLFSlide slide = ppt.getSlides()[0]; - HSLFTextParagraph[] runs = slide.getTextRuns(); - - assertEquals("Arial", runs[0].getRichTextRuns()[0].getFontName()); - assertEquals(36, runs[0].getRichTextRuns()[0].getFontSize()); - - assertEquals("Arial", runs[1].getRichTextRuns()[0].getFontName()); - assertEquals(24, runs[1].getRichTextRuns()[0].getFontSize()); - - assertEquals("Arial", runs[2].getRichTextRuns()[0].getFontName()); - assertEquals(32, runs[2].getRichTextRuns()[0].getFontSize()); - - } - -} diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java index c5a01341ae..8601f95ea5 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java @@ -17,15 +17,17 @@ package org.apache.poi.hslf.model; +import static org.junit.Assert.assertEquals; -import junit.framework.TestCase; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; -import java.io.*; - -import org.apache.poi.hslf.usermodel.HSLFTextRun; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.poifs.filesystem.*; import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.usermodel.*; +import org.apache.poi.poifs.filesystem.DocumentEntry; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.junit.Before; +import org.junit.Test; /** * Tests that if we load something up, get a TextRun, set the text @@ -34,7 +36,7 @@ import org.apache.poi.POIDataSamples; * * @author Nick Burch (nick at torchbox dot com) */ -public final class TestTextRunReWrite extends TestCase { +public final class TestTextRunReWrite { // HSLFSlideShow primed on the test data private HSLFSlideShowImpl hss; // HSLFSlideShow primed on the test data @@ -45,6 +47,7 @@ public final class TestTextRunReWrite extends TestCase { /** * Load up a test PPT file with rich data */ + @Before public void setUp() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); String filename = "Single_Coloured_Page_With_Fonts_and_Alignments.ppt"; @@ -53,35 +56,36 @@ public final class TestTextRunReWrite extends TestCase { ss = new HSLFSlideShow(hss); } - public void testWritesOutTheSameNonRich() throws Exception { + @Test + public void testWritesOutTheSameNonRich() throws Exception { // Grab the first text run on the first sheet - HSLFTextParagraph tr1 = ss.getSlides()[0].getTextRuns()[0]; - HSLFTextParagraph tr2 = ss.getSlides()[0].getTextRuns()[1]; + HSLFTextParagraph tr1 = ss.getSlides().get(0).getTextParagraphs().get(0); + HSLFTextParagraph tr2 = ss.getSlides().get(0).getTextParagraphs().get(1); // Ensure the text lengths are as we'd expect to start with assertEquals(1, ss.getSlides().length); - assertEquals(2, ss.getSlides()[0].getTextRuns().length); - assertEquals(30, tr1.getText().length()); - assertEquals(179, tr2.getText().length()); + assertEquals(2, ss.getSlides().get(0).getTextParagraphs().length); + assertEquals(30, tr1.getRawText().length()); + assertEquals(179, tr2.getRawText().length()); - assertEquals(1, tr1.getRichTextRuns().length); - assertEquals(30, tr1.getRichTextRuns()[0].getLength()); - assertEquals(30, tr1.getRichTextRuns()[0].getText().length()); - assertEquals(31, tr1.getRichTextRuns()[0]._getRawCharacterStyle().getCharactersCovered()); - assertEquals(31, tr1.getRichTextRuns()[0]._getRawParagraphStyle().getCharactersCovered()); + assertEquals(1, tr1.getTextRuns().length); + assertEquals(30, tr1.getTextRuns().get(0).getLength()); + assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); + assertEquals(31, tr1.getTextRuns().get(0)._getRawCharacterStyle().getCharactersCovered()); + assertEquals(31, tr1.getTextRuns().get(0)._getRawParagraphStyle().getCharactersCovered()); // Set the text to be as it is now - tr1.setText( tr1.getText() ); + tr1.setText( tr1.getRawText() ); // Check the text lengths are still right - assertEquals(30, tr1.getText().length()); - assertEquals(179, tr2.getText().length()); + assertEquals(30, tr1.getRawText().length()); + assertEquals(179, tr2.getRawText().length()); - assertEquals(1, tr1.getRichTextRuns().length); - assertEquals(30, tr1.getRichTextRuns()[0].getLength()); - assertEquals(30, tr1.getRichTextRuns()[0].getText().length()); - assertEquals(31, tr1.getRichTextRuns()[0]._getRawCharacterStyle().getCharactersCovered()); - assertEquals(31, tr1.getRichTextRuns()[0]._getRawParagraphStyle().getCharactersCovered()); + assertEquals(1, tr1.getTextRuns().length); + assertEquals(30, tr1.getTextRuns().get(0).getLength()); + assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); + assertEquals(31, tr1.getTextRuns().get(0)._getRawCharacterStyle().getCharactersCovered()); + assertEquals(31, tr1.getTextRuns().get(0)._getRawParagraphStyle().getCharactersCovered()); // Write the slideshow out to a byte array @@ -110,33 +114,34 @@ public final class TestTextRunReWrite extends TestCase { } } + @Test public void testWritesOutTheSameRich() throws Exception { // Grab the first text run on the first sheet - HSLFTextParagraph tr1 = ss.getSlides()[0].getTextRuns()[0]; + HSLFTextParagraph tr1 = ss.getSlides().get(0).getTextParagraphs().get(0); // Get the first rich text run - HSLFTextRun rtr1 = tr1.getRichTextRuns()[0]; + HSLFTextRun rtr1 = tr1.getTextRuns().get(0); // Check that the text sizes are as expected - assertEquals(1, tr1.getRichTextRuns().length); - assertEquals(30, tr1.getText().length()); - assertEquals(30, tr1.getRichTextRuns()[0].getText().length()); + assertEquals(1, tr1.getTextRuns().length); + assertEquals(30, tr1.getRawText().length()); + assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); assertEquals(30, rtr1.getLength()); - assertEquals(30, rtr1.getText().length()); + assertEquals(30, rtr1.getRawText().length()); assertEquals(31, rtr1._getRawCharacterStyle().getCharactersCovered()); assertEquals(31, rtr1._getRawParagraphStyle().getCharactersCovered()); // Set the text to be as it is now - rtr1.setText( rtr1.getText() ); - rtr1 = tr1.getRichTextRuns()[0]; + rtr1.setText( rtr1.getRawText() ); + rtr1 = tr1.getTextRuns().get(0); // Check that the text sizes are still as expected - assertEquals(1, tr1.getRichTextRuns().length); - assertEquals(30, tr1.getText().length()); - assertEquals(30, tr1.getRichTextRuns()[0].getText().length()); + assertEquals(1, tr1.getTextRuns().length); + assertEquals(30, tr1.getRawText().length()); + assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); assertEquals(30, rtr1.getLength()); - assertEquals(30, rtr1.getText().length()); + assertEquals(30, rtr1.getRawText().length()); assertEquals(31, rtr1._getRawCharacterStyle().getCharactersCovered()); assertEquals(31, rtr1._getRawParagraphStyle().getCharactersCovered()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java index 5666b8db0e..f57d1548be 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java @@ -34,7 +34,7 @@ import java.util.Map; import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeType; import org.junit.Test; @@ -49,13 +49,13 @@ public final class TestTextShape { @Test public void createAutoShape(){ HSLFTextShape shape = new HSLFAutoShape(ShapeType.TRAPEZOID); - assertNull(shape.getTextParagraph()); + assertNull(shape.getTextParagraphs()); assertNull(shape.getText()); assertNull(shape.getEscherTextboxWrapper()); HSLFTextParagraph run = shape.createTextRun(); assertNotNull(run); - assertNotNull(shape.getTextParagraph()); + assertNotNull(shape.getTextParagraphs()); assertNotNull(shape.getEscherTextboxWrapper()); assertEquals("", shape.getText()); assertSame(run, shape.createTextRun()); @@ -65,13 +65,13 @@ public final class TestTextShape { @Test public void createTextBox(){ HSLFTextShape shape = new HSLFTextBox(); - HSLFTextParagraph run = shape.getTextParagraph(); + HSLFTextParagraph run = shape.getTextParagraphs(); assertNotNull(run); assertNotNull(shape.getText()); assertNotNull(shape.getEscherTextboxWrapper()); assertSame(run, shape.createTextRun()); - assertNotNull(shape.getTextParagraph()); + assertNotNull(shape.getTextParagraphs()); assertNotNull(shape.getEscherTextboxWrapper()); assertEquals("", shape.getText()); @@ -93,41 +93,41 @@ public final class TestTextShape { for (int i = 0; i < shape.length; i++) { assertTrue("Expected TextShape but found " + shape[i].getClass().getName(), shape[i] instanceof HSLFTextShape); HSLFTextShape tx = (HSLFTextShape)shape[i]; - HSLFTextParagraph run = tx.getTextParagraph(); + HSLFTextParagraph run = tx.getTextParagraphs(); assertNotNull(run); int runType = run.getRunType(); ShapeType type = shape[i].getShapeType(); switch (type){ case TEXT_BOX: - assertEquals("Text in a TextBox", run.getText()); + assertEquals("Text in a TextBox", run.getRawText()); break; case RECT: if(runType == TextHeaderAtom.OTHER_TYPE) - assertEquals("Rectangle", run.getText()); + assertEquals("Rectangle", run.getRawText()); else if(runType == TextHeaderAtom.TITLE_TYPE) - assertEquals("Title Placeholder", run.getText()); + assertEquals("Title Placeholder", run.getRawText()); break; case OCTAGON: - assertEquals("Octagon", run.getText()); + assertEquals("Octagon", run.getRawText()); break; case ELLIPSE: - assertEquals("Ellipse", run.getText()); + assertEquals("Ellipse", run.getRawText()); break; case ROUND_RECT: - assertEquals("RoundRectangle", run.getText()); + assertEquals("RoundRectangle", run.getRawText()); break; default: fail("Unexpected shape: " + shape[i].getShapeName()); } - lst1.add(run.getText()); + lst1.add(run.getRawText()); } List lst2 = new ArrayList(); - HSLFTextParagraph[] run = slide.getTextRuns(); + HSLFTextParagraph[] run = slide.getTextParagraphs(); for (int i = 0; i < run.length; i++) { - lst2.add(run[i].getText()); + lst2.add(run[i].getRawText()); } assertTrue(lst1.containsAll(lst2)); @@ -162,12 +162,12 @@ public final class TestTextShape { assertTrue(shape[0] instanceof HSLFTextShape); shape1 = (HSLFTextShape)shape[0]; assertEquals(ShapeType.TEXT_BOX, shape1.getShapeType()); - assertEquals("Hello, World!", shape1.getTextParagraph().getText()); + assertEquals("Hello, World!", shape1.getTextParagraphs().getRawText()); assertTrue(shape[1] instanceof HSLFTextShape); shape1 = (HSLFTextShape)shape[1]; assertEquals(ShapeType.RIGHT_ARROW, shape1.getShapeType()); - assertEquals("Testing TextShape", shape1.getTextParagraph().getText()); + assertEquals("Testing TextShape", shape1.getTextParagraphs().getRawText()); } @Test @@ -188,28 +188,28 @@ public final class TestTextShape { HSLFTextShape tx; tx = map.get("TEST1"); - assertEquals(0.1, tx.getMarginLeft()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.1, tx.getMarginRight()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.39, tx.getMarginTop()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginBottom()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getLeftInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getRightInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.39, tx.getTopInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getBottomInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); tx = map.get("TEST2"); - assertEquals(0.1, tx.getMarginLeft()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.1, tx.getMarginRight()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginTop()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.39, tx.getMarginBottom()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getLeftInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getRightInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getTopInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.39, tx.getBottomInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); tx = map.get("TEST3"); - assertEquals(0.39, tx.getMarginLeft()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.1, tx.getMarginRight()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginTop()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginBottom()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.39, tx.getLeftInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getRightInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getTopInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getBottomInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); tx = map.get("TEST4"); - assertEquals(0.1, tx.getMarginLeft()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.39, tx.getMarginRight()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginTop()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); - assertEquals(0.05, tx.getMarginBottom()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.1, tx.getLeftInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.39, tx.getRightInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getTopInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); + assertEquals(0.05, tx.getBottomInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01); } @Test @@ -222,14 +222,14 @@ public final class TestTextShape { HSLFTextShape sh0 = (HSLFTextShape)sh[0]; assertEquals(null, sh0.getText()); - assertEquals(null, sh0.getTextParagraph()); + assertEquals(null, sh0.getTextParagraphs()); HSLFTextShape sh1 = (HSLFTextShape)sh[1]; assertEquals(null, sh1.getText()); - assertEquals(null, sh1.getTextParagraph()); + assertEquals(null, sh1.getTextParagraphs()); HSLFTextShape sh2 = (HSLFTextShape)sh[2]; assertEquals("this box should be shown just once", sh2.getText()); - assertEquals(-1, sh2.getTextParagraph().getIndex()); + assertEquals(-1, sh2.getTextParagraphs().getIndex()); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java index 7e37b47a43..f11d299c90 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java @@ -19,7 +19,7 @@ package org.apache.poi.hslf.model; import org.apache.poi.hslf.record.StyleTextPropAtom; import org.apache.poi.hslf.record.TextCharsAtom; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hssf.usermodel.DummyGraphics2d; import org.junit.Test; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java index 60aee0f49d..f7ee1f9262 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java @@ -25,7 +25,7 @@ import java.io.InputStream; import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.poifs.filesystem.DocumentEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.junit.Test; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java index d7de61c877..8018ba3b86 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java @@ -19,7 +19,7 @@ package org.apache.poi.hslf.record; import junit.framework.TestCase; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.poifs.filesystem.*; import org.apache.poi.POIDataSamples; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java index 12c114b344..4f23e4998b 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java @@ -34,10 +34,7 @@ import org.apache.poi.hpsf.PropertySet; import org.apache.poi.hpsf.PropertySetFactory; import org.apache.poi.hpsf.SummaryInformation; import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; -import org.apache.poi.hslf.model.HSLFSlide; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; -import org.apache.poi.hslf.usermodel.HSLFPictureData; -import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey; import org.apache.poi.poifs.crypt.CryptoFunctions; import org.apache.poi.poifs.crypt.EncryptionInfo; @@ -147,7 +144,7 @@ public class TestDocumentEncryption { HSLFSlideShow ss = new HSLFSlideShow(hss); HSLFSlide slide = ss.getSlides()[0]; - assertEquals("Dominic Salemno", slide.getTextRuns()[0].getText()); + assertEquals("Dominic Salemno", slide.getTextParagraphs()[0].getRawText()); String picCmp[][] = { {"0","nKsDTKqxTCR8LFkVVWlP9GSTvZ0="}, diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java index f712e20a6d..de5ee42b7c 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java @@ -25,8 +25,8 @@ import java.util.List; import junit.framework.AssertionFailedError; import junit.framework.TestCase; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.POIDataSamples; /** diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java index 836016666e..bf596faed8 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java @@ -20,8 +20,8 @@ package org.apache.poi.hslf.record; import junit.framework.TestCase; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.usermodel.HSLFSlideShow; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.POIDataSamples; /** diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java index cecf3ee319..67bbd03175 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java @@ -20,7 +20,7 @@ package org.apache.poi.hslf.record; import junit.framework.TestCase; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; +import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.POIDataSamples; /** diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java index 4b1ef6c988..4dad61a6cb 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java @@ -78,7 +78,7 @@ public final class TestSlideAtom extends TestCase { public void testSSSlideInfoAtom() throws Exception { HSLFSlideShow ss = new HSLFSlideShow(); - org.apache.poi.hslf.model.HSLFSlide slide1 = ss.createSlide(), slide2 = ss.createSlide(); + org.apache.poi.hslf.usermodel.HSLFSlide slide1 = ss.createSlide(), slide2 = ss.createSlide(); slide2.setHidden(true); ByteArrayOutputStream bos = new ByteArrayOutputStream(4096); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java index 42fbf9113d..1dcd58ca37 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java @@ -98,16 +98,16 @@ public final class TestBugs { notes = ppt.getSlides()[0].getNotesSheet(); assertNotNull(notes); - txrun = notes.getTextRuns()[0]; + txrun = notes.getTextParagraphs()[0]; assertEquals("Notes-1", txrun.getRawText()); - assertEquals(false, txrun.getRichTextRuns()[0].isBold()); + assertEquals(false, txrun.getTextRuns()[0].isBold()); //notes for the second slide are in bold notes = ppt.getSlides()[1].getNotesSheet(); assertNotNull(notes); - txrun = notes.getTextRuns()[0]; + txrun = notes.getTextParagraphs()[0]; assertEquals("Notes-2", txrun.getRawText()); - assertEquals(true, txrun.getRichTextRuns()[0].isBold()); + assertEquals(true, txrun.getTextRuns()[0].isBold()); } @@ -134,7 +134,7 @@ public final class TestBugs { HSLFNotes notes = slide[i].getNotesSheet(); if (notesMap.containsKey(slideNumber)){ assertNotNull(notes); - String text = notes.getTextRuns()[0].getRawText(); + String text = notes.getTextParagraphs()[0].getRawText(); String startingPhrase = notesMap.get(slideNumber); assertTrue("Notes for slide " + slideNumber + " must start with " + startingPhrase , text.startsWith(startingPhrase)); @@ -158,7 +158,7 @@ public final class TestBugs { for (int j = 0; j < sh.length; j++) { if( sh[j] instanceof HSLFTextBox){ HSLFTextBox txt = (HSLFTextBox)sh[j]; - assertNotNull(txt.getTextParagraph()); + assertNotNull(txt.getTextParagraphs()); } } } @@ -202,8 +202,8 @@ public final class TestBugs { HSLFSlide[] slide = ppt.getSlides(); for (int i = 0; i < slide.length; i++) { HSLFMasterSheet master = slide[i].getMasterSheet(); - if (i == 0) assertTrue(master instanceof TitleMaster); //the first slide follows TitleMaster - else assertTrue(master instanceof SlideMaster); + if (i == 0) assertTrue(master instanceof HSLFTitleMaster); //the first slide follows TitleMaster + else assertTrue(master instanceof HSLFSlideMaster); } } @@ -301,7 +301,7 @@ public final class TestBugs { HSLFSlide[] slide = ppt.getSlides(); assertEquals(1, slide.length); - HSLFTextParagraph[] runs = slide[0].getTextRuns(); + HSLFTextParagraph[] runs = slide[0].getTextParagraphs(); assertEquals(4, runs.length); Set txt = new HashSet(); @@ -329,21 +329,21 @@ public final class TestBugs { // Check the first slide HSLFSlide slide = ppt.getSlides()[0]; - HSLFTextParagraph[] slTr = slide.getTextRuns(); + HSLFTextParagraph[] slTr = slide.getTextParagraphs(); // Has two text runs, one from slide text, one from drawing assertEquals(2, slTr.length); assertEquals(false, slTr[0].isDrawingBased()); assertEquals(true, slTr[1].isDrawingBased()); - assertEquals("First run", slTr[0].getText()); - assertEquals("Second run", slTr[1].getText()); + assertEquals("First run", slTr[0].getRawText()); + assertEquals("Second run", slTr[1].getRawText()); // Check the shape based text runs List lst = new ArrayList(); HSLFShape[] shape = slide.getShapes(); for (int i = 0; i < shape.length; i++) { if( shape[i] instanceof HSLFTextShape){ - HSLFTextParagraph textRun = ((HSLFTextShape)shape[i]).getTextParagraph(); + HSLFTextParagraph textRun = ((HSLFTextShape)shape[i]).getTextParagraphs(); if(textRun != null) { lst.add(textRun); } @@ -354,7 +354,7 @@ public final class TestBugs { assertEquals(1, lst.size()); // And it should be the second one - assertEquals("Second run", lst.get(0).getText()); + assertEquals("Second run", lst.get(0).getRawText()); } /** @@ -402,11 +402,11 @@ public final class TestBugs { assertEquals(1, sh.length); assertTrue(sh[0] instanceof HSLFTextShape); HSLFTextShape tx = (HSLFTextShape)sh[0]; - assertEquals("Fundera, planera och involvera.", tx.getTextParagraph().getText()); + assertEquals("Fundera, planera och involvera.", tx.getTextParagraphs().getRawText()); - HSLFTextParagraph[] run = slide.getTextRuns(); + HSLFTextParagraph[] run = slide.getTextParagraphs(); assertEquals(1, run.length); - assertEquals("Fundera, planera och involvera.", run[0].getText()); + assertEquals("Fundera, planera och involvera.", run[0].getRawText()); } /** @@ -429,7 +429,7 @@ public final class TestBugs { public void bug49648() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("49648.ppt")); for(HSLFSlide slide : ppt.getSlides()) { - for(HSLFTextParagraph run : slide.getTextRuns()) { + for(HSLFTextParagraph run : slide.getTextParagraphs()) { String text = run.getRawText(); text.replace("{txtTot}", "With \u0123\u1234\u5678 unicode"); run.setRawText(text); @@ -487,7 +487,7 @@ public final class TestBugs { str = str.replace("$$DATE$$", new Date().toString()); tb.setText(str); - HSLFTextParagraph tr = tb.getTextParagraph(); + HSLFTextParagraph tr = tb.getTextParagraphs(); assertEquals(str.length()+1,tr.getStyleTextPropAtom().getParagraphStyles().getFirst().getCharactersCovered()); assertEquals(str.length()+1,tr.getStyleTextPropAtom().getCharacterStyles().getFirst().getCharactersCovered()); } @@ -538,7 +538,7 @@ public final class TestBugs { // Check the number of text runs based on the slide (not textbox) // Will have skipped the empty one int str = 0; - for (HSLFTextParagraph tr : _slides[0].getTextRuns()) { + for (HSLFTextParagraph tr : _slides[0].getTextParagraphs()) { if (! tr.isDrawingBased()) str++; } assertEquals(1, str); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java index 37b7bb6965..3638bad82e 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java @@ -39,7 +39,6 @@ import java.util.Map; import javax.imageio.ImageIO; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.model.HSLFSlide; import org.apache.poi.hslf.model.TextPainter; import org.apache.poi.util.TempFile; import org.junit.Ignore; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java index 088dbb0cee..1cb9c7d9fd 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java @@ -21,7 +21,6 @@ package org.apache.poi.hslf.usermodel; import junit.framework.TestCase; import org.apache.poi.hslf.*; -import org.apache.poi.hslf.model.HSLFSlideShowImpl; import org.apache.poi.hslf.record.*; import org.apache.poi.POIDataSamples; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java index 22b40a22e2..570fb5883a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java @@ -43,18 +43,18 @@ public final class TestNotesText extends TestCase { HSLFNotes notes = ss.getNotes()[0]; String[] expectText = new String[] {"These are the notes for page 1"}; - assertEquals(expectText.length, notes.getTextRuns().length); + assertEquals(expectText.length, notes.getTextParagraphs().length); for(int i=0; i(text a)(text a)(text b) // TR: // (text) - HSLFTextParagraph[] s7tr = slideSevenC.getTextRuns(); - HSLFTextRun[] s7rtr0 = s7tr[0].getRichTextRuns(); - HSLFTextRun[] s7rtr1 = s7tr[1].getRichTextRuns(); - HSLFTextRun[] s7rtr2 = s7tr[2].getRichTextRuns(); + HSLFTextParagraph[] s7tr = slideSevenC.getTextParagraphs(); + HSLFTextRun[] s7rtr0 = s7tr[0].getTextRuns(); + HSLFTextRun[] s7rtr1 = s7tr[1].getTextRuns(); + HSLFTextRun[] s7rtr2 = s7tr[2].getTextRuns(); assertEquals(1, s7rtr0.length); assertEquals(3, s7rtr1.length); @@ -332,10 +332,10 @@ public final class TestRichTextRun extends POITestCase { assertMatchesFileC(ssRichC); HSLFSlide slideSevenC = ssRichC.getSlides()[6]; - HSLFTextParagraph[] s7tr = slideSevenC.getTextRuns(); - HSLFTextRun[] s7rtr0 = s7tr[0].getRichTextRuns(); - HSLFTextRun[] s7rtr1 = s7tr[1].getRichTextRuns(); - HSLFTextRun[] s7rtr2 = s7tr[2].getRichTextRuns(); + HSLFTextParagraph[] s7tr = slideSevenC.getTextParagraphs(); + HSLFTextRun[] s7rtr0 = s7tr[0].getTextRuns(); + HSLFTextRun[] s7rtr1 = s7tr[1].getTextRuns(); + HSLFTextRun[] s7rtr2 = s7tr[2].getTextRuns(); String oldText; @@ -343,8 +343,8 @@ public final class TestRichTextRun extends POITestCase { // Need to ensure it's a run that really has styles! oldText = s7rtr2[0].getRawText(); s7rtr2[0].setText( oldText ); - assertEquals(oldText, s7rtr2[0].getText()); - assertEquals(oldText, s7tr[2].getText()); + assertEquals(oldText, s7rtr2[0].getRawText()); + assertEquals(oldText, s7tr[2].getRawText()); assertEquals(oldText.length() + 1, s7rtr2[0]._getRawCharacterStyle().getCharactersCovered()); assertEquals(oldText.length() + 1, s7rtr2[0]._getRawParagraphStyle().getCharactersCovered()); assertMatchesSLTWC(ssRichC); @@ -353,7 +353,7 @@ public final class TestRichTextRun extends POITestCase { // Reset the text on a shared paragraph oldText = s7rtr1[2].getRawText(); s7rtr1[2].setText( oldText ); - assertEquals(oldText, s7rtr1[2].getText()); + assertEquals(oldText, s7rtr1[2].getRawText()); assertEquals(oldText.length() + 1, s7rtr1[2]._getRawCharacterStyle().getCharactersCovered()); assertMatchesSLTWC(ssRichC); assertMatchesFileC(ssRichC); @@ -450,9 +450,9 @@ if(false) { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt")); HSLFSlide[] sl = ppt.getSlides(); for (int i = 0; i < sl.length; i++) { - HSLFTextParagraph[] txt = sl[i].getTextRuns(); + HSLFTextParagraph[] txt = sl[i].getTextParagraphs(); for (int j = 0; j < txt.length; j++) { - HSLFTextRun[] rt = txt[j].getRichTextRuns(); + HSLFTextRun[] rt = txt[j].getTextRuns(); for (int k = 0; k < rt.length; k++) { int indent = rt[k].getIndentLevel(); assertTrue(indent >= 0 && indent <= 4 ); @@ -471,12 +471,12 @@ if(false) { HSLFSlide[] slide = ppt.getSlides(); assertEquals(2, slide.length); - txt = slide[0].getTextRuns(); + txt = slide[0].getTextParagraphs(); assertEquals(2, txt.length); assertEquals("Title text", txt[0].getRawText()); - assertEquals(1, txt[0].getRichTextRuns().length); - rt = txt[0].getRichTextRuns()[0]; + assertEquals(1, txt[0].getTextRuns().length); + rt = txt[0].getTextRuns()[0]; assertFalse(rt.isBullet()); assertEquals( @@ -484,13 +484,13 @@ if(false) { "follows the design pattern\r" + "Defined in the slide master\r" + "and has bullets by default", txt[1].getRawText()); - assertEquals(1, txt[1].getRichTextRuns().length); - rt = txt[1].getRichTextRuns()[0]; + assertEquals(1, txt[1].getTextRuns().length); + rt = txt[1].getTextRuns()[0]; assertEquals('\u2022', rt.getBulletChar()); assertTrue(rt.isBullet()); - txt = slide[1].getTextRuns(); + txt = slide[1].getTextParagraphs(); assertEquals(2, txt.length); assertEquals( @@ -498,16 +498,16 @@ if(false) { "With bullets\r" + "That follow the design pattern\r" + "From the slide master", txt[0].getRawText()); - assertEquals(1, txt[0].getRichTextRuns().length); - rt = txt[0].getRichTextRuns()[0]; + assertEquals(1, txt[0].getTextRuns().length); + rt = txt[0].getTextRuns()[0]; assertTrue(rt.isBullet()); assertEquals('\u2022', rt.getBulletChar()); assertEquals( "I\u2019m a text box with user-defined\r" + "bullet character", txt[1].getRawText()); - assertEquals(1, txt[1].getRichTextRuns().length); - rt = txt[1].getRichTextRuns()[0]; + assertEquals(1, txt[1].getTextRuns().length); + rt = txt[1].getTextRuns()[0]; assertTrue(rt.isBullet()); assertEquals('\u263A', rt.getBulletChar()); } @@ -518,7 +518,7 @@ if(false) { HSLFSlide slide = ppt.createSlide(); HSLFTextBox shape = new HSLFTextBox(); - HSLFTextRun rt = shape.getTextParagraph().getRichTextRuns()[0]; + HSLFTextRun rt = shape.getTextParagraphs().getTextRuns()[0]; shape.setText( "Hello, World!\r" + "This should be\r" + @@ -547,7 +547,7 @@ if(false) { ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); slide = ppt.getSlides()[0]; shape = (HSLFTextBox)slide.getShapes()[0]; - rt = shape.getTextParagraph().getRichTextRuns()[0]; + rt = shape.getTextParagraphs().getTextRuns()[0]; assertEquals(42, rt.getFontSize()); assertEquals(true, rt.isBullet()); assertEquals(50, rt.getTextOffset()); @@ -564,38 +564,38 @@ if(false) { HSLFSlide[] slides = ppt.getSlides(); assertEquals(2, slides.length); - txt = slides[0].getTextRuns(); + txt = slides[0].getTextParagraphs(); assertEquals(2, txt.length); assertEquals("Title text", txt[0].getRawText()); - assertEquals(1, txt[0].getRichTextRuns().length); - rt = txt[0].getRichTextRuns()[0]; + assertEquals(1, txt[0].getTextRuns().length); + rt = txt[0].getTextRuns()[0]; assertFalse(rt.isBullet()); // Add some new text txt[0].appendText("Foo! I'm new!"); - assertEquals(2, txt[0].getRichTextRuns().length); + assertEquals(2, txt[0].getTextRuns().length); - rt = txt[0].getRichTextRuns()[0]; + rt = txt[0].getTextRuns()[0]; assertFalse(rt.isBold()); - assertEquals("Title text", rt.getText()); - rt = txt[0].getRichTextRuns()[1]; + assertEquals("Title text", rt.getRawText()); + rt = txt[0].getTextRuns()[1]; assertFalse(rt.isBold()); - assertEquals("Foo! I'm new!", rt.getText()); + assertEquals("Foo! I'm new!", rt.getRawText()); rt.setBold(true); // And some more txt[0].appendText("Me too!"); - assertEquals(3, txt[0].getRichTextRuns().length); - rt = txt[0].getRichTextRuns()[0]; + assertEquals(3, txt[0].getTextRuns().length); + rt = txt[0].getTextRuns()[0]; assertFalse(rt.isBold()); - assertEquals("Title text", rt.getText()); - rt = txt[0].getRichTextRuns()[1]; + assertEquals("Title text", rt.getRawText()); + rt = txt[0].getTextRuns()[1]; assertTrue(rt.isBold()); - assertEquals("Foo! I'm new!", rt.getText()); - rt = txt[0].getRichTextRuns()[2]; + assertEquals("Foo! I'm new!", rt.getRawText()); + rt = txt[0].getTextRuns()[2]; assertFalse(rt.isBold()); - assertEquals("Me too!", rt.getText()); + assertEquals("Me too!", rt.getRawText()); // Save and re-open ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -607,18 +607,18 @@ if(false) { assertEquals(2, slides.length); - txt = slides[0].getTextRuns(); + txt = slides[0].getTextParagraphs(); assertEquals(2, txt.length); - assertEquals(3, txt[0].getRichTextRuns().length); - rt = txt[0].getRichTextRuns()[0]; + assertEquals(3, txt[0].getTextRuns().length); + rt = txt[0].getTextRuns()[0]; assertFalse(rt.isBold()); - assertEquals("Title text", rt.getText()); - rt = txt[0].getRichTextRuns()[1]; + assertEquals("Title text", rt.getRawText()); + rt = txt[0].getTextRuns()[1]; assertTrue(rt.isBold()); - assertEquals("Foo! I'm new!", rt.getText()); - rt = txt[0].getRichTextRuns()[2]; + assertEquals("Foo! I'm new!", rt.getRawText()); + rt = txt[0].getTextRuns()[2]; assertFalse(rt.isBold()); - assertEquals("Me too!", rt.getText()); + assertEquals("Me too!", rt.getRawText()); // FileOutputStream fout = new FileOutputStream("/tmp/foo.ppt"); // ppt.write(fout); @@ -634,17 +634,17 @@ if(false) { assertEquals(1, slides.length); // One block of text within that - txt = slides[0].getTextRuns(); + txt = slides[0].getTextParagraphs(); assertEquals(1, txt.length); // One rich block of text in that - text is all the same style // TODO Is this completely correct? - rts = txt[0].getRichTextRuns(); + rts = txt[0].getTextRuns(); assertEquals(1, rts.length); rt = rts[0]; // Check we can get the english text out of that - String text = rt.getText(); + String text = rt.getRawText(); assertContains(text, "Single byte"); // And the chinese assertContains(text, "\uff8a\uff9d\uff76\uff78"); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java index fda2aba0d0..000166b754 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java @@ -43,18 +43,18 @@ public final class TestSheetText extends TestCase { HSLFSheet slideOne = ss.getSlides()[0]; String[] expectText = new String[] {"This is a test title","This is a test subtitle\nThis is on page 1"}; - assertEquals(expectText.length, slideOne.getTextRuns().length); + assertEquals(expectText.length, slideOne.getTextParagraphs().length); for(int i=0; i textParas = slideOne.getTextParagraphs(); + + assertEquals(2, textParas.size()); + + // Get text works with \n + assertEquals("This is a test title", textParas.get(0).getTextRuns().get(0).getRawText()); + assertEquals("This is a test subtitle\nThis is on page 1", textParas.get(1).getTextRuns().get(0).getRawText()); + + // Raw text has \r instead + assertEquals("This is a test title", textParas.get(0).getTextRuns().get(0).getRawText()); + assertEquals("This is a test subtitle\rThis is on page 1", textParas.get(1).getTextRuns().get(0).getRawText()); + + + // Now check on a rich text run + HSLFSlide slideOneR = ssRich.getSlides().get(0); + List textRunsR = slideOneR.getTextParagraphs(); + + assertEquals(2, textRunsR.size()); + assertEquals("This is a title, it\u2019s in black", textRunsR.get(0).getTextRuns().get(0).getRawText()); + assertEquals("This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)", textRunsR.get(1).getTextRuns().get(0).getRawText()); + assertEquals("This is a title, it\u2019s in black", textRunsR.get(0).getTextRuns().get(0).getRawText()); + assertEquals("This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)", textRunsR.get(1).getTextRuns().get(0).getRawText()); + } + + /** + * Test to ensure changing non rich text bytes->bytes works correctly + */ + @Test + public void testSetText() { + HSLFSlide slideOne = ss.getSlides().get(0); + List textRuns = slideOne.getTextParagraphs(); + HSLFTextParagraph run = textRuns.get(0); + HSLFTextRun tr = run.getTextRuns().get(0); + + // Check current text + assertEquals("This is a test title", tr.getRawText()); + + // Change + String changeTo = "New test title"; + tr.setText(changeTo); + assertEquals(changeTo, tr.getRawText()); + + // Ensure trailing \n's are NOT stripped, it is legal to set a text with a trailing '\r' + tr.setText(changeTo + "\n"); + assertEquals(changeTo + "\n", tr.getRawText()); + } + + /** + * Test to ensure that changing non rich text between bytes and + * chars works correctly + */ + @Test + public void testAdvancedSetText() { + HSLFSlide slideOne = ss.getSlides().get(0); + List paras = slideOne.getTextParagraphs(); + HSLFTextParagraph para = paras.get(0); + + TextHeaderAtom tha = null; + TextBytesAtom tba = null; + TextCharsAtom tca = null; + for (Record r : para.getRecords()) { + if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r; + else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r; + else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r; + } + + + // Bytes -> Bytes + assertNull(tca); + assertNotNull(tba); + // assertFalse(run._isUnicode); + assertEquals("This is a test title", para.getTextRuns().get(0).getRawText()); + + String changeBytesOnly = "New Test Title"; + HSLFTextParagraph.setText(paras, changeBytesOnly); + para = paras.get(0); + tha = null; tba = null; tca = null; + for (Record r : para.getRecords()) { + if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r; + else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r; + else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r; + } + + assertEquals(changeBytesOnly, HSLFTextParagraph.getRawText(paras)); + assertNull(tca); + assertNotNull(tba); + + // Bytes -> Chars + assertNull(tca); + assertNotNull(tba); + assertEquals(changeBytesOnly, HSLFTextParagraph.getRawText(paras)); + + String changeByteChar = "This is a test title with a '\u0121' g with a dot"; + HSLFTextParagraph.setText(paras, changeByteChar); + para = paras.get(0); + tha = null; tba = null; tca = null; + for (Record r : para.getRecords()) { + if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r; + else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r; + else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r; + } + + assertEquals(changeByteChar, HSLFTextParagraph.getRawText(paras)); + assertNotNull(tca); + assertNull(tba); + + // Chars -> Chars + assertNull(tba); + assertNotNull(tca); + assertEquals(changeByteChar, HSLFTextParagraph.getRawText(paras)); + + String changeCharChar = "This is a test title with a '\u0147' N with a hat"; + HSLFTextParagraph.setText(paras, changeCharChar); + para = paras.get(0); + tha = null; tba = null; tca = null; + for (Record r : para.getRecords()) { + if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r; + else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r; + else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r; + } + + assertEquals(changeCharChar, HSLFTextParagraph.getRawText(paras)); + assertNotNull(tca); + assertNull(tba); + } + + /** + * Tests to ensure that non rich text has the right default rich text run + * set up for it + */ + @Test + public void testGetRichTextNonRich() { + HSLFSlide slideOne = ss.getSlides().get(0); + List textRuns = slideOne.getTextParagraphs(); + + assertEquals(2, textRuns.size()); + + HSLFTextParagraph trA = textRuns.get(0); + HSLFTextParagraph trB = textRuns.get(1); + + assertEquals(1, trA.getTextRuns().size()); + assertEquals(1, trB.getTextRuns().size()); + + HSLFTextRun rtrA = trA.getTextRuns().get(0); + HSLFTextRun rtrB = trB.getTextRuns().get(0); + + assertEquals(HSLFTextParagraph.getRawText(textRuns.subList(0, 0)), rtrA.getRawText()); + assertEquals(HSLFTextParagraph.getRawText(textRuns.subList(1, 1)), rtrB.getRawText()); + +// assertNull(rtrA._getRawCharacterStyle()); +// assertNull(rtrA._getRawParagraphStyle()); +// assertNull(rtrB._getRawCharacterStyle()); +// assertNull(rtrB._getRawParagraphStyle()); + } + + /** + * Tests to ensure that the rich text runs are built up correctly + */ + @Test + public void testGetRichText() { + HSLFSlide slideOne = ssRich.getSlides().get(0); + List textRuns = slideOne.getTextParagraphs(); + + assertEquals(2, textRuns.size()); + + HSLFTextParagraph trA = textRuns.get(0); + HSLFTextParagraph trB = textRuns.get(1); + + assertEquals(1, trA.getTextRuns().size()); + assertEquals(3, trB.getTextRuns().size()); + + HSLFTextRun rtrA = trA.getTextRuns().get(0); + HSLFTextRun rtrB = trB.getTextRuns().get(0); + HSLFTextRun rtrC = trB.getTextRuns().get(1); + HSLFTextRun rtrD = trB.getTextRuns().get(2); + + assertEquals(HSLFTextParagraph.getRawText(textRuns.subList(0, 0)), rtrA.getRawText()); + + String trBstr = HSLFTextParagraph.getRawText(textRuns.subList(1, 1)); + assertEquals(trBstr.substring(0, 30), rtrB.getRawText()); + assertEquals(trBstr.substring(30,58), rtrC.getRawText()); + assertEquals(trBstr.substring(58,82), rtrD.getRawText()); + +// assertNull(rtrA._getRawCharacterStyle()); +// assertNull(rtrA._getRawParagraphStyle()); +// assertNotNull(rtrB._getRawCharacterStyle()); +// assertNotNull(rtrB._getRawParagraphStyle()); +// assertNotNull(rtrC._getRawCharacterStyle()); +// assertNotNull(rtrC._getRawParagraphStyle()); +// assertNotNull(rtrD._getRawCharacterStyle()); +// assertNotNull(rtrD._getRawParagraphStyle()); + + // Same paragraph styles +// assertEquals(rtrB._getRawParagraphStyle(), rtrC._getRawParagraphStyle()); +// assertEquals(rtrB._getRawParagraphStyle(), rtrD._getRawParagraphStyle()); + + // Different char styles +// assertFalse( rtrB._getRawCharacterStyle().equals( rtrC._getRawCharacterStyle() )); +// assertFalse( rtrB._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() )); +// assertFalse( rtrC._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() )); + } + + /** + * Tests to ensure that setting the text where the text isn't rich, + * ensuring that everything stays with the same default styling + */ + @Test + public void testSetTextWhereNotRich() { + HSLFSlide slideOne = ss.getSlides().get(0); + List textRuns = slideOne.getTextParagraphs(); + HSLFTextParagraph trB = textRuns.get(1); +// assertEquals(1, trB.getTextRuns().length); + + HSLFTextRun rtrB = trB.getTextRuns().get(0); +// assertEquals(trB.getRawText(), rtrB.getRawText()); +// assertNull(rtrB._getRawCharacterStyle()); +// assertNull(rtrB._getRawParagraphStyle()); + + // Change text via normal +// trB.setText("Test Foo Test"); + rtrB = trB.getTextRuns().get(0); +// assertEquals("Test Foo Test", trB.getRawText()); +// assertEquals("Test Foo Test", rtrB.getRawText()); +// assertNull(rtrB._getRawCharacterStyle()); +// assertNull(rtrB._getRawParagraphStyle()); + } + + /** + * Tests to ensure that setting the text where the text is rich + * sets everything to the same styling + */ + @Test + public void testSetTextWhereRich() { + HSLFSlide slideOne = ssRich.getSlides().get(0); + List textRuns = slideOne.getTextParagraphs(); + HSLFTextParagraph trB = textRuns.get(1); + assertEquals(3, trB.getTextRuns().size()); + + HSLFTextRun rtrB = trB.getTextRuns().get(0); + HSLFTextRun rtrC = trB.getTextRuns().get(1); + HSLFTextRun rtrD = trB.getTextRuns().get(2); +// TextPropCollection tpBP = rtrB._getRawParagraphStyle(); +// TextPropCollection tpBC = rtrB._getRawCharacterStyle(); +// TextPropCollection tpCP = rtrC._getRawParagraphStyle(); +// TextPropCollection tpCC = rtrC._getRawCharacterStyle(); +// TextPropCollection tpDP = rtrD._getRawParagraphStyle(); +// TextPropCollection tpDC = rtrD._getRawCharacterStyle(); + +// assertEquals(trB.getRawText().substring(0, 30), rtrB.getRawText()); +// assertNotNull(tpBP); +// assertNotNull(tpBC); +// assertNotNull(tpCP); +// assertNotNull(tpCC); +// assertNotNull(tpDP); +// assertNotNull(tpDC); +// assertTrue(tpBP.equals(tpCP)); +// assertTrue(tpBP.equals(tpDP)); +// assertTrue(tpCP.equals(tpDP)); +// assertFalse(tpBC.equals(tpCC)); +// assertFalse(tpBC.equals(tpDC)); +// assertFalse(tpCC.equals(tpDC)); + + // Change text via normal +// trB.setText("Test Foo Test"); + + // Ensure now have first style +// assertEquals(1, trB.getTextRuns().length); +// rtrB = trB.getTextRuns().get(0); +// assertEquals("Test Foo Test", trB.getRawText()); +// assertEquals("Test Foo Test", rtrB.getRawText()); +// assertNotNull(rtrB._getRawCharacterStyle()); +// assertNotNull(rtrB._getRawParagraphStyle()); +// assertEquals( tpBP, rtrB._getRawParagraphStyle() ); +// assertEquals( tpBC, rtrB._getRawCharacterStyle() ); + } + + /** + * Test to ensure the right stuff happens if we change the text + * in a rich text run, that doesn't happen to actually be rich + */ + @Test + public void testChangeTextInRichTextRunNonRich() { + HSLFSlide slideOne = ss.getSlides().get(0); + List textRuns = slideOne.getTextParagraphs(); + HSLFTextParagraph trB = textRuns.get(1); +// assertEquals(1, trB.getTextRuns().length); +// +// HSLFTextRun rtrB = trB.getTextRuns().get(0); +// assertEquals(trB.getRawText(), rtrB.getRawText()); +// assertNull(rtrB._getRawCharacterStyle()); +// assertNull(rtrB._getRawParagraphStyle()); + + // Change text via rich +// rtrB.setText("Test Test Test"); +// assertEquals("Test Test Test", trB.getRawText()); +// assertEquals("Test Test Test", rtrB.getRawText()); + + // Will now have dummy props +// assertNotNull(rtrB._getRawCharacterStyle()); +// assertNotNull(rtrB._getRawParagraphStyle()); + } + + /** + * Tests to ensure changing the text within rich text runs works + * correctly + */ + @Test + public void testChangeTextInRichTextRun() { + HSLFSlide slideOne = ssRich.getSlides().get(0); + List textRuns = slideOne.getTextParagraphs(); + HSLFTextParagraph trB = textRuns.get(1); + assertEquals(3, trB.getTextRuns().size()); + + // We start with 3 text runs, each with their own set of styles, + // but all sharing the same paragraph styles + HSLFTextRun rtrB = trB.getTextRuns().get(0); + HSLFTextRun rtrC = trB.getTextRuns().get(1); + HSLFTextRun rtrD = trB.getTextRuns().get(2); +// TextPropCollection tpBP = rtrB._getRawParagraphStyle(); +// TextPropCollection tpBC = rtrB._getRawCharacterStyle(); +// TextPropCollection tpCP = rtrC._getRawParagraphStyle(); +// TextPropCollection tpCC = rtrC._getRawCharacterStyle(); +// TextPropCollection tpDP = rtrD._getRawParagraphStyle(); +// TextPropCollection tpDC = rtrD._getRawCharacterStyle(); + + // Check text and stylings +// assertEquals(trB.getRawText().substring(0, 30), rtrB.getRawText()); +// assertNotNull(tpBP); +// assertNotNull(tpBC); +// assertNotNull(tpCP); +// assertNotNull(tpCC); +// assertNotNull(tpDP); +// assertNotNull(tpDC); +// assertTrue(tpBP.equals(tpCP)); +// assertTrue(tpBP.equals(tpDP)); +// assertTrue(tpCP.equals(tpDP)); +// assertFalse(tpBC.equals(tpCC)); +// assertFalse(tpBC.equals(tpDC)); +// assertFalse(tpCC.equals(tpDC)); + + // Check text in the rich runs + assertEquals("This is the subtitle, in bold\n", rtrB.getRawText()); + assertEquals("This bit is blue and italic\n", rtrC.getRawText()); + assertEquals("This bit is red (normal)", rtrD.getRawText()); + + String newBText = "New Subtitle, will still be bold\n"; + String newCText = "New blue and italic text\n"; + String newDText = "Funky new normal red text"; + rtrB.setText(newBText); + rtrC.setText(newCText); + rtrD.setText(newDText); + assertEquals(newBText, rtrB.getRawText()); + assertEquals(newCText, rtrC.getRawText()); + assertEquals(newDText, rtrD.getRawText()); + +// assertEquals(newBText + newCText + newDText, trB.getRawText()); + + // The styles should have been updated for the new sizes +// assertEquals(newBText.length(), tpBC.getCharactersCovered()); +// assertEquals(newCText.length(), tpCC.getCharactersCovered()); +// assertEquals(newDText.length()+1, tpDC.getCharactersCovered()); // Last one is always one larger + +// assertEquals( +// newBText.length() + newCText.length() + newDText.length(), +// tpBP.getCharactersCovered() +// ); + + // Paragraph style should be sum of text length +// assertEquals(newBText.length() + newCText.length() + newDText.length(), tpBP.getCharactersCovered()); + + // Check stylings still as expected +// TextPropCollection ntpBC = rtrB._getRawCharacterStyle(); +// TextPropCollection ntpCC = rtrC._getRawCharacterStyle(); +// TextPropCollection ntpDC = rtrD._getRawCharacterStyle(); +// assertEquals(tpBC.getTextPropList(), ntpBC.getTextPropList()); +// assertEquals(tpCC.getTextPropList(), ntpCC.getTextPropList()); +// assertEquals(tpDC.getTextPropList(), ntpDC.getTextPropList()); + } + + + /** + * Test case for Bug 41015. + * + * In some cases RichTextRun.getText() threw StringIndexOutOfBoundsException because + * of the wrong list of potential paragraph properties defined in StyleTextPropAtom. + * + */ + @Test + public void testBug41015() throws IOException { + List rt; + + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bug-41015.ppt")); + HSLFSlide sl = ppt.getSlides().get(0); + List txt = sl.getTextParagraphs(); + assertEquals(2, txt.size()); + + rt = txt.get(0).getTextRuns(); + assertEquals(1, rt.size()); + assertEquals(0, txt.get(0).getIndentLevel()); + assertEquals("sdfsdfsdf", rt.get(0).getRawText()); + + rt = txt.get(1).getTextRuns(); + assertEquals(2, rt.size()); + assertEquals(0, txt.get(0).getIndentLevel()); + assertEquals("Sdfsdfsdf\n" + + "Dfgdfg\n" + + "Dfgdfgdfg\n", rt.get(0).getRawText()); + assertEquals(1, txt.get(1).getIndentLevel()); + assertEquals("Sdfsdfs\n" + + "Sdfsdf\n", rt.get(1).getRawText()); + } + + /** + * Test creation of TextRun objects. + */ + @Test + public void testAddTextRun() { + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); + + assertNull(slide.getTextParagraphs()); + + HSLFTextBox shape1 = new HSLFTextBox(); +// HSLFTextParagraph run1 = shape1.getTextParagraphs(); +// assertSame(run1, shape1.createTextRun()); +// run1.setText("Text 1"); + slide.addShape(shape1); + + //The array of Slide's text runs must be updated when new text shapes are added. +// HSLFTextParagraph[] runs = slide.getTextParagraphs(); +// assertNotNull(runs); +// assertSame(run1, runs.get(0)); +// +// HSLFTextBox shape2 = new HSLFTextBox(); +// HSLFTextParagraph run2 = shape2.getTextParagraphs(); +// assertSame(run2, shape2.createTextRun()); +// run2.setText("Text 2"); +// slide.addShape(shape2); +// +// runs = slide.getTextParagraphs(); +// assertEquals(2, runs.length); +// +// assertSame(run1, runs.get(0)); +// assertSame(run2, runs.get(1)); +// +// //as getShapes() +// HSLFShape[] sh = slide.getShapes(); +// assertEquals(2, sh.length); +// assertTrue(sh.get(0) instanceof HSLFTextBox); +// HSLFTextBox box1 = (HSLFTextBox)sh.get(0); +// assertSame(run1, box1.getTextParagraphs()); +// HSLFTextBox box2 = (HSLFTextBox)sh.get(1); +// assertSame(run2, box2.getTextParagraphs()); +// +// //test Table - a complex group of shapes containing text objects +// HSLFSlide slide2 = ppt.createSlide(); +// assertNull(slide2.getTextParagraphs()); +// Table table = new Table(2, 2); +// slide2.addShape(table); +// runs = slide2.getTextParagraphs(); +// assertNotNull(runs); +// assertEquals(4, runs.length); + } + + @Test + public void test48916() throws IOException { +// HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("SampleShow.ppt")); +// for(HSLFSlide slide : ppt.getSlides()){ +// for(HSLFShape sh : slide.getShapes()){ +// if(sh instanceof HSLFTextShape){ +// HSLFTextShape tx = (HSLFTextShape)sh; +// HSLFTextParagraph run = tx.getTextParagraphs(); +// //verify that records cached in TextRun and EscherTextboxWrapper are the same +// Record[] runChildren = run.getRecords(); +// Record[] txboxChildren = tx.getEscherTextboxWrapper().getChildRecords(); +// assertEquals(runChildren.length, txboxChildren.length); +// for(int i=0; i < txboxChildren.length; i++){ +// assertSame(txboxChildren.get(i), runChildren.get(i)); +// } +// //caused NPE prior to fix of Bugzilla #48916 +// run.getTextRuns().get(0).setBold(true); +// run.getTextRuns().get(0).setFontColor(Color.RED); +// } +// } +// } +// ByteArrayOutputStream out = new ByteArrayOutputStream(); +// ppt.write(out); +// ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); +// for(HSLFSlide slide : ppt.getSlides()){ +// for(HSLFShape sh : slide.getShapes()){ +// if(sh instanceof HSLFTextShape){ +// HSLFTextShape tx = (HSLFTextShape)sh; +// HSLFTextParagraph run = tx.getTextParagraphs(); +// HSLFTextRun rt = run.getTextRuns().get(0); +// assertTrue(rt.isBold()); +// assertEquals(rt.getFontColor(), Color.RED); +// } +// } +// } + + } + + @Test + public void test52244() throws IOException { + HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52244.ppt")); + HSLFSlide slide = ppt.getSlides().get(0); + List runs = slide.getTextParagraphs(); + + assertEquals("Arial", runs.get(0).getTextRuns().get(0).getFontFamily()); + assertEquals(36, runs.get(0).getTextRuns().get(0).getFontSize(), 0); + + assertEquals("Arial", runs.get(1).getTextRuns().get(0).getFontFamily()); + assertEquals(24, runs.get(1).getTextRuns().get(0).getFontSize(), 0); + + assertEquals("Arial", runs.get(2).getTextRuns().get(0).getFontFamily()); + assertEquals(32, runs.get(2).getTextRuns().get(0).getFontSize(), 0); + + } + +} From 111a87b7a597fbf539997b993e5fa3936b27fb82 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Wed, 29 Apr 2015 20:26:05 +0000 Subject: [PATCH 06/22] Added Distributed option to TextAlignment Added FontAlignment git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1676849 13f79535-47bb-0310-9956-ffa450edef68 --- ...ntTextProp.java => FontAlignmentProp.java} | 18 +++-- .../textproperties/TextAlignmentProp.java | 66 +++++++++++++++++ .../poi/hslf/record/StyleTextPropAtom.java | 4 +- .../poi/hslf/usermodel/HSLFTextParagraph.java | 72 +++++++++++++------ .../poi/sl/usermodel/TextParagraph.java | 52 ++++++++++++-- .../org/apache/poi/hslf/model/TestShapes.java | 5 +- 6 files changed, 180 insertions(+), 37 deletions(-) rename src/scratchpad/src/org/apache/poi/hslf/model/textproperties/{AlignmentTextProp.java => FontAlignmentProp.java} (71%) create mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextAlignmentProp.java diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java similarity index 71% rename from src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java rename to src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java index c4c2729bf4..c9c911ccf9 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java @@ -18,17 +18,15 @@ package org.apache.poi.hslf.model.textproperties; /** - * Definition for the alignment text property. + * Definition for the font alignment property. */ -public class AlignmentTextProp extends TextProp { - public static final int LEFT = 0; - public static final int CENTER = 1; - public static final int RIGHT = 2; - public static final int JUSTIFY = 3; - public static final int THAIDISTRIBUTED = 5; - public static final int JUSTIFYLOW = 6; +public class FontAlignmentProp extends TextProp { + public static final int BASELINE = 0; + public static final int TOP = 1; + public static final int CENTER = 2; + public static final int BOTTOM = 3; - public AlignmentTextProp() { - super(2, 0x800, "alignment"); + public FontAlignmentProp() { + super(2, 0x10000, "fontAlign"); } } \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextAlignmentProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextAlignmentProp.java new file mode 100644 index 0000000000..82430f0de2 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextAlignmentProp.java @@ -0,0 +1,66 @@ +/* ==================================================================== + 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.hslf.model.textproperties; + +/** + * Definition for the text alignment property. + */ +public class TextAlignmentProp extends TextProp { + /** + * For horizontal text, left aligned. + * For vertical text, top aligned. + */ + public static final int LEFT = 0; + + /** + * For horizontal text, centered. + * For vertical text, middle aligned. + */ + public static final int CENTER = 1; + + /** + * For horizontal text, right aligned. + * For vertical text, bottom aligned. + */ + public static final int RIGHT = 2; + + /** + * For horizontal text, flush left and right. + * For vertical text, flush top and bottom. + */ + public static final int JUSTIFY = 3; + + /** + * Distribute space between characters. + */ + public static final int DISTRIBUTED = 4; + + /** + * Thai distribution justification. + */ + public static final int THAIDISTRIBUTED = 5; + + /** + * Kashida justify low. + */ + public static final int JUSTIFYLOW = 6; + + public TextAlignmentProp() { + super(2, 0x800, "alignment"); + } +} \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java index 4e0654a8a6..ad43c4dce8 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java @@ -126,7 +126,7 @@ public final class StyleTextPropAtom extends RecordAtom new TextProp(2, 0x10, "bullet.font"), new TextProp(2, 0x40, "bullet.size"), new TextProp(4, 0x20, "bullet.color"), - new AlignmentTextProp(), + new TextAlignmentProp(), new TextProp(2, 0x1000, "linespacing"), new TextProp(2, 0x2000, "spacebefore"), new TextProp(2, 0x4000, "spaceafter"), @@ -135,7 +135,7 @@ public final class StyleTextPropAtom extends RecordAtom new TextProp(2, 0x400, "bullet.offset"), // indent new TextProp(2, 0x8000, "defaultTabSize"), new TabStopPropCollection(), // tabstops size is variable! - new TextProp(2, 0x10000, "fontAlign"), + new FontAlignmentProp(), new TextProp(2, 0xE0000, "wrapFlags"), // charWrap | wordWrap | overflow new TextProp(2, 0x200000, "textDirection"), // 0x400000 MUST be zero and MUST be ignored diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index 0b90f15a9d..c6a1e12bd6 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -20,6 +20,7 @@ package org.apache.poi.hslf.usermodel; import java.awt.Color; import java.util.*; +import org.apache.poi.hslf.model.PPFont; import org.apache.poi.hslf.model.textproperties.*; import org.apache.poi.hslf.record.*; import org.apache.poi.sl.usermodel.TextParagraph; @@ -367,13 +368,13 @@ public final class HSLFTextParagraph implements TextParagraph { int alignInt; switch (align) { default: - case LEFT: alignInt = AlignmentTextProp.LEFT; break; - case CENTER: alignInt = AlignmentTextProp.CENTER; break; - case RIGHT: alignInt = AlignmentTextProp.RIGHT; break; - case DIST: // TODO: DIST doesn't not exist within hslf, check mapping - case JUSTIFY: alignInt = AlignmentTextProp.JUSTIFY; break; - case JUSTIFY_LOW: alignInt = AlignmentTextProp.JUSTIFYLOW; break; - case THAI_DIST: alignInt = AlignmentTextProp.THAIDISTRIBUTED; break; + case LEFT: alignInt = TextAlignmentProp.LEFT; break; + case CENTER: alignInt = TextAlignmentProp.CENTER; break; + case RIGHT: alignInt = TextAlignmentProp.RIGHT; break; + case DIST: alignInt = TextAlignmentProp.DISTRIBUTED; break; + case JUSTIFY: alignInt = TextAlignmentProp.JUSTIFY; break; + case JUSTIFY_LOW: alignInt = TextAlignmentProp.JUSTIFYLOW; break; + case THAI_DIST: alignInt = TextAlignmentProp.THAIDISTRIBUTED; break; } setParaTextPropVal("alignment", alignInt); } @@ -382,23 +383,53 @@ public final class HSLFTextParagraph implements TextParagraph { public org.apache.poi.sl.usermodel.TextParagraph.TextAlign getTextAlign() { switch (getParaTextPropVal("alignment")) { default: - case AlignmentTextProp.LEFT: return TextAlign.LEFT; - case AlignmentTextProp.CENTER: return TextAlign.CENTER; - case AlignmentTextProp.RIGHT: return TextAlign.RIGHT; - case AlignmentTextProp.JUSTIFY: return TextAlign.JUSTIFY; - case AlignmentTextProp.JUSTIFYLOW: return TextAlign.JUSTIFY_LOW; - case AlignmentTextProp.THAIDISTRIBUTED: return TextAlign.THAI_DIST; + case TextAlignmentProp.LEFT: return TextAlign.LEFT; + case TextAlignmentProp.CENTER: return TextAlign.CENTER; + case TextAlignmentProp.RIGHT: return TextAlign.RIGHT; + case TextAlignmentProp.JUSTIFY: return TextAlign.JUSTIFY; + case TextAlignmentProp.JUSTIFYLOW: return TextAlign.JUSTIFY_LOW; + case TextAlignmentProp.DISTRIBUTED: return TextAlign.DIST; + case TextAlignmentProp.THAIDISTRIBUTED: return TextAlign.THAI_DIST; } } - public org.apache.poi.sl.usermodel.TextParagraph.FontAlign getFontAlign() { - // TODO Auto-generated method stub - return null; + @Override + public FontAlign getFontAlign() { + switch(getParaTextPropVal("fontAlign")) { + default: + case -1: return FontAlign.AUTO; + case FontAlignmentProp.BASELINE: return FontAlign.BASELINE; + case FontAlignmentProp.TOP: return FontAlign.TOP; + case FontAlignmentProp.CENTER: return FontAlign.CENTER; + case FontAlignmentProp.BOTTOM: return FontAlign.BOTTOM; + } } - public org.apache.poi.sl.usermodel.TextParagraph.BulletStyle getBulletStyle() { - // TODO Auto-generated method stub - return null; + @Override + public BulletStyle getBulletStyle() { + if (getBulletChar() == 0) return null; + + return new BulletStyle() { + public String getBulletCharacter() { + char chr = HSLFTextParagraph.this.getBulletChar(); + return (chr == 0 ? "" : ""+chr); + } + + public String getBulletFont() { + int fontIdx = HSLFTextParagraph.this.getBulletFont(); + if (fontIdx == -1) return getDefaultFontFamily(); + PPFont ppFont = getSheet().getSlideShow().getFont(fontIdx); + return ppFont.getFontName(); + } + + public double getBulletFontSize() { + return HSLFTextParagraph.this.getBulletSize(); + } + + public Color getBulletFontColor() { + return HSLFTextParagraph.this.getBulletColor(); + } + }; } @Override @@ -460,7 +491,8 @@ public final class HSLFTextParagraph implements TextParagraph { * Returns the bullet character */ public char getBulletChar() { - return (char)getParaTextPropVal("bullet.char"); + int val = getParaTextPropVal("bullet.char"); + return (char)(val == -1 ? 0 : val); } /** diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java index c4cf8bc57e..102dbae2bc 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java @@ -21,21 +21,26 @@ import java.awt.Color; public interface TextParagraph extends Iterable { + /** * Specifies a list of text alignment types */ public enum TextAlign { /** - * Align text to the left margin. + * For horizontal text, left aligned. + * For vertical text, top aligned. */ LEFT, + /** - * Align text in the center. + * For horizontal text, centered. + * For vertical text, middle aligned. */ CENTER, /** - * Align text to the right margin. + * For horizontal text, right aligned. + * For vertical text, bottom aligned. */ RIGHT, @@ -43,10 +48,25 @@ public interface TextParagraph extends Iterable { * Align text so that it is justified across the whole line. It * is smart in the sense that it will not justify sentences * which are short + * + * For horizontal text, flush left and right. + * For vertical text, flush top and bottom. */ JUSTIFY, + + /** + * Kashida justify low. + */ JUSTIFY_LOW, + + /** + * Distribute space between characters. + */ DIST, + + /** + * Thai distribution justification. + */ THAI_DIST } @@ -54,7 +74,31 @@ public interface TextParagraph extends Iterable { * */ public enum FontAlign { - AUTO, TOP, CENTER, BASELINE, BOTTOM; + AUTO, + + /** + * Characters hang from top of line height. + * Also known as "Hanging" + */ + TOP, + + /** + * Characters centered within line height. + */ + CENTER, + + /** + * Place characters on font baseline. + * Also known as "Roman" + */ + BASELINE, + + /** + * Characters are anchored to the very bottom of a single line. + * This is different than BASELINE because of letters such as "g", "q", and "y". + * Also known as "UpholdFixed" + */ + BOTTOM; } public interface BulletStyle { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java index d38a21ecab..bf93fa79d3 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java @@ -27,8 +27,11 @@ import java.util.List; import org.apache.poi.POIDataSamples; import org.apache.poi.ddf.*; import org.apache.poi.hslf.usermodel.*; -import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.usermodel.*; import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; +import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle; +import org.apache.poi.sl.usermodel.TextParagraph.FontAlign; +import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; import org.junit.Before; import org.junit.Test; From bdeec46d6df7bd29e387dc746e1ac90723783126 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sun, 3 May 2015 23:42:42 +0000 Subject: [PATCH 07/22] fixed HSLF text handling git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1677496 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xslf/usermodel/XSLFTextParagraph.java | 33 +--- .../model/textproperties/BitMaskTextProp.java | 14 +- .../textproperties/TextPropCollection.java | 38 ++-- .../poi/hslf/record/StyleTextPropAtom.java | 43 ++-- .../apache/poi/hslf/usermodel/HSLFSheet.java | 1 - .../poi/hslf/usermodel/HSLFTextParagraph.java | 186 +++++++++++------- .../poi/hslf/usermodel/HSLFTextRun.java | 4 +- .../poi/hslf/usermodel/HSLFTextShape.java | 18 +- .../org/apache/poi/sl/draw/DrawTextShape.java | 2 +- .../poi/sl/usermodel/TextParagraph.java | 25 ++- .../org/apache/poi/hslf/model/TestShapes.java | 50 ++++- 11 files changed, 252 insertions(+), 162 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java index ca369ea957..aef03197dd 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -490,27 +490,7 @@ public class XSLFTextParagraph implements TextParagraph { tabStops.addNewTab().setPos(Units.toEMU(value)); } - /** - * This element specifies the vertical line spacing that is to be used within a paragraph. - * This may be specified in two different ways, percentage spacing and font point spacing: - *

- * If linespacing >= 0, then linespacing is a percentage of normal line height - * If linespacing < 0, the absolute value of linespacing is the spacing in points - *

- * Examples: - *

-     *      // spacing will be 120% of the size of the largest text on each line
-     *      paragraph.setLineSpacing(120);
-     *
-     *      // spacing will be 200% of the size of the largest text on each line
-     *      paragraph.setLineSpacing(200);
-     *
-     *      // spacing will be 48 points
-     *      paragraph.setLineSpacing(-48.0);
-     * 
- * - * @param linespacing the vertical line spacing - */ + @Override public void setLineSpacing(double linespacing){ CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); CTTextSpacing spc = CTTextSpacing.Factory.newInstance(); @@ -519,16 +499,7 @@ public class XSLFTextParagraph implements TextParagraph { pr.setLnSpc(spc); } - /** - * Returns the vertical line spacing that is to be used within a paragraph. - * This may be specified in two different ways, percentage spacing and font point spacing: - *

- * If linespacing >= 0, then linespacing is a percentage of normal line height. - * If linespacing < 0, the absolute value of linespacing is the spacing in points - *

- * - * @return the vertical line spacing. - */ + @Override public double getLineSpacing(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java index 0f8bab418c..e688f9959d 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java @@ -82,13 +82,9 @@ public abstract class BitMaskTextProp extends TextProp implements Cloneable { * Set the true/false status of the subproperty with the given index */ public void setSubValue(boolean value, int idx) { - if(subPropMatches[idx] == value) { return; } - if(value) { - dataValue += subPropMasks[idx]; - } else { - dataValue -= subPropMasks[idx]; - } - subPropMatches[idx] = value; + if (subPropMatches[idx] == value) return; + subPropMatches[idx] = value; + dataValue ^= subPropMasks[idx]; } @Override @@ -101,4 +97,8 @@ public abstract class BitMaskTextProp extends TextProp implements Cloneable { return newObj; } + + public BitMaskTextProp cloneAll(){ + return (BitMaskTextProp)super.clone(); + } } \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java index ac34bf1ffe..d856614eb3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java @@ -160,14 +160,9 @@ public class TextPropCollection { this.reservedField = other.reservedField; this.textPropList.clear(); for (TextProp tp : other.textPropList) { - TextProp tpCopy = tp.clone(); - if (tpCopy instanceof BitMaskTextProp) { - BitMaskTextProp bmt = (BitMaskTextProp)tpCopy; - boolean matches[] = ((BitMaskTextProp)tp).getSubPropMatches(); - for (int i=0; i paragraphStyles; - public LinkedList getParagraphStyles() { return paragraphStyles; } + private List paragraphStyles; + public List getParagraphStyles() { return paragraphStyles; } /** * Updates the link list of TextPropCollections which make up the * paragraph stylings */ - public void setParagraphStyles(LinkedList ps) { paragraphStyles = ps; } + public void setParagraphStyles(List ps) { paragraphStyles = ps; } /** * The list of all the different character stylings we code for. * Each entry is a TextPropCollection, which tells you how many * Characters the character styling covers, and also contains the * TextProps that actually define the styling of the characters. */ - private LinkedList charStyles; - public LinkedList getCharacterStyles() { return charStyles; } + private List charStyles; + public List getCharacterStyles() { return charStyles; } /** * Updates the link list of TextPropCollections which make up the * character stylings */ - public void setCharacterStyles(LinkedList cs) { charStyles = cs; } + public void setCharacterStyles(List cs) { charStyles = cs; } /** * Returns how many characters the paragraph's @@ -105,7 +102,7 @@ public final class StyleTextPropAtom extends RecordAtom public int getCharacterTextLengthCovered() { return getCharactersCovered(charStyles); } - private int getCharactersCovered(LinkedList styles) { + private int getCharactersCovered(List styles) { int length = 0; for(TextPropCollection tpc : styles) { length += tpc.getCharactersCovered(); @@ -197,9 +194,9 @@ public final class StyleTextPropAtom extends RecordAtom System.arraycopy(source,start+8,rawContents,0,rawContents.length); reserved = new byte[0]; - // Set empty linked lists, ready for when they call setParentTextSize - paragraphStyles = new LinkedList(); - charStyles = new LinkedList(); + // Set empty lists, ready for when they call setParentTextSize + paragraphStyles = new ArrayList(); + charStyles = new ArrayList(); } @@ -217,8 +214,8 @@ public final class StyleTextPropAtom extends RecordAtom LittleEndian.putInt(_header,4,10); // Set empty paragraph and character styles - paragraphStyles = new LinkedList(); - charStyles = new LinkedList(); + paragraphStyles = new ArrayList(); + charStyles = new ArrayList(); TextPropCollection defaultParagraphTextProps = new TextPropCollection(parentTextSize, (short)0); @@ -377,13 +374,13 @@ public final class StyleTextPropAtom extends RecordAtom // First up, we need to serialise the paragraph properties for(int i=0; i { * @param shape */ protected void onAddTextShape(HSLFTextShape shape) { - } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index c6a1e12bd6..7d76efe8da 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -553,30 +553,22 @@ public final class HSLFTextParagraph implements TextParagraph { return getParaTextPropVal("bullet.font"); } - /** - * Sets the line spacing. - *

- * If linespacing >= 0, then linespacing is a percentage of normal line height. - * If linespacing < 0, the absolute value of linespacing is the spacing in master coordinates. - *

- */ - public void setLineSpacing(int val) { - setParaTextPropVal("linespacing", val); + @Override + public void setLineSpacing(double lineSpacing) { + // if lineSpacing < 0, we need to convert points (common interface) to master units (hslf) + if (lineSpacing < 0) { + lineSpacing = (lineSpacing*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); + } + setParaTextPropVal("linespacing", (int)lineSpacing); } - /** - * Returns the line spacing - *

- * If linespacing >= 0, then linespacing is a percentage of normal line height. - * If linespacing < 0, the absolute value of linespacing is the spacing in master coordinates. - *

- * - * @return the spacing between lines - */ @Override public double getLineSpacing() { - int val = getParaTextPropVal("linespacing"); - return val == -1 ? 0 : val; + double val = getParaTextPropVal("linespacing"); + // if lineSpacing < 0, we need to convert master units (hslf) to points (common interface) + if (val == -1) return 0; + if (val < -1) val *= HSLFShape.POINT_DPI/((double)HSLFShape.MASTER_DPI); + return val; } /** @@ -722,6 +714,12 @@ public final class HSLFTextParagraph implements TextParagraph { throw new RuntimeException("child record not found - malformed container record"); } cr[idx] = newRecord; + + if (newRecord == byteAtom) { + charAtom = null; + } else { + byteAtom = null; + } } // Ensure a StyleTextPropAtom is present, adding if required @@ -750,6 +748,7 @@ public final class HSLFTextParagraph implements TextParagraph { } for (HSLFTextRun tr : para.getTextRuns()) { TextPropCollection rtpc = tr.getCharacterStyle(); + rtpc.updateTextSize(0); if (!rtpc.equals(lastRTPC)) { lastRTPC = styleAtom.addCharacterTextPropCollection(0); lastRTPC.copy(rtpc); @@ -783,19 +782,43 @@ public final class HSLFTextParagraph implements TextParagraph { * * @param text the text string used by this object. */ - protected static void appendText(List paragraphs, String text, boolean newParagraph) { + protected static HSLFTextRun appendText(List paragraphs, String text, boolean newParagraph) { text = toInternalString(text); + + // check paragraphs + assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); - // init paragraphs - assert(!paragraphs.isEmpty()); + HSLFTextParagraph htp = paragraphs.get(paragraphs.size()-1); + HSLFTextRun htr = htp.getTextRuns().get(htp.getTextRuns().size()-1); + + if (newParagraph) { + htr.setText(htr.getRawText()+"\n"); + } - HSLFTextParagraph lastHTP = paragraphs.get(paragraphs.size()-1); - HSLFTextRun lastHTR = lastHTP.getTextRuns().get(lastHTP.getTextRuns().size()-1); - HSLFTextParagraph htp = (newParagraph) ? new HSLFTextParagraph(lastHTP) : lastHTP; - HSLFTextRun htr = new HSLFTextRun(htp); - htr.setText(text); - htr.getCharacterStyle().copy(lastHTR.getCharacterStyle()); - htp.addTextRun(htr); + boolean isFirst = !newParagraph; + for (String rawText : text.split("(?<=\r)")) { + if (!isFirst) { + TextPropCollection tpc = htp.getParagraphStyle(); + HSLFTextParagraph prevHtp = htp; + htp = new HSLFTextParagraph(htp._headerAtom, htp._byteAtom, htp._charAtom, htp._styleAtom); + htp.getParagraphStyle().copy(tpc); + htp.setParentShape(prevHtp.getParentShape()); + htp.setShapeId(prevHtp.getShapeId()); + htp.supplySheet(prevHtp.getSheet()); + paragraphs.add(htp); + isFirst = false; + } + TextPropCollection tpc = htr.getCharacterStyle(); + // special case, last text run is empty, we will reuse it + if (htr.getLength() > 0) { + htr = new HSLFTextRun(htp); + htr.getCharacterStyle().copy(tpc); + htp.addTextRun(htr); + } + htr.setText(rawText); + } + + return htr; } /** @@ -804,29 +827,30 @@ public final class HSLFTextParagraph implements TextParagraph { * * @param text the text string used by this object. */ - public static void setText(List paragraphs, String text) { + public static HSLFTextRun setText(List paragraphs, String text) { text = HSLFTextParagraph.toInternalString(text); - // init paragraphs - assert(!paragraphs.isEmpty()); + // check paragraphs + assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); Iterator paraIter = paragraphs.iterator(); - HSLFTextParagraph firstHTP = paraIter.next(); // keep first - assert(firstHTP != null); + HSLFTextParagraph htp = paraIter.next(); // keep first + assert(htp != null); while (paraIter.hasNext()) { paraIter.next(); paraIter.remove(); } - Iterator runIter = firstHTP.getTextRuns().iterator(); - HSLFTextRun firstHTR = runIter.next(); - assert(firstHTR != null); + Iterator runIter = htp.getTextRuns().iterator(); + HSLFTextRun htr = runIter.next(); + htr.setText(""); + assert(htr != null); while (runIter.hasNext()) { runIter.next(); runIter.remove(); } - firstHTR.setText(text); + return appendText(paragraphs, text, false); } public static String getRawText(List paragraphs) { @@ -835,9 +859,7 @@ public final class HSLFTextParagraph implements TextParagraph { for (HSLFTextRun r : p.getTextRuns()) { sb.append(r.getRawText()); } - sb.append("\r"); } - sb.deleteCharAt(sb.length()-1); // remove last line break return sb.toString(); } @@ -947,7 +969,7 @@ public final class HSLFTextParagraph implements TextParagraph { return paragraphCollection; } - for (int slwtIndex = 0; recordIdx < records.length-2; slwtIndex++) { + for (int slwtIndex = 0; recordIdx < records.length; slwtIndex++) { List paragraphs = new ArrayList(); paragraphCollection.add(paragraphs); @@ -985,12 +1007,14 @@ public final class HSLFTextParagraph implements TextParagraph { if (tbytes == null && tchars == null) { tbytes = new TextBytesAtom(); + header.getParentRecord().addChildAfter(tbytes, header); logger.log(POILogger.INFO, "bytes nor chars atom doesn't exist. Creating dummy record for later saving."); } String rawText = (tchars != null) ? tchars.getText() : tbytes.getText(); - for (String para : rawText.split("\r")) { + // split, but keep delimiter + for (String para : rawText.split("(?<=\r)")) { HSLFTextParagraph tpara = new HSLFTextParagraph(header, tbytes, tchars, styles); paragraphs.add(tpara); tpara.setStyleTextProp9Atom(styleTextProp9Atom); @@ -1021,29 +1045,21 @@ public final class HSLFTextParagraph implements TextParagraph { protected static void applyCharacterStyles(List paragraphs, List charStyles) { int paraIdx = 0, runIdx = 0; - for (TextPropCollection p : charStyles) { + HSLFTextRun trun; + + for (int csIdx=0; csIdx runs = para.getTextRuns(); - HSLFTextRun trun = runs.get(runIdx); + trun = runs.get(runIdx); int len = trun.getLength(); - if (runIdx+1 >= runs.size()) { - // need to add +1 to the last run of the paragraph - len++; - } - - TextPropCollection pCopy = new TextPropCollection(1); - pCopy.copy(p); if (ccRun+len <= ccStyle) { - trun.setCharacterStyle(pCopy); - pCopy.updateTextSize(len); ccRun += len; } else { String text = trun.getRawText(); trun.setText(text.substring(0,ccStyle-ccRun)); - pCopy.updateTextSize(ccStyle-ccRun); - trun.setCharacterStyle(pCopy); HSLFTextRun nextRun = new HSLFTextRun(para); nextRun.setText(text.substring(ccStyle-ccRun)); @@ -1052,8 +1068,27 @@ public final class HSLFTextParagraph implements TextParagraph { ccRun += ccStyle-ccRun; } - // need to compare it again, in case a run has been added afer - if (++runIdx >= runs.size()) { + TextPropCollection pCopy = new TextPropCollection(0); + pCopy.copy(p); + trun.setCharacterStyle(pCopy); + + len = trun.getLength(); + if (paraIdx == paragraphs.size()-1 && runIdx == runs.size()-1) { + if (csIdx < charStyles.size()-1) { + // special case, empty trailing text run + HSLFTextRun nextRun = new HSLFTextRun(para); + nextRun.setText(""); + runs.add(nextRun); + } else { + // need to add +1 to the last run of the last paragraph + len++; + ccRun++; + } + } + pCopy.updateTextSize(len); + + // need to compare it again, in case a run has been added after + if (++runIdx == runs.size()) { paraIdx++; runIdx = 0; } @@ -1065,16 +1100,18 @@ public final class HSLFTextParagraph implements TextParagraph { int paraIdx = 0; for (TextPropCollection p : paraStyles) { for (int ccPara = 0, ccStyle = p.getCharactersCovered(); ccPara < ccStyle; paraIdx++) { - HSLFTextParagraph para = paragraphs.get(paraIdx); - TextPropCollection pCopy = new TextPropCollection(1); + if (paraIdx >= paragraphs.size() || ccPara >= ccStyle-1) return; + HSLFTextParagraph htp = paragraphs.get(paraIdx); + TextPropCollection pCopy = new TextPropCollection(0); pCopy.copy(p); + htp.setParagraphStyle(pCopy); int len = 0; - for (HSLFTextRun trun : para.getTextRuns()) { + for (HSLFTextRun trun : htp.getTextRuns()) { len += trun.getLength(); } - pCopy.updateTextSize(len+1); - para.setParagraphStyle(pCopy); - ccPara += len+1; + if (paraIdx == paragraphs.size()-1) len++; + pCopy.updateTextSize(len); + ccPara += len; } } } @@ -1101,15 +1138,28 @@ public final class HSLFTextParagraph implements TextParagraph { tha.setParentRecord(wrapper); wrapper.appendChildRecord(tha); - TextCharsAtom tca = new TextCharsAtom(); - wrapper.appendChildRecord(tca); + TextBytesAtom tba = new TextBytesAtom(); + tba.setText("\r".getBytes()); + wrapper.appendChildRecord(tba); - StyleTextPropAtom sta = new StyleTextPropAtom(0); + StyleTextPropAtom sta = new StyleTextPropAtom(1); + TextPropCollection paraStyle = sta.addParagraphTextPropCollection(1); + TextPropCollection charStyle = sta.addCharacterTextPropCollection(1); wrapper.appendChildRecord(sta); - HSLFTextParagraph htp = new HSLFTextParagraph(tha, null, tca, sta); + HSLFTextParagraph htp = new HSLFTextParagraph(tha, tba, null, sta); + htp.setParagraphStyle(paraStyle); htp._records = new Record[0]; + htp.setBullet(false); + htp.setLineSpacing(100); + htp.setLeftMargin(0); + htp.setIndent(0); + // set wrap flags + HSLFTextRun htr = new HSLFTextRun(htp); + htr.setCharacterStyle(charStyle); + htr.setText("\r"); + htr.setFontColor(Color.black); htp.addTextRun(htr); return Arrays.asList(htp); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index 9a10a9b125..e94c844649 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -37,14 +37,14 @@ public final class HSLFTextRun implements TextRun { /** The TextRun we belong to */ private HSLFTextParagraph parentParagraph; - private String _runText = "\r"; + private String _runText = ""; private String _fontname; /** * Our paragraph and character style. * Note - we may share these styles with other RichTextRuns */ - private TextPropCollection characterStyle = new TextPropCollection(1); + private TextPropCollection characterStyle = new TextPropCollection(0); /** * Create a new wrapper around a rich text string diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java index 2c4e73b690..7b541fdf45 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java @@ -22,14 +22,11 @@ import static org.apache.poi.hslf.record.RecordTypes.*; import java.awt.Rectangle; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; -import java.awt.geom.Rectangle2D.Double; import java.io.IOException; import java.util.*; -import org.apache.poi.POIXMLException; import org.apache.poi.ddf.*; import org.apache.poi.hslf.exceptions.HSLFException; -import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.record.*; import org.apache.poi.sl.draw.DrawFactory; import org.apache.poi.sl.draw.DrawTextShape; @@ -139,8 +136,12 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape protected void afterInsert(HSLFSheet sh){ super.afterInsert(sh); + storeText(); + EscherTextboxWrapper _txtbox = getEscherTextboxWrapper(); if(_txtbox != null){ + _escherContainer.addChildRecord(_txtbox.getEscherRecord()); + PPDrawing ppdrawing = sh.getPPDrawing(); ppdrawing.addTextboxWrapper(_txtbox); // Ensure the escher layer knows about the added records @@ -712,10 +713,10 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape * * @param text the text string used by this object. */ - public void appendText(String text, boolean newParagraph) { + public HSLFTextRun appendText(String text, boolean newParagraph) { // init paragraphs List paras = getTextParagraphs(); - HSLFTextParagraph.appendText(paras, text, newParagraph); + return HSLFTextParagraph.appendText(paras, text, newParagraph); } /** @@ -723,12 +724,15 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape * Uses the properties of the first paragraph / textrun * * @param text the text string used by this object. + * + * @return the last text run of the splitted text */ - public void setText(String text) { + public HSLFTextRun setText(String text) { // init paragraphs List paras = getTextParagraphs(); - HSLFTextParagraph.setText(paras, text); + HSLFTextRun htr = HSLFTextParagraph.setText(paras, text); setTextId(text.hashCode()); + return htr; } /** diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java index f0b4ff42b3..247c7c1845 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java @@ -104,8 +104,8 @@ public class DrawTextShape extends Iterable { * This may be specified in two different ways, percentage spacing and font point spacing: *

* If spaceBefore >= 0, then space is a percentage of normal line height. - * If spaceBefore < 0, the absolute value of linespacing is the spacing in points + * If spaceBefore < 0, the absolute value in points *

* * @return the vertical white space before the paragraph @@ -174,6 +174,29 @@ public interface TextParagraph extends Iterable { * @return the vertical line spacing. */ double getLineSpacing(); + + /** + * This element specifies the vertical line spacing that is to be used within a paragraph. + * This may be specified in two different ways, percentage spacing and font point spacing: + *

+ * If linespacing >= 0, then linespacing is a percentage of normal line height + * If linespacing < 0, the absolute value of linespacing is the spacing in points + *

+ * Examples: + *

+     *      // spacing will be 120% of the size of the largest text on each line
+     *      paragraph.setLineSpacing(120);
+     *
+     *      // spacing will be 200% of the size of the largest text on each line
+     *      paragraph.setLineSpacing(200);
+     *
+     *      // spacing will be 48 points
+     *      paragraph.setLineSpacing(-48.0);
+     * 
+ * + * @param linespacing the vertical line spacing + */ + void setLineSpacing(double lineSpacing); String getDefaultFontFamily(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java index bf93fa79d3..c807c20116 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java @@ -20,6 +20,8 @@ package org.apache.poi.hslf.model; import static org.junit.Assert.*; import java.awt.*; +import java.awt.geom.Rectangle2D; +import java.awt.geom.Rectangle2D.Double; import java.io.*; import java.util.ArrayList; import java.util.List; @@ -136,6 +138,48 @@ public final class TestShapes { } } + @Test + public void testParagraphs() throws Exception { + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); + HSLFTextBox shape = new HSLFTextBox(); + HSLFTextRun p1r1 = shape.setText("para 1 run 1. "); + HSLFTextRun p1r2 = shape.appendText("para 1 run 2.", false); + HSLFTextRun p2r1 = shape.appendText("para 2 run 1. ", true); + HSLFTextRun p2r2 = shape.appendText("para 2 run 2. ", false); + p1r1.setFontColor(Color.black); + p1r2.setFontColor(Color.red); + p2r1.setFontColor(Color.yellow); + p2r2.setStrikethrough(true); + // run 3 has same text properties as run 2 and will be merged when saving + HSLFTextRun p2r3 = shape.appendText("para 2 run 3.", false); + shape.setAnchor(new Rectangle2D.Double(100,100,100,10)); + slide.addShape(shape); + shape.resizeToFitText(); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ppt.write(bos); + + ppt = new HSLFSlideShow(new ByteArrayInputStream(bos.toByteArray())); + slide = ppt.getSlides().get(0); + HSLFTextBox tb = (HSLFTextBox)slide.getShapes().get(0); + List para = tb.getTextParagraphs(); + HSLFTextRun tr = para.get(0).getTextRuns().get(0); + assertEquals("para 1 run 1. ", tr.getRawText()); + assertEquals(Color.black, tr.getFontColor()); + tr = para.get(0).getTextRuns().get(1); + assertEquals("para 1 run 2.\r", tr.getRawText()); + assertEquals(Color.red, tr.getFontColor()); + tr = para.get(1).getTextRuns().get(0); + assertEquals("para 2 run 1. ", tr.getRawText()); + assertEquals(Color.yellow, tr.getFontColor()); + tr = para.get(1).getTextRuns().get(1); + assertEquals("para 2 run 2. para 2 run 3.", tr.getRawText()); + assertEquals(Color.black, tr.getFontColor()); + assertTrue(tr.isStrikethrough()); + } + + /** * Verify that we can add TextBox shapes to a slide * and set some of the style attributes @@ -235,7 +279,11 @@ public final class TestShapes { for (HSLFShape sh : sld.getShapes()) { if (sh instanceof HSLFTextShape){ HSLFTextShape tbox = (HSLFTextShape)sh; - lst2.add(tbox.getText()); + for (HSLFTextParagraph p : tbox.getTextParagraphs()) { + for (HSLFTextRun r : p) { + lst2.add(r.getRawText()); + } + } } } assertTrue(lst1.containsAll(lst2)); From 28d7a023e936da7c4eb0f852c6a7ffdffaf08cdb Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Mon, 4 May 2015 22:31:45 +0000 Subject: [PATCH 08/22] HSLF table and example fixes git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1677703 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hslf/examples/ApacheconEU08.java | 183 ++++++++---------- .../apache/poi/hslf/examples/BulletsDemo.java | 12 +- .../poi/hslf/examples/DataExtraction.java | 38 ++-- .../src/org/apache/poi/hslf/model/Table.java | 4 +- .../apache/poi/hslf/usermodel/HSLFShape.java | 7 +- .../poi/hslf/usermodel/HSLFTextShape.java | 4 +- 6 files changed, 110 insertions(+), 138 deletions(-) diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java index 229d7576e7..384da258e7 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java +++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java @@ -17,14 +17,15 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.*; +import java.awt.*; +import java.io.FileOutputStream; +import java.io.IOException; + import org.apache.poi.hslf.model.*; import org.apache.poi.hslf.record.TextHeaderAtom; +import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeType; - -import java.io.IOException; -import java.io.FileOutputStream; -import java.awt.*; +import org.apache.poi.sl.usermodel.VerticalAlignment; /** * Presentation for Fast Feather Track on ApacheconEU 2008 @@ -60,26 +61,23 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE); - tr1.setText("POI-HSLF"); + box1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE); + box1.setText("POI-HSLF"); box1.setAnchor(new Rectangle(54, 78, 612, 115)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraphs(); - tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE); - tr2.setText("Java API To Access Microsoft PowerPoint Format Files"); + box2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE); + box2.setText("Java API To Access Microsoft PowerPoint Format Files"); box2.setAnchor(new Rectangle(108, 204, 504, 138)); slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraphs(); - tr3.getTextRuns()[0].setFontSize(32); - box3.setHorizontalAlignment(HSLFTextBox.AlignCenter); - tr3.setText( + box3.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32); + box3.setText( "Yegor Kozlov\r" + "yegor - apache - org"); + box3.setHorizontalCentered(true); box3.setAnchor(new Rectangle(206, 348, 310, 84)); slide.addShape(box3); } @@ -88,16 +86,14 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setRunType(TextHeaderAtom.TITLE_TYPE); - tr1.setText("What is HSLF?"); + box1.setRunType(TextHeaderAtom.TITLE_TYPE); + box1.setText("What is HSLF?"); box1.setAnchor(new Rectangle(36, 21, 648, 90)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraphs(); - tr2.setRunType(TextHeaderAtom.BODY_TYPE); - tr2.setText("HorribleSLideshowFormat is the POI Project's pure Java implementation " + + box2.setRunType(TextHeaderAtom.BODY_TYPE); + box2.setText("HorribleSLideshowFormat is the POI Project's pure Java implementation " + "of the Powerpoint binary file format. \r" + "POI sub-project since 2005\r" + "Started by Nick Birch, Yegor Kozlov joined soon after"); @@ -111,41 +107,37 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setRunType(TextHeaderAtom.TITLE_TYPE); - tr1.setText("HSLF in a Nutshell"); + box1.setRunType(TextHeaderAtom.TITLE_TYPE); + box1.setText("HSLF in a Nutshell"); box1.setAnchor(new Rectangle(36, 15, 648, 65)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraphs(); - tr2.setRunType(TextHeaderAtom.BODY_TYPE); - tr2.setText( + box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(28); + box2.setRunType(TextHeaderAtom.BODY_TYPE); + box2.setText( "HSLF provides a way to read, create and modify MS PowerPoint presentations\r" + "Pure Java API - you don't need PowerPoint to read and write *.ppt files\r" + "Comprehensive support of PowerPoint objects"); - tr2.getTextRuns()[0].setFontSize(28); box2.setAnchor(new Rectangle(36, 80, 648, 200)); slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraphs(); - tr3.setRunType(TextHeaderAtom.BODY_TYPE); - tr3.setText( + box2.getTextParagraphs().get(0).setIndentLevel(1); + box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(24); + box3.setRunType(TextHeaderAtom.BODY_TYPE); + box3.setText( "Rich text\r" + "Tables\r" + "Shapes\r" + "Pictures\r" + "Master slides"); - tr3.getTextRuns()[0].setFontSize(24); - tr3.getTextRuns()[0].setIndentLevel(1); box3.setAnchor(new Rectangle(36, 265, 648, 150)); slide.addShape(box3); HSLFTextBox box4 = new HSLFTextBox(); - HSLFTextParagraph tr4 = box4.getTextParagraphs(); - tr4.setRunType(TextHeaderAtom.BODY_TYPE); - tr4.setText("Access to low level data structures"); + box4.setRunType(TextHeaderAtom.BODY_TYPE); + box4.setText("Access to low level data structures"); box4.setAnchor(new Rectangle(36, 430, 648, 50)); slide.addShape(box4); } @@ -162,8 +154,8 @@ public final class ApacheconEU08 { for (int j = 0; j < txt1[i].length; j++) { TableCell cell = table1.getCell(i, j); cell.setText(txt1[i][j]); - cell.getTextParagraphs().getTextRuns()[0].setFontSize(10); - HSLFTextRun rt = cell.getTextParagraphs().getTextRuns()[0]; + HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); + rt.setFontSize(10); rt.setFontName("Arial"); rt.setBold(true); if(i == 0){ @@ -174,7 +166,7 @@ public final class ApacheconEU08 { rt.setFontSize(28); cell.getFill().setForegroundColor(new Color(235, 239, 241)); } - cell.setVerticalAlignment(HSLFTextBox.AnchorMiddle); + cell.setVerticalAlignment(VerticalAlignment.MIDDLE); } } @@ -196,12 +188,10 @@ public final class ApacheconEU08 { table1.moveTo(100, 100); HSLFTextBox box1 = new HSLFTextBox(); - box1.setHorizontalAlignment(HSLFTextBox.AlignCenter); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setText("The source code is available at\r" + + box1.setHorizontalCentered(true); + box1.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(24); + box1.setText("The source code is available at\r" + "http://people.apache.org/~yegor/apachecon_eu08/"); - HSLFTextRun rt = tr1.getTextRuns()[0]; - rt.setFontSize(24); box1.setAnchor(new Rectangle(80, 356, 553, 65)); slide.addShape(box1); @@ -211,16 +201,14 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setRunType(TextHeaderAtom.TITLE_TYPE); - tr1.setText("HSLF in Action - 1\rData Extraction"); + box1.setRunType(TextHeaderAtom.TITLE_TYPE); + box1.setText("HSLF in Action - 1\rData Extraction"); box1.setAnchor(new Rectangle(36, 21, 648, 100)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraphs(); - tr2.setRunType(TextHeaderAtom.BODY_TYPE); - tr2.setText( + box2.setRunType(TextHeaderAtom.BODY_TYPE); + box2.setText( "Text from slides and notes\r" + "Images\r" + "Shapes and their properties (type, position in the slide, color, font, etc.)"); @@ -234,25 +222,22 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setRunType(TextHeaderAtom.TITLE_TYPE); - tr1.setText("HSLF in Action - 2"); + box1.setRunType(TextHeaderAtom.TITLE_TYPE); + box1.setText("HSLF in Action - 2"); box1.setAnchor(new Rectangle(36, 20, 648, 90)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraphs(); - tr2.getTextRuns()[0].setFontSize(18); - tr2.setText("Creating a simple presentation from scratch"); + box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18); + box2.setText("Creating a simple presentation from scratch"); box2.setAnchor(new Rectangle(170, 100, 364, 30)); slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraphs(); - HSLFTextRun rt3 = tr3.getTextRuns()[0]; + HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0); rt3.setFontName("Courier New"); rt3.setFontSize(8); - tr3.setText( + box3.setText( " SlideShow ppt = new SlideShow();\r" + " Slide slide = ppt.createSlide();\r" + "\r" + @@ -294,9 +279,9 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box2 = new HSLFTextBox(); - box2.setHorizontalAlignment(HSLFTextBox.AlignCenter); - box2.setVerticalAlignment(HSLFTextBox.AnchorMiddle); - box2.getTextParagraphs().setText("Java Code"); + box2.setHorizontalCentered(true); + box2.setVerticalAlignment(VerticalAlignment.MIDDLE); + box2.setText("Java Code"); box2.getFill().setForegroundColor(new Color(187, 224, 227)); box2.setLineColor(Color.black); box2.setLineWidth(0.75); @@ -304,9 +289,9 @@ public final class ApacheconEU08 { slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - box3.setHorizontalAlignment(HSLFTextBox.AlignCenter); - box3.setVerticalAlignment(HSLFTextBox.AnchorMiddle); - box3.getTextParagraphs().setText("*.ppt file"); + box3.setHorizontalCentered(true); + box3.setVerticalAlignment(VerticalAlignment.MIDDLE); + box3.setText("*.ppt file"); box3.setLineWidth(0.75); box3.setLineColor(Color.black); box3.getFill().setForegroundColor(new Color(187, 224, 227)); @@ -325,16 +310,14 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setRunType(TextHeaderAtom.TITLE_TYPE); - tr1.setText("Wait, there is more!"); + box1.setRunType(TextHeaderAtom.TITLE_TYPE); + box1.setText("Wait, there is more!"); box1.setAnchor(new Rectangle(36, 21, 648, 90)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraphs(); - tr2.setRunType(TextHeaderAtom.BODY_TYPE); - tr2.setText( + box2.setRunType(TextHeaderAtom.BODY_TYPE); + box2.setText( "Rich text\r" + "Tables\r" + "Pictures (JPEG, PNG, BMP, WMF, PICT)\r" + @@ -347,25 +330,22 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setRunType(TextHeaderAtom.TITLE_TYPE); - tr1.setText("HSLF in Action - 3"); + box1.setRunType(TextHeaderAtom.TITLE_TYPE); + box1.setText("HSLF in Action - 3"); box1.setAnchor(new Rectangle(36, 20, 648, 50)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraphs(); - tr2.getTextRuns()[0].setFontSize(18); - tr2.setText("PPGraphics2D: PowerPoint Graphics2D driver"); + box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18); + box2.setText("PPGraphics2D: PowerPoint Graphics2D driver"); box2.setAnchor(new Rectangle(178, 70, 387, 30)); slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraphs(); - HSLFTextRun rt3 = tr3.getTextRuns()[0]; + HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0); rt3.setFontName("Courier New"); rt3.setFontSize(8); - tr3.setText( + box3.setText( " //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" + @@ -449,45 +429,40 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setRunType(TextHeaderAtom.TITLE_TYPE); - tr1.setText("HSLF Development Plans"); + box1.setRunType(TextHeaderAtom.TITLE_TYPE); + box1.setText("HSLF Development Plans"); box1.setAnchor(new Rectangle(36, 21, 648, 90)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraphs(); - tr2.setRunType(TextHeaderAtom.BODY_TYPE); - tr2.getTextRuns()[0].setFontSize(32); - tr2.setText( + box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32); + box2.setRunType(TextHeaderAtom.BODY_TYPE); + box2.setText( "Support for more PowerPoint functionality\r" + "Rendering slides into java.awt.Graphics2D"); box2.setAnchor(new Rectangle(36, 126, 648, 100)); slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - HSLFTextParagraph tr3 = box3.getTextParagraphs(); - tr3.setRunType(TextHeaderAtom.BODY_TYPE); - tr3.getTextRuns()[0].setIndentLevel(1); - tr3.setText( + box3.getTextParagraphs().get(0).setIndentLevel(1); + box3.setRunType(TextHeaderAtom.BODY_TYPE); + box3.setText( "A way to export slides into images or other formats"); box3.setAnchor(new Rectangle(36, 220, 648, 70)); slide.addShape(box3); HSLFTextBox box4 = new HSLFTextBox(); - HSLFTextParagraph tr4 = box4.getTextParagraphs(); - tr4.setRunType(TextHeaderAtom.BODY_TYPE); - tr4.getTextRuns()[0].setFontSize(32); - tr4.setText( + box4.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32); + box4.setRunType(TextHeaderAtom.BODY_TYPE); + box4.setText( "Integration with Apache FOP - Formatting Objects Processor"); box4.setAnchor(new Rectangle(36, 290, 648, 90)); slide.addShape(box4); HSLFTextBox box5 = new HSLFTextBox(); - HSLFTextParagraph tr5 = box5.getTextParagraphs(); - tr5.setRunType(TextHeaderAtom.BODY_TYPE); - tr5.getTextRuns()[0].setIndentLevel(1); - tr5.setText( + box5.getTextParagraphs().get(0).setIndentLevel(1); + box5.setRunType(TextHeaderAtom.BODY_TYPE); + box5.setText( "Transformation of XSL-FO into PPT\r" + "PPT2PDF transcoder"); box5.setAnchor(new Rectangle(36, 380, 648, 100)); @@ -498,16 +473,14 @@ public final class ApacheconEU08 { HSLFSlide slide = ppt.createSlide(); HSLFTextBox box1 = new HSLFTextBox(); - HSLFTextParagraph tr1 = box1.getTextParagraphs(); - tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE); - tr1.setText("Questions?"); + box1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE); + box1.setText("Questions?"); box1.setAnchor(new Rectangle(54, 167, 612, 115)); slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - HSLFTextParagraph tr2 = box2.getTextParagraphs(); - tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE); - tr2.setText( + box2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE); + box2.setText( "http://poi.apache.org/hslf/\r" + "http://people.apache.org/~yegor"); box2.setAnchor(new Rectangle(108, 306, 504, 138)); diff --git a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java index 58aaf1fff2..d95f970ce7 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java @@ -36,17 +36,17 @@ public final class BulletsDemo { HSLFSlide slide = ppt.createSlide(); HSLFTextBox shape = new HSLFTextBox(); - HSLFTextRun rt = shape.getTextParagraphs().getTextRuns()[0]; + HSLFTextParagraph rt = shape.getTextParagraphs().get(0); + rt.getTextRuns().get(0).setFontSize(42); + rt.setBullet(true); + rt.setIndent(0); //bullet offset + rt.setLeftMargin(50); //text offset (should be greater than bullet offset) + rt.setBulletChar('\u263A'); //bullet character shape.setText( "January\r" + "February\r" + "March\r" + "April"); - rt.setFontSize(42); - rt.setBullet(true); - rt.setBulletOffset(0); //bullet offset - rt.setTextOffset(50); //text offset (should be greater than bullet offset) - rt.setBulletChar('\u263A'); //bullet character slide.addShape(shape); shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300)); //position of the text box in the slide diff --git a/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java b/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java index d4028d7c67..d1e9a21c27 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java +++ b/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java @@ -57,13 +57,13 @@ public final class DataExtraction { out.close(); } - //extract embedded OLE documents - HSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - HSLFShape[] shape = slide[i].getShapes(); - for (int j = 0; j < shape.length; j++) { - if (shape[j] instanceof OLEShape) { - OLEShape ole = (OLEShape) shape[j]; + int oleIdx=-1, picIdx=-1; + for (HSLFSlide slide : ppt.getSlides()) { + //extract embedded OLE documents + for (HSLFShape shape : slide.getShapes()) { + if (shape instanceof OLEShape) { + oleIdx++; + OLEShape ole = (OLEShape) shape; HSLFObjectData data = ole.getObjectData(); String name = ole.getInstanceName(); if ("Worksheet".equals(name)) { @@ -81,11 +81,11 @@ public final class DataExtraction { } //save on disk - FileOutputStream out = new FileOutputStream(name + "-("+(j)+").doc"); + FileOutputStream out = new FileOutputStream(name + "-("+(oleIdx)+").doc"); doc.write(out); out.close(); } else { - FileOutputStream out = new FileOutputStream(ole.getProgID() + "-"+(j+1)+".dat"); + FileOutputStream out = new FileOutputStream(ole.getProgID() + "-"+(oleIdx+1)+".dat"); InputStream dis = data.getData(); byte[] chunk = new byte[2048]; int count; @@ -96,16 +96,11 @@ public final class DataExtraction { out.close(); } } - - } - } - - //Pictures - for (int i = 0; i < slide.length; i++) { - HSLFShape[] shape = slide[i].getShapes(); - for (int j = 0; j < shape.length; j++) { - if (shape[j] instanceof HSLFPictureShape) { - HSLFPictureShape p = (HSLFPictureShape) shape[j]; + + //Pictures + else if (shape instanceof HSLFPictureShape) { + picIdx++; + HSLFPictureShape p = (HSLFPictureShape) shape; HSLFPictureData data = p.getPictureData(); String name = p.getPictureName(); int type = data.getType(); @@ -132,14 +127,13 @@ public final class DataExtraction { default: continue; } - FileOutputStream out = new FileOutputStream("pict-" + j + ext); + FileOutputStream out = new FileOutputStream("pict-" + picIdx + ext); out.write(data.getData()); out.close(); } - } - } + } } private static void usage(){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java index c2cc0ce80b..8f3b245c15 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Table.java @@ -78,7 +78,7 @@ public final class Table extends HSLFGroupShape { EscherOptRecord opt = new EscherOptRecord(); opt.setRecordId((short)0xF122); opt.addEscherProperty(new EscherSimpleProperty((short)0x39F, 1)); - EscherArrayProperty p = new EscherArrayProperty((short)0x43A0, false, null); + EscherArrayProperty p = new EscherArrayProperty((short)(0x4000 | 0x3A0), false, null); p.setSizeOfElements(0x0004); p.setNumberOfElementsInArray(numrows); p.setNumberOfElementsInMemory(numrows); @@ -122,7 +122,7 @@ public final class Table extends HSLFGroupShape { EscherContainerRecord spCont = (EscherContainerRecord) getSpContainer().getChild(0); List lst = spCont.getChildRecords(); EscherOptRecord opt = (EscherOptRecord)lst.get(lst.size()-2); - EscherArrayProperty p = (EscherArrayProperty)opt.getEscherProperty(1); + EscherArrayProperty p = opt.lookup(0x3A0); for (int i = 0; i < cells.length; i++) { TableCell cell = cells[i][0]; int rowHeight = cell.getAnchor().height*MASTER_DPI/POINT_DPI; diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java index adb61e6d9e..a6be80f92f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java @@ -24,6 +24,7 @@ import java.util.Iterator; import org.apache.poi.ddf.*; import org.apache.poi.hslf.record.ColorSchemeAtom; +import org.apache.poi.hslf.record.RecordTypes; import org.apache.poi.sl.usermodel.*; import org.apache.poi.util.*; @@ -484,7 +485,11 @@ public abstract class HSLFShape implements Shape { } public EscherOptRecord getEscherOptRecord() { - return getEscherChild(EscherOptRecord.RECORD_ID); + EscherOptRecord opt = getEscherChild(EscherOptRecord.RECORD_ID); + if (opt == null) { + opt = getEscherChild(RecordTypes.EscherUserDefined); + } + return opt; } public boolean getFlipHorizontal(){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java index 7b541fdf45..d431f0bac4 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java @@ -230,8 +230,8 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape * fetch the master shape and search for the align property there. */ int type = getRunType(); - HSLFMasterSheet master = getSheet().getMasterSheet(); - if(master != null){ + if(getSheet() != null && getSheet().getMasterSheet() != null){ + HSLFMasterSheet master = getSheet().getMasterSheet(); HSLFTextShape masterShape = master.getPlaceholderByTextType(type); if(masterShape != null) align = masterShape.getAlignment(); } else { From d2e7cd51c3a00b52859e53210aea5b726b40d2bf Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Mon, 11 May 2015 22:07:40 +0000 Subject: [PATCH 09/22] Commit changes in common_sl - need to update trunk ... git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1678832 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hslf/examples/Hyperlinks.java | 62 +++-- .../org/apache/poi/hslf/examples/PPT2PNG.java | 27 +-- .../apache/poi/hslf/examples/SoundFinder.java | 30 +-- .../apache/poi/hslf/examples/TableDemo.java | 23 +- .../poi/xslf/usermodel/PieChartDemo.java | 2 +- .../apache/poi/xslf/usermodel/Tutorial1.java | 2 +- .../poi/xslf/usermodel/tutorial/Step2.java | 2 +- .../poi/hslf/usermodel/HSLFHyperlink.java | 79 +++--- .../apache/poi/hslf/usermodel/HSLFSlide.java | 39 ++- .../poi/hslf/usermodel/HSLFSlideShow.java | 2 +- .../poi/hslf/usermodel/HSLFTextParagraph.java | 61 +++-- .../poi/hslf/usermodel/HSLFTextRun.java | 4 + .../poi/hslf/usermodel/HSLFTextShape.java | 2 +- .../apache/poi/hslf/model/TestHyperlink.java | 26 +- .../hslf/record/TestDocumentEncryption.java | 5 +- .../apache/poi/hslf/record/TestSlideAtom.java | 4 +- .../hslf/record/TestStyleTextPropAtom.java | 42 ++-- .../poi/hslf/usermodel/TestAddingSlides.java | 73 +++--- .../apache/poi/hslf/usermodel/TestBugs.java | 228 ++++++++---------- 19 files changed, 345 insertions(+), 368 deletions(-) diff --git a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java index b9af6d2d56..9e88082508 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java +++ b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java @@ -17,9 +17,10 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.*; - import java.io.FileInputStream; +import java.util.List; + +import org.apache.poi.hslf.usermodel.*; /** * Demonstrates how to read hyperlinks from a presentation @@ -34,44 +35,37 @@ public final class Hyperlinks { HSLFSlideShow ppt = new HSLFSlideShow(is); is.close(); - HSLFSlide[] slide = ppt.getSlides(); - for (int j = 0; j < slide.length; j++) { - System.out.println("slide " + slide[j].getSlideNumber()); + for (HSLFSlide slide : ppt.getSlides()) { + System.out.println("\nslide " + slide.getSlideNumber()); - //read hyperlinks from the slide's text runs - System.out.println("reading hyperlinks from the text runs"); - HSLFTextParagraph[] txt = slide[j].getTextParagraphs(); - for (int k = 0; k < txt.length; k++) { - String text = txt[k].getRawText(); - HSLFHyperlink[] links = txt[k].getHyperlinks(); - if(links != null) for (int l = 0; l < links.length; l++) { - HSLFHyperlink link = links[l]; - String title = link.getTitle(); - String address = link.getAddress(); - System.out.println(" " + title); - System.out.println(" " + address); - String substring = text.substring(link.getStartIndex(), link.getEndIndex()-1);//in ppt end index is inclusive - System.out.println(" " + substring); + // read hyperlinks from the slide's text runs + System.out.println("- reading hyperlinks from the text runs"); + for (List txtParas : slide.getTextParagraphs()) { + List links = HSLFHyperlink.find(txtParas); + String text = HSLFTextParagraph.getRawText(txtParas); + + for (HSLFHyperlink link : links) { + System.out.println(toStr(link, text)); } } - //in PowerPoint you can assign a hyperlink to a shape without text, - //for example to a Line object. The code below demonstrates how to - //read such hyperlinks - System.out.println(" reading hyperlinks from the slide's shapes"); - HSLFShape[] sh = slide[j].getShapes(); - for (int k = 0; k < sh.length; k++) { - HSLFHyperlink link = sh[k].getHyperlink(); - if(link != null) { - String title = link.getTitle(); - String address = link.getAddress(); - System.out.println(" " + title); - System.out.println(" " + address); - } + // in PowerPoint you can assign a hyperlink to a shape without text, + // for example to a Line object. The code below demonstrates how to + // read such hyperlinks + System.out.println("- reading hyperlinks from the slide's shapes"); + for (HSLFShape sh : slide.getShapes()) { + HSLFHyperlink link = HSLFHyperlink.find(sh); + if (link == null) continue; + System.out.println(toStr(link, null)); } } - } - } + + static String toStr(HSLFHyperlink link, String rawText) { + //in ppt end index is inclusive + String formatStr = "title: %1$s, address: %2$s" + (rawText == null ? "" : ", start: %3$s, end: %4$s, substring: %5$s"); + String substring = (rawText == null) ? "" : rawText.substring(link.getStartIndex(), link.getEndIndex()-1); + return String.format(formatStr, link.getTitle(), link.getAddress(), link.getStartIndex(), link.getEndIndex(), substring); + } } diff --git a/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java b/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java index 784d912c0e..8981c64c3c 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java +++ b/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java @@ -17,16 +17,16 @@ package org.apache.poi.hslf.examples; -import org.apache.poi.hslf.usermodel.*; -import org.apache.poi.hslf.model.*; +import java.awt.*; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.FileInputStream; +import java.io.FileOutputStream; import javax.imageio.ImageIO; -import java.io.FileOutputStream; -import java.io.FileInputStream; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.awt.geom.Rectangle2D; +import org.apache.poi.hslf.usermodel.HSLFSlide; +import org.apache.poi.hslf.usermodel.HSLFSlideShow; /** * Demonstrates how you can use HSLF to convert each slide into a PNG image @@ -70,12 +70,11 @@ public final class PPT2PNG { int width = (int)(pgsize.width*scale); int height = (int)(pgsize.height*scale); - HSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - if (slidenum != -1 && slidenum != (i+1)) continue; + for (HSLFSlide slide : ppt.getSlides()) { + if (slidenum != -1 && slidenum != slide.getSlideNumber()) continue; - String title = slide[i].getTitle(); - System.out.println("Rendering slide "+slide[i].getSlideNumber() + (title == null ? "" : ": " + title)); + String title = slide.getTitle(); + System.out.println("Rendering slide "+slide.getSlideNumber() + (title == null ? "" : ": " + title)); BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = img.createGraphics(); @@ -89,9 +88,9 @@ public final class PPT2PNG { graphics.scale((double)width/pgsize.width, (double)height/pgsize.height); - slide[i].draw(graphics); + slide.draw(graphics); - String fname = file.replaceAll("\\.ppt", "-" + (i+1) + ".png"); + String fname = file.replaceAll("\\.ppt", "-" + slide.getSlideNumber() + ".png"); FileOutputStream out = new FileOutputStream(fname); ImageIO.write(img, "png", out); out.close(); diff --git a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java index 7ebbea9f17..3cdb101be5 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java +++ b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java @@ -15,17 +15,14 @@ limitations under the License. ==================================================================== */ package org.apache.poi.hslf.examples; -import org.apache.poi.ddf.*; -import org.apache.poi.hslf.model.*; -import org.apache.poi.hslf.record.InteractiveInfo; -import org.apache.poi.hslf.record.InteractiveInfoAtom; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.usermodel.*; - import java.io.FileInputStream; import java.util.Iterator; import java.util.List; +import org.apache.poi.ddf.*; +import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.usermodel.*; + /** * For each slide iterate over shapes and found associated sound data. * @@ -36,16 +33,15 @@ public class SoundFinder { HSLFSlideShow ppt = new HSLFSlideShow(new FileInputStream(args[0])); HSLFSoundData[] sounds = ppt.getSoundData(); - HSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - HSLFShape[] shape = slide[i].getShapes(); - for (int j = 0; j < shape.length; j++) { - int soundRef = getSoundReference(shape[j]); - if(soundRef != -1) { - System.out.println("Slide["+i+"], shape["+j+"], soundRef: "+soundRef); - System.out.println(" " + sounds[soundRef].getSoundName()); - System.out.println(" " + sounds[soundRef].getSoundType()); - } + for (HSLFSlide slide : ppt.getSlides()) { + for (HSLFShape shape : slide.getShapes()) { + int soundRef = getSoundReference(shape); + if(soundRef == -1) continue; + + + System.out.println("Slide["+slide.getSlideNumber()+"], shape["+shape.getShapeId()+"], soundRef: "+soundRef); + System.out.println(" " + sounds[soundRef].getSoundName()); + System.out.println(" " + sounds[soundRef].getSoundType()); } } } diff --git a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java index 1d03e1b6f1..bb2e813865 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java @@ -19,6 +19,8 @@ package org.apache.poi.hslf.examples; import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hslf.model.*; +import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; +import org.apache.poi.sl.usermodel.VerticalAlignment; import java.awt.*; import java.io.FileOutputStream; @@ -51,8 +53,7 @@ public final class TableDemo { for (int i = 0; i < txt1.length; i++) { for (int j = 0; j < txt1[i].length; j++) { TableCell cell = table1.getCell(i, j); - cell.setText(txt1[i][j]); - HSLFTextRun rt = cell.getTextParagraphs().getTextRuns()[0]; + HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontName("Arial"); rt.setFontSize(10); if(i == 0){ @@ -60,8 +61,9 @@ public final class TableDemo { } else { rt.setBold(true); } - cell.setVerticalAlignment(HSLFTextBox.AnchorMiddle); - cell.setHorizontalAlignment(HSLFTextBox.AlignCenter); + cell.setVerticalAlignment(VerticalAlignment.MIDDLE); + cell.setHorizontalCentered(true); + cell.setText(txt1[i][j]); } } @@ -90,8 +92,7 @@ public final class TableDemo { for (int i = 0; i < txt2.length; i++) { for (int j = 0; j < txt2[i].length; j++) { TableCell cell = table2.getCell(i, j); - cell.setText(txt2[i][j]); - HSLFTextRun rt = cell.getTextParagraphs().getTextRuns()[0]; + HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontSize(10); rt.setFontName("Arial"); if(i == 0){ @@ -99,13 +100,15 @@ public final class TableDemo { rt.setFontColor(Color.white); rt.setBold(true); rt.setFontSize(14); - cell.setHorizontalAlignment(HSLFTextBox.AlignCenter); + cell.setHorizontalCentered(true); } else { - rt.setBullet(true); + rt.getTextParagraph().setBullet(true); rt.setFontSize(12); - cell.setHorizontalAlignment(HSLFTextBox.AlignLeft); + rt.getTextParagraph().setAlignment(TextAlign.LEFT); + cell.setHorizontalCentered(false); } - cell.setVerticalAlignment(HSLFTextBox.AnchorMiddle); + cell.setVerticalAlignment(VerticalAlignment.MIDDLE); + cell.setText(txt2[i][j]); } } table2.setColumnWidth(0, 300); diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java b/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java index de90c52d20..e399d3d0ed 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java @@ -67,7 +67,7 @@ public class PieChartDemo { String chartTitle = modelReader.readLine(); // first line is chart title XMLSlideShow pptx = new XMLSlideShow(new FileInputStream(args[0])); - XSLFSlide slide = pptx.getSlides()[0]; + XSLFSlide slide = pptx.getSlides().get(0); // find chart in the slide XSLFChart chart = null; diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java index 93d437b913..458b987320 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java @@ -37,7 +37,7 @@ public class Tutorial1 { /*XSLFSlide blankSlide =*/ ppt.createSlide(); - XSLFSlideMaster master = ppt.getSlideMasters()[0]; + XSLFSlideMaster master = ppt.getSlideMasters().get(0); XSLFSlideLayout layout1 = master.getLayout(SlideLayout.TITLE); XSLFSlide slide1 = ppt.createSlide(layout1) ; diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step2.java b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step2.java index b006eb86a1..cd01d60c8c 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step2.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step2.java @@ -49,7 +49,7 @@ public class Step2 { // blank slide /*XSLFSlide blankSlide =*/ ppt.createSlide(); - XSLFSlideMaster defaultMaster = ppt.getSlideMasters()[0]; + XSLFSlideMaster defaultMaster = ppt.getSlideMasters().get(0); // title slide XSLFSlideLayout titleLayout = defaultMaster.getLayout(SlideLayout.TITLE); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFHyperlink.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFHyperlink.java index baead9e31c..02608b74a3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFHyperlink.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFHyperlink.java @@ -146,50 +146,31 @@ public final class HSLFHyperlink { * @param shape TextRun to lookup hyperlinks in * @return found hyperlinks or null if not found */ - public static HSLFHyperlink[] find(HSLFTextShape shape){ - List lst = new ArrayList(); - HSLFSlideShow ppt = shape.getSheet().getSlideShow(); - //document-level container which stores info about all links in a presentation - ExObjList exobj = ppt.getDocumentRecord().getExObjList(); - if (exobj == null) { - return null; - } - - Record[] records = shape.getClientRecords(); - find(records, exobj, lst); - - HSLFHyperlink[] links = null; - if (lst.size() > 0){ - links = new HSLFHyperlink[lst.size()]; - lst.toArray(links); - } - return links; + public static List find(HSLFTextShape shape){ + return find(shape.getTextParagraphs()); } /** * Find hyperlinks in a text paragraph * - * @param paragraph TextParagraph to lookup hyperlinks in - * @return found hyperlinks or null if not found + * @param paragraphs List of TextParagraph to lookup hyperlinks + * @return found hyperlinks */ - public static HSLFHyperlink[] find(HSLFTextParagraph paragraph){ + public static List find(List paragraphs){ List lst = new ArrayList(); - HSLFSlideShow ppt = paragraph.getSheet().getSlideShow(); + if (paragraphs == null || paragraphs.isEmpty()) return lst; + + HSLFTextParagraph firstPara = paragraphs.get(0); + + HSLFSlideShow ppt = firstPara.getSheet().getSlideShow(); //document-level container which stores info about all links in a presentation ExObjList exobj = ppt.getDocumentRecord().getExObjList(); - if (exobj == null) { - return null; - } + if (exobj == null) return lst; - Record[] records = paragraph.getRecords(); + Record[] records = firstPara.getRecords(); find(records, exobj, lst); - HSLFHyperlink[] links = null; - if (lst.size() > 0){ - links = new HSLFHyperlink[lst.size()]; - lst.toArray(links); - } - return links; + return lst; } /** @@ -224,24 +205,24 @@ public final class HSLFHyperlink { if (records == null) return; for (int i = 0; i < records.length; i++) { //see if we have InteractiveInfo in the textrun's records - if( records[i] instanceof InteractiveInfo){ - InteractiveInfo hldr = (InteractiveInfo)records[i]; - InteractiveInfoAtom info = hldr.getInteractiveInfoAtom(); - int id = info.getHyperlinkID(); - ExHyperlink linkRecord = exobj.get(id); - if (linkRecord != null){ - HSLFHyperlink link = new HSLFHyperlink(); - link.title = linkRecord.getLinkTitle(); - link.address = linkRecord.getLinkURL(); - link.type = info.getAction(); + if(!(records[i] instanceof InteractiveInfo)) continue; + + InteractiveInfo hldr = (InteractiveInfo)records[i]; + InteractiveInfoAtom info = hldr.getInteractiveInfoAtom(); + int id = info.getHyperlinkID(); + ExHyperlink linkRecord = exobj.get(id); + if (linkRecord == null) continue; + + HSLFHyperlink link = new HSLFHyperlink(); + link.title = linkRecord.getLinkTitle(); + link.address = linkRecord.getLinkURL(); + link.type = info.getAction(); + out.add(link); - if (++i < records.length && records[i] instanceof TxInteractiveInfoAtom){ - TxInteractiveInfoAtom txinfo = (TxInteractiveInfoAtom)records[i]; - link.startIndex = txinfo.getStartIndex(); - link.endIndex = txinfo.getEndIndex(); - } - out.add(link); - } + if (i+1 < records.length && records[i+1] instanceof TxInteractiveInfoAtom){ + TxInteractiveInfoAtom txinfo = (TxInteractiveInfoAtom)records[++i]; + link.startIndex = txinfo.getStartIndex(); + link.endIndex = txinfo.getEndIndex(); } } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java index 2fbd5c201f..048655fa64 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java @@ -62,8 +62,8 @@ public final class HSLFSlide extends HSLFSheet implements Slide 0) { - List> llhtp = HSLFTextParagraph.findTextParagraphs(_atomSet.getSlideRecords()); - _paragraphs.addAll(llhtp); + // Grab text from SlideListWithTexts entries + _paragraphs.addAll(HSLFTextParagraph.findTextParagraphs(_atomSet.getSlideRecords())); if (_paragraphs.isEmpty()) { throw new RuntimeException("No text records found for slide"); } @@ -71,23 +71,14 @@ public final class HSLFSlide extends HSLFSheet implements Slide ltp : _paragraphs) { - for (HSLFTextParagraph tp : ltp) { - tp.supplySheet(this); - } - } + // Grab text from slide's PPDrawing + _paragraphs.addAll(HSLFTextParagraph.findTextParagraphs(getPPDrawing())); - // Grab the TextRuns from the PPDrawing - List> llOtherRuns = HSLFTextParagraph.findTextParagraphs(getPPDrawing()); - for (List otherRuns : llOtherRuns) { - // Grab text from slide's PPDrawing - for(HSLFTextParagraph tp : otherRuns) { - tp.supplySheet(this); - tp.setIndex(-1); // runs found in PPDrawing are not linked with SlideListWithTexts - } - } - _paragraphs.addAll(llOtherRuns); + for(List ltp : _paragraphs) { + for (HSLFTextParagraph tp : ltp) { + tp.supplySheet(this); + } + } } /** @@ -449,19 +440,19 @@ public final class HSLFSlide extends HSLFSheet implements Slide records = new ArrayList(); - List sa = Arrays.asList(sas); + List sa = new ArrayList(Arrays.asList(sas)); HSLFSlide removedSlide = _slides.remove(index); _notes.remove(removedSlide.getNotes()); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index 7d76efe8da..b9c02dc7f3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -668,11 +668,33 @@ public final class HSLFTextParagraph implements TextParagraph { prop.setSubValue(value,index); } + /** + * Check and add linebreaks to text runs leading other paragraphs + * + * @param paragraphs + */ + protected static void fixLineEndings(List paragraphs) { + HSLFTextRun lastRun = null; + for (HSLFTextParagraph p : paragraphs) { + if (lastRun != null && !lastRun.getRawText().endsWith("\r")) { + lastRun.setText(lastRun.getRawText()+"\r"); + } + List ltr = p.getTextRuns(); + if (ltr.isEmpty()) { + throw new RuntimeException("paragraph without textruns found"); + } + lastRun = ltr.get(ltr.size()-1); + assert(lastRun.getRawText() != null); + } + } + /** * Saves the modified paragraphs/textrun to the records. * Also updates the styles to the correct text length. */ protected static void storeText(List paragraphs) { + fixLineEndings(paragraphs); + String rawText = toInternalString(getRawText(paragraphs)); // Will it fit in a 8 bit atom? @@ -738,16 +760,16 @@ public final class HSLFTextParagraph implements TextParagraph { styleAtom.clearStyles(); - TextPropCollection lastPTPC = null, lastRTPC = null; + TextPropCollection lastPTPC = null, lastRTPC = null, ptpc = null, rtpc = null; for (HSLFTextParagraph para : paragraphs) { - TextPropCollection ptpc = para.getParagraphStyle(); + ptpc = para.getParagraphStyle(); ptpc.updateTextSize(0); if (!ptpc.equals(lastPTPC)) { lastPTPC = styleAtom.addParagraphTextPropCollection(0); lastPTPC.copy(ptpc); } for (HSLFTextRun tr : para.getTextRuns()) { - TextPropCollection rtpc = tr.getCharacterStyle(); + rtpc = tr.getCharacterStyle(); rtpc.updateTextSize(0); if (!rtpc.equals(lastRTPC)) { lastRTPC = styleAtom.addCharacterTextPropCollection(0); @@ -761,7 +783,9 @@ public final class HSLFTextParagraph implements TextParagraph { } } - assert(lastPTPC != null && lastRTPC != null); + assert(lastPTPC != null && lastRTPC != null && ptpc != null && rtpc != null); + ptpc.updateTextSize(ptpc.getCharactersCovered()+1); + rtpc.updateTextSize(rtpc.getCharactersCovered()+1); lastPTPC.updateTextSize(lastPTPC.getCharactersCovered()+1); lastRTPC.updateTextSize(lastRTPC.getCharactersCovered()+1); @@ -817,6 +841,8 @@ public final class HSLFTextParagraph implements TextParagraph { } htr.setText(rawText); } + + storeText(paragraphs); return htr; } @@ -909,16 +935,7 @@ public final class HSLFTextParagraph implements TextParagraph { public static List> findTextParagraphs(PPDrawing ppdrawing) { List> runsV = new ArrayList>(); for (EscherTextboxWrapper wrapper : ppdrawing.getTextboxWrappers()) { - // propagate parents to parent-aware records - RecordContainer.handleParentAwareRecords(wrapper); - int shapeId = wrapper.getShapeId(); - List> rv = findTextParagraphs(wrapper); - for (List htpList : rv) { - for (HSLFTextParagraph htp : htpList) { - htp.setShapeId(shapeId); - } - } - runsV.addAll(rv); + runsV.addAll(findTextParagraphs(wrapper)); } return runsV; } @@ -940,8 +957,17 @@ public final class HSLFTextParagraph implements TextParagraph { * * @param wrapper an EscherTextboxWrapper */ - protected static List> findTextParagraphs(final EscherTextboxWrapper wrapper) { - return findTextParagraphs(wrapper.getChildRecords(), wrapper.getStyleTextProp9Atom()); + protected static List> findTextParagraphs(EscherTextboxWrapper wrapper) { + // propagate parents to parent-aware records + RecordContainer.handleParentAwareRecords(wrapper); + int shapeId = wrapper.getShapeId(); + List> rv = findTextParagraphs(wrapper.getChildRecords(), wrapper.getStyleTextProp9Atom()); + for (List htpList : rv) { + for (HSLFTextParagraph htp : htpList) { + htp.setShapeId(shapeId); + } + } + return rv; } /** @@ -999,7 +1025,8 @@ public final class HSLFTextParagraph implements TextParagraph { } assert(header != null); - if (header.getIndex() == -1) { + if (header.getParentRecord() instanceof SlideListWithText) { + // runs found in PPDrawing are not linked with SlideListWithTexts header.setIndex(slwtIndex); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index e94c844649..d06715b173 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -383,6 +383,10 @@ public final class HSLFTextRun implements TextRun { prop.setSubValue(value, index); } + public HSLFTextParagraph getTextParagraph() { + return parentParagraph; + } + public TextCap getTextCap() { return TextCap.NONE; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java index d431f0bac4..e05ae79a60 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java @@ -750,7 +750,7 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape * @return the array of all hyperlinks in this text run or null * if not found. */ - public HSLFHyperlink[] getHyperlinks() { + public List getHyperlinks() { return HSLFHyperlink.find(this); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java index 5438ac8af9..5429b96fbc 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java @@ -53,17 +53,17 @@ public final class TestHyperlink { "In addition, its notes has one link"; assertEquals(expected, rawText); - HSLFHyperlink[] links = HSLFHyperlink.find(para.get(1)); + List links = HSLFHyperlink.find(para); assertNotNull(links); - assertEquals(2, links.length); + assertEquals(2, links.size()); - assertEquals("http://jakarta.apache.org/poi/", links[0].getTitle()); - assertEquals("http://jakarta.apache.org/poi/", links[0].getAddress()); - assertEquals("http://jakarta.apache.org/poi/", rawText.substring(links[0].getStartIndex(), links[0].getEndIndex()-1)); + assertEquals("http://jakarta.apache.org/poi/", links.get(0).getTitle()); + assertEquals("http://jakarta.apache.org/poi/", links.get(0).getAddress()); + assertEquals("http://jakarta.apache.org/poi/", rawText.substring(links.get(0).getStartIndex(), links.get(0).getEndIndex()-1)); - assertEquals("http://slashdot.org/", links[1].getTitle()); - assertEquals("http://slashdot.org/", links[1].getAddress()); - assertEquals("http://slashdot.org/", rawText.substring(links[1].getStartIndex(), links[1].getEndIndex()-1)); + assertEquals("http://slashdot.org/", links.get(1).getTitle()); + assertEquals("http://slashdot.org/", links.get(1).getAddress()); + assertEquals("http://slashdot.org/", rawText.substring(links.get(1).getStartIndex(), links.get(1).getEndIndex()-1)); slide = ppt.getSlides().get(1); para = slide.getTextParagraphs().get(1); @@ -73,12 +73,12 @@ public final class TestHyperlink { "Jakarta HSSF"; assertEquals(expected, rawText); - links = HSLFHyperlink.find(para.get(1)); + links = HSLFHyperlink.find(para); assertNotNull(links); - assertEquals(1, links.length); + assertEquals(1, links.size()); - assertEquals("http://jakarta.apache.org/poi/hssf/", links[0].getTitle()); - assertEquals("http://jakarta.apache.org/poi/hssf/", links[0].getAddress()); - assertEquals("Jakarta HSSF", rawText.substring(links[0].getStartIndex(), links[0].getEndIndex()-1)); + assertEquals("http://jakarta.apache.org/poi/hssf/", links.get(0).getTitle()); + assertEquals("http://jakarta.apache.org/poi/hssf/", links.get(0).getAddress()); + assertEquals("Jakarta HSSF", rawText.substring(links.get(0).getStartIndex(), links.get(0).getEndIndex()-1)); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java index 4f23e4998b..7176c504e7 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java @@ -143,8 +143,9 @@ public class TestDocumentEncryption { HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs); HSLFSlideShow ss = new HSLFSlideShow(hss); - HSLFSlide slide = ss.getSlides()[0]; - assertEquals("Dominic Salemno", slide.getTextParagraphs()[0].getRawText()); + HSLFSlide slide = ss.getSlides().get(0); + String rawText = HSLFTextParagraph.getRawText(slide.getTextParagraphs().get(0)); + assertEquals("Dominic Salemno", rawText); String picCmp[][] = { {"0","nKsDTKqxTCR8LFkVVWlP9GSTvZ0="}, diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java index 4dad61a6cb..447a7646b1 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java @@ -85,8 +85,8 @@ public final class TestSlideAtom extends TestCase { ss.write(bos); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ss = new HSLFSlideShow(bis); - slide1 = ss.getSlides()[0]; - slide2 = ss.getSlides()[1]; + slide1 = ss.getSlides().get(0); + slide2 = ss.getSlides().get(1); assertFalse(slide1.getHidden()); assertTrue(slide2.getHidden()); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java index 665c86e691..e0e2de515a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java @@ -21,13 +21,11 @@ import static org.junit.Assert.assertArrayEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.LinkedList; +import java.util.List; import junit.framework.TestCase; -import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; -import org.apache.poi.hslf.model.textproperties.TextProp; -import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.hslf.model.textproperties.*; import org.apache.poi.util.HexDump; /** @@ -188,7 +186,7 @@ public final class TestStyleTextPropAtom extends TestCase { stpb.setParentTextSize(data_b_text_len); // 54 chars, 21 + 17 + 16 - LinkedList a_ch_l = stpa.getCharacterStyles(); + List a_ch_l = stpa.getCharacterStyles(); TextPropCollection a_ch_1 = a_ch_l.get(0); TextPropCollection a_ch_2 = a_ch_l.get(1); TextPropCollection a_ch_3 = a_ch_l.get(2); @@ -197,7 +195,7 @@ public final class TestStyleTextPropAtom extends TestCase { assertEquals(16, a_ch_3.getCharactersCovered()); // 179 chars, 30 + 28 + 25 - LinkedList b_ch_l = stpb.getCharacterStyles(); + List b_ch_l = stpb.getCharacterStyles(); TextPropCollection b_ch_1 = b_ch_l.get(0); TextPropCollection b_ch_2 = b_ch_l.get(1); TextPropCollection b_ch_3 = b_ch_l.get(2); @@ -213,7 +211,7 @@ public final class TestStyleTextPropAtom extends TestCase { StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length); stpb.setParentTextSize(data_b_text_len); - LinkedList b_ch_l = stpb.getCharacterStyles(); + List b_ch_l = stpb.getCharacterStyles(); TextPropCollection b_ch_1 = b_ch_l.get(0); TextPropCollection b_ch_2 = b_ch_l.get(1); TextPropCollection b_ch_3 = b_ch_l.get(2); @@ -260,7 +258,7 @@ public final class TestStyleTextPropAtom extends TestCase { StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length); stpb.setParentTextSize(data_b_text_len); - LinkedList b_p_l = stpb.getParagraphStyles(); + List b_p_l = stpb.getParagraphStyles(); TextPropCollection b_p_1 = b_p_l.get(0); TextPropCollection b_p_2 = b_p_l.get(1); TextPropCollection b_p_3 = b_p_l.get(2); @@ -304,7 +302,7 @@ public final class TestStyleTextPropAtom extends TestCase { StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length); stpb.setParentTextSize(data_b_text_len); - LinkedList b_ch_l = stpb.getCharacterStyles(); + List b_ch_l = stpb.getCharacterStyles(); TextPropCollection b_ch_1 = b_ch_l.get(0); TextPropCollection b_ch_2 = b_ch_l.get(1); TextPropCollection b_ch_3 = b_ch_l.get(2); @@ -375,13 +373,13 @@ public final class TestStyleTextPropAtom extends TestCase { StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length); stpb.setParentTextSize(data_b_text_len); - LinkedList b_p_l = stpb.getParagraphStyles(); + List b_p_l = stpb.getParagraphStyles(); TextPropCollection b_p_1 = b_p_l.get(0); TextPropCollection b_p_2 = b_p_l.get(1); TextPropCollection b_p_3 = b_p_l.get(2); TextPropCollection b_p_4 = b_p_l.get(3); - LinkedList b_ch_l = stpb.getCharacterStyles(); + List b_ch_l = stpb.getCharacterStyles(); TextPropCollection b_ch_1 = b_ch_l.get(0); TextPropCollection b_ch_2 = b_ch_l.get(1); TextPropCollection b_ch_3 = b_ch_l.get(2); @@ -431,7 +429,7 @@ public final class TestStyleTextPropAtom extends TestCase { // Don't need to touch the paragraph styles // Add two more character styles - LinkedList cs = stpa.getCharacterStyles(); + List cs = stpa.getCharacterStyles(); // First char style is boring, and 21 long TextPropCollection tpca = cs.get(0); @@ -468,7 +466,7 @@ public final class TestStyleTextPropAtom extends TestCase { // Need 4 paragraph styles - LinkedList ps = stpa.getParagraphStyles(); + List ps = stpa.getParagraphStyles(); // First is 30 long, left aligned, normal spacing TextPropCollection tppa = ps.get(0); @@ -503,7 +501,7 @@ public final class TestStyleTextPropAtom extends TestCase { // Now do 4 character styles - LinkedList cs = stpa.getCharacterStyles(); + List cs = stpa.getCharacterStyles(); // First is 30 long, bold and font size TextPropCollection tpca = cs.get(0); @@ -568,16 +566,16 @@ public final class TestStyleTextPropAtom extends TestCase { // Compare in detail to b StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length); stpb.setParentTextSize(data_b_text_len); - LinkedList psb = stpb.getParagraphStyles(); - LinkedList csb = stpb.getCharacterStyles(); + List psb = stpb.getParagraphStyles(); + List csb = stpb.getCharacterStyles(); assertEquals(psb.size(), ps.size()); assertEquals(csb.size(), cs.size()); // Ensure Paragraph Character styles match for(int z=0; z<2; z++) { - LinkedList lla = cs; - LinkedList llb = csb; + List lla = cs; + List llb = csb; int upto = 5; if(z == 1) { lla = ps; @@ -605,8 +603,8 @@ public final class TestStyleTextPropAtom extends TestCase { ByteArrayOutputStream ba = new ByteArrayOutputStream(); ByteArrayOutputStream bb = new ByteArrayOutputStream(); - ca.writeOut(ba); - cb.writeOut(bb); + ca.writeOut(ba, StyleTextPropAtom.characterTextPropTypes); + cb.writeOut(bb, StyleTextPropAtom.characterTextPropTypes); byte[] cab = ba.toByteArray(); byte[] cbb = bb.toByteArray(); @@ -695,12 +693,12 @@ public final class TestStyleTextPropAtom extends TestCase { StyleTextPropAtom atom = new StyleTextPropAtom(data_d, 0, data_d.length); atom.setParentTextSize(data_d_text_len); - TextPropCollection prprops = atom.getParagraphStyles().getFirst(); + TextPropCollection prprops = atom.getParagraphStyles().get(0); assertEquals(data_d_text_len+1, prprops.getCharactersCovered()); assertEquals(1, prprops.getTextPropList().size()); //1 property found assertEquals(1, prprops.findByName("alignment").getValue()); - TextPropCollection chprops = atom.getCharacterStyles().getFirst(); + TextPropCollection chprops = atom.getCharacterStyles().get(0); assertEquals(data_d_text_len+1, chprops.getCharactersCovered()); assertEquals(5, chprops.getTextPropList().size()); //5 properties found assertEquals(1, chprops.findByName("char_flags").getValue()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java index 5778beac2c..c0634f05fc 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java @@ -20,16 +20,12 @@ package org.apache.poi.hslf.usermodel; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.util.List; import junit.framework.TestCase; -import org.apache.poi.hslf.*; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.RecordTypes; -import org.apache.poi.hslf.record.UserEditAtom; -import org.apache.poi.hslf.record.Document; -import org.apache.poi.hslf.model.*; import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.record.*; /** * Tests that SlideShow adds additional sheets properly @@ -70,7 +66,7 @@ public final class TestAddingSlides extends TestCase { */ public void testAddSlideToEmpty() throws Exception { // Doesn't have any slides - assertEquals(0, ss_empty.getSlides().length); + assertEquals(0, ss_empty.getSlides().size()); // Should only have a master SLWT assertEquals(1, ss_empty.getDocumentRecord().getSlideListWithTexts().length); @@ -88,7 +84,7 @@ public final class TestAddingSlides extends TestCase { // Add one HSLFSlide slide = ss_empty.createSlide(); - assertEquals(1, ss_empty.getSlides().length); + assertEquals(1, ss_empty.getSlides().size()); assertEquals(256, slide._getSheetNumber()); assertEquals(3, slide._getSheetRefId()); assertEquals(1, slide.getSlideNumber()); @@ -103,13 +99,13 @@ public final class TestAddingSlides extends TestCase { HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); // Check it now has a slide - assertEquals(1, ss_read.getSlides().length); + assertEquals(1, ss_read.getSlides().size()); // Check it now has two SLWTs assertEquals(2, ss_empty.getDocumentRecord().getSlideListWithTexts().length); // And check it's as expected - slide = ss_read.getSlides()[0]; + slide = ss_read.getSlides().get(0); assertEquals(256, slide._getSheetNumber()); assertEquals(3, slide._getSheetRefId()); assertEquals(1, slide.getSlideNumber()); @@ -120,8 +116,8 @@ public final class TestAddingSlides extends TestCase { */ public void testAddSlideToExisting() throws Exception { // Has one slide - assertEquals(1, ss_one.getSlides().length); - HSLFSlide s1 = ss_one.getSlides()[0]; + assertEquals(1, ss_one.getSlides().size()); + HSLFSlide s1 = ss_one.getSlides().get(0); // Should have two SLTWs assertEquals(2, ss_one.getDocumentRecord().getSlideListWithTexts().length); @@ -133,7 +129,7 @@ public final class TestAddingSlides extends TestCase { // Add a second one HSLFSlide s2 = ss_one.createSlide(); - assertEquals(2, ss_one.getSlides().length); + assertEquals(2, ss_one.getSlides().size()); assertEquals(257, s2._getSheetNumber()); assertEquals(4, s2._getSheetRefId()); assertEquals(2, s2.getSlideNumber()); @@ -147,14 +143,14 @@ public final class TestAddingSlides extends TestCase { HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); // Check it now has two slides - assertEquals(2, ss_read.getSlides().length); + assertEquals(2, ss_read.getSlides().size()); // Should still have two SLTWs assertEquals(2, ss_read.getDocumentRecord().getSlideListWithTexts().length); // And check it's as expected - s1 = ss_read.getSlides()[0]; - s2 = ss_read.getSlides()[1]; + s1 = ss_read.getSlides().get(0); + s2 = ss_read.getSlides().get(1); assertEquals(256, s1._getSheetNumber()); assertEquals(3, s1._getSheetRefId()); assertEquals(1, s1.getSlideNumber()); @@ -167,7 +163,8 @@ public final class TestAddingSlides extends TestCase { * Test adding a slide to an existing slideshow, * with two slides already */ - public void testAddSlideToExisting2() throws Exception { + @SuppressWarnings("unused") + public void testAddSlideToExisting2() throws Exception { //grab UserEditAtom UserEditAtom usredit = null; Record[] _records = hss_two.getRecords(); @@ -180,9 +177,9 @@ public final class TestAddingSlides extends TestCase { assertNotNull(usredit); // Has two slides - assertEquals(2, ss_two.getSlides().length); - HSLFSlide s1 = ss_two.getSlides()[0]; - HSLFSlide s2 = ss_two.getSlides()[1]; + assertEquals(2, ss_two.getSlides().size()); + HSLFSlide s1 = ss_two.getSlides().get(0); + HSLFSlide s2 = ss_two.getSlides().get(1); // Check slide 1 is as expected assertEquals(256, s1._getSheetNumber()); @@ -195,7 +192,7 @@ public final class TestAddingSlides extends TestCase { // Add a third one HSLFSlide s3 = ss_two.createSlide(); - assertEquals(3, ss_two.getSlides().length); + assertEquals(3, ss_two.getSlides().size()); assertEquals(258, s3._getSheetNumber()); assertEquals(8, s3._getSheetRefId()); // lots of notes before us assertEquals(3, s3.getSlideNumber()); @@ -210,12 +207,12 @@ public final class TestAddingSlides extends TestCase { HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); // Check it now has three slides - assertEquals(3, ss_read.getSlides().length); + assertEquals(3, ss_read.getSlides().size()); // And check it's as expected - s1 = ss_read.getSlides()[0]; - s2 = ss_read.getSlides()[1]; - s3 = ss_read.getSlides()[2]; + s1 = ss_read.getSlides().get(0); + s2 = ss_read.getSlides().get(1); + s3 = ss_read.getSlides().get(2); assertEquals(256, s1._getSheetNumber()); assertEquals(4, s1._getSheetRefId()); assertEquals(1, s1.getSlideNumber()); @@ -235,8 +232,8 @@ public final class TestAddingSlides extends TestCase { HSLFSlide slide1 = ppt.createSlide(); HSLFSlide slide2 = ppt.createSlide(); - HSLFSlide[] s1 = ppt.getSlides(); - assertEquals(2, s1.length); + List s1 = ppt.getSlides(); + assertEquals(2, s1.size()); try { ppt.removeSlide(-1); fail("expected exception"); @@ -254,10 +251,10 @@ public final class TestAddingSlides extends TestCase { assertEquals(1, slide1.getSlideNumber()); HSLFSlide removedSlide = ppt.removeSlide(0); - HSLFSlide[] s2 = ppt.getSlides(); - assertEquals(1, s2.length); + List s2 = ppt.getSlides(); + assertEquals(1, s2.size()); assertSame(slide1, removedSlide); - assertSame(slide2, s2[0]); + assertSame(slide2, s2.get(0)); assertEquals(0, slide2.getSlideNumber()); @@ -266,29 +263,29 @@ public final class TestAddingSlides extends TestCase { ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); - HSLFSlide[] s3 = ppt.getSlides(); - assertEquals(1, s3.length); + List s3 = ppt.getSlides(); + assertEquals(1, s3.size()); } public void test47261() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("47261.ppt")); - HSLFSlide[] slides = ppt.getSlides(); + List slides = ppt.getSlides(); Document doc = ppt.getDocumentRecord(); assertNotNull(doc.getSlideSlideListWithText()); - assertEquals(14, ppt.getSlides().length); - int notesId = slides[0].getSlideRecord().getSlideAtom().getNotesID(); + assertEquals(14, ppt.getSlides().size()); + int notesId = slides.get(0).getSlideRecord().getSlideAtom().getNotesID(); assertTrue(notesId > 0); assertNotNull(doc.getNotesSlideListWithText()); assertEquals(14, doc.getNotesSlideListWithText().getSlideAtomsSets().length); //remove all slides, corresponding notes should be removed too - for (int i = 0; i < slides.length; i++) { + for (int i = 0; i < slides.size(); i++) { ppt.removeSlide(0); } - assertEquals(0, ppt.getSlides().length); - assertEquals(0, ppt.getNotes().length); + assertEquals(0, ppt.getSlides().size()); + assertEquals(0, ppt.getNotes().size()); assertNull(doc.getSlideSlideListWithText()); assertNull(doc.getNotesSlideListWithText()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java index 1dcd58ca37..12e3ff6c30 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.usermodel; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -73,7 +73,7 @@ public final class TestBugs { HSLFSlideShow ppt = new HSLFSlideShow(hslf); assertTrue("No Exceptions while reading file", true); - assertEquals(1, ppt.getSlides().length); + assertEquals(1, ppt.getSlides().size()); HSLFPictureData[] pict = ppt.getPictureData(); assertEquals(2, pict.length); @@ -91,23 +91,23 @@ public final class TestBugs { HSLFSlideShow ppt = new HSLFSlideShow(hslf); assertTrue("No Exceptions while reading file", true); - assertEquals(2, ppt.getSlides().length); + assertEquals(2, ppt.getSlides().size()); - HSLFTextParagraph txrun; + List txrun; HSLFNotes notes; - notes = ppt.getSlides()[0].getNotesSheet(); + notes = ppt.getSlides().get(0).getNotes(); assertNotNull(notes); - txrun = notes.getTextParagraphs()[0]; - assertEquals("Notes-1", txrun.getRawText()); - assertEquals(false, txrun.getTextRuns()[0].isBold()); + txrun = notes.getTextParagraphs().get(0); + assertEquals("Notes-1", HSLFTextParagraph.getRawText(txrun)); + assertEquals(false, txrun.get(0).getTextRuns().get(0).isBold()); //notes for the second slide are in bold - notes = ppt.getSlides()[1].getNotesSheet(); + notes = ppt.getSlides().get(1).getNotes(); assertNotNull(notes); - txrun = notes.getTextParagraphs()[0]; - assertEquals("Notes-2", txrun.getRawText()); - assertEquals(true, txrun.getTextRuns()[0].isBold()); + txrun = notes.getTextParagraphs().get(0); + assertEquals("Notes-2", HSLFTextParagraph.getRawText(txrun)); + assertEquals(true, txrun.get(0).getTextRuns().get(0).isBold()); } @@ -128,13 +128,12 @@ public final class TestBugs { notesMap.put(Integer.valueOf(7), "Although multiply and square root are easier"); notesMap.put(Integer.valueOf(8), "The bus Z is split into Z_H and Z_L"); - HSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - Integer slideNumber = Integer.valueOf(slide[i].getSlideNumber()); - HSLFNotes notes = slide[i].getNotesSheet(); + for (HSLFSlide slide : ppt.getSlides()) { + Integer slideNumber = Integer.valueOf(slide.getSlideNumber()); + HSLFNotes notes = slide.getNotes(); if (notesMap.containsKey(slideNumber)){ assertNotNull(notes); - String text = notes.getTextParagraphs()[0].getRawText(); + String text = HSLFTextParagraph.getRawText(notes.getTextParagraphs().get(0)); String startingPhrase = notesMap.get(slideNumber); assertTrue("Notes for slide " + slideNumber + " must start with " + startingPhrase , text.startsWith(startingPhrase)); @@ -150,14 +149,12 @@ public final class TestBugs { HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42485.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(hslf); - HSLFShape[] shape = ppt.getSlides()[0].getShapes(); - for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof HSLFGroupShape){ - HSLFGroupShape group = (HSLFGroupShape)shape[i]; - HSLFShape[] sh = group.getShapes(); - for (int j = 0; j < sh.length; j++) { - if( sh[j] instanceof HSLFTextBox){ - HSLFTextBox txt = (HSLFTextBox)sh[j]; + for (HSLFShape shape : ppt.getSlides().get(0).getShapes()) { + if(shape instanceof HSLFGroupShape){ + HSLFGroupShape group = (HSLFGroupShape)shape; + for (HSLFShape sh : group.getShapes()) { + if(sh instanceof HSLFTextBox){ + HSLFTextBox txt = (HSLFTextBox)sh; assertNotNull(txt.getTextParagraphs()); } } @@ -173,14 +170,12 @@ public final class TestBugs { HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42485.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(hslf); - HSLFShape[] shape = ppt.getSlides()[0].getShapes(); - for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof HSLFGroupShape){ - HSLFGroupShape group = (HSLFGroupShape)shape[i]; + for (HSLFShape shape : ppt.getSlides().get(0).getShapes()) { + if(shape instanceof HSLFGroupShape){ + HSLFGroupShape group = (HSLFGroupShape)shape; assertNotNull(group.getAnchor()); - HSLFShape[] sh = group.getShapes(); - for (int j = 0; j < sh.length; j++) { - assertNotNull(sh[j].getAnchor()); + for (HSLFShape sh : group.getShapes()) { + assertNotNull(sh.getAnchor()); } } } @@ -197,28 +192,28 @@ public final class TestBugs { HSLFSlideShow ppt = new HSLFSlideShow(hslf); assertTrue("No Exceptions while reading file", true); - assertEquals(1, ppt.getSlidesMasters().length); - assertEquals(1, ppt.getTitleMasters().length); - HSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - HSLFMasterSheet master = slide[i].getMasterSheet(); - if (i == 0) assertTrue(master instanceof HSLFTitleMaster); //the first slide follows TitleMaster - else assertTrue(master instanceof HSLFSlideMaster); + assertEquals(1, ppt.getSlideMasters().size()); + assertEquals(1, ppt.getTitleMasters().size()); + boolean isFirst = true; + for (HSLFSlide slide : ppt.getSlides()) { + HSLFMasterSheet master = slide.getMasterSheet(); + // the first slide follows TitleMaster + assertTrue(isFirst ? master instanceof HSLFTitleMaster : master instanceof HSLFSlideMaster); + isFirst = false; } } /** * Bug 42486: Failure parsing a seemingly valid PPT */ + @SuppressWarnings("unused") @Test public void bug42486 () throws Exception { HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42486.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(hslf); - HSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - @SuppressWarnings("unused") - HSLFShape[] shape = slide[i].getShapes(); + for (HSLFSlide slide : ppt.getSlides()) { + List shape = slide.getShapes(); } assertTrue("No Exceptions while reading file", true); @@ -233,16 +228,13 @@ public final class TestBugs { HSLFSlideShow ppt = new HSLFSlideShow(hslf); //walk down the tree and see if there were no errors while reading - HSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - HSLFShape[] shape = slide[i].getShapes(); - for (int j = 0; j < shape.length; j++) { - assertNotNull(shape[j].getShapeName()); - if (shape[j] instanceof HSLFGroupShape){ - HSLFGroupShape group = (HSLFGroupShape)shape[j]; - HSLFShape[] comps = group.getShapes(); - for (int k = 0; k < comps.length; k++) { - assertNotNull(comps[k].getShapeName()); + for (HSLFSlide slide : ppt.getSlides()) { + for (HSLFShape shape : slide.getShapes()) { + assertNotNull(shape.getShapeName()); + if (shape instanceof HSLFGroupShape){ + HSLFGroupShape group = (HSLFGroupShape)shape; + for (HSLFShape comps : group.getShapes()) { + assertNotNull(comps.getShapeName()); } } } @@ -255,6 +247,7 @@ public final class TestBugs { /** * Bug 42520: NPE in Picture.getPictureData() */ + @SuppressWarnings("unused") @Test public void bug42520 () throws Exception { HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42520.ppt")); @@ -262,22 +255,17 @@ public final class TestBugs { HSLFSlideShow ppt = new HSLFSlideShow(hslf); //test case from the bug report - HSLFGroupShape shapeGroup = (HSLFGroupShape)ppt.getSlides()[11].getShapes()[10]; - HSLFPictureShape picture = (HSLFPictureShape)shapeGroup.getShapes()[0]; + HSLFGroupShape shapeGroup = (HSLFGroupShape)ppt.getSlides().get(11).getShapes().get(10); + HSLFPictureShape picture = (HSLFPictureShape)shapeGroup.getShapes().get(0); picture.getPictureData(); //walk down the tree and see if there were no errors while reading - HSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - HSLFShape[] shape = slide[i].getShapes(); - for (int j = 0; j < shape.length; j++) { - if (shape[j] instanceof HSLFGroupShape){ - HSLFGroupShape group = (HSLFGroupShape)shape[j]; - HSLFShape[] comps = group.getShapes(); - for (int k = 0; k < comps.length; k++) { - HSLFShape comp = comps[k]; + for (HSLFSlide slide : ppt.getSlides()) { + for (HSLFShape shape : slide.getShapes()) { + if (shape instanceof HSLFGroupShape){ + HSLFGroupShape group = (HSLFGroupShape)shape; + for (HSLFShape comp : group.getShapes()) { if (comp instanceof HSLFPictureShape){ - @SuppressWarnings("unused") HSLFPictureData pict = ((HSLFPictureShape)comp).getPictureData(); } } @@ -299,10 +287,10 @@ public final class TestBugs { assertTrue("No Exceptions while reading file", true); - HSLFSlide[] slide = ppt.getSlides(); - assertEquals(1, slide.length); - HSLFTextParagraph[] runs = slide[0].getTextParagraphs(); - assertEquals(4, runs.length); + List slide = ppt.getSlides(); + assertEquals(1, slide.size()); + List> paras = slide.get(0).getTextParagraphs(); + assertEquals(4, paras.size()); Set txt = new HashSet(); txt.add("\u201CHAPPY BIRTHDAY SCOTT\u201D"); @@ -310,8 +298,8 @@ public final class TestBugs { txt.add("PS Nobody is allowed to hassle Scott TODAY\u2026"); txt.add("Drinks will be in the Boardroom at 5pm today to celebrate Scott\u2019s B\u2019Day\u2026 See you all there!"); - for (int i = 0; i < runs.length; i++) { - String text = runs[i].getRawText(); + for (List para : paras) { + String text = HSLFTextParagraph.getRawText(para); assertTrue(text, txt.contains(text)); } @@ -322,39 +310,37 @@ public final class TestBugs { * ( also fixed followup: getTextRuns() returns no text ) */ @Test - public void bug43781 () throws Exception { + public void bug43781() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("43781.ppt")); assertTrue("No Exceptions while reading file", true); // Check the first slide - HSLFSlide slide = ppt.getSlides()[0]; - HSLFTextParagraph[] slTr = slide.getTextParagraphs(); + HSLFSlide slide = ppt.getSlides().get(0); + List> slTr = slide.getTextParagraphs(); - // Has two text runs, one from slide text, one from drawing - assertEquals(2, slTr.length); - assertEquals(false, slTr[0].isDrawingBased()); - assertEquals(true, slTr[1].isDrawingBased()); - assertEquals("First run", slTr[0].getRawText()); - assertEquals("Second run", slTr[1].getRawText()); + // Has 3 text paragraphs, two from slide text (empty title / filled body), one from drawing + assertEquals(3, slTr.size()); + assertFalse(slTr.get(0).get(0).isDrawingBased()); + assertFalse(slTr.get(1).get(0).isDrawingBased()); + assertTrue(slTr.get(2).get(0).isDrawingBased()); + assertEquals("", HSLFTextParagraph.getRawText(slTr.get(0))); + assertEquals("First run", HSLFTextParagraph.getRawText(slTr.get(1))); + assertEquals("Second run", HSLFTextParagraph.getRawText(slTr.get(2))); // Check the shape based text runs List lst = new ArrayList(); - HSLFShape[] shape = slide.getShapes(); - for (int i = 0; i < shape.length; i++) { - if( shape[i] instanceof HSLFTextShape){ - HSLFTextParagraph textRun = ((HSLFTextShape)shape[i]).getTextParagraphs(); - if(textRun != null) { - lst.add(textRun); - } + for (HSLFShape shape : slide.getShapes()) { + if (shape instanceof HSLFTextShape){ + List textRun = ((HSLFTextShape)shape).getTextParagraphs(); + lst.addAll(textRun); } } - // There should be only one shape based one found - assertEquals(1, lst.size()); - // And it should be the second one - assertEquals("Second run", lst.get(0).getRawText()); + // There are two shapes in the ppt + assertEquals(2, lst.size()); + assertEquals("First runSecond run", HSLFTextParagraph.getRawText(lst)); } /** @@ -364,7 +350,7 @@ public final class TestBugs { public void bug44296 () throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("44296.ppt")); - HSLFSlide slide = ppt.getSlides()[0]; + HSLFSlide slide = ppt.getSlides().get(0); HSLFBackground b = slide.getBackground(); HSLFFill f = b.getFill(); @@ -397,16 +383,16 @@ public final class TestBugs { public void bug41071() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("41071.ppt")); - HSLFSlide slide = ppt.getSlides()[0]; - HSLFShape[] sh = slide.getShapes(); - assertEquals(1, sh.length); - assertTrue(sh[0] instanceof HSLFTextShape); - HSLFTextShape tx = (HSLFTextShape)sh[0]; - assertEquals("Fundera, planera och involvera.", tx.getTextParagraphs().getRawText()); + HSLFSlide slide = ppt.getSlides().get(0); + List sh = slide.getShapes(); + assertEquals(1, sh.size()); + assertTrue(sh.get(0) instanceof HSLFTextShape); + HSLFTextShape tx = (HSLFTextShape)sh.get(0); + assertEquals("Fundera, planera och involvera.", HSLFTextParagraph.getRawText(tx.getTextParagraphs())); - HSLFTextParagraph[] run = slide.getTextParagraphs(); - assertEquals(1, run.length); - assertEquals("Fundera, planera och involvera.", run[0].getRawText()); + List> run = slide.getTextParagraphs(); + assertEquals(3, run.size()); + assertEquals("Fundera, planera och involvera.", HSLFTextParagraph.getRawText(run.get(2))); } /** @@ -429,10 +415,10 @@ public final class TestBugs { public void bug49648() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("49648.ppt")); for(HSLFSlide slide : ppt.getSlides()) { - for(HSLFTextParagraph run : slide.getTextParagraphs()) { - String text = run.getRawText(); + for(List run : slide.getTextParagraphs()) { + String text = HSLFTextParagraph.getRawText(run); text.replace("{txtTot}", "With \u0123\u1234\u5678 unicode"); - run.setRawText(text); + HSLFTextParagraph.setText(run, text); } } } @@ -487,9 +473,9 @@ public final class TestBugs { str = str.replace("$$DATE$$", new Date().toString()); tb.setText(str); - HSLFTextParagraph tr = tb.getTextParagraphs(); - assertEquals(str.length()+1,tr.getStyleTextPropAtom().getParagraphStyles().getFirst().getCharactersCovered()); - assertEquals(str.length()+1,tr.getStyleTextPropAtom().getCharacterStyles().getFirst().getCharactersCovered()); + List tr = tb.getTextParagraphs(); + assertEquals(str.length()+1,tr.get(0).getParagraphStyle().getCharactersCovered()); + assertEquals(str.length()+1,tr.get(0).getTextRuns().get(0).getCharacterStyle().getCharactersCovered()); } } } @@ -500,7 +486,7 @@ public final class TestBugs { HSLFSlideShowImpl ss = new HSLFSlideShowImpl(file.getAbsolutePath()); HSLFSlideShow _show = new HSLFSlideShow(ss); - HSLFSlide[] _slides = _show.getSlides(); + List _slides = _show.getSlides(); /* Iterate over slides and extract text */ for( HSLFSlide slide : _slides ) { @@ -516,8 +502,8 @@ public final class TestBugs { HSLFSlideShowImpl ss = new HSLFSlideShowImpl(file.getAbsolutePath()); HSLFSlideShow _show = new HSLFSlideShow(ss); - HSLFSlide[] _slides = _show.getSlides(); - assertEquals(13, _slides.length); + List _slides = _show.getSlides(); + assertEquals(13, _slides.size()); // Check the number of TextHeaderAtoms on Slide 1 Document dr = _show.getDocumentRecord(); @@ -538,8 +524,8 @@ public final class TestBugs { // Check the number of text runs based on the slide (not textbox) // Will have skipped the empty one int str = 0; - for (HSLFTextParagraph tr : _slides[0].getTextParagraphs()) { - if (! tr.isDrawingBased()) str++; + for (List tr : _slides.get(0).getTextParagraphs()) { + if (! tr.get(0).isDrawingBased()) str++; } assertEquals(1, str); } @@ -549,11 +535,11 @@ public final class TestBugs { InputStream inputStream = new FileInputStream(_slTests.getFile("37625.ppt")); try { HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); - assertEquals(29, slideShow.getSlides().length); + assertEquals(29, slideShow.getSlides().size()); HSLFSlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow); assertNotNull(slideBack); - assertEquals(29, slideBack.getSlides().length); + assertEquals(29, slideBack.getSlides().size()); } finally { inputStream.close(); } @@ -564,11 +550,11 @@ public final class TestBugs { InputStream inputStream = new FileInputStream(_slTests.getFile("57272_corrupted_usereditatom.ppt")); try { HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); - assertEquals(6, slideShow.getSlides().length); + assertEquals(6, slideShow.getSlides().size()); HSLFSlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow); assertNotNull(slideBack); - assertEquals(6, slideBack.getSlides().length); + assertEquals(6, slideBack.getSlides().size()); } finally { inputStream.close(); } @@ -579,9 +565,9 @@ public final class TestBugs { InputStream inputStream = new FileInputStream(_slTests.getFile("49541_symbol_map.ppt")); try { HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); - HSLFSlide slide = slideShow.getSlides()[0]; - HSLFGroupShape sg = (HSLFGroupShape)slide.getShapes()[0]; - HSLFTextBox tb = (HSLFTextBox)sg.getShapes()[0]; + HSLFSlide slide = slideShow.getSlides().get(0); + HSLFGroupShape sg = (HSLFGroupShape)slide.getShapes().get(0); + HSLFTextBox tb = (HSLFTextBox)sg.getShapes().get(0); String text = StringUtil.mapMsCodepointString(tb.getText()); assertEquals("\u226575 years", text); } finally { @@ -608,7 +594,7 @@ public final class TestBugs { InputStream inputStream = new FileInputStream(_slTests.getFile("bug56240.ppt")); try { HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); - int slideCnt = slideShow.getSlides().length; + int slideCnt = slideShow.getSlides().size(); assertEquals(105, slideCnt); ByteArrayOutputStream bos = new ByteArrayOutputStream(); slideShow.write(bos); @@ -623,7 +609,7 @@ public final class TestBugs { InputStream inputStream = new FileInputStream(_slTests.getFile("bug46441.ppt")); try { HSLFSlideShow slideShow = new HSLFSlideShow(inputStream); - HSLFAutoShape as = (HSLFAutoShape)slideShow.getSlides()[0].getShapes()[0]; + HSLFAutoShape as = (HSLFAutoShape)slideShow.getSlides().get(0).getShapes().get(0); EscherOptRecord opt = as.getEscherOptRecord(); EscherArrayProperty ep = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__SHADECOLORS); double exp[][] = { From fd637ce0edfdd87c67796b202636758ed6459db8 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Wed, 20 May 2015 23:07:08 +0000 Subject: [PATCH 10/22] A few text handling related fixes git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1680695 13f79535-47bb-0310-9956-ffa450edef68 --- .../textproperties/TextPropCollection.java | 126 +++++-- .../poi/hslf/record/StyleTextPropAtom.java | 134 ++++--- .../poi/hslf/record/TxMasterStyleAtom.java | 8 +- .../poi/hslf/usermodel/HSLFTextParagraph.java | 326 +++++++++--------- .../poi/hslf/usermodel/HSLFTextRun.java | 7 +- .../apache/poi/hslf/usermodel/TestCounts.java | 34 +- .../poi/hslf/usermodel/TestNotesText.java | 12 +- 7 files changed, 336 insertions(+), 311 deletions(-) diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java index d856614eb3..a5af73b3d3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java @@ -17,11 +17,11 @@ package org.apache.poi.hslf.model.textproperties; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import java.util.*; import org.apache.poi.hslf.record.StyleTextPropAtom; +import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndian; /** @@ -33,8 +33,9 @@ import org.apache.poi.util.LittleEndian; public class TextPropCollection { private int charactersCovered; private short reservedField; - private List textPropList; + private final List textPropList = new ArrayList(); private int maskSpecial = 0; + private final TextProp[] potentialPropList; public int getSpecialMask() { return maskSpecial; } @@ -45,8 +46,7 @@ public class TextPropCollection { /** Fetch the TextProp with this name, or null if it isn't present */ public TextProp findByName(String textPropName) { - for(int i=0; i curProp.getMask()) { - pos++; - } - } - textPropList.add(pos, textProp); + addProp(textProp); return textProp; } + + /** + * Add the property at the correct position. Replaces an existing property with the same name. + * + * @param textProp the property to be added + */ + public void addProp(TextProp textProp) { + assert(textProp != null); + + int pos = 0; + boolean found = false; + for (TextProp curProp : potentialPropList) { + String potName = curProp.getName(); + if (pos == textPropList.size() || potName.equals(textProp.getName())) { + if (textPropList.size() > pos && potName.equals(textPropList.get(pos).getName())) { + // replace existing prop (with same name) + textPropList.set(pos, textProp); + } else { + textPropList.add(pos, textProp); + } + found = true; + break; + } + + if (potName.equals(textPropList.get(pos).getName())) { + pos++; + } + } + + if(!found) { + String err = "TextProp with name " + textProp.getName() + " doesn't belong to this collection."; + throw new IllegalArgumentException(err); + } + } /** * For an existing set of text properties, build the list of * properties coded for in a given run of properties. * @return the number of bytes that were used encoding the properties list */ - public int buildTextPropList(int containsField, TextProp[] potentialProperties, byte[] data, int dataOffset) { + public int buildTextPropList(int containsField, byte[] data, int dataOffset) { int bytesPassed = 0; // For each possible entry, see if we match the mask // If we do, decode that, save it, and shuffle on - for(TextProp tp : potentialProperties) { + for(TextProp tp : potentialPropList) { // Check there's still data left to read // Check if this property is found in the mask @@ -123,7 +151,7 @@ public class TextPropCollection { } prop.setValue(val); bytesPassed += prop.getSize(); - textPropList.add(prop); + addProp(prop); } } @@ -136,20 +164,18 @@ public class TextPropCollection { * or character) which will be groked via a subsequent call to * buildTextPropList(). */ - public TextPropCollection(int charactersCovered, short reservedField) { + public TextPropCollection(int charactersCovered, short reservedField, TextProp[] potentialPropList) { this.charactersCovered = charactersCovered; this.reservedField = reservedField; - textPropList = new ArrayList(); + this.potentialPropList = potentialPropList; } /** * Create a new collection of text properties (be they paragraph * or character) for a run of text without any */ - public TextPropCollection(int textSize) { - charactersCovered = textSize; - reservedField = -1; - textPropList = new ArrayList(); + public TextPropCollection(int textSize, TextProp[] potentialPropList) { + this(textSize, (short)-1, potentialPropList); } /** @@ -158,12 +184,13 @@ public class TextPropCollection { public void copy(TextPropCollection other) { this.charactersCovered = other.charactersCovered; this.reservedField = other.reservedField; + this.maskSpecial = other.maskSpecial; this.textPropList.clear(); for (TextProp tp : other.textPropList) { TextProp tpCopy = (tp instanceof BitMaskTextProp) ? ((BitMaskTextProp)tp).cloneAll() : tp.clone(); - this.textPropList.add(tpCopy); + addProp(tpCopy); } } @@ -178,7 +205,7 @@ public class TextPropCollection { /** * Writes out to disk the header, and then all the properties */ - public void writeOut(OutputStream o, TextProp[] potentialProperties) throws IOException { + public void writeOut(OutputStream o) throws IOException { // First goes the number of characters we affect StyleTextPropAtom.writeLittleEndian(charactersCovered,o); @@ -201,12 +228,17 @@ public class TextPropCollection { StyleTextPropAtom.writeLittleEndian(mask,o); // Then the contents of all the properties - for (TextProp potProp : potentialProperties) { + for (TextProp potProp : potentialPropList) { for(TextProp textProp : textPropList) { if (!textProp.getName().equals(potProp.getName())) continue; int val = textProp.getValue(); - if (textProp instanceof BitMaskTextProp && val == 0) { + if (textProp instanceof BitMaskTextProp && val == 0 + && !(textProp instanceof ParagraphFlagsTextProp) +// && !(textProp instanceof CharFlagsTextProp) + ) { // don't add empty properties, as they can't be recognized while reading + // strangely this doesn't apply for ParagraphFlagsTextProp in contrast + // to the documentation in 2.9.20 TextPFException continue; } else if (textProp.getSize() == 2) { StyleTextPropAtom.writeLittleEndian((short)val,o); @@ -264,4 +296,26 @@ public class TextPropCollection { return true; } + public String toString() { + StringBuilder out = new StringBuilder(); + out.append(" chars covered: " + getCharactersCovered()); + out.append(" special mask flags: 0x" + HexDump.toHex(getSpecialMask()) + "\n"); + for(TextProp p : getTextPropList()) { + out.append(" " + p.getName() + " = " + p.getValue() ); + out.append(" (0x" + HexDump.toHex(p.getValue()) + ")\n"); + } + + out.append(" bytes that would be written: \n"); + + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + writeOut(baos); + byte[] b = baos.toByteArray(); + out.append(HexDump.dump(b, 0, 0)); + } catch (Exception e ) { + e.printStackTrace(); + } + + return out.toString(); + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java index 0e34744682..e2f765723b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java @@ -218,15 +218,23 @@ public final class StyleTextPropAtom extends RecordAtom charStyles = new ArrayList(); TextPropCollection defaultParagraphTextProps = - new TextPropCollection(parentTextSize, (short)0); + new TextPropCollection(parentTextSize, (short)0, paragraphTextPropTypes); + defaultParagraphTextProps.addWithName("paragraph_flags"); paragraphStyles.add(defaultParagraphTextProps); TextPropCollection defaultCharacterTextProps = - new TextPropCollection(parentTextSize); + new TextPropCollection(parentTextSize, characterTextPropTypes); + defaultCharacterTextProps.addWithName("char_flags"); charStyles.add(defaultCharacterTextProps); // Set us as now initialised initialised = true; + + try { + updateRawContents(); + } catch (IOException e) { + throw new RuntimeException(e); + } } @@ -245,10 +253,6 @@ public final class StyleTextPropAtom extends RecordAtom // on the properties updateRawContents(); - // Now ensure that the header size is correct - int newSize = rawContents.length + reserved.length; - LittleEndian.putInt(_header,4,newSize); - // Write out the (new) header out.write(_header); @@ -265,9 +269,14 @@ public final class StyleTextPropAtom extends RecordAtom * contains, so we can go ahead and initialise ourselves. */ public void setParentTextSize(int size) { + // if (initialised) return; + int pos = 0; int textHandled = 0; + paragraphStyles.clear(); + charStyles.clear(); + // While we have text in need of paragraph stylings, go ahead and // grok the contents as paragraph formatting data int prsize = size; @@ -286,9 +295,8 @@ public final class StyleTextPropAtom extends RecordAtom pos += 4; // Now make sense of those properties - TextPropCollection thisCollection = new TextPropCollection(textLen, indent); - int plSize = thisCollection.buildTextPropList( - paraFlags, paragraphTextPropTypes, rawContents, pos); + TextPropCollection thisCollection = new TextPropCollection(textLen, indent, paragraphTextPropTypes); + int plSize = thisCollection.buildTextPropList(paraFlags, rawContents, pos); pos += plSize; // Save this properties set @@ -323,9 +331,8 @@ public final class StyleTextPropAtom extends RecordAtom // Now make sense of those properties // (Assuming we actually have some) - TextPropCollection thisCollection = new TextPropCollection(textLen, no_val); - int chSize = thisCollection.buildTextPropList( - charFlags, characterTextPropTypes, rawContents, pos); + TextPropCollection thisCollection = new TextPropCollection(textLen, no_val, characterTextPropTypes); + int chSize = thisCollection.buildTextPropList(charFlags, rawContents, pos); pos += chSize; // Save this properties set @@ -363,33 +370,32 @@ public final class StyleTextPropAtom extends RecordAtom * Updates the cache of the raw contents. Serialised the styles out. */ private void updateRawContents() throws IOException { - if(!initialised) { - // We haven't groked the styles since creation, so just stick - // with what we found - return; + if (initialised) { + // Only update the style bytes, if the styles have been potentially + // changed + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + // First up, we need to serialise the paragraph properties + for(TextPropCollection tpc : paragraphStyles) { + // ensure, that the paragraphs flags exist, no matter if anthing is set + tpc.addWithName(ParagraphFlagsTextProp.NAME); + tpc.writeOut(baos); + } + + // Now, we do the character ones + for(TextPropCollection tpc : charStyles) { + // ditto for the char flags + tpc.addWithName(CharFlagsTextProp.NAME); + tpc.writeOut(baos); + } + + rawContents = baos.toByteArray(); } - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - // First up, we need to serialise the paragraph properties - for(int i=0; i { protected static POILogger logger = POILogFactory.getLogger(HSLFTextParagraph.class); - + /** * How to align the text */ @@ -44,16 +46,16 @@ public final class HSLFTextParagraph implements TextParagraph { /* package */ static final int AlignCenter = 1; /* package */ static final int AlignRight = 2; /* package */ static final int AlignJustify = 3; - - + + // Note: These fields are protected to help with unit testing // Other classes shouldn't really go playing with them! private final TextHeaderAtom _headerAtom; - private final TextBytesAtom _byteAtom; - private final TextCharsAtom _charAtom; + private TextBytesAtom _byteAtom; + private TextCharsAtom _charAtom; private StyleTextPropAtom _styleAtom; - private TextPropCollection _paragraphStyle = new TextPropCollection(1); - + private TextPropCollection _paragraphStyle = new TextPropCollection(1, StyleTextPropAtom.paragraphTextPropTypes); + protected TextRulerAtom _ruler; protected List _runs = new ArrayList(); protected HSLFTextShape _parentShape; @@ -70,7 +72,7 @@ public final class HSLFTextParagraph implements TextParagraph { /** * Constructs a Text Run from a Unicode text block. - * Either a {@link TextCharsAtom} or a {@link TextBytesAtom} needs to be provided. + * Either a {@link TextCharsAtom} or a {@link TextBytesAtom} needs to be provided. * * @param tha the TextHeaderAtom that defines what's what * @param tba the TextBytesAtom containing the text or null if {@link TextCharsAtom} is provided @@ -105,7 +107,7 @@ public final class HSLFTextParagraph implements TextParagraph { public void addTextRun(HSLFTextRun run) { _runs.add(run); } - + /** * Fetch the rich text runs (runs of text with the same styling) that * are contained within this block of text @@ -117,11 +119,11 @@ public final class HSLFTextParagraph implements TextParagraph { public TextPropCollection getParagraphStyle() { return _paragraphStyle; } - + public void setParagraphStyle(TextPropCollection paragraphStyle) { _paragraphStyle = paragraphStyle; } - + /** * Supply the Sheet we belong to, which might have an assigned SlideShow * Also passes it on to our child RichTextRuns @@ -161,14 +163,14 @@ public final class HSLFTextParagraph implements TextParagraph { } /** - * Sets the index of the paragraph in the SLWT container + * Sets the index of the paragraph in the SLWT container * * @param index */ protected void setIndex(int index) { if (_headerAtom != null) _headerAtom.setIndex(index); } - + /** * Returns the type of the text, from the TextHeaderAtom. * Possible values can be seen from TextHeaderAtom @@ -177,7 +179,7 @@ public final class HSLFTextParagraph implements TextParagraph { public int getRunType() { return (_headerAtom != null) ? _headerAtom.getTextType() : -1; } - + /** * Is this Text Run one from a {@link PPDrawing}, or is it * one from the {@link SlideListWithText}? @@ -208,12 +210,12 @@ public final class HSLFTextParagraph implements TextParagraph { public Record[] getRecords(){ return _records; } - + /** Numbered List info */ public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) { this.styleTextProp9Atom = styleTextProp9Atom; } - + /** Numbered List info */ public StyleTextProp9Atom getStyleTextProp9Atom() { return this.styleTextProp9Atom; @@ -221,7 +223,7 @@ public final class HSLFTextParagraph implements TextParagraph { /** Characters covered */ public StyleTextPropAtom getStyleTextPropAtom() { - return this._styleAtom; + return this._styleAtom; } /** @@ -258,56 +260,14 @@ public final class HSLFTextParagraph implements TextParagraph { public void setParaTextPropVal(String propName, int val) { // Ensure we have the StyleTextProp atom we're going to need if(_paragraphStyle == null) { - ensureStyleAtomPresent(); - // paragraphStyle will now be defined + _styleAtom = findStyleAtomPresent(_headerAtom, -1); + _paragraphStyle = _styleAtom.getParagraphStyles().get(0); } assert(_paragraphStyle!=null); TextProp tp = fetchOrAddTextProp(_paragraphStyle, propName); tp.setValue(val); } - - /** - * Ensure a StyleTextPropAtom is present for this run, - * by adding if required. Normally for internal TextRun use. - */ - protected StyleTextPropAtom ensureStyleAtomPresent() { - if (_styleAtom != null) { - return _styleAtom; - } - - _styleAtom = ensureStyleAtomPresent(_headerAtom, _byteAtom, _charAtom); - _paragraphStyle = _styleAtom.getParagraphStyles().get(0); - - return _styleAtom; - } - - protected static StyleTextPropAtom ensureStyleAtomPresent(TextHeaderAtom header, TextBytesAtom tbytes, TextCharsAtom tchars) { - RecordContainer wrapper = header.getParentRecord(); - StyleTextPropAtom styleAtom = null; - - boolean afterHeader = false; - for (Record record : wrapper.getChildRecords()) { - if (afterHeader && record.getRecordType() == RecordTypes.TextHeaderAtom.typeID) break; - afterHeader |= (header == record); - if (afterHeader && record.getRecordType() == RecordTypes.StyleTextPropAtom.typeID) { - styleAtom = (StyleTextPropAtom)record; - break; - } - } - - if (styleAtom != null) return styleAtom; - - String rawText = (tchars != null) ? tchars.getText() : tbytes.getText(); - - // Create a new one at the right size - styleAtom = new StyleTextPropAtom(rawText.length()+1); - - // Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom - wrapper.addChildAfter(styleAtom, (tbytes == null ? tchars : tbytes)); - - return styleAtom; - } @Override public Iterator iterator() { @@ -325,7 +285,7 @@ public final class HSLFTextParagraph implements TextParagraph { int val = (int)(leftMargin*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); setParaTextPropVal("text.offset", val); } - + @Override public double getRightMargin() { // TODO: find out, how to determine this value @@ -336,7 +296,7 @@ public final class HSLFTextParagraph implements TextParagraph { public void setRightMargin(double rightMargin) { // TODO: find out, how to set this value } - + @Override public double getIndent() { int val = getParaTextPropVal("bullet.offset"); @@ -378,7 +338,7 @@ public final class HSLFTextParagraph implements TextParagraph { } setParaTextPropVal("alignment", alignInt); } - + @Override public org.apache.poi.sl.usermodel.TextParagraph.TextAlign getTextAlign() { switch (getParaTextPropVal("alignment")) { @@ -408,7 +368,7 @@ public final class HSLFTextParagraph implements TextParagraph { @Override public BulletStyle getBulletStyle() { if (getBulletChar() == 0) return null; - + return new BulletStyle() { public String getBulletCharacter() { char chr = HSLFTextParagraph.this.getBulletChar(); @@ -441,7 +401,7 @@ public final class HSLFTextParagraph implements TextParagraph { _parentShape = parentShape; } - + /** * * @return indentation level @@ -622,7 +582,7 @@ public final class HSLFTextParagraph implements TextParagraph { int val = getParaTextPropVal("spaceafter"); return val == -1 ? 0 : val; } - + /** * Returns the named TextProp, either by fetching it (if it exists) or adding it * (if it didn't) @@ -661,7 +621,7 @@ public final class HSLFTextParagraph implements TextParagraph { protected void setFlag(int index, boolean value) { // Ensure we have the StyleTextProp atom we're going to need if(_paragraphStyle == null) { - _paragraphStyle = new TextPropCollection(1); + _paragraphStyle = new TextPropCollection(1, StyleTextPropAtom.paragraphTextPropTypes); } BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(_paragraphStyle, ParagraphFlagsTextProp.NAME); @@ -685,81 +645,120 @@ public final class HSLFTextParagraph implements TextParagraph { } lastRun = ltr.get(ltr.size()-1); assert(lastRun.getRawText() != null); - } + } } - + + /** + * Search for a StyleTextPropAtom is for this text header (list of paragraphs) + * + * @param header the header + * @param textLen the length of the rawtext, or -1 if the length is not known + */ + private static StyleTextPropAtom findStyleAtomPresent(TextHeaderAtom header, int textLen) { + boolean afterHeader = false; + StyleTextPropAtom style = null; + for (Record record : header.getParentRecord().getChildRecords()) { + if (afterHeader && record.getRecordType() == RecordTypes.TextHeaderAtom.typeID) { + // already on the next header, quit searching + break; + } + afterHeader |= (header == record); + if (afterHeader && record.getRecordType() == RecordTypes.StyleTextPropAtom.typeID) { + // found it + style = (StyleTextPropAtom)record; + } + } + + if (style == null) { + logger.log(POILogger.INFO, "styles atom doesn't exist. Creating dummy record for later saving."); + style = new StyleTextPropAtom((textLen < 0) ? 1 : textLen); + } else { + if (textLen >= 0) { + style.setParentTextSize(textLen); + } + } + + return style; + } + + /** * Saves the modified paragraphs/textrun to the records. * Also updates the styles to the correct text length. */ protected static void storeText(List paragraphs) { fixLineEndings(paragraphs); - + String rawText = toInternalString(getRawText(paragraphs)); // Will it fit in a 8 bit atom? boolean isUnicode = StringUtil.hasMultibyte(rawText); - + // isUnicode = true; + TextHeaderAtom headerAtom = paragraphs.get(0)._headerAtom; TextBytesAtom byteAtom = paragraphs.get(0)._byteAtom; TextCharsAtom charAtom = paragraphs.get(0)._charAtom; + StyleTextPropAtom styleAtom = findStyleAtomPresent(headerAtom, rawText.length()); // Store in the appropriate record Record oldRecord = null, newRecord = null; - if (isUnicode) { - if (byteAtom != null) { + if (isUnicode) { + if (byteAtom != null || charAtom == null) { oldRecord = byteAtom; - newRecord = charAtom = new TextCharsAtom(); + charAtom = new TextCharsAtom(); } + newRecord = charAtom; charAtom.setText(rawText); } else { - if (charAtom != null) { + if (charAtom != null || byteAtom == null) { oldRecord = charAtom; - newRecord = byteAtom = new TextBytesAtom(); + byteAtom = new TextBytesAtom(); } + newRecord = byteAtom; byte[] byteText = new byte[rawText.length()]; StringUtil.putCompressedUnicode(rawText,byteText,0); byteAtom.setText(byteText); } - - RecordContainer _txtbox = headerAtom.getParentRecord(); + assert(newRecord != null); - if (oldRecord != null) { - // swap not appropriated records - Record[] cr = _txtbox.getChildRecords(); - int idx=0; - for (Record r : cr) { - if(r.equals(oldRecord)) break; - idx++; - } - if (idx >= cr.length) { - throw new RuntimeException("child record not found - malformed container record"); - } - cr[idx] = newRecord; - - if (newRecord == byteAtom) { - charAtom = null; - } else { - byteAtom = null; - } + RecordContainer _txtbox = headerAtom.getParentRecord(); + Record[] cr = _txtbox.getChildRecords(); + int headerIdx = -1, textIdx = -1, styleIdx = -1; + for (int i=0; i { lastRTPC.updateTextSize(lastRTPC.getCharactersCovered()+len); } } - + assert(lastPTPC != null && lastRTPC != null && ptpc != null && rtpc != null); ptpc.updateTextSize(ptpc.getCharactersCovered()+1); rtpc.updateTextSize(rtpc.getCharactersCovered()+1); lastPTPC.updateTextSize(lastPTPC.getCharactersCovered()+1); lastRTPC.updateTextSize(lastRTPC.getCharactersCovered()+1); - + /** * If TextSpecInfoAtom is present, we must update the text size in it, * otherwise the ppt will be corrupted @@ -803,7 +802,7 @@ public final class HSLFTextParagraph implements TextParagraph { /** * Adds the supplied text onto the end of the TextParagraphs, * creating a new RichTextRun for it to sit in. - * + * * @param text the text string used by this object. */ protected static HSLFTextRun appendText(List paragraphs, String text, boolean newParagraph) { @@ -811,14 +810,10 @@ public final class HSLFTextParagraph implements TextParagraph { // check paragraphs assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); - + HSLFTextParagraph htp = paragraphs.get(paragraphs.size()-1); HSLFTextRun htr = htp.getTextRuns().get(htp.getTextRuns().size()-1); - if (newParagraph) { - htr.setText(htr.getRawText()+"\n"); - } - boolean isFirst = !newParagraph; for (String rawText : text.split("(?<=\r)")) { if (!isFirst) { @@ -832,6 +827,7 @@ public final class HSLFTextParagraph implements TextParagraph { paragraphs.add(htp); isFirst = false; } + TextPropCollection tpc = htr.getCharacterStyle(); // special case, last text run is empty, we will reuse it if (htr.getLength() > 0) { @@ -841,21 +837,19 @@ public final class HSLFTextParagraph implements TextParagraph { } htr.setText(rawText); } - - storeText(paragraphs); + storeText(paragraphs); + return htr; } - + /** * Sets (overwrites) the current text. * Uses the properties of the first paragraph / textrun - * + * * @param text the text string used by this object. */ public static HSLFTextRun setText(List paragraphs, String text) { - text = HSLFTextParagraph.toInternalString(text); - // check paragraphs assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); @@ -866,7 +860,7 @@ public final class HSLFTextParagraph implements TextParagraph { paraIter.next(); paraIter.remove(); } - + Iterator runIter = htp.getTextRuns().iterator(); HSLFTextRun htr = runIter.next(); htr.setText(""); @@ -875,10 +869,10 @@ public final class HSLFTextParagraph implements TextParagraph { runIter.next(); runIter.remove(); } - + return appendText(paragraphs, text, false); } - + public static String getRawText(List paragraphs) { StringBuilder sb = new StringBuilder(); for (HSLFTextParagraph p : paragraphs) { @@ -886,9 +880,9 @@ public final class HSLFTextParagraph implements TextParagraph { sb.append(r.getRawText()); } } - return sb.toString(); + return sb.toString(); } - + /** * Returns a new string with line breaks converted into internal ppt * representation @@ -948,7 +942,7 @@ public final class HSLFTextParagraph implements TextParagraph { * @param found vector to add any found to */ protected static List> findTextParagraphs(final Record[] records) { - return findTextParagraphs(records, null); + return findTextParagraphs(records, null); } /** * Scans through the supplied record array, looking for @@ -980,41 +974,40 @@ public final class HSLFTextParagraph implements TextParagraph { */ protected static List> findTextParagraphs(Record[] records, StyleTextProp9Atom styleTextProp9Atom) { List> paragraphCollection = new ArrayList>(); - + if (records == null) { throw new NullPointerException("records need to be filled."); } - + int recordIdx; for (recordIdx = 0; recordIdx < records.length; recordIdx++) { if (records[recordIdx] instanceof TextHeaderAtom) break; } - + if (recordIdx == records.length) { logger.log(POILogger.INFO, "No text records found."); return paragraphCollection; } - + for (int slwtIndex = 0; recordIdx < records.length; slwtIndex++) { List paragraphs = new ArrayList(); paragraphCollection.add(paragraphs); - + TextHeaderAtom header = (TextHeaderAtom)records[recordIdx++]; TextBytesAtom tbytes = null; TextCharsAtom tchars = null; - StyleTextPropAtom styles = null; TextRulerAtom ruler = null; MasterTextPropAtom indents = null; - + List otherRecordList = new ArrayList(); - + for (; recordIdx < records.length; recordIdx++) { Record r = records[recordIdx]; long rt = r.getRecordType(); if (RecordTypes.TextHeaderAtom.typeID == rt) break; else if (RecordTypes.TextBytesAtom.typeID == rt) tbytes = (TextBytesAtom)r; else if (RecordTypes.TextCharsAtom.typeID == rt) tchars = (TextCharsAtom)r; - else if (RecordTypes.StyleTextPropAtom.typeID == rt) styles = (StyleTextPropAtom)r; + // don't search for RecordTypes.StyleTextPropAtom.typeID here ... see findStyleAtomPresent below else if (RecordTypes.TextRulerAtom.typeID == rt) ruler = (TextRulerAtom)r; else if (RecordTypes.MasterTextPropAtom.typeID == rt) { indents = (MasterTextPropAtom)r; @@ -1023,23 +1016,24 @@ public final class HSLFTextParagraph implements TextParagraph { otherRecordList.add(r); } } - + assert(header != null); if (header.getParentRecord() instanceof SlideListWithText) { // runs found in PPDrawing are not linked with SlideListWithTexts header.setIndex(slwtIndex); } - + Record otherRecords[] = otherRecordList.toArray(new Record[otherRecordList.size()]); - + if (tbytes == null && tchars == null) { tbytes = new TextBytesAtom(); - header.getParentRecord().addChildAfter(tbytes, header); + // header.getParentRecord().addChildAfter(tbytes, header); logger.log(POILogger.INFO, "bytes nor chars atom doesn't exist. Creating dummy record for later saving."); } - + String rawText = (tchars != null) ? tchars.getText() : tbytes.getText(); - + StyleTextPropAtom styles = findStyleAtomPresent(header, rawText.length()); + // split, but keep delimiter for (String para : rawText.split("(?<=\r)")) { HSLFTextParagraph tpara = new HSLFTextParagraph(header, tbytes, tchars, styles); @@ -1048,32 +1042,26 @@ public final class HSLFTextParagraph implements TextParagraph { tpara._ruler = ruler; tpara._records = otherRecords; tpara.getParagraphStyle().updateTextSize(para.length()); - + HSLFTextRun trun = new HSLFTextRun(tpara); tpara.addTextRun(trun); trun.setText(para); } - - if (styles == null) { - styles = ensureStyleAtomPresent(header, tbytes, tchars); - } else { - styles.setParentTextSize(rawText.length()); - } - + applyCharacterStyles(paragraphs, styles.getCharacterStyles()); applyParagraphStyles(paragraphs, styles.getParagraphStyles()); if (indents != null) { applyParagraphIndents(paragraphs, indents.getIndents()); } } - + return paragraphCollection; } protected static void applyCharacterStyles(List paragraphs, List charStyles) { int paraIdx = 0, runIdx = 0; HSLFTextRun trun; - + for (int csIdx=0; csIdx { List runs = para.getTextRuns(); trun = runs.get(runIdx); int len = trun.getLength(); - + if (ccRun+len <= ccStyle) { ccRun += len; } else { String text = trun.getRawText(); trun.setText(text.substring(0,ccStyle-ccRun)); - + HSLFTextRun nextRun = new HSLFTextRun(para); nextRun.setText(text.substring(ccStyle-ccRun)); runs.add(runIdx+1, nextRun); - + ccRun += ccStyle-ccRun; } - TextPropCollection pCopy = new TextPropCollection(0); + TextPropCollection pCopy = new TextPropCollection(0, StyleTextPropAtom.characterTextPropTypes); pCopy.copy(p); trun.setCharacterStyle(pCopy); @@ -1113,7 +1101,7 @@ public final class HSLFTextParagraph implements TextParagraph { } } pCopy.updateTextSize(len); - + // need to compare it again, in case a run has been added after if (++runIdx == runs.size()) { paraIdx++; @@ -1122,14 +1110,14 @@ public final class HSLFTextParagraph implements TextParagraph { } } } - + protected static void applyParagraphStyles(List paragraphs, List paraStyles) { int paraIdx = 0; for (TextPropCollection p : paraStyles) { for (int ccPara = 0, ccStyle = p.getCharactersCovered(); ccPara < ccStyle; paraIdx++) { if (paraIdx >= paragraphs.size() || ccPara >= ccStyle-1) return; HSLFTextParagraph htp = paragraphs.get(paraIdx); - TextPropCollection pCopy = new TextPropCollection(0); + TextPropCollection pCopy = new TextPropCollection(0, StyleTextPropAtom.paragraphTextPropTypes); pCopy.copy(p); htp.setParagraphStyle(pCopy); int len = 0; @@ -1142,7 +1130,7 @@ public final class HSLFTextParagraph implements TextParagraph { } } } - + protected static void applyParagraphIndents(List paragraphs, List paraStyles) { int paraIdx = 0; for (IndentProp p : paraStyles) { @@ -1157,23 +1145,23 @@ public final class HSLFTextParagraph implements TextParagraph { } } } - + protected static List createEmptyParagraph() { EscherTextboxWrapper wrapper = new EscherTextboxWrapper(); - + TextHeaderAtom tha = new TextHeaderAtom(); tha.setParentRecord(wrapper); wrapper.appendChildRecord(tha); - + TextBytesAtom tba = new TextBytesAtom(); tba.setText("\r".getBytes()); wrapper.appendChildRecord(tba); - + StyleTextPropAtom sta = new StyleTextPropAtom(1); TextPropCollection paraStyle = sta.addParagraphTextPropCollection(1); TextPropCollection charStyle = sta.addCharacterTextPropCollection(1); wrapper.appendChildRecord(sta); - + HSLFTextParagraph htp = new HSLFTextParagraph(tha, tba, null, sta); htp.setParagraphStyle(paraStyle); htp._records = new Record[0]; @@ -1182,16 +1170,16 @@ public final class HSLFTextParagraph implements TextParagraph { htp.setLeftMargin(0); htp.setIndent(0); // set wrap flags - + HSLFTextRun htr = new HSLFTextRun(htp); htr.setCharacterStyle(charStyle); htr.setText("\r"); htr.setFontColor(Color.black); htp.addTextRun(htr); - + return Arrays.asList(htp); } - + public EscherTextboxWrapper getTextboxWrapper() { return (EscherTextboxWrapper)_headerAtom.getParentRecord(); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index d06715b173..b4da12c4dc 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -23,6 +23,7 @@ import java.awt.Color; import org.apache.poi.hslf.model.textproperties.*; import org.apache.poi.hslf.record.ColorSchemeAtom; +import org.apache.poi.hslf.record.StyleTextPropAtom; import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -44,7 +45,7 @@ public final class HSLFTextRun implements TextRun { * Our paragraph and character style. * Note - we may share these styles with other RichTextRuns */ - private TextPropCollection characterStyle = new TextPropCollection(0); + private TextPropCollection characterStyle = new TextPropCollection(0, StyleTextPropAtom.characterTextPropTypes); /** * Create a new wrapper around a rich text string @@ -163,7 +164,7 @@ public final class HSLFTextRun implements TextRun { public void setCharTextPropVal(String propName, int val) { // Ensure we have the StyleTextProp atom we're going to need if(characterStyle == null) { - characterStyle = new TextPropCollection(1); + characterStyle = new TextPropCollection(1, StyleTextPropAtom.characterTextPropTypes); // characterStyle will now be defined } @@ -376,7 +377,7 @@ public final class HSLFTextRun implements TextRun { protected void setFlag(int index, boolean value) { // Ensure we have the StyleTextProp atom we're going to need if (characterStyle == null) { - characterStyle = new TextPropCollection(1); + characterStyle = new TextPropCollection(1, StyleTextPropAtom.characterTextPropTypes); } BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(characterStyle, CharFlagsTextProp.NAME); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java index dbee82742f..cb51595f57 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java @@ -18,10 +18,10 @@ package org.apache.poi.hslf.usermodel; +import java.util.List; + import junit.framework.TestCase; -import org.apache.poi.hslf.*; -import org.apache.poi.hslf.model.*; import org.apache.poi.POIDataSamples; /** @@ -40,39 +40,39 @@ public final class TestCounts extends TestCase { } public void testSheetsCount() { - HSLFSlide[] slides = ss.getSlides(); + List slides = ss.getSlides(); // Two sheets - master sheet is separate - assertEquals(2, slides.length); + assertEquals(2, slides.size()); // They are slides 1+2 - assertEquals(1, slides[0].getSlideNumber()); - assertEquals(2, slides[1].getSlideNumber()); + assertEquals(1, slides.get(0).getSlideNumber()); + assertEquals(2, slides.get(1).getSlideNumber()); // The ref IDs are 4 and 6 - assertEquals(4, slides[0]._getSheetRefId()); - assertEquals(6, slides[1]._getSheetRefId()); + assertEquals(4, slides.get(0)._getSheetRefId()); + assertEquals(6, slides.get(1)._getSheetRefId()); // These are slides 1+2 -> 256+257 - assertEquals(256, slides[0]._getSheetNumber()); - assertEquals(257, slides[1]._getSheetNumber()); + assertEquals(256, slides.get(0)._getSheetNumber()); + assertEquals(257, slides.get(1)._getSheetNumber()); } public void testNotesCount() { - HSLFNotes[] notes = ss.getNotes(); + List notes = ss.getNotes(); // Two sheets -> two notes // Note: there are also notes on the slide master //assertEquals(3, notes.length); // When we do slide masters - assertEquals(2, notes.length); + assertEquals(2, notes.size()); // First is for master - //assertEquals(-2147483648, notes[0]._getSheetNumber()); // When we do slide masters + //assertEquals(-2147483648, notes.get(0)._getSheetNumber()); // When we do slide masters // Next two are for the two slides - assertEquals(256, notes[0]._getSheetNumber()); - assertEquals(257, notes[1]._getSheetNumber()); + assertEquals(256, notes.get(0)._getSheetNumber()); + assertEquals(257, notes.get(1)._getSheetNumber()); // They happen to go between the two slides in Ref terms - assertEquals(5, notes[0]._getSheetRefId()); - assertEquals(7, notes[1]._getSheetRefId()); + assertEquals(5, notes.get(0)._getSheetRefId()); + assertEquals(7, notes.get(1)._getSheetRefId()); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java index 570fb5883a..8713c09d07 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java @@ -40,21 +40,21 @@ public final class TestNotesText extends TestCase { } public void testNotesOne() { - HSLFNotes notes = ss.getNotes()[0]; + HSLFNotes notes = ss.getNotes().get(0); String[] expectText = new String[] {"These are the notes for page 1"}; - assertEquals(expectText.length, notes.getTextParagraphs().length); + assertEquals(expectText.length, notes.getTextParagraphs().size()); for(int i=0; i Date: Sat, 23 May 2015 22:07:05 +0000 Subject: [PATCH 11/22] Creating a new slideshow and manipulating existing ones works again :) git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1681389 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hslf/examples/ApacheconEU08.java | 228 +++++++++--------- .../model/textproperties/BitMaskTextProp.java | 45 +++- .../textproperties/CharFlagsTextProp.java | 15 +- .../textproperties/TextPropCollection.java | 201 +++++++++++---- .../poi/hslf/record/StyleTextPropAtom.java | 88 +------ .../poi/hslf/record/TxMasterStyleAtom.java | 81 ++----- .../poi/hslf/usermodel/HSLFSlideMaster.java | 4 +- .../poi/hslf/usermodel/HSLFTextParagraph.java | 35 ++- .../poi/hslf/usermodel/HSLFTextRun.java | 16 +- 9 files changed, 361 insertions(+), 352 deletions(-) diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java index 384da258e7..3397278737 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java +++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java @@ -20,6 +20,7 @@ package org.apache.poi.hslf.examples; import java.awt.*; import java.io.FileOutputStream; import java.io.IOException; +import java.util.List; import org.apache.poi.hslf.model.*; import org.apache.poi.hslf.record.TextHeaderAtom; @@ -113,33 +114,29 @@ public final class ApacheconEU08 { slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(28); box2.setRunType(TextHeaderAtom.BODY_TYPE); box2.setText( - "HSLF provides a way to read, create and modify MS PowerPoint presentations\r" + - "Pure Java API - you don't need PowerPoint to read and write *.ppt files\r" + - "Comprehensive support of PowerPoint objects"); - box2.setAnchor(new Rectangle(36, 80, 648, 200)); - slide.addShape(box2); - - HSLFTextBox box3 = new HSLFTextBox(); - box2.getTextParagraphs().get(0).setIndentLevel(1); - box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(24); - box3.setRunType(TextHeaderAtom.BODY_TYPE); - box3.setText( + "HSLF provides a way to read, create and modify MS PowerPoint presentations\r" + + "Pure Java API - you don't need PowerPoint to read and write *.ppt files\r" + + "Comprehensive support of PowerPoint objects\r" + "Rich text\r" + "Tables\r" + "Shapes\r" + "Pictures\r" + - "Master slides"); - box3.setAnchor(new Rectangle(36, 265, 648, 150)); - slide.addShape(box3); + "Master slides\r" + + "Access to low level data structures" + ); - HSLFTextBox box4 = new HSLFTextBox(); - box4.setRunType(TextHeaderAtom.BODY_TYPE); - box4.setText("Access to low level data structures"); - box4.setAnchor(new Rectangle(36, 430, 648, 50)); - slide.addShape(box4); + List tp = box2.getTextParagraphs(); + for (int i : new byte[]{0,1,2,8}) { + tp.get(i).getTextRuns().get(0).setFontSize(28); + } + for (int i : new byte[]{3,4,5,6,7}) { + tp.get(i).getTextRuns().get(0).setFontSize(24); + tp.get(i).setIndentLevel(1); + } + box2.setAnchor(new Rectangle(36, 80, 648, 400)); + slide.addShape(box2); } public static void slide4(HSLFSlideShow ppt) throws IOException { @@ -238,40 +235,41 @@ public final class ApacheconEU08 { rt3.setFontName("Courier New"); rt3.setFontSize(8); box3.setText( - " SlideShow ppt = new SlideShow();\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" + - " FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\r" + - " ppt.write(out);\r" + - " out.close();"); + "SlideShow ppt = new SlideShow();\u000b" + + "Slide slide = ppt.createSlide();\u000b" + + "\u000b" + + "TextBox box2 = new TextBox();\u000b" + + "box2.setHorizontalAlignment(TextBox.AlignCenter);\u000b" + + "box2.setVerticalAlignment(TextBox.AnchorMiddle);\u000b" + + "box2.getTextRun().setText(\"Java Code\");\u000b" + + "box2.getFill().setForegroundColor(new Color(187, 224, 227));\u000b" + + "box2.setLineColor(Color.black);\u000b" + + "box2.setLineWidth(0.75);\u000b" + + "box2.setAnchor(new Rectangle(66, 243, 170, 170));\u000b" + + "slide.addShape(box2);\u000b" + + "\u000b" + + "TextBox box3 = new TextBox();\u000b" + + "box3.setHorizontalAlignment(TextBox.AlignCenter);\u000b" + + "box3.setVerticalAlignment(TextBox.AnchorMiddle);\u000b" + + "box3.getTextRun().setText(\"*.ppt file\");\u000b" + + "box3.setLineWidth(0.75);\u000b" + + "box3.setLineColor(Color.black);\u000b" + + "box3.getFill().setForegroundColor(new Color(187, 224, 227));\u000b" + + "box3.setAnchor(new Rectangle(473, 243, 170, 170));\u000b" + + "slide.addShape(box3);\u000b" + + "\u000b" + + "AutoShape box4 = new AutoShape(ShapeTypes.Arrow);\u000b" + + "box4.getFill().setForegroundColor(new Color(187, 224, 227));\u000b" + + "box4.setLineWidth(0.75);\u000b" + + "box4.setLineColor(Color.black);\u000b" + + "box4.setAnchor(new Rectangle(253, 288, 198, 85));\u000b" + + "slide.addShape(box4);\u000b" + + "\u000b" + + "FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\u000b" + + "ppt.write(out);\u000b" + + "out.close();"); box3.setAnchor(new Rectangle(30, 150, 618, 411)); + box3.setHorizontalCentered(true); slide.addShape(box3); } @@ -346,45 +344,46 @@ public final class ApacheconEU08 { rt3.setFontName("Courier New"); rt3.setFontSize(8); box3.setText( - " //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" + - " SlideShow ppt = new SlideShow();\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" + - " FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\r" + - " ppt.write(out);\r" + - " out.close();"); + "//bar chart data. The first value is the bar color, the second is the width\u000b" + + "Object[] def = new Object[]{\u000b" + + " Color.yellow, new Integer(100),\u000b" + + " Color.green, new Integer(150),\u000b" + + " Color.gray, new Integer(75),\u000b" + + " Color.red, new Integer(200),\u000b" + + "};\u000b" + + "\u000b" + + "SlideShow ppt = new SlideShow();\u000b" + + "Slide slide = ppt.createSlide();\u000b" + + "\u000b" + + "ShapeGroup group = new ShapeGroup();\u000b" + + "//define position of the drawing in the slide\u000b" + + "Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);\u000b" + + "group.setAnchor(bounds);\u000b" + + "slide.addShape(group);\u000b" + + "Graphics2D graphics = new PPGraphics2D(group);\u000b" + + "\u000b" + + "//draw a simple bar graph\u000b" + + "int x = bounds.x + 50, y = bounds.y + 50;\u000b" + + "graphics.setFont(new Font(\"Arial\", Font.BOLD, 10));\u000b" + + "for (int i = 0, idx = 1; i < def.length; i+=2, idx++) {\u000b" + + " graphics.setColor(Color.black);\u000b" + + " int width = ((Integer)def[i+1]).intValue();\u000b" + + " graphics.drawString(\"Q\" + idx, x-20, y+20);\u000b" + + " graphics.drawString(width + \"%\", x + width + 10, y + 20);\u000b" + + " graphics.setColor((Color)def[i]);\u000b" + + " graphics.fill(new Rectangle(x, y, width, 30));\u000b" + + " y += 40;\u000b" + + "}\u000b" + + "graphics.setColor(Color.black);\u000b" + + "graphics.setFont(new Font(\"Arial\", Font.BOLD, 14));\u000b" + + "graphics.draw(bounds);\u000b" + + "graphics.drawString(\"Performance\", x + 70, y + 40);\u000b" + + "\u000b" + + "FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\u000b" + + "ppt.write(out);\u000b" + + "out.close();"); box3.setAnchor(new Rectangle(96, 110, 499, 378)); + box3.setHorizontalCentered(true); slide.addShape(box3); } @@ -435,38 +434,27 @@ public final class ApacheconEU08 { slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32); box2.setRunType(TextHeaderAtom.BODY_TYPE); box2.setText( - "Support for more PowerPoint functionality\r" + - "Rendering slides into java.awt.Graphics2D"); - box2.setAnchor(new Rectangle(36, 126, 648, 100)); - slide.addShape(box2); - - HSLFTextBox box3 = new HSLFTextBox(); - box3.getTextParagraphs().get(0).setIndentLevel(1); - box3.setRunType(TextHeaderAtom.BODY_TYPE); - box3.setText( - "A way to export slides into images or other formats"); - box3.setAnchor(new Rectangle(36, 220, 648, 70)); - slide.addShape(box3); - - HSLFTextBox box4 = new HSLFTextBox(); - box4.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32); - box4.setRunType(TextHeaderAtom.BODY_TYPE); - box4.setText( - "Integration with Apache FOP - Formatting Objects Processor"); - box4.setAnchor(new Rectangle(36, 290, 648, 90)); - slide.addShape(box4); - - HSLFTextBox box5 = new HSLFTextBox(); - box5.getTextParagraphs().get(0).setIndentLevel(1); - box5.setRunType(TextHeaderAtom.BODY_TYPE); - box5.setText( + "Support for more PowerPoint functionality\r" + + "Rendering slides into java.awt.Graphics2D\r" + + "A way to export slides into images or other formats\r" + + "Integration with Apache FOP - Formatting Objects Processor\r" + "Transformation of XSL-FO into PPT\r" + - "PPT2PDF transcoder"); - box5.setAnchor(new Rectangle(36, 380, 648, 100)); - slide.addShape(box5); + "PPT2PDF transcoder" + ); + + List tp = box2.getTextParagraphs(); + for (int i : new byte[]{0,1,3}) { + tp.get(i).getTextRuns().get(0).setFontSize(28); + } + for (int i : new byte[]{2,4,5}) { + tp.get(i).getTextRuns().get(0).setFontSize(24); + tp.get(i).setIndentLevel(1); + } + + box2.setAnchor(new Rectangle(36, 126, 648, 400)); + slide.addShape(box2); } public static void slide12(HSLFSlideShow ppt) throws IOException { diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java index e688f9959d..15fdc1991f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java @@ -48,26 +48,42 @@ public abstract class BitMaskTextProp extends TextProp implements Cloneable { } /** - * As we're purely mask based, just set flags for stuff - * that is set + * Calculate mask from the subPropMatches. */ public int getWriteMask() { - return dataValue; + /* + * The dataValue can't be taken as a mask, as sometimes certain properties + * are explicitly set to false, i.e. the mask says the property is defined + * but in the actually nibble the property is set to false + */ + int mask = 0, i = 0; + for (int subMask : subPropMasks) { + if (subPropMatches[i++]) mask |= subMask; + } + return mask; + } + + public void setWriteMask(int containsField) { + int i = 0; + for (int subMask : subPropMasks) { + if ((containsField & subMask) != 0) subPropMatches[i] = true; + i++; + } } /** * Set the value of the text property, and recompute the sub - * properties based on it + * properties based on it, i.e. all unset subvalues won't be saved. + * Use {@link #setSubValue(boolean, int)} to explicitly set subvalues to {@code false}. */ + @Override public void setValue(int val) { dataValue = val; // Figure out the values of the sub properties - for(int i=0; i< subPropMatches.length; i++) { - subPropMatches[i] = false; - if((dataValue & subPropMasks[i]) != 0) { - subPropMatches[i] = true; - } + int i = 0; + for(int mask : subPropMasks) { + subPropMatches[i++] = ((val & mask) != 0); } } @@ -75,16 +91,19 @@ public abstract class BitMaskTextProp extends TextProp implements Cloneable { * Fetch the true/false status of the subproperty with the given index */ public boolean getSubValue(int idx) { - return subPropMatches[idx]; + return (dataValue & subPropMasks[idx]) != 0; } /** * Set the true/false status of the subproperty with the given index */ public void setSubValue(boolean value, int idx) { - if (subPropMatches[idx] == value) return; - subPropMatches[idx] = value; - dataValue ^= subPropMasks[idx]; + subPropMatches[idx] = true; + if (value) { + dataValue |= subPropMasks[idx]; + } else { + dataValue &= ~subPropMasks[idx]; + } } @Override diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java index 1afd6b1810..54f1cbf382 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java @@ -34,20 +34,23 @@ public class CharFlagsTextProp extends BitMaskTextProp { public static final String NAME = "char_flags"; public CharFlagsTextProp() { - super(2,0xffff, NAME, new String[] { + super(2, 0xffff, NAME, new String[] { "bold", // 0x0001 A bit that specifies whether the characters are bold. "italic", // 0x0002 A bit that specifies whether the characters are italicized. "underline", // 0x0004 A bit that specifies whether the characters are underlined. - "char_unknown_1", // 0x0008 Undefined and MUST be ignored. + "unused1", // 0x0008 Undefined and MUST be ignored. "shadow", // 0x0010 A bit that specifies whether the characters have a shadow effect. "fehint", // 0x0020 A bit that specifies whether characters originated from double-byte input. - "char_unknown_2", // 0x0040 Undefined and MUST be ignored. + "unused2", // 0x0040 Undefined and MUST be ignored. "kumi", // 0x0080 A bit that specifies whether Kumimoji are used for vertical text. "strikethrough", // 0x0100 Undefined and MUST be ignored. "emboss", // 0x0200 A bit that specifies whether the characters are embossed. - "char_unknown_3", // 0x0400 Undefined and MUST be ignored. - "char_unknown_4", // 0x0800 Undefined and MUST be ignored. - "char_unknown_5", // 0x1000 Undefined and MUST be ignored. + "pp9rt_1", // 0x0400 An unsigned integer that specifies the run grouping of additional text properties in StyleTextProp9Atom record. + "pp9rt_2", // 0x0800 + "pp9rt_3", // 0x1000 + "pp9rt_4", // 0x2000 + "unused4_1", // 0x4000 Undefined and MUST be ignored. + "unused4_2", // 0x8000 Undefined and MUST be ignored. } ); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java index a5af73b3d3..2c8fd1dbf1 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java @@ -28,15 +28,128 @@ import org.apache.poi.util.LittleEndian; * For a given run of characters, holds the properties (which could * be paragraph properties or character properties). * Used to hold the number of characters affected, the list of active - * properties, and the random reserved field if required. + * properties, and the indent level if required. */ public class TextPropCollection { - private int charactersCovered; - private short reservedField; + /* + private static TextProp paragraphSpecialPropTypes[] = { + new ParagraphFlagsTextProp(), + new TextProp(2, 0x80, "bullet.char"), + new TextProp(2, 0x10, "bullet.font"), + new TextProp(2, 0x40, "bullet.size"), + new TextProp(4, 0x20, "bullet.color"), + new TextProp(2, 0xD00, "alignment"), + new TextProp(2, 0x1000, "linespacing"), + new TextProp(2, 0x2000, "spacebefore"), + new TextProp(2, 0x4000, "spaceafter"), + new TextProp(2, 0x8000, "text.offset"), + new TextProp(2, 0x10000, "bullet.offset"), + new TextProp(2, 0x20000, "defaulttab"), + new TextProp(2, 0x40000, "para_unknown_2"), + new TextProp(2, 0x80000, "para_unknown_3"), + new TextProp(2, 0x100000, "para_unknown_4"), + new TextProp(2, 0x200000, "para_unknown_5") + }; + + private static TextProp characterSpecialPropTypes[] = { + new CharFlagsTextProp(), + new TextProp(2, 0x10000, "font.index"), + new TextProp(2, 0x20000, "char_unknown_1"), + new TextProp(4, 0x40000, "char_unknown_2"), + new TextProp(2, 0x80000, "font.size"), + new TextProp(2, 0x100000, "char_unknown_3"), + new TextProp(4, 0x200000, "font.color"), + new TextProp(2, 0x800000, "char_unknown_4") + }; +*/ + + + /** All the different kinds of paragraph properties we might handle */ + public static final TextProp[] paragraphTextPropTypes = { + // TextProp order is according to 2.9.20 TextPFException, + // bitmask order can be different +// new TextProp(0, 0x1, "hasBullet"), +// new TextProp(0, 0x2, "hasBulletFont"), +// new TextProp(0, 0x4, "hasBulletColor"), +// new TextProp(0, 0x8, "hasBulletSize"), + new ParagraphFlagsTextProp(), + new TextProp(2, 0x80, "bullet.char"), + new TextProp(2, 0x10, "bullet.font"), + new TextProp(2, 0x40, "bullet.size"), + new TextProp(4, 0x20, "bullet.color"), + new TextAlignmentProp(), + new TextProp(2, 0x1000, "linespacing"), + new TextProp(2, 0x2000, "spacebefore"), + new TextProp(2, 0x4000, "spaceafter"), + new TextProp(2, 0x100, "text.offset"), // left margin + // 0x200 - Undefined and MUST be ignored + new TextProp(2, 0x400, "bullet.offset"), // indent + new TextProp(2, 0x8000, "defaultTabSize"), + new TabStopPropCollection(), // tabstops size is variable! + new FontAlignmentProp(), + new TextProp(2, 0xE0000, "wrapFlags"), // charWrap | wordWrap | overflow + new TextProp(2, 0x200000, "textDirection"), + // 0x400000 MUST be zero and MUST be ignored + new TextProp(0, 0x800000, "bullet.blip"), // TODO: check size + new TextProp(0, 0x1000000, "bullet.scheme"), // TODO: check size + new TextProp(0, 0x2000000, "hasBulletScheme"), // TODO: check size + // 0xFC000000 MUST be zero and MUST be ignored + }; + /** All the different kinds of character properties we might handle */ + public static final TextProp[] characterTextPropTypes = new TextProp[] { +// new TextProp(0, 0x1, "bold"), +// new TextProp(0, 0x2, "italic"), +// new TextProp(0, 0x4, "underline"), +// new TextProp(0, 0x8, "unused1"), +// new TextProp(0, 0x10, "shadow"), +// new TextProp(0, 0x20, "fehint"), +// new TextProp(0, 0x40, "unused2"), +// new TextProp(0, 0x80, "kumi"), +// new TextProp(0, 0x100, "strikethrough"), +// new TextProp(0, 0x200, "emboss"), +// new TextProp(0, 0x400, "nibble1"), +// new TextProp(0, 0x800, "nibble2"), +// new TextProp(0, 0x1000, "nibble3"), +// new TextProp(0, 0x2000, "nibble4"), +// new TextProp(0, 0x4000, "unused4"), +// new TextProp(0, 0x8000, "unused5"), + new TextProp(0, 0x100000, "pp10ext"), + new TextProp(0, 0x1000000, "newAsian.font.index"), // A bit that specifies whether the newEAFontRef field of the TextCFException10 structure that contains this CFMasks exists. + new TextProp(0, 0x2000000, "cs.font.index"), // A bit that specifies whether the csFontRef field of the TextCFException10 structure that contains this CFMasks exists. + new TextProp(0, 0x4000000, "pp11ext"), // A bit that specifies whether the pp11ext field of the TextCFException10 structure that contains this CFMasks exists. + new CharFlagsTextProp(), + new TextProp(2, 0x10000, "font.index"), + new TextProp(2, 0x200000, "asian.font.index"), + new TextProp(2, 0x400000, "ansi.font.index"), + new TextProp(2, 0x800000, "symbol.font.index"), + new TextProp(2, 0x20000, "font.size"), + new TextProp(4, 0x40000, "font.color"), + new TextProp(2, 0x80000, "superscript") + }; + + public enum TextPropType { + paragraph, character; + } + + private int charactersCovered; + + // indentLevel is only valid for paragraph collection + // if it's set to -1, it must be omitted - see 2.9.36 TextMasterStyleLevel + private short indentLevel = 0; private final List textPropList = new ArrayList(); private int maskSpecial = 0; - private final TextProp[] potentialPropList; + private final TextPropType textPropType; + /** + * Create a new collection of text properties (be they paragraph + * or character) which will be groked via a subsequent call to + * buildTextPropList(). + */ + public TextPropCollection(int charactersCovered, TextPropType textPropType) { + this.charactersCovered = charactersCovered; + this.textPropType = textPropType; + } + public int getSpecialMask() { return maskSpecial; } /** Fetch the number of characters this styling applies to */ @@ -61,7 +174,7 @@ public class TextPropCollection { if (existing != null) return existing; TextProp base = null; - for (TextProp tp : potentialPropList) { + for (TextProp tp : getPotentialProperties()) { if (tp.getName().equals(name)) { base = tp; break; @@ -78,6 +191,10 @@ public class TextPropCollection { addProp(textProp); return textProp; } + + private TextProp[] getPotentialProperties() { + return (textPropType == TextPropType.paragraph) ? paragraphTextPropTypes : characterTextPropTypes; + } /** * Add the property at the correct position. Replaces an existing property with the same name. @@ -89,7 +206,7 @@ public class TextPropCollection { int pos = 0; boolean found = false; - for (TextProp curProp : potentialPropList) { + for (TextProp curProp : getPotentialProperties()) { String potName = curProp.getName(); if (pos == textPropList.size() || potName.equals(textProp.getName())) { if (textPropList.size() > pos && potName.equals(textPropList.get(pos).getName())) { @@ -123,7 +240,7 @@ public class TextPropCollection { // For each possible entry, see if we match the mask // If we do, decode that, save it, and shuffle on - for(TextProp tp : potentialPropList) { + for(TextProp tp : getPotentialProperties()) { // Check there's still data left to read // Check if this property is found in the mask @@ -150,6 +267,9 @@ public class TextPropCollection { continue; } prop.setValue(val); + if (prop instanceof BitMaskTextProp) { + ((BitMaskTextProp)prop).setWriteMask(containsField); + } bytesPassed += prop.getSize(); addProp(prop); } @@ -159,31 +279,12 @@ public class TextPropCollection { return bytesPassed; } - /** - * Create a new collection of text properties (be they paragraph - * or character) which will be groked via a subsequent call to - * buildTextPropList(). - */ - public TextPropCollection(int charactersCovered, short reservedField, TextProp[] potentialPropList) { - this.charactersCovered = charactersCovered; - this.reservedField = reservedField; - this.potentialPropList = potentialPropList; - } - - /** - * Create a new collection of text properties (be they paragraph - * or character) for a run of text without any - */ - public TextPropCollection(int textSize, TextProp[] potentialPropList) { - this(textSize, (short)-1, potentialPropList); - } - /** * Clones the given text properties */ public void copy(TextPropCollection other) { this.charactersCovered = other.charactersCovered; - this.reservedField = other.reservedField; + this.indentLevel = other.indentLevel; this.maskSpecial = other.maskSpecial; this.textPropList.clear(); for (TextProp tp : other.textPropList) { @@ -209,17 +310,17 @@ public class TextPropCollection { // First goes the number of characters we affect StyleTextPropAtom.writeLittleEndian(charactersCovered,o); - // Then we have the reserved field if required - if(reservedField > -1) { - StyleTextPropAtom.writeLittleEndian(reservedField,o); + // Then we have the indentLevel field if it's a paragraph collection + if (textPropType == TextPropType.paragraph && indentLevel > -1) { + StyleTextPropAtom.writeLittleEndian(indentLevel, o); } // Then the mask field int mask = maskSpecial; - for(TextProp textProp : textPropList) { - //sometimes header indicates that the bitmask is present but its value is 0 + for (TextProp textProp : textPropList) { + // sometimes header indicates that the bitmask is present but its value is 0 if (textProp instanceof BitMaskTextProp) { - if(mask == 0) mask |= textProp.getWriteMask(); + if (mask == 0) mask |= textProp.getWriteMask(); } else { mask |= textProp.getWriteMask(); @@ -228,17 +329,12 @@ public class TextPropCollection { StyleTextPropAtom.writeLittleEndian(mask,o); // Then the contents of all the properties - for (TextProp potProp : potentialPropList) { + for (TextProp potProp : getPotentialProperties()) { for(TextProp textProp : textPropList) { if (!textProp.getName().equals(potProp.getName())) continue; int val = textProp.getValue(); - if (textProp instanceof BitMaskTextProp && val == 0 - && !(textProp instanceof ParagraphFlagsTextProp) -// && !(textProp instanceof CharFlagsTextProp) - ) { + if (textProp instanceof BitMaskTextProp && textProp.getWriteMask() == 0) { // don't add empty properties, as they can't be recognized while reading - // strangely this doesn't apply for ParagraphFlagsTextProp in contrast - // to the documentation in 2.9.20 TextPFException continue; } else if (textProp.getSize() == 2) { StyleTextPropAtom.writeLittleEndian((short)val,o); @@ -249,12 +345,15 @@ public class TextPropCollection { } } - public short getReservedField(){ - return reservedField; + public short getIndentLevel(){ + return indentLevel; } - public void setReservedField(short val){ - reservedField = val; + public void setIndentLevel(short indentLevel) { + if (textPropType == TextPropType.character) { + throw new RuntimeException("trying to set an indent on a character collection."); + } + this.indentLevel = indentLevel; } public int hashCode() { @@ -262,7 +361,7 @@ public class TextPropCollection { int result = 1; result = prime * result + charactersCovered; result = prime * result + maskSpecial; - result = prime * result + reservedField; + result = prime * result + indentLevel; result = prime * result + ((textPropList == null) ? 0 : textPropList.hashCode()); return result; } @@ -275,7 +374,7 @@ public class TextPropCollection { if (getClass() != other.getClass()) return false; TextPropCollection o = (TextPropCollection)other; - if (o.maskSpecial != this.maskSpecial || o.reservedField != this.reservedField) { + if (o.maskSpecial != this.maskSpecial || o.indentLevel != this.indentLevel) { return false; } @@ -303,6 +402,16 @@ public class TextPropCollection { for(TextProp p : getTextPropList()) { out.append(" " + p.getName() + " = " + p.getValue() ); out.append(" (0x" + HexDump.toHex(p.getValue()) + ")\n"); + if (p instanceof BitMaskTextProp) { + BitMaskTextProp bm = (BitMaskTextProp)p; + int i = 0; + for (String s : bm.getSubPropNames()) { + if (bm.getSubPropMatches()[i]) { + out.append(" " + s + " = " + bm.getSubValue(i) + "\n"); + } + i++; + } + } } out.append(" bytes that would be written: \n"); diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java index e2f765723b..7441ae91c0 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.poi.hslf.model.textproperties.*; +import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType; import org.apache.poi.util.*; /** @@ -110,66 +111,6 @@ public final class StyleTextPropAtom extends RecordAtom return length; } - /** All the different kinds of paragraph properties we might handle */ - public static final TextProp[] paragraphTextPropTypes = { - // TextProp order is according to 2.9.20 TextPFException, - // bitmask order can be different - new TextProp(0, 0x1, "hasBullet"), - new TextProp(0, 0x2, "hasBulletFont"), - new TextProp(0, 0x4, "hasBulletColor"), - new TextProp(0, 0x8, "hasBulletSize"), - new ParagraphFlagsTextProp(), - new TextProp(2, 0x80, "bullet.char"), - new TextProp(2, 0x10, "bullet.font"), - new TextProp(2, 0x40, "bullet.size"), - new TextProp(4, 0x20, "bullet.color"), - new TextAlignmentProp(), - new TextProp(2, 0x1000, "linespacing"), - new TextProp(2, 0x2000, "spacebefore"), - new TextProp(2, 0x4000, "spaceafter"), - new TextProp(2, 0x100, "text.offset"), // left margin - // 0x200 - Undefined and MUST be ignored - new TextProp(2, 0x400, "bullet.offset"), // indent - new TextProp(2, 0x8000, "defaultTabSize"), - new TabStopPropCollection(), // tabstops size is variable! - new FontAlignmentProp(), - new TextProp(2, 0xE0000, "wrapFlags"), // charWrap | wordWrap | overflow - new TextProp(2, 0x200000, "textDirection"), - // 0x400000 MUST be zero and MUST be ignored - new TextProp(0, 0x800000, "bullet.blip"), // TODO: check size - new TextProp(0, 0x1000000, "bullet.scheme"), // TODO: check size - new TextProp(0, 0x2000000, "hasBulletScheme"), // TODO: check size - // 0xFC000000 MUST be zero and MUST be ignored - }; - /** All the different kinds of character properties we might handle */ - public static final TextProp[] characterTextPropTypes = new TextProp[] { - new TextProp(0, 0x1, "bold"), - new TextProp(0, 0x2, "italic"), - new TextProp(0, 0x4, "underline"), - new TextProp(0, 0x8, "unused1"), - new TextProp(0, 0x10, "shadow"), - new TextProp(0, 0x20, "fehint"), - new TextProp(0, 0x40, "unused2"), - new TextProp(0, 0x80, "kumi"), - new TextProp(0, 0x100, "unused3"), - new TextProp(0, 0x200, "emboss"), - new TextProp(0, 0x400, "nibble1"), - new TextProp(0, 0x800, "nibble2"), - new TextProp(0, 0x1000, "nibble3"), - new TextProp(0, 0x2000, "nibble4"), - new TextProp(0, 0x4000, "unused4"), - new TextProp(0, 0x8000, "unused5"), - new CharFlagsTextProp(), - new TextProp(2, 0x10000, "font.index"), - new TextProp(0, 0x100000, "pp10ext"), - new TextProp(2, 0x200000, "asian.font.index"), - new TextProp(2, 0x400000, "ansi.font.index"), - new TextProp(2, 0x800000, "symbol.font.index"), - new TextProp(2, 0x20000, "font.size"), - new TextProp(4, 0x40000, "font.color"), - new TextProp(2, 0x80000, "superscript") - }; - /* *************** record code follows ********************** */ /** @@ -217,15 +158,8 @@ public final class StyleTextPropAtom extends RecordAtom paragraphStyles = new ArrayList(); charStyles = new ArrayList(); - TextPropCollection defaultParagraphTextProps = - new TextPropCollection(parentTextSize, (short)0, paragraphTextPropTypes); - defaultParagraphTextProps.addWithName("paragraph_flags"); - paragraphStyles.add(defaultParagraphTextProps); - - TextPropCollection defaultCharacterTextProps = - new TextPropCollection(parentTextSize, characterTextPropTypes); - defaultCharacterTextProps.addWithName("char_flags"); - charStyles.add(defaultCharacterTextProps); + addParagraphTextPropCollection(parentTextSize); + addCharacterTextPropCollection(parentTextSize); // Set us as now initialised initialised = true; @@ -269,7 +203,7 @@ public final class StyleTextPropAtom extends RecordAtom * contains, so we can go ahead and initialise ourselves. */ public void setParentTextSize(int size) { - // if (initialised) return; + if (initialised) return; int pos = 0; int textHandled = 0; @@ -295,7 +229,8 @@ public final class StyleTextPropAtom extends RecordAtom pos += 4; // Now make sense of those properties - TextPropCollection thisCollection = new TextPropCollection(textLen, indent, paragraphTextPropTypes); + TextPropCollection thisCollection = new TextPropCollection(textLen, TextPropType.paragraph); + thisCollection.setIndentLevel(indent); int plSize = thisCollection.buildTextPropList(paraFlags, rawContents, pos); pos += plSize; @@ -322,16 +257,13 @@ public final class StyleTextPropAtom extends RecordAtom textHandled += textLen; pos += 4; - // There is no 2 byte value - short no_val = -1; - // Grab the 4 byte value that tells us what properties follow int charFlags = LittleEndian.getInt(rawContents,pos); pos += 4; // Now make sense of those properties // (Assuming we actually have some) - TextPropCollection thisCollection = new TextPropCollection(textLen, no_val, characterTextPropTypes); + TextPropCollection thisCollection = new TextPropCollection(textLen, TextPropType.character); int chSize = thisCollection.buildTextPropList(charFlags, rawContents, pos); pos += chSize; @@ -386,7 +318,7 @@ public final class StyleTextPropAtom extends RecordAtom // Now, we do the character ones for(TextPropCollection tpc : charStyles) { // ditto for the char flags - tpc.addWithName(CharFlagsTextProp.NAME); + // tpc.addWithName(CharFlagsTextProp.NAME); tpc.writeOut(baos); } @@ -414,7 +346,7 @@ public final class StyleTextPropAtom extends RecordAtom * @return the new TextPropCollection, which will then be in the list */ public TextPropCollection addParagraphTextPropCollection(int charactersCovered) { - TextPropCollection tpc = new TextPropCollection(charactersCovered, (short)0, paragraphTextPropTypes); + TextPropCollection tpc = new TextPropCollection(charactersCovered, TextPropType.paragraph); paragraphStyles.add(tpc); return tpc; } @@ -424,7 +356,7 @@ public final class StyleTextPropAtom extends RecordAtom * @return the new TextPropCollection, which will then be in the list */ public TextPropCollection addCharacterTextPropCollection(int charactersCovered) { - TextPropCollection tpc = new TextPropCollection(charactersCovered, characterTextPropTypes); + TextPropCollection tpc = new TextPropCollection(charactersCovered, TextPropType.character); charStyles.add(tpc); return tpc; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java index 8d6626dc2b..54e7529d5d 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java @@ -19,11 +19,11 @@ package org.apache.poi.hslf.record; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; -import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; -import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp; -import org.apache.poi.hslf.model.textproperties.TextProp; import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType; import org.apache.poi.util.LittleEndian; /** @@ -48,43 +48,12 @@ public final class TxMasterStyleAtom extends RecordAtom { */ public static final int MAX_INDENT = 5; -/* - private static TextProp paragraphSpecialPropTypes[] = { - new ParagraphFlagsTextProp(), - new TextProp(2, 0x80, "bullet.char"), - new TextProp(2, 0x10, "bullet.font"), - new TextProp(2, 0x40, "bullet.size"), - new TextProp(4, 0x20, "bullet.color"), - new TextProp(2, 0xD00, "alignment"), - new TextProp(2, 0x1000, "linespacing"), - new TextProp(2, 0x2000, "spacebefore"), - new TextProp(2, 0x4000, "spaceafter"), - new TextProp(2, 0x8000, "text.offset"), - new TextProp(2, 0x10000, "bullet.offset"), - new TextProp(2, 0x20000, "defaulttab"), - new TextProp(2, 0x40000, "para_unknown_2"), - new TextProp(2, 0x80000, "para_unknown_3"), - new TextProp(2, 0x100000, "para_unknown_4"), - new TextProp(2, 0x200000, "para_unknown_5") - }; - - private static TextProp characterSpecialPropTypes[] = { - new CharFlagsTextProp(), - new TextProp(2, 0x10000, "font.index"), - new TextProp(2, 0x20000, "char_unknown_1"), - new TextProp(4, 0x40000, "char_unknown_2"), - new TextProp(2, 0x80000, "font.size"), - new TextProp(2, 0x100000, "char_unknown_3"), - new TextProp(4, 0x200000, "font.color"), - new TextProp(2, 0x800000, "char_unknown_4") - }; -*/ private byte[] _header; private static long _type = 4003; private byte[] _data; - private TextPropCollection[] prstyles; - private TextPropCollection[] chstyles; + private List paragraphStyles; + private List charStylesyles; protected TxMasterStyleAtom(byte[] source, int start, int len) { _header = new byte[8]; @@ -129,8 +98,8 @@ public final class TxMasterStyleAtom extends RecordAtom { * * @return character styles defined in this record */ - public TextPropCollection[] getCharacterStyles(){ - return chstyles; + public List getCharacterStyles(){ + return charStylesyles; } /** @@ -138,8 +107,8 @@ public final class TxMasterStyleAtom extends RecordAtom { * * @return paragraph styles defined in this record */ - public TextPropCollection[] getParagraphStyles(){ - return prstyles; + public List getParagraphStyles(){ + return paragraphStyles; } /** @@ -157,7 +126,6 @@ public final class TxMasterStyleAtom extends RecordAtom { /** * parse the record data and initialize styles */ - @SuppressWarnings("unused") protected void init(){ //type of the text int type = getTextType(); @@ -169,28 +137,31 @@ public final class TxMasterStyleAtom extends RecordAtom { short levels = LittleEndian.getShort(_data, 0); pos += LittleEndian.SHORT_SIZE; - prstyles = new TextPropCollection[levels]; - chstyles = new TextPropCollection[levels]; + paragraphStyles = new ArrayList(levels); + charStylesyles = new ArrayList(levels); for(short j = 0; j < levels; j++) { - + TextPropCollection prprops = new TextPropCollection(0, TextPropType.paragraph); // getParagraphProps(type, j) if (type >= TextHeaderAtom.CENTRE_BODY_TYPE) { // Fetch the 2 byte value, that is safe to ignore for some types of text - short val = LittleEndian.getShort(_data, pos); + short indentLevel = LittleEndian.getShort(_data, pos); + prprops.setIndentLevel(indentLevel); pos += LittleEndian.SHORT_SIZE; + } else { + prprops.setIndentLevel((short)-1); } head = LittleEndian.getInt(_data, pos); pos += LittleEndian.INT_SIZE; - TextPropCollection prprops = new TextPropCollection(0, getParagraphProps(type, j)); + pos += prprops.buildTextPropList( head, _data, pos); - prstyles[j] = prprops; + paragraphStyles.add(prprops); head = LittleEndian.getInt(_data, pos); pos += LittleEndian.INT_SIZE; - TextPropCollection chprops = new TextPropCollection(0, getCharacterProps(type, j)); + TextPropCollection chprops = new TextPropCollection(0, TextPropType.character); // getCharacterProps(type, j) pos += chprops.buildTextPropList( head, _data, pos); - chstyles[j] = chprops; + charStylesyles.add(chprops); } } @@ -201,12 +172,12 @@ public final class TxMasterStyleAtom extends RecordAtom { * Depending on the level and type, it may be our special * ones, or the standard StyleTextPropAtom ones */ - protected TextProp[] getParagraphProps(int type, int level){ - return StyleTextPropAtom.paragraphTextPropTypes; +// protected TextProp[] getParagraphProps(int type, int level){ +// return StyleTextPropAtom.paragraphTextPropTypes; // return (level != 0 || type >= MAX_INDENT) // ? StyleTextPropAtom.paragraphTextPropTypes // : paragraphSpecialPropTypes; - } +// } /** * Character properties for the specified text type and @@ -214,10 +185,10 @@ public final class TxMasterStyleAtom extends RecordAtom { * Depending on the level and type, it may be our special * ones, or the standard StyleTextPropAtom ones */ - protected TextProp[] getCharacterProps(int type, int level){ - return StyleTextPropAtom.characterTextPropTypes; +// protected TextProp[] getCharacterProps(int type, int level){ +// return StyleTextPropAtom.characterTextPropTypes; // return (level != 0 || type >= MAX_INDENT) // ? StyleTextPropAtom.characterTextPropTypes // : characterSpecialPropTypes; - } +// } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java index 36265735b8..1c6518e5e0 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java @@ -76,9 +76,9 @@ public final class HSLFSlideMaster extends HSLFMasterSheet { TextProp prop = null; for (int i = level; i >= 0; i--) { - TextPropCollection[] styles = + List styles = isCharacter ? _txmaster[txtype].getCharacterStyles() : _txmaster[txtype].getParagraphStyles(); - if (i < styles.length) prop = styles[i].findByName(name); + if (i < styles.size()) prop = styles.get(i).findByName(name); if (prop != null) break; } if (prop == null) { diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index a6d6e5b49b..4b1e3767a7 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -18,12 +18,11 @@ package org.apache.poi.hslf.usermodel; import java.awt.Color; -import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.util.*; import org.apache.poi.hslf.model.PPFont; import org.apache.poi.hslf.model.textproperties.*; +import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType; import org.apache.poi.hslf.record.*; import org.apache.poi.sl.usermodel.TextParagraph; import org.apache.poi.util.*; @@ -54,7 +53,7 @@ public final class HSLFTextParagraph implements TextParagraph { private TextBytesAtom _byteAtom; private TextCharsAtom _charAtom; private StyleTextPropAtom _styleAtom; - private TextPropCollection _paragraphStyle = new TextPropCollection(1, StyleTextPropAtom.paragraphTextPropTypes); + private TextPropCollection _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph); protected TextRulerAtom _ruler; protected List _runs = new ArrayList(); @@ -407,7 +406,7 @@ public final class HSLFTextParagraph implements TextParagraph { * @return indentation level */ public int getIndentLevel() { - return _paragraphStyle == null ? 0 : _paragraphStyle.getReservedField(); + return _paragraphStyle == null ? 0 : _paragraphStyle.getIndentLevel(); } /** @@ -416,7 +415,7 @@ public final class HSLFTextParagraph implements TextParagraph { * @param level indentation level. Must be in the range [0, 4] */ public void setIndentLevel(int level) { - if( _paragraphStyle != null ) _paragraphStyle.setReservedField((short)level); + if( _paragraphStyle != null ) _paragraphStyle.setIndentLevel((short)level); } /** @@ -591,11 +590,7 @@ public final class HSLFTextParagraph implements TextParagraph { */ protected static TextProp fetchOrAddTextProp(TextPropCollection textPropCol, String textPropName) { // Fetch / Add the TextProp - TextProp tp = textPropCol.findByName(textPropName); - if (tp == null) { - tp = textPropCol.addWithName(textPropName); - } - return tp; + return textPropCol.addWithName(textPropName); } protected boolean getFlag(int index) { @@ -621,7 +616,7 @@ public final class HSLFTextParagraph implements TextParagraph { protected void setFlag(int index, boolean value) { // Ensure we have the StyleTextProp atom we're going to need if(_paragraphStyle == null) { - _paragraphStyle = new TextPropCollection(1, StyleTextPropAtom.paragraphTextPropTypes); + _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph); } BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(_paragraphStyle, ParagraphFlagsTextProp.NAME); @@ -747,9 +742,11 @@ public final class HSLFTextParagraph implements TextParagraph { for (HSLFTextParagraph p : paragraphs) { if (newRecord == byteAtom) { + p._byteAtom = byteAtom; p._charAtom = null; } else { p._byteAtom = null; + p._charAtom = charAtom; } } @@ -825,8 +822,8 @@ public final class HSLFTextParagraph implements TextParagraph { htp.setShapeId(prevHtp.getShapeId()); htp.supplySheet(prevHtp.getSheet()); paragraphs.add(htp); - isFirst = false; } + isFirst = false; TextPropCollection tpc = htr.getCharacterStyle(); // special case, last text run is empty, we will reuse it @@ -1083,7 +1080,7 @@ public final class HSLFTextParagraph implements TextParagraph { ccRun += ccStyle-ccRun; } - TextPropCollection pCopy = new TextPropCollection(0, StyleTextPropAtom.characterTextPropTypes); + TextPropCollection pCopy = new TextPropCollection(0, TextPropType.character); pCopy.copy(p); trun.setCharacterStyle(pCopy); @@ -1117,7 +1114,7 @@ public final class HSLFTextParagraph implements TextParagraph { for (int ccPara = 0, ccStyle = p.getCharactersCovered(); ccPara < ccStyle; paraIdx++) { if (paraIdx >= paragraphs.size() || ccPara >= ccStyle-1) return; HSLFTextParagraph htp = paragraphs.get(paraIdx); - TextPropCollection pCopy = new TextPropCollection(0, StyleTextPropAtom.paragraphTextPropTypes); + TextPropCollection pCopy = new TextPropCollection(0, TextPropType.paragraph); pCopy.copy(p); htp.setParagraphStyle(pCopy); int len = 0; @@ -1165,16 +1162,16 @@ public final class HSLFTextParagraph implements TextParagraph { HSLFTextParagraph htp = new HSLFTextParagraph(tha, tba, null, sta); htp.setParagraphStyle(paraStyle); htp._records = new Record[0]; - htp.setBullet(false); - htp.setLineSpacing(100); - htp.setLeftMargin(0); - htp.setIndent(0); +// htp.setBullet(false); +// htp.setLineSpacing(100); +// htp.setLeftMargin(0); +// htp.setIndent(0); // set wrap flags HSLFTextRun htr = new HSLFTextRun(htp); htr.setCharacterStyle(charStyle); htr.setText("\r"); - htr.setFontColor(Color.black); +// htr.setFontColor(Color.black); htp.addTextRun(htr); return Arrays.asList(htp); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index b4da12c4dc..9096573c7e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -22,8 +22,8 @@ import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.fetchOrAddTextProp import java.awt.Color; import org.apache.poi.hslf.model.textproperties.*; +import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType; import org.apache.poi.hslf.record.ColorSchemeAtom; -import org.apache.poi.hslf.record.StyleTextPropAtom; import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -45,7 +45,7 @@ public final class HSLFTextRun implements TextRun { * Our paragraph and character style. * Note - we may share these styles with other RichTextRuns */ - private TextPropCollection characterStyle = new TextPropCollection(0, StyleTextPropAtom.characterTextPropTypes); + private TextPropCollection characterStyle = new TextPropCollection(1, TextPropType.character); /** * Create a new wrapper around a rich text string @@ -60,6 +60,7 @@ public final class HSLFTextRun implements TextRun { } public void setCharacterStyle(TextPropCollection characterStyle) { + assert(characterStyle != null); this.characterStyle = characterStyle; } @@ -162,12 +163,6 @@ public final class HSLFTextRun implements TextRun { * @param val The value to set for the TextProp */ public void setCharTextPropVal(String propName, int val) { - // Ensure we have the StyleTextProp atom we're going to need - if(characterStyle == null) { - characterStyle = new TextPropCollection(1, StyleTextPropAtom.characterTextPropTypes); - // characterStyle will now be defined - } - TextProp tp = fetchOrAddTextProp(characterStyle, propName); tp.setValue(val); } @@ -375,11 +370,6 @@ public final class HSLFTextRun implements TextRun { } protected void setFlag(int index, boolean value) { - // Ensure we have the StyleTextProp atom we're going to need - if (characterStyle == null) { - characterStyle = new TextPropCollection(1, StyleTextPropAtom.characterTextPropTypes); - } - BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(characterStyle, CharFlagsTextProp.NAME); prop.setSubValue(value, index); } From 86c7025e066ec8986b296f2f5d8f9bb6cd5f6612 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sun, 24 May 2015 01:10:12 +0000 Subject: [PATCH 12/22] Fixed some style related corner cases and adapted the tests for it git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1681411 13f79535-47bb-0310-9956-ffa450edef68 --- .../model/textproperties/BitMaskTextProp.java | 73 +++++++++++++++++-- .../textproperties/CharFlagsTextProp.java | 35 +++++---- .../ParagraphFlagsTextProp.java | 10 +-- .../textproperties/TextPropCollection.java | 19 +++-- .../textproperties/WrapFlagsTextProp.java | 30 ++++++++ .../poi/hslf/record/StyleTextPropAtom.java | 4 - .../poi/hslf/usermodel/HSLFSlideShow.java | 8 +- .../poi/hslf/usermodel/HSLFTextRun.java | 4 +- .../hslf/record/TestStyleTextPropAtom.java | 69 +++++++++++++----- 9 files changed, 185 insertions(+), 67 deletions(-) create mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/textproperties/WrapFlagsTextProp.java diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java index 15fdc1991f..c76b05cd25 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java @@ -17,6 +17,10 @@ package org.apache.poi.hslf.model.textproperties; +import org.apache.poi.hslf.record.Record; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; + /** * Definition of a special kind of property of some text, or its * paragraph. For these properties, a flag in the "contains" header @@ -25,7 +29,9 @@ package org.apache.poi.hslf.model.textproperties; * (but related) properties */ public abstract class BitMaskTextProp extends TextProp implements Cloneable { - private String[] subPropNames; + protected static final POILogger logger = POILogFactory.getLogger(BitMaskTextProp.class); + + private String[] subPropNames; private int[] subPropMasks; private boolean[] subPropMatches; @@ -34,22 +40,25 @@ public abstract class BitMaskTextProp extends TextProp implements Cloneable { /** Fetch the list of if the sub properties match or not */ public boolean[] getSubPropMatches() { return subPropMatches; } - public BitMaskTextProp(int sizeOfDataBlock, int maskInHeader, String overallName, String[] subPropNames) { + protected BitMaskTextProp(int sizeOfDataBlock, int maskInHeader, String overallName, String... subPropNames) { super(sizeOfDataBlock,maskInHeader,"bitmask"); this.subPropNames = subPropNames; this.propName = overallName; subPropMasks = new int[subPropNames.length]; subPropMatches = new boolean[subPropNames.length]; + int LSB = Integer.lowestOneBit(maskInHeader); + // Initialise the masks list for(int i=0; i */ + @Test public void test45815() { int length = 19; byte[] data = { @@ -750,7 +779,13 @@ public final class TestStyleTextPropAtom extends TestCase { 0x01, 0x18, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x00, 0x01, 0x1C }; - doReadWrite(data, length); + + // changed original data: ... 0x41 and 0x06 don't match + // the bitmask text properties will sanitize the bytes and thus the bytes differ + byte[] exptected = data.clone(); + exptected[18] = 0; + + doReadWrite(data, exptected, length); } } From 16ac6b107e8f5deae70c391be3fbc5d02d751fd0 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Thu, 28 May 2015 23:32:26 +0000 Subject: [PATCH 13/22] Fixed several test drivers or the implementation renamed font functions in HSLFTextRun git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1682356 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hslf/examples/ApacheconEU08.java | 6 +- .../apache/poi/hslf/examples/TableDemo.java | 4 +- src/java/org/apache/poi/util/HexDump.java | 50 +- .../apache/poi/hslf/model/PPGraphics2D.java | 2 +- .../org/apache/poi/hslf/record/PPDrawing.java | 8 +- .../poi/hslf/record/TextSpecInfoAtom.java | 150 ++-- .../poi/hslf/record/TextSpecInfoRun.java | 346 ++++++++++ .../apache/poi/hslf/usermodel/HSLFSheet.java | 71 +- .../poi/hslf/usermodel/HSLFSlideShow.java | 11 +- .../poi/hslf/usermodel/HSLFTextParagraph.java | 31 +- .../poi/hslf/usermodel/HSLFTextRun.java | 18 +- .../poi/hslf/model/AllHSLFModelTests.java | 6 +- .../poi/hslf/model/TestPPGraphics2D.java | 2 +- .../org/apache/poi/hslf/model/TestShapes.java | 9 +- .../org/apache/poi/hslf/model/TestSheet.java | 11 +- .../poi/hslf/model/TestSlideMaster.java | 51 +- .../poi/hslf/model/TestTextRunReWrite.java | 71 +- .../poi/hslf/model/TextPainterTest.java | 52 -- .../poi/hslf/record/TestTextSpecInfoAtom.java | 20 +- .../hslf/record/TestTxMasterStyleAtom.java | 30 +- .../hslf/usermodel/AllHSLFUserModelTests.java | 5 +- .../poi/hslf/usermodel/TestNumberedList.java | 92 +-- .../poi/hslf/usermodel/TestNumberedList2.java | 69 +- .../poi/hslf/usermodel/TestNumberedList3.java | 62 +- .../{model => usermodel}/TestPicture.java | 2 +- .../hslf/usermodel/TestReOrderingSlides.java | 100 +-- .../poi/hslf/usermodel/TestRecordSetup.java | 19 +- .../poi/hslf/usermodel/TestRichTextRun.java | 642 +++++++++--------- .../poi/hslf/usermodel/TestSheetText.java | 47 +- .../poi/hslf/usermodel/TestSlideOrdering.java | 50 +- .../poi/hslf/usermodel/TestTextRun.java | 202 +++--- .../{model => usermodel}/TestTextShape.java | 124 ++-- 32 files changed, 1300 insertions(+), 1063 deletions(-) create mode 100644 src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoRun.java delete mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java rename src/scratchpad/testcases/org/apache/poi/hslf/{model => usermodel}/TestPicture.java (99%) rename src/scratchpad/testcases/org/apache/poi/hslf/{model => usermodel}/TestTextShape.java (62%) diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java index 3397278737..494c7f9c32 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java +++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java @@ -153,7 +153,7 @@ public final class ApacheconEU08 { cell.setText(txt1[i][j]); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontSize(10); - rt.setFontName("Arial"); + rt.setFontFamily("Arial"); rt.setBold(true); if(i == 0){ rt.setFontSize(32); @@ -232,7 +232,7 @@ public final class ApacheconEU08 { HSLFTextBox box3 = new HSLFTextBox(); HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0); - rt3.setFontName("Courier New"); + rt3.setFontFamily("Courier New"); rt3.setFontSize(8); box3.setText( "SlideShow ppt = new SlideShow();\u000b" + @@ -341,7 +341,7 @@ public final class ApacheconEU08 { HSLFTextBox box3 = new HSLFTextBox(); HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0); - rt3.setFontName("Courier New"); + rt3.setFontFamily("Courier New"); rt3.setFontSize(8); box3.setText( "//bar chart data. The first value is the bar color, the second is the width\u000b" + diff --git a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java index bb2e813865..abc40750cc 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java @@ -54,7 +54,7 @@ public final class TableDemo { for (int j = 0; j < txt1[i].length; j++) { TableCell cell = table1.getCell(i, j); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); - rt.setFontName("Arial"); + rt.setFontFamily("Arial"); rt.setFontSize(10); if(i == 0){ cell.getFill().setForegroundColor(new Color(227, 227, 227)); @@ -94,7 +94,7 @@ public final class TableDemo { TableCell cell = table2.getCell(i, j); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontSize(10); - rt.setFontName("Arial"); + rt.setFontFamily("Arial"); if(i == 0){ cell.getFill().setForegroundColor(new Color(0, 51, 102)); rt.setFontColor(Color.white); diff --git a/src/java/org/apache/poi/util/HexDump.java b/src/java/org/apache/poi/util/HexDump.java index 979ca1c9c5..3c086ba606 100644 --- a/src/java/org/apache/poi/util/HexDump.java +++ b/src/java/org/apache/poi/util/HexDump.java @@ -170,49 +170,41 @@ public class HexDump { * @return output string */ - public static String dump(final byte [] data, final long offset, - final int index) { - StringBuffer buffer; - if ((index < 0) || (index >= data.length)) + public static String dump(final byte [] data, final long offset, final int index) { + if ((index < 0) || (index > data.length)) { throw new ArrayIndexOutOfBoundsException( "illegal index: " + index + " into array of length " + data.length); } - long display_offset = offset + index; - buffer = new StringBuffer(74); + long display_offset = offset + index; + StringBuilder buffer = new StringBuilder(74); - for (int j = index; j < data.length; j += 16) - { + for (int j = index; j <= data.length; j += 16) { int chars_read = data.length - j; - if (chars_read > 16) - { + if (chars_read > 16) { chars_read = 16; } + buffer.append(dump(display_offset)).append(' '); - for (int k = 0; k < 16; k++) - { - if (k < chars_read) - { - buffer.append(dump(data[ k + j ])); - } - else - { - buffer.append(" "); - } + for (int k = 0; k < 16; k++) { + String hexDmp = (k < chars_read) ? dump(data[ k + j ]) : " "; + buffer.append(hexDmp); buffer.append(' '); } - for (int k = 0; k < chars_read; k++) - { - if ((data[ k + j ] >= ' ') && (data[ k + j ] < 127)) - { - buffer.append(( char ) data[ k + j ]); - } - else - { - buffer.append('.'); + for (int k = 0; k < chars_read; k++) { + byte dataB = data[ k + j ]; + char charB = (char)(dataB & 0xFF); + switch (charB) { + case 127: case 128: case 129: case 141: case 142: case 143: case 144: case 157: case 158: + charB = '.'; + break; + default: + if (charB < ' ') charB = '.'; + break; } + buffer.append(charB); } buffer.append(EOL); display_offset += chars_read; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java index 526ccc7dc1..7ae20c6696 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java @@ -257,7 +257,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { HSLFTextRun rt = txt.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontSize(_font.getSize()); - rt.setFontName(_font.getFamily()); + rt.setFontFamily(_font.getFamily()); if (getColor() != null) rt.setFontColor(getColor()); if (_font.isBold()) rt.setBold(true); diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java index 38535ecf09..09f21d1baf 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java @@ -247,14 +247,14 @@ public final class PPDrawing extends RecordAtom { */ public void writeOut(OutputStream out) throws IOException { // Ensure the escher layer reflects the text changes - for(int i=0; i 0); + int covered = 0; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + TextSpecInfoRun runs[] = getTextSpecInfoRuns(); + assert(runs.length > 0); + for (int i=0; i size || i == runs.length-1) { + run.setLength(size-covered); + } + covered += run.getLength(); + try { + run.writeOut(bos); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + _data = bos.toByteArray(); + + // Update the size (header bytes 5-8) + LittleEndian.putInt(_header, 4, _data.length); + } + /** * Get the number of characters covered by this records * @@ -111,92 +152,17 @@ public final class TextSpecInfoAtom extends RecordAtom { */ public int getCharactersCovered(){ int covered = 0; - TextSpecInfoRun[] runs = getTextSpecInfoRuns(); - for (int i = 0; i < runs.length; i++) covered += runs[i].len; + for (TextSpecInfoRun r : getTextSpecInfoRuns()) covered += r.length; return covered; } public TextSpecInfoRun[] getTextSpecInfoRuns(){ - ArrayList lst = new ArrayList(); - int pos = 0; - int[] bits = {1, 0, 2}; - while(pos < _data.length) { - TextSpecInfoRun run = new TextSpecInfoRun(); - run.len = LittleEndian.getInt(_data, pos); pos += 4; - run.mask = LittleEndian.getInt(_data, pos); pos += 4; - for (int i = 0; i < bits.length; i++) { - if((run.mask & 1 << bits[i]) != 0){ - switch (bits[i]){ - case 0: - run.spellInfo = LittleEndian.getShort(_data, pos); pos += 2; - break; - case 1: - run.langId = LittleEndian.getShort(_data, pos); pos += 2; - break; - case 2: - run.altLangId = LittleEndian.getShort(_data, pos); pos += 2; - break; - } - } - } - lst.add(run); + LittleEndianByteArrayInputStream bis = new LittleEndianByteArrayInputStream(_data); + List lst = new ArrayList(); + while (bis.available() > 0) { + lst.add(new TextSpecInfoRun(bis)); } return lst.toArray(new TextSpecInfoRun[lst.size()]); } - public static class TextSpecInfoRun { - //Length of special info run. - protected int len; - - //Special info mask of this run; - protected int mask; - - // info fields as indicated by the mask. - // -1 means the bit is not set - protected short spellInfo = -1; - protected short langId = -1; - protected short altLangId = -1; - - /** - * Spelling status of this text. See Spell Info table below. - * - *

Spell Info Types:

- *
  • 0 Unchecked - *
  • 1 Previously incorrect, needs rechecking - *
  • 2 Correct - *
  • 3 Incorrect - * - * @return Spelling status of this text - */ - public short getSpellInfo(){ - return spellInfo; - } - - /** - * Windows LANGID for this text. - * - * @return Windows LANGID for this text. - */ - public short getLangId(){ - return spellInfo; - } - - /** - * Alternate Windows LANGID of this text; - * must be a valid non-East Asian LANGID if the text has an East Asian language, - * otherwise may be an East Asian LANGID or language neutral (zero). - * - * @return Alternate Windows LANGID of this text - */ - public short getAltLangId(){ - return altLangId; - } - - /** - * @return Length of special info run. - */ - public int length(){ - return len; - } - } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoRun.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoRun.java new file mode 100644 index 0000000000..0e2f7301ce --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoRun.java @@ -0,0 +1,346 @@ +/* ==================================================================== + 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.hslf.record; + +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.poi.util.*; + +public class TextSpecInfoRun { + /** + * A enum that specifies the spelling status of a run of text. + */ + public enum SpellInfoEnum { + /** the text is spelled incorrectly. */ + error(new BitField(1)), + /** the text needs rechecking. */ + clean(new BitField(2)), + /** the text has a grammar error. */ + grammar(new BitField(4)), + /** the text is spelled correct */ + correct(new BitField(0)); + + final BitField bitField; + + SpellInfoEnum(BitField bitField) { + this.bitField = bitField; + } + } + + /** A bit that specifies whether the spellInfo field exists. */ + private static final BitField spellFld = new BitField(0X00000001); + /** A bit that specifies whether the lid field exists. */ + private static final BitField langFld = new BitField(0X00000002); + /** A bit that specifies whether the altLid field exists. */ + private static final BitField altLangFld = new BitField(0X00000004); + // unused1, unused2 - Undefined and MUST be ignored. + /** A bit that specifies whether the pp10runid, reserved3, and grammarError fields exist. */ + private static final BitField pp10extFld = new BitField(0X00000020); + /** A bit that specifies whether the bidi field exists. */ + private static final BitField bidiFld = new BitField(0X00000040); + // unused3 - Undefined and MUST be ignored. + // reserved1 - MUST be zero and MUST be ignored. + /** A bit that specifies whether the smartTags field exists. */ + private static final BitField smartTagFld = new BitField(0X00000200); + // reserved2 - MUST be zero and MUST be ignored. + + /** + * An optional unsigned integer that specifies an identifier for a character + * run that contains StyleTextProp11 data. It MUST exist if and only if pp10ext is TRUE. + **/ + private static final BitField pp10runidFld = new BitField(0X0000000F); + // reserved3 - An optional unsigned integer that MUST be zero, and MUST be ignored. It + // MUST exist if and only if fPp10ext is TRUE. + /** + * An optional bit that specifies a grammar error. It MUST exist if and + * only if fPp10ext is TRUE. + **/ + private static final BitField grammarErrorFld = new BitField(0X80000000); + + //Length of special info run. + protected int length; + + //Special info mask of this run; + protected int mask; + + // info fields as indicated by the mask. + // -1 means the bit is not set + + /** + * An optional SpellingFlags structure that specifies the spelling status of this + * text. It MUST exist if and only if spell is TRUE. + * The spellInfo.grammar sub-field MUST be zero. + *
    + * error (1 bit): A bit that specifies whether the text is spelled incorrectly.
    + * clean (1 bit): A bit that specifies whether the text needs rechecking.
    + * grammar (1 bit): A bit that specifies whether the text has a grammar error.
    + * reserved (13 bits): MUST be zero and MUST be ignored. + */ + protected short spellInfo = -1; + + /** + * An optional TxLCID that specifies the language identifier of this text. + * It MUST exist if and only if lang is TRUE. + *
    + * 0x0000 = No language.
    + * 0x0013 = Any Dutch language is preferred over non-Dutch languages when proofing the text.
    + * 0x0400 = No proofing is performed on the text.
    + * > 0x0400 = A valid LCID as specified by [MS-LCID]. + */ + protected short langId = -1; + + /** + * An optional TxLCID that specifies the alternate language identifier of this text. + * It MUST exist if and only if altLang is TRUE. + */ + protected short altLangId = -1; + + /** + * An optional signed integer that specifies whether the text contains bidirectional + * characters. It MUST exist if and only if fBidi is TRUE. + * 0x0000 = Contains no bidirectional characters, + * 0x0001 = Contains bidirectional characters. + */ + protected short bidi = -1; + + protected int pp10extMask = -1; + protected byte[] smartTagsBytes = null; + + /** + * Inits a TextSpecInfoRun with default values + * + * @param len the length of the one and only run + */ + public TextSpecInfoRun(int len) { + setLength(len); + setLangId((short)0); + } + + public TextSpecInfoRun(LittleEndianByteArrayInputStream source) { + length = source.readInt(); + mask = source.readInt(); + if (spellFld.isSet(mask)) { + spellInfo = source.readShort(); + } + if (langFld.isSet(mask)) { + langId = source.readShort(); + } + if (altLangFld.isSet(mask)) { + altLangId = source.readShort(); + } + if (bidiFld.isSet(mask)) { + bidi = source.readShort(); + } + if (pp10extFld.isSet(mask)) { + pp10extMask = source.readInt(); + } + if (smartTagFld.isSet(mask)) { + // An unsigned integer specifies the count of items in rgSmartTagIndex. + int count = source.readInt(); + smartTagsBytes = new byte[4+count*4]; + LittleEndian.putInt(smartTagsBytes, 0, count); + // An array of SmartTagIndex that specifies the indices. + // The count of items in the array is specified by count. + source.readFully(smartTagsBytes, 4, count*4); + } + } + + /** + * Write the contents of the record back, so it can be written + * to disk + * + * @param out the output stream to write to. + * @throws java.io.IOException if an error occurs. + */ + public void writeOut(OutputStream out) throws IOException { + final byte buf[] = new byte[4]; + LittleEndian.putInt(buf, 0, length); + out.write(buf); + LittleEndian.putInt(buf, 0, mask); + out.write(buf); + Object flds[] = { + spellFld, spellInfo, "spell info", + langFld, langId, "lang id", + altLangFld, altLangId, "alt lang id", + bidiFld, bidi, "bidi", + pp10extFld, pp10extMask, "pp10 extension field", + smartTagFld, smartTagsBytes, "smart tags" + }; + + for (int i=0; i 0; + out.write(bufB); + } else if (valO instanceof Integer) { + int valI = ((Integer)valO); + valid = (valI != -1); + LittleEndian.putInt(buf, 0, valI); + out.write(buf); + } else if (valO instanceof Short) { + short valS = ((Short)valO); + valid = (valS != -1); + LittleEndian.putShort(buf, 0, valS); + out.write(buf, 0, 2); + } else { + valid = false; + } + if (!valid) { + throw new IOException(flds[i+2]+" is activated, but its value is invalid"); + } + } + } + + /** + * @return Spelling status of this text. null if not defined. + */ + public SpellInfoEnum getSpellInfo(){ + if (spellInfo == -1) return null; + for (SpellInfoEnum si : new SpellInfoEnum[]{SpellInfoEnum.clean,SpellInfoEnum.error,SpellInfoEnum.grammar}) { + if (si.bitField.isSet(spellInfo)) return si; + } + return SpellInfoEnum.correct; + } + + /** + * @param spellInfo Spelling status of this text. null if not defined. + */ + public void setSpellInfo(SpellInfoEnum spellInfo) { + this.spellInfo = (spellInfo == null) + ? -1 + : (short)spellInfo.bitField.set(0); + mask = spellFld.setBoolean(mask, spellInfo != null); + } + + /** + * Windows LANGID for this text. + * + * @return Windows LANGID for this text, -1 if it's not set + */ + public short getLangId(){ + return langId; + } + + /** + * @param langId Windows LANGID for this text, -1 to unset + */ + public void setLangId(short langId) { + this.langId = langId; + mask = langFld.setBoolean(mask, langId != -1); + } + + /** + * Alternate Windows LANGID of this text; + * must be a valid non-East Asian LANGID if the text has an East Asian language, + * otherwise may be an East Asian LANGID or language neutral (zero). + * + * @return Alternate Windows LANGID of this text, -1 if it's not set + */ + public short getAltLangId(){ + return altLangId; + } + + public void setAltLangId(short altLangId) { + this.altLangId = altLangId; + mask = altLangFld.setBoolean(mask, altLangId != -1); + } + + /** + * @return Length of special info run. + */ + public int getLength() { + return length; + } + + /** + * @param length Length of special info run. + */ + public void setLength(int length) { + this.length = length; + } + + /** + * @return the bidirectional characters flag. false = not bidi, true = is bidi, null = not set + */ + public Boolean getBidi() { + return (bidi == -1 ? null : bidi != 0); + } + + /** + * @param bidi the bidirectional characters flag. false = not bidi, true = is bidi, null = not set + */ + public void setBidi(Boolean bidi) { + this.bidi = (bidi == null) ? -1 : (short)(bidi ? 1 : 0); + mask = bidiFld.setBoolean(mask, bidi != null); + } + + /** + * @return the unparsed smart tags + */ + public byte[] getSmartTagsBytes() { + return smartTagsBytes; + } + + /** + * @param smartTagsBytes the unparsed smart tags, null to unset + */ + public void setSmartTagsBytes(byte[] smartTagsBytes) { + this.smartTagsBytes = smartTagsBytes; + mask = smartTagFld.setBoolean(mask, smartTagsBytes != null); + } + + /** + * @return an identifier for a character run that contains StyleTextProp11 data. + */ + public int getPP10RunId() { + return (pp10extMask == -1 || !pp10extFld.isSet(mask)) ? -1 : pp10runidFld.getValue(pp10extMask); + + } + + /** + * @param pp10RunId an identifier for a character run that contains StyleTextProp11 data, -1 to unset + */ + public void setPP10RunId(int pp10RunId) { + if (pp10RunId == -1) { + pp10extMask = (getGrammarError() == null) ? -1 : pp10runidFld.clear(pp10extMask); + } else { + pp10extMask = pp10runidFld.setValue(pp10extMask, pp10RunId); + } + // if both parameters are invalid, remove the extension mask + mask = pp10extFld.setBoolean(mask, pp10extMask != -1); + } + + public Boolean getGrammarError() { + return (pp10extMask == -1 || !pp10extFld.isSet(mask)) ? null : grammarErrorFld.isSet(pp10extMask); + } + + public void getGrammarError(Boolean grammarError) { + if (grammarError == null) { + pp10extMask = (getPP10RunId() == -1) ? -1 : grammarErrorFld.clear(pp10extMask); + } else { + pp10extMask = grammarErrorFld.set(pp10extMask); + } + // if both parameters are invalid, remove the extension mask + mask = pp10extFld.setBoolean(mask, pp10extMask != -1); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java index ddc6e13068..547e095efb 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java @@ -127,7 +127,36 @@ public abstract class HSLFSheet implements Sheet { */ @Override public List getShapes() { - return getShapeList(); + PPDrawing ppdrawing = getPPDrawing(); + + EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; + EscherContainerRecord spgr = null; + + for (Iterator it = dg.getChildIterator(); it.hasNext();) { + EscherRecord rec = it.next(); + if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) { + spgr = (EscherContainerRecord) rec; + break; + } + } + if (spgr == null) { + throw new IllegalStateException("spgr not found"); + } + + List shapeList = new ArrayList(); + Iterator it = spgr.getChildIterator(); + if (it.hasNext()) { + // skip first item + it.next(); + } + for (; it.hasNext();) { + EscherContainerRecord sp = (EscherContainerRecord) it.next(); + HSLFShape sh = HSLFShapeFactory.createShape(sp, null); + sh.setSheet(this); + shapeList.add(sh); + } + + return shapeList; } /** @@ -347,48 +376,10 @@ public abstract class HSLFSheet implements Sheet { } public Iterator iterator() { - return getShapeList().iterator(); + return getShapes().iterator(); } - /** - * Returns all shapes contained in this Sheet - * - * @return all shapes contained in this Sheet (Slide or Notes) - */ - protected List getShapeList() { - PPDrawing ppdrawing = getPPDrawing(); - - EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; - EscherContainerRecord spgr = null; - - for (Iterator it = dg.getChildIterator(); it.hasNext();) { - EscherRecord rec = it.next(); - if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) { - spgr = (EscherContainerRecord) rec; - break; - } - } - if (spgr == null) { - throw new IllegalStateException("spgr not found"); - } - - List shapeList = new ArrayList(); - Iterator it = spgr.getChildIterator(); - if (it.hasNext()) { - // skip first item - it.next(); - } - for (; it.hasNext();) { - EscherContainerRecord sp = (EscherContainerRecord) it.next(); - HSLFShape sh = HSLFShapeFactory.createShape(sp, null); - sh.setSheet(this); - shapeList.add(sh); - } - - return shapeList; - } - /** * @return whether shapes on the master sheet should be shown. By default master graphics is turned off. * Sheets that support the notion of master (slide, slideLayout) should override it and diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java index eb8eb48512..5cc313e91f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java @@ -571,10 +571,6 @@ public final class HSLFSlideShow implements SlideShow { + _slides.size() + ")"); } - _slides.get(newSlideNumber).setSlideNumber(oldSlideNumber); - _slides.get(oldSlideNumber).setSlideNumber(newSlideNumber); - Collections.swap(_slides, oldSlideNumber-1, newSlideNumber-1); - // The order of slides is defined by the order of slide atom sets in the // SlideListWithText container. SlideListWithText slwt = _documentRecord.getSlideSlideListWithText(); @@ -584,11 +580,16 @@ public final class HSLFSlideShow implements SlideShow { sas[oldSlideNumber - 1] = sas[newSlideNumber - 1]; sas[newSlideNumber - 1] = tmp; + Collections.swap(_slides, oldSlideNumber - 1, newSlideNumber - 1); + _slides.get(newSlideNumber - 1).setSlideNumber(newSlideNumber); + _slides.get(oldSlideNumber - 1).setSlideNumber(oldSlideNumber); + ArrayList lst = new ArrayList(); for (SlideAtomsSet s : sas) { lst.add(s.getSlidePersistAtom()); lst.addAll(Arrays.asList(s.getSlideRecords())); } + Record[] r = lst.toArray(new Record[lst.size()]); slwt.setChildRecord(r); } @@ -628,7 +629,7 @@ public final class HSLFSlideShow implements SlideShow { records.add(s.getSlidePersistAtom()); records.addAll(Arrays.asList(s.getSlideRecords())); } - if (sa.size() == 0) { + if (sa.isEmpty()) { _documentRecord.removeSlideListWithText(slwt); } else { slwt.setSlideAtomsSets(sa.toArray(new SlideAtomsSet[sa.size()])); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index 4b1e3767a7..ca6ddf6e80 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -241,8 +241,8 @@ public final class HSLFTextParagraph implements TextParagraph { hardAttribute = maskProp != null && maskProp.getValue() == 0; } if (prop == null && !hardAttribute){ - HSLFSheet sheet = _parentShape.getSheet(); - int txtype = _parentShape.getRunType(); + HSLFSheet sheet = getSheet(); + int txtype = getRunType(); HSLFMasterSheet master = sheet.getMasterSheet(); if (master != null) prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); @@ -600,7 +600,7 @@ public final class HSLFTextParagraph implements TextParagraph { if (prop == null) { if (_sheet != null) { - int txtype = getParentShape().getRunType(); + int txtype = getRunType(); HSLFMasterSheet master = _sheet.getMasterSheet(); if (master != null) { prop = (BitMaskTextProp) master.getStyleAttribute(txtype, getIndentLevel(), ParagraphFlagsTextProp.NAME, false); @@ -789,10 +789,11 @@ public final class HSLFTextParagraph implements TextParagraph { * If TextSpecInfoAtom is present, we must update the text size in it, * otherwise the ppt will be corrupted */ - TextSpecInfoAtom specAtom = (TextSpecInfoAtom)_txtbox.findFirstOfType(RecordTypes.TextSpecInfoAtom.typeID); - int len = rawText.length() + 1; - if(specAtom != null && len != specAtom.getCharactersCovered()) { - specAtom.reset(len); + for (Record r : paragraphs.get(0)._records) { + if (r instanceof TextSpecInfoAtom) { + ((TextSpecInfoAtom)r).setParentSize(rawText.length()+1); + break; + } } } @@ -870,6 +871,12 @@ public final class HSLFTextParagraph implements TextParagraph { return appendText(paragraphs, text, false); } + public static String getText(List paragraphs) { + assert(!paragraphs.isEmpty()); + String rawText = getRawText(paragraphs); + return toExternalString(rawText, paragraphs.get(0).getRunType()); + } + public static String getRawText(List paragraphs) { StringBuilder sb = new StringBuilder(); for (HSLFTextParagraph p : paragraphs) { @@ -1151,7 +1158,7 @@ public final class HSLFTextParagraph implements TextParagraph { wrapper.appendChildRecord(tha); TextBytesAtom tba = new TextBytesAtom(); - tba.setText("\r".getBytes()); + tba.setText("".getBytes()); wrapper.appendChildRecord(tba); StyleTextPropAtom sta = new StyleTextPropAtom(1); @@ -1162,16 +1169,10 @@ public final class HSLFTextParagraph implements TextParagraph { HSLFTextParagraph htp = new HSLFTextParagraph(tha, tba, null, sta); htp.setParagraphStyle(paraStyle); htp._records = new Record[0]; -// htp.setBullet(false); -// htp.setLineSpacing(100); -// htp.setLeftMargin(0); -// htp.setIndent(0); - // set wrap flags HSLFTextRun htr = new HSLFTextRun(htp); htr.setCharacterStyle(charStyle); - htr.setText("\r"); -// htr.setFontColor(Color.black); + htr.setText(""); htp.addTextRun(htr); return Arrays.asList(htp); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index 91f327c10b..0fb443b604 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -39,7 +39,7 @@ public final class HSLFTextRun implements TextRun { /** The TextRun we belong to */ private HSLFTextParagraph parentParagraph; private String _runText = ""; - private String _fontname; + private String _fontFamily; /** * Our paragraph and character style. @@ -68,9 +68,9 @@ public final class HSLFTextRun implements TextRun { * Supply the SlideShow we belong to */ public void updateSheet() { - if (_fontname != null) { - setFontName(_fontname); - _fontname = null; + if (_fontFamily != null) { + setFontFamily(_fontFamily); + _fontFamily = null; } } @@ -149,7 +149,7 @@ public final class HSLFTextRun implements TextRun { if (prop == null){ HSLFSheet sheet = parentParagraph.getSheet(); - int txtype = parentParagraph.getParentShape().getRunType(); + int txtype = parentParagraph.getRunType(); HSLFMasterSheet master = sheet.getMasterSheet(); if (master != null) prop = master.getStyleAttribute(txtype, parentParagraph.getIndentLevel(), propName, true); @@ -306,16 +306,16 @@ public final class HSLFTextRun implements TextRun { /** * Sets the font name to use */ - public void setFontName(String fontName) { + public void setFontFamily(String fontFamily) { HSLFSheet sheet = parentParagraph.getSheet(); HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow(); if (sheet == null || slideShow == null) { //we can't set font since slideshow is not assigned yet - _fontname = fontName; + _fontFamily = fontFamily; return; } // Get the index for this font (adding if needed) - int fontIdx = slideShow.getFontCollection().addFont(fontName); + int fontIdx = slideShow.getFontCollection().addFont(fontFamily); setCharTextPropVal("font.index", fontIdx); } @@ -327,7 +327,7 @@ public final class HSLFTextRun implements TextRun { HSLFSheet sheet = parentParagraph.getSheet(); HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow(); if (sheet == null || slideShow == null) { - return _fontname; + return _fontFamily; } int fontIdx = getCharTextPropVal("font.index"); if(fontIdx == -1) { return null; } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java index f43f168ee7..ca9e6c9a2f 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java @@ -17,7 +17,6 @@ package org.apache.poi.hslf.model; -import org.apache.poi.hslf.usermodel.TestTextRun; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -36,7 +35,6 @@ import org.junit.runners.Suite; TestOleEmbedding.class, TestPPFont.class, TestPPGraphics2D.class, - TestPicture.class, TestSetBoldItalic.class, TestShapes.class, TestSheet.class, @@ -44,9 +42,7 @@ import org.junit.runners.Suite; TestSlideMaster.class, TestSlides.class, TestTable.class, - TestTextRun.class, - TestTextRunReWrite.class, - TestTextShape.class + TestTextRunReWrite.class }) public class AllHSLFModelTests { } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java index 4fb06ddcf3..cd5c3f7976 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java @@ -40,7 +40,7 @@ public final class TestPPGraphics2D { private HSLFSlideShow ppt; @Before - protected void setUp() throws Exception { + public void setUp() throws Exception { ppt = new HSLFSlideShow(_slTests.openResourceAsStream("empty.ppt")); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java index c807c20116..4fde268965 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java @@ -21,7 +21,6 @@ import static org.junit.Assert.*; import java.awt.*; import java.awt.geom.Rectangle2D; -import java.awt.geom.Rectangle2D.Double; import java.io.*; import java.util.ArrayList; import java.util.List; @@ -29,11 +28,8 @@ import java.util.List; import org.apache.poi.POIDataSamples; import org.apache.poi.ddf.*; import org.apache.poi.hslf.usermodel.*; -import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; -import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle; -import org.apache.poi.sl.usermodel.TextParagraph.FontAlign; -import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; import org.junit.Before; import org.junit.Test; @@ -138,6 +134,7 @@ public final class TestShapes { } } + @SuppressWarnings("unused") @Test public void testParagraphs() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(); @@ -196,7 +193,7 @@ public final class TestShapes { HSLFTextBox txtbox = new HSLFTextBox(); rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); txtbox.setText(val); - rt.setFontName("Arial"); + rt.setFontFamily("Arial"); rt.setFontSize(42); rt.setBold(true); rt.setItalic(true); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java index 330c832486..a5e9084b9e 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java @@ -82,10 +82,13 @@ public final class TestSheet { assertTrue(sheet._getSheetNumber() != 0); assertTrue(sheet._getSheetRefId() != 0); - List txt = sheet.getTextParagraphs(); - assertTrue("no text runs", txt != null && !txt.isEmpty()); - for (HSLFTextParagraph t : txt) { - assertNotNull(t.getSheet()); + List> txt = sheet.getTextParagraphs(); + // assertTrue("no text runs", txt != null && !txt.isEmpty()); + // backgrounds.ppt has no texts + for (List t : txt) { + for (HSLFTextParagraph tp : t) { + assertNotNull(tp.getSheet()); + } } List shape = sheet.getShapes(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java index e6b24ce1b9..cd46ef98ec 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java @@ -113,10 +113,9 @@ public final class TestSlideMaster { HSLFMasterSheet masterSheet = slide.getMasterSheet(); assertTrue(masterSheet instanceof HSLFTitleMaster); - List txt = slide.getTextParagraphs(); - for (int i = 0; i < txt.size(); i++) { - HSLFTextRun rt = txt.get(i).getTextRuns().get(0); - switch(txt.get(i).getRunType()){ + for (List txt : slide.getTextParagraphs()) { + HSLFTextRun rt = txt.get(0).getTextRuns().get(0); + switch(txt.get(0).getRunType()){ case TextHeaderAtom.CENTER_TITLE_TYPE: assertEquals("Arial", rt.getFontFamily()); assertEquals(32, rt.getFontSize(), 0); @@ -141,20 +140,22 @@ public final class TestSlideMaster { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); List slide = ppt.getSlides(); assertEquals(3, slide.size()); - for (HSLFTextParagraph trun : slide.get(0).getTextParagraphs()) { - if (trun.getRunType() == TextHeaderAtom.TITLE_TYPE){ - HSLFTextRun rt = trun.getTextRuns().get(0); + for (List tparas : slide.get(0).getTextParagraphs()) { + HSLFTextParagraph tpara = tparas.get(0); + if (tpara.getRunType() == TextHeaderAtom.TITLE_TYPE){ + HSLFTextRun rt = tpara.getTextRuns().get(0); assertEquals(40, rt.getFontSize(), 0); assertEquals(true, rt.isUnderlined()); assertEquals("Arial", rt.getFontFamily()); - } else if (trun.getRunType() == TextHeaderAtom.BODY_TYPE){ - HSLFTextRun rt = trun.getTextRuns().get(0); - assertEquals(0, trun.getIndentLevel()); + } else if (tpara.getRunType() == TextHeaderAtom.BODY_TYPE){ + HSLFTextRun rt = tpara.getTextRuns().get(0); + assertEquals(0, tpara.getIndentLevel()); assertEquals(32, rt.getFontSize(), 0); assertEquals("Arial", rt.getFontFamily()); - rt = trun.getTextRuns().get(1); - assertEquals(1, trun.getIndentLevel()); + tpara = tparas.get(1); + rt = tpara.getTextRuns().get(0); + assertEquals(1, tpara.getIndentLevel()); assertEquals(28, rt.getFontSize(), 0); assertEquals("Arial", rt.getFontFamily()); @@ -162,16 +163,17 @@ public final class TestSlideMaster { } ; - for (HSLFTextParagraph trun : slide.get(1).getTextParagraphs()) { - if (trun.getRunType() == TextHeaderAtom.TITLE_TYPE){ - HSLFTextRun rt = trun.getTextRuns().get(0); + for (List tparas : slide.get(1).getTextParagraphs()) { + HSLFTextParagraph tpara = tparas.get(0); + if (tpara.getRunType() == TextHeaderAtom.TITLE_TYPE){ + HSLFTextRun rt = tpara.getTextRuns().get(0); assertEquals(48, rt.getFontSize(), 0); assertEquals(true, rt.isItalic()); assertEquals("Georgia", rt.getFontFamily()); - } else if (trun.getRunType() == TextHeaderAtom.BODY_TYPE){ + } else if (tpara.getRunType() == TextHeaderAtom.BODY_TYPE){ HSLFTextRun rt; - rt = trun.getTextRuns().get(0); - assertEquals(0, trun.getIndentLevel()); + rt = tpara.getTextRuns().get(0); + assertEquals(0, tpara.getIndentLevel()); assertEquals(32, rt.getFontSize(), 0); assertEquals("Courier New", rt.getFontFamily()); } @@ -222,16 +224,17 @@ public final class TestSlideMaster { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); HSLFSlide slide = ppt.getSlides().get(0); - for (HSLFTextParagraph trun : slide.getTextParagraphs()) { - if (trun.getRunType() == TextHeaderAtom.TITLE_TYPE){ - HSLFTextRun rt = trun.getTextRuns().get(0); + for (List tparas : slide.getTextParagraphs()) { + HSLFTextParagraph tpara = tparas.get(0); + if (tpara.getRunType() == TextHeaderAtom.TITLE_TYPE){ + HSLFTextRun rt = tpara.getTextRuns().get(0); assertEquals(40, rt.getFontSize(), 0); assertEquals(true, rt.isUnderlined()); assertEquals("Arial", rt.getFontFamily()); - } else if (trun.getRunType() == TextHeaderAtom.BODY_TYPE){ + } else if (tpara.getRunType() == TextHeaderAtom.BODY_TYPE){ int indents[] = { 32, 28, 24 }; - for (HSLFTextRun rt : trun.getTextRuns()) { - int indent = trun.getIndentLevel(); + for (HSLFTextRun rt : tpara.getTextRuns()) { + int indent = tpara.getIndentLevel(); assertEquals(indents[indent], rt.getFontSize(), 0); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java index 8601f95ea5..85070a3d51 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.util.List; import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.usermodel.*; @@ -58,34 +59,37 @@ public final class TestTextRunReWrite { @Test public void testWritesOutTheSameNonRich() throws Exception { - // Grab the first text run on the first sheet - HSLFTextParagraph tr1 = ss.getSlides().get(0).getTextParagraphs().get(0); - HSLFTextParagraph tr2 = ss.getSlides().get(0).getTextParagraphs().get(1); - // Ensure the text lengths are as we'd expect to start with - assertEquals(1, ss.getSlides().length); - assertEquals(2, ss.getSlides().get(0).getTextParagraphs().length); - assertEquals(30, tr1.getRawText().length()); - assertEquals(179, tr2.getRawText().length()); + assertEquals(1, ss.getSlides().size()); + assertEquals(2, ss.getSlides().get(0).getTextParagraphs().size()); - assertEquals(1, tr1.getTextRuns().length); - assertEquals(30, tr1.getTextRuns().get(0).getLength()); - assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); - assertEquals(31, tr1.getTextRuns().get(0)._getRawCharacterStyle().getCharactersCovered()); - assertEquals(31, tr1.getTextRuns().get(0)._getRawParagraphStyle().getCharactersCovered()); + // Grab the first text run on the first sheet + List tr1 = ss.getSlides().get(0).getTextParagraphs().get(0); + List tr2 = ss.getSlides().get(0).getTextParagraphs().get(1); + + + assertEquals(30, HSLFTextParagraph.getRawText(tr1).length()); + assertEquals(179, HSLFTextParagraph.getRawText(tr2).length()); + + assertEquals(1, tr1.size()); + assertEquals(30, HSLFTextParagraph.getText(tr1).length()); + assertEquals(30, HSLFTextParagraph.getRawText(tr1).length()); + assertEquals(31, tr1.get(0).getTextRuns().get(0).getCharacterStyle().getCharactersCovered()); + assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered()); // Set the text to be as it is now - tr1.setText( tr1.getRawText() ); + HSLFTextParagraph.setText(tr1, HSLFTextParagraph.getRawText(tr1)); + tr1 = ss.getSlides().get(0).getTextParagraphs().get(0); // Check the text lengths are still right - assertEquals(30, tr1.getRawText().length()); - assertEquals(179, tr2.getRawText().length()); + assertEquals(30, HSLFTextParagraph.getRawText(tr1).length()); + assertEquals(179, HSLFTextParagraph.getRawText(tr2).length()); - assertEquals(1, tr1.getTextRuns().length); - assertEquals(30, tr1.getTextRuns().get(0).getLength()); - assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); - assertEquals(31, tr1.getTextRuns().get(0)._getRawCharacterStyle().getCharactersCovered()); - assertEquals(31, tr1.getTextRuns().get(0)._getRawParagraphStyle().getCharactersCovered()); + assertEquals(1, tr1.size()); + assertEquals(30, HSLFTextParagraph.getText(tr1).length()); + assertEquals(30, HSLFTextParagraph.getRawText(tr1).length()); + assertEquals(31, tr1.get(0).getTextRuns().get(0).getCharacterStyle().getCharactersCovered()); + assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered()); // Write the slideshow out to a byte array @@ -117,33 +121,32 @@ public final class TestTextRunReWrite { @Test public void testWritesOutTheSameRich() throws Exception { // Grab the first text run on the first sheet - HSLFTextParagraph tr1 = ss.getSlides().get(0).getTextParagraphs().get(0); + List tr1 = ss.getSlides().get(0).getTextParagraphs().get(0); // Get the first rich text run - HSLFTextRun rtr1 = tr1.getTextRuns().get(0); + HSLFTextRun rtr1 = tr1.get(0).getTextRuns().get(0); // Check that the text sizes are as expected - assertEquals(1, tr1.getTextRuns().length); - assertEquals(30, tr1.getRawText().length()); - assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); + assertEquals(1, tr1.get(0).getTextRuns().size()); + assertEquals(30, HSLFTextParagraph.getRawText(tr1).length()); assertEquals(30, rtr1.getLength()); assertEquals(30, rtr1.getRawText().length()); - assertEquals(31, rtr1._getRawCharacterStyle().getCharactersCovered()); - assertEquals(31, rtr1._getRawParagraphStyle().getCharactersCovered()); + assertEquals(31, rtr1.getCharacterStyle().getCharactersCovered()); + assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered()); // Set the text to be as it is now rtr1.setText( rtr1.getRawText() ); - rtr1 = tr1.getTextRuns().get(0); + rtr1 = tr1.get(0).getTextRuns().get(0); // Check that the text sizes are still as expected - assertEquals(1, tr1.getTextRuns().length); - assertEquals(30, tr1.getRawText().length()); - assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); + assertEquals(1, tr1.get(0).getTextRuns().size()); + assertEquals(30, HSLFTextParagraph.getRawText(tr1).length()); + assertEquals(30, tr1.get(0).getTextRuns().get(0).getRawText().length()); assertEquals(30, rtr1.getLength()); assertEquals(30, rtr1.getRawText().length()); - assertEquals(31, rtr1._getRawCharacterStyle().getCharactersCovered()); - assertEquals(31, rtr1._getRawParagraphStyle().getCharactersCovered()); + assertEquals(31, rtr1.getCharacterStyle().getCharactersCovered()); + assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered()); // Write the slideshow out to a byte array diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java deleted file mode 100644 index f11d299c90..0000000000 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* ==================================================================== - 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.hslf.model; - -import org.apache.poi.hslf.record.StyleTextPropAtom; -import org.apache.poi.hslf.record.TextCharsAtom; -import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.*; -import org.apache.poi.hssf.usermodel.DummyGraphics2d; -import org.junit.Test; - - -public class TextPainterTest { - @Test - public void testTextPainter() { - HSLFTextShape shape = new Polygon(); - TextPainter painter = new TextPainter(shape); - painter.getAttributedString(new HSLFTextParagraph(null, new TextCharsAtom(), null)); - painter.paint(new DummyGraphics2d()); - painter.getTextElements((float)1.0, null); - } - - @Test - public void testTextPainterWithText() { - HSLFTextShape shape = new Polygon(); - TextPainter painter = new TextPainter(shape); - TextCharsAtom tca = new TextCharsAtom(); - tca.setText("some text to read"); - HSLFTextParagraph txrun = new HSLFTextParagraph(new TextHeaderAtom(), tca, new StyleTextPropAtom(10)); - HSLFSlide sheet = new HSLFSlide(1, 1, 1); - sheet.setSlideShow(new HSLFSlideShow()); - txrun.setSheet(sheet); - - painter.getAttributedString(txrun, new DummyGraphics2d()); - painter.paint(new DummyGraphics2d()); - painter.getTextElements((float)1.0, null); - } -} diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTextSpecInfoAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTextSpecInfoAtom.java index 6a407365a0..593f116cab 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTextSpecInfoAtom.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTextSpecInfoAtom.java @@ -42,14 +42,14 @@ public final class TestTextSpecInfoAtom extends TestCase { public void testRead() { TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length); - TextSpecInfoAtom.TextSpecInfoRun[] run = spec.getTextSpecInfoRuns(); + TextSpecInfoRun[] run = spec.getTextSpecInfoRuns(); assertEquals(5, run.length); - assertEquals(10, run[0].length()); - assertEquals(1, run[1].length()); - assertEquals(70, run[2].length()); - assertEquals(9, run[3].length()); - assertEquals(32, run[4].length()); + assertEquals(10, run[0].getLength()); + assertEquals(1, run[1].getLength()); + assertEquals(70, run[2].getLength()); + assertEquals(9, run[3].getLength()); + assertEquals(32, run[4].getLength()); } @@ -66,10 +66,10 @@ public final class TestTextSpecInfoAtom extends TestCase { TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length); spec.reset(32); //length of the parent text - TextSpecInfoAtom.TextSpecInfoRun[] run = spec.getTextSpecInfoRuns(); + TextSpecInfoRun[] run = spec.getTextSpecInfoRuns(); assertEquals(1, run.length); - assertEquals(32, run[0].length()); + assertEquals(32, run[0].getLength()); //serialize and read again ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -77,9 +77,9 @@ public final class TestTextSpecInfoAtom extends TestCase { byte[] result = out.toByteArray(); TextSpecInfoAtom spec2 = new TextSpecInfoAtom(result, 0, result.length); - TextSpecInfoAtom.TextSpecInfoRun[] run2 = spec2.getTextSpecInfoRuns(); + TextSpecInfoRun[] run2 = spec2.getTextSpecInfoRuns(); assertEquals(1, run2.length); - assertEquals(32, run2[0].length()); + assertEquals(32, run2[0].getLength()); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTxMasterStyleAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTxMasterStyleAtom.java index 6a66b234db..cd4b54d19c 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTxMasterStyleAtom.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTxMasterStyleAtom.java @@ -84,13 +84,13 @@ public final class TestTxMasterStyleAtom extends TestCase { TextProp prop; //paragraph styles - props = txmaster.getParagraphStyles()[0]; + props = txmaster.getParagraphStyles().get(0); prop = props.findByName("alignment"); assertEquals(1, prop.getValue()); //title has center alignment //character styles - props = txmaster.getCharacterStyles()[0]; + props = txmaster.getCharacterStyles().get(0); prop = props.findByName("font.color"); assertEquals(0x3000000, prop.getValue()); @@ -110,27 +110,27 @@ public final class TestTxMasterStyleAtom extends TestCase { TextPropCollection props; TextProp prop; - TextPropCollection[] prstyles = txmaster.getParagraphStyles(); - TextPropCollection[] chstyles = txmaster.getCharacterStyles(); + List prstyles = txmaster.getParagraphStyles(); + List chstyles = txmaster.getCharacterStyles(); assertEquals("TxMasterStyleAtom for TextHeaderAtom.BODY_TYPE " + - "must contain styles for 5 indentation levels", 5, prstyles.length); + "must contain styles for 5 indentation levels", 5, prstyles.size()); assertEquals("TxMasterStyleAtom for TextHeaderAtom.BODY_TYPE " + - "must contain styles for 5 indentation levels", 5, chstyles.length); + "must contain styles for 5 indentation levels", 5, chstyles.size()); //paragraph styles - props = prstyles[0]; + props = prstyles.get(0); prop = props.findByName("alignment"); assertEquals(0, prop.getValue()); - for (int i = 0; i < prstyles.length; i++) { - assertNotNull("text.offset is null for indentation level " + i, prstyles[i].findByName("text.offset")); - assertNotNull("bullet.offset is null for indentation level " + i, prstyles[i].findByName("bullet.offset")); + for (int i = 0; i < prstyles.size(); i++) { + assertNotNull("text.offset is null for indentation level " + i, prstyles.get(i).findByName("text.offset")); + assertNotNull("bullet.offset is null for indentation level " + i, prstyles.get(i).findByName("bullet.offset")); } //character styles - props = chstyles[0]; + props = chstyles.get(0); prop = props.findByName("font.color"); assertEquals(0x1000000, prop.getValue()); @@ -150,13 +150,13 @@ public final class TestTxMasterStyleAtom extends TestCase { TextProp prop; //paragraph styles - props = txmaster.getParagraphStyles()[0]; + props = txmaster.getParagraphStyles().get(0); prop = props.findByName("alignment"); assertEquals(0, prop.getValue()); //character styles - props = txmaster.getCharacterStyles()[0]; + props = txmaster.getCharacterStyles().get(0); prop = props.findByName("font.color"); assertEquals(0x1000000, prop.getValue()); @@ -176,13 +176,13 @@ public final class TestTxMasterStyleAtom extends TestCase { TextProp prop; //paragraph styles - props = txmaster.getParagraphStyles()[0]; + props = txmaster.getParagraphStyles().get(0); prop = props.findByName("alignment"); assertEquals(0, prop.getValue()); //title has center alignment //character styles - props = txmaster.getCharacterStyles()[0]; + props = txmaster.getCharacterStyles().get(0); prop = props.findByName("font.color"); assertEquals(0x1000000, prop.getValue()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/AllHSLFUserModelTests.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/AllHSLFUserModelTests.java index bc6b6cd972..0354d9b46c 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/AllHSLFUserModelTests.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/AllHSLFUserModelTests.java @@ -37,7 +37,10 @@ import org.junit.runners.Suite; TestSheetText.class, TestSlideOrdering.class, TestSoundData.class, - TestFontRendering.class + TestFontRendering.class, + TestPicture.class, + TestTextRun.class, + TestTextShape.class }) public class AllHSLFUserModelTests { } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java index 53079a3ac2..9695a9d053 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java @@ -19,17 +19,15 @@ package org.apache.poi.hslf.usermodel; +import static org.junit.Assert.*; + import java.util.List; -import junit.framework.TestCase; - +import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.model.textproperties.TextPFException9; import org.apache.poi.hslf.model.textproperties.TextPropCollection; -import org.apache.poi.hslf.record.EscherTextboxWrapper; -import org.apache.poi.hslf.record.StyleTextProp9Atom; -import org.apache.poi.hslf.record.StyleTextPropAtom; -import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum; -import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.record.*; +import org.junit.Test; /** @@ -37,22 +35,21 @@ import org.apache.poi.POIDataSamples; * * @author Alex Nikiforov [mailto:anikif@gmail.com] */ -public final class TestNumberedList extends TestCase { +public final class TestNumberedList { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); - protected void setUp() throws Exception { - } - - public void testNumberedList() throws Exception { + @Test + public void testNumberedList() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers.ppt")); assertTrue("No Exceptions while reading file", true); - final HSLFSlide[] slides = ppt.getSlides(); - assertEquals(2, slides.length); - checkSlide0(slides[0]); - checkSlide1(slides[1]); + final List slides = ppt.getSlides(); + assertEquals(2, slides.size()); + checkSlide0(slides.get(0)); + checkSlide1(slides.get(1)); } - private void checkSlide0(final HSLFSlide s) { + + private void checkSlide0(final HSLFSlide s) { final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo(); assertNotNull(numberedListArray); assertEquals(1, numberedListArray.length);//Just one text box here @@ -68,27 +65,33 @@ public final class TestNumberedList extends TestCase { assertNull(autoNumbers[1].getAutoNumberScheme()); assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaLcParenRight == autoNumbers[2].getAutoNumberScheme()); - HSLFTextParagraph[] textRuns = s.getTextParagraphs(); - assertEquals(2, textRuns.length); + List> textParass = s.getTextParagraphs(); + assertEquals(2, textParass.size()); - HSLFTextRun textRun = textRuns[0].getTextRuns()[0]; - assertEquals("titTe", textRun.getRawText()); - assertEquals(1, textRuns[0].getTextRuns().length); - assertFalse(textRun.isBullet()); + List textParas = textParass.get(0); + assertEquals("titTe", HSLFTextParagraph.getRawText(textParas)); + assertEquals(1, textParas.size()); + assertFalse(textParas.get(0).isBullet()); - assertEquals("This is a text placeholder that \rfollows the design pattern\rJust a test\rWithout any paragraph\rSecond paragraph first line c) ;\rSecond paragraph second line d) . \r", textRuns[1].getRawText()); + String expected = + "This is a text placeholder that \r" + + "follows the design pattern\r" + + "Just a test\rWithout any paragraph\r" + + "Second paragraph first line c) ;\r" + + "Second paragraph second line d) . \r"; + assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1))); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); - assertEquals(textRuns.length, styleAtoms.length); + assertEquals(textParass.size(), styleAtoms.length); final EscherTextboxWrapper wrapper = styleAtoms[1]; final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom(); final List textProps = styleTextPropAtom.getCharacterStyles(); - final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]); - assertEquals(60, props[0].getCharactersCovered()); - assertEquals(34, props[1].getCharactersCovered()); - assertEquals(68, props[2].getCharactersCovered()); + assertEquals(60, textProps.get(0).getCharactersCovered()); + assertEquals(34, textProps.get(1).getCharactersCovered()); + assertEquals(68, textProps.get(2).getCharactersCovered()); } - private void checkSlide1(final HSLFSlide s) { + + private void checkSlide1(final HSLFSlide s) { final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo(); assertNotNull(numberedListArray); assertEquals(1, numberedListArray.length);//Just one text box here @@ -104,25 +107,30 @@ public final class TestNumberedList extends TestCase { assertNull(autoNumbers[1].getAutoNumberScheme()); assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaUcPeriod == autoNumbers[2].getAutoNumberScheme()); - final HSLFTextParagraph[] textRuns = s.getTextParagraphs(); - assertEquals(2, textRuns.length); + final List> textParass = s.getTextParagraphs(); + assertEquals(2, textParass.size()); - HSLFTextRun textRun = textRuns[0].getTextRuns()[0]; - assertEquals("Second Slide Title", textRun.getRawText()); - assertEquals(1, textRuns[0].getTextRuns().length); - assertFalse(textRun.isBullet()); + List textParas = textParass.get(0); + assertEquals("Second Slide Title", HSLFTextParagraph.getRawText(textParas)); + assertEquals(1, textParas.size()); + assertFalse(textParas.get(0).isBullet()); - assertEquals("This is a text placeholder that \rfollows the design pattern\rJust a test\rWithout any paragraph\rSecond paragraph first line c) ;\rSecond paragraph second line d) . \r", textRuns[1].getRawText()); + String expected = + "This is a text placeholder that \r" + + "follows the design pattern\r" + + "Just a test\rWithout any paragraph\r" + + "Second paragraph first line c) ;\r" + + "Second paragraph second line d) . \r"; + assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1))); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); - assertEquals(textRuns.length, styleAtoms.length); + assertEquals(textParass.size(), styleAtoms.length); final EscherTextboxWrapper wrapper = styleAtoms[1]; final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom(); final List textProps = styleTextPropAtom.getCharacterStyles(); - final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]); - assertEquals(33, props[0].getCharactersCovered()); - assertEquals(61, props[1].getCharactersCovered()); - assertEquals(68, props[2].getCharactersCovered()); + assertEquals(33, textProps.get(0).getCharactersCovered()); + assertEquals(61, textProps.get(1).getCharactersCovered()); + assertEquals(68, textProps.get(2).getCharactersCovered()); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java index c0457f4d8c..9a096c18ed 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java @@ -19,17 +19,15 @@ package org.apache.poi.hslf.usermodel; +import static org.junit.Assert.*; + import java.util.List; -import junit.framework.TestCase; - +import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.model.textproperties.TextPFException9; import org.apache.poi.hslf.model.textproperties.TextPropCollection; -import org.apache.poi.hslf.record.EscherTextboxWrapper; -import org.apache.poi.hslf.record.StyleTextProp9Atom; -import org.apache.poi.hslf.record.StyleTextPropAtom; -import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum; -import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.record.*; +import org.junit.Test; /** @@ -40,20 +38,18 @@ import org.apache.poi.POIDataSamples; * * @author Alex Nikiforov [mailto:anikif@gmail.com] */ -public final class TestNumberedList2 extends TestCase { +public final class TestNumberedList2 { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); - protected void setUp() throws Exception { - } - + @Test public void testNumberedList() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers2.ppt")); assertTrue("No Exceptions while reading file", true); - final HSLFSlide[] slides = ppt.getSlides(); - assertEquals(2, slides.length); - checkSlide0(slides[0]); - checkSlide1(slides[1]); + final List slides = ppt.getSlides(); + assertEquals(2, slides.size()); + checkSlide0(slides.get(0)); + checkSlide1(slides.get(1)); } private void checkSlide0(final HSLFSlide s) { final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo(); @@ -73,18 +69,22 @@ public final class TestNumberedList2 extends TestCase { assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox1[0].getAutoNumberScheme()); - HSLFTextParagraph[] textRuns = s.getTextParagraphs(); - assertEquals(2, textRuns.length); + List> textParass = s.getTextParagraphs(); + assertEquals(2, textParass.size()); - HSLFTextRun textRun = textRuns[0].getTextRuns()[0]; - assertEquals("List Item One\rList Item Two\rList Item Three", textRun.getRawText()); - assertEquals(1, textRuns[0].getTextRuns().length); - assertTrue(textRun.isBullet()); + List textParas = textParass.get(0); + assertEquals("List Item One\rList Item Two\rList Item Three", HSLFTextParagraph.getRawText(textParas)); + assertEquals(3, textParas.size()); + assertTrue(textParas.get(0).isBullet()); - assertEquals("A numbered list may start at any number \rThis would be used as a continuation list on another page\rThis list should start with #6", textRuns[1].getRawText()); + String expected = + "A numbered list may start at any number \r" + + "This would be used as a continuation list on another page\r" + + "This list should start with #6"; + assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1))); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); - assertEquals(textRuns.length, styleAtoms.length); + assertEquals(textParass.size(), styleAtoms.length); checkSingleRunWrapper(44, styleAtoms[0]); checkSingleRunWrapper(130, styleAtoms[1]); } @@ -99,19 +99,21 @@ public final class TestNumberedList2 extends TestCase { assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox[0].getAutoNumberStartNumber());//Default value = 1 will be used assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox[0].getAutoNumberScheme()); - HSLFTextParagraph[] textRuns = s.getTextParagraphs(); - assertEquals(3, textRuns.length); + List> textParass = s.getTextParagraphs(); + assertEquals(3, textParass.size()); - HSLFTextRun textRun = textRuns[0].getTextRuns()[0]; - assertEquals("Bulleted list\rMore bullets", textRun.getRawText()); - assertEquals(1, textRuns[0].getTextRuns().length); - assertTrue(textRun.isBullet()); + List textParas = textParass.get(0); + assertEquals("Bulleted list\rMore bullets", HSLFTextParagraph.getRawText(textParas)); + assertEquals(2, textParas.size()); + assertTrue(textParas.get(0).isBullet()); - assertEquals("Numbered list between two bulleted lists\rSecond numbered list item", textRuns[1].getRawText()); - assertEquals("Second bulleted list \u2013 should appear after numbered list\rMore bullets", textRuns[2].getRawText()); + String expected = "Numbered list between two bulleted lists\rSecond numbered list item"; + assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1))); + expected = "Second bulleted list \u2013 should appear after numbered list\rMore bullets"; + assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(2))); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); - assertEquals(textRuns.length, styleAtoms.length); + assertEquals(textParass.size(), styleAtoms.length); checkSingleRunWrapper(27, styleAtoms[0]); checkSingleRunWrapper(67, styleAtoms[1]); checkSingleRunWrapper(70, styleAtoms[2]); @@ -120,7 +122,6 @@ public final class TestNumberedList2 extends TestCase { final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom(); final List textProps = styleTextPropAtom.getCharacterStyles(); assertEquals(1, textProps.size()); - final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]); - assertEquals(exceptedLength, props[0].getCharactersCovered()); + assertEquals(exceptedLength, textProps.get(0).getCharactersCovered()); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java index eabbc4d58f..ab358f65a0 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java @@ -19,17 +19,15 @@ package org.apache.poi.hslf.usermodel; +import static org.junit.Assert.*; + import java.util.List; -import junit.framework.TestCase; - +import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.model.textproperties.TextPFException9; import org.apache.poi.hslf.model.textproperties.TextPropCollection; -import org.apache.poi.hslf.record.EscherTextboxWrapper; -import org.apache.poi.hslf.record.StyleTextProp9Atom; -import org.apache.poi.hslf.record.StyleTextPropAtom; -import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum; -import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.record.*; +import org.junit.Test; /** @@ -40,19 +38,17 @@ import org.apache.poi.POIDataSamples; * * @author Alex Nikiforov [mailto:anikif@gmail.com] */ -public final class TestNumberedList3 extends TestCase { +public final class TestNumberedList3 { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); - protected void setUp() throws Exception { - } - - public void testNumberedList() throws Exception { + @Test + public void testNumberedList() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers3.ppt")); assertTrue("No Exceptions while reading file", true); - final HSLFSlide[] slides = ppt.getSlides(); - assertEquals(1, slides.length); - final HSLFSlide slide = slides[0]; + final List slides = ppt.getSlides(); + assertEquals(1, slides.size()); + final HSLFSlide slide = slides.get(0); checkSlide(slide); } private void checkSlide(final HSLFSlide s) { @@ -66,35 +62,32 @@ public final class TestNumberedList3 extends TestCase { assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getAutoNumberStartNumber());//Default value = 1 will be used assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); - final HSLFTextParagraph[] textRuns = s.getTextParagraphs(); - assertEquals(3, textRuns.length); - assertEquals("Bulleted list\rMore bullets\rNo bullets here", textRuns[0].getRawText()); - assertEquals("Numbered list between two bulleted lists\rSecond numbered list item", textRuns[1].getRawText()); - assertEquals("Second bulleted list \u2013 should appear after numbered list\rMore bullets", textRuns[2].getRawText()); - assertEquals(2, textRuns[0].getTextRuns().length); - assertEquals(1, textRuns[1].getTextRuns().length); - assertEquals(1, textRuns[2].getTextRuns().length); - assertNull(textRuns[0].getStyleTextProp9Atom()); - assertNotNull(textRuns[1].getStyleTextProp9Atom()); - assertNull(textRuns[2].getStyleTextProp9Atom()); - final TextPFException9[] autoNumbers = textRuns[1].getStyleTextProp9Atom().getAutoNumberTypes(); + final List> textParass = s.getTextParagraphs(); + assertEquals(3, textParass.size()); + assertEquals("Bulleted list\rMore bullets\rNo bullets here", HSLFTextParagraph.getRawText(textParass.get(0))); + assertEquals("Numbered list between two bulleted lists\rSecond numbered list item", HSLFTextParagraph.getRawText(textParass.get(1))); + assertEquals("Second bulleted list \u2013 should appear after numbered list\rMore bullets", HSLFTextParagraph.getRawText(textParass.get(2))); + assertEquals(3, textParass.get(0).size()); + assertEquals(2, textParass.get(1).size()); + assertEquals(2, textParass.get(2).size()); + assertNull(textParass.get(0).get(0).getStyleTextProp9Atom()); + assertNotNull(textParass.get(1).get(0).getStyleTextProp9Atom()); + assertNull(textParass.get(2).get(0).getStyleTextProp9Atom()); + final TextPFException9[] autoNumbers = textParass.get(1).get(0).getStyleTextProp9Atom().getAutoNumberTypes(); assertEquals(1, autoNumbers.length); assertEquals(Short.valueOf((short)1), autoNumbers[0].getfBulletHasAutoNumber()); assertEquals(Short.valueOf((short)1), autoNumbers[0].getAutoNumberStartNumber());//Default value = 1 will be used assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); - final List textProps = textRuns[1].getStyleTextPropAtom().getCharacterStyles(); + final List textProps = textParass.get(1).get(0).getStyleTextPropAtom().getCharacterStyles(); assertEquals(1, textProps.size()); final TextPropCollection textProp = textProps.get(0); assertEquals(67, textProp.getCharactersCovered()); - - HSLFTextRun textRun = textRuns[0].getTextRuns()[0]; - assertTrue(textRun.isBullet()); - + assertTrue(textParass.get(0).get(0).isBullet()); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); - assertEquals(textRuns.length, styleAtoms.length); + assertEquals(textParass.size(), styleAtoms.length); checkSingleRunWrapper(43, styleAtoms[0]); checkSingleRunWrapper(67, styleAtoms[1]); } @@ -102,7 +95,6 @@ public final class TestNumberedList3 extends TestCase { final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom(); final List textProps = styleTextPropAtom.getCharacterStyles(); assertEquals(1, textProps.size()); - final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]); - assertEquals(exceptedLength, props[0].getCharactersCovered()); + assertEquals(exceptedLength, textProps.get(0).getCharactersCovered()); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java similarity index 99% rename from src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java rename to src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java index ff4e1c5a7a..2410d6ca65 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java @@ -15,7 +15,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java index 270e01caa3..c8a3d3761d 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java @@ -18,21 +18,21 @@ package org.apache.poi.hslf.usermodel; +import static org.junit.Assert.assertEquals; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import junit.framework.TestCase; - -import org.apache.poi.hslf.*; -import org.apache.poi.hslf.model.*; import org.apache.poi.POIDataSamples; +import org.junit.Before; +import org.junit.Test; /** * Tests that SlideShow can re-order slides properly * * @author Nick Burch (nick at torchbox dot com) */ -public final class TestReOrderingSlides extends TestCase { +public final class TestReOrderingSlides { // A SlideShow with one slide private HSLFSlideShowImpl hss_one; private HSLFSlideShow ss_one; @@ -48,6 +48,7 @@ public final class TestReOrderingSlides extends TestCase { /** * Create/open the slideshows */ + @Before public void setUp() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); @@ -64,10 +65,11 @@ public final class TestReOrderingSlides extends TestCase { /** * Test that we can "re-order" a slideshow with only 1 slide on it */ + @Test public void testReOrder1() throws Exception { // Has one slide - assertEquals(1, ss_one.getSlides().length); - HSLFSlide s1 = ss_one.getSlides()[0]; + assertEquals(1, ss_one.getSlides().size()); + HSLFSlide s1 = ss_one.getSlides().get(0); // Check slide 1 is as expected assertEquals(256, s1._getSheetNumber()); @@ -86,10 +88,10 @@ public final class TestReOrderingSlides extends TestCase { HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); // Check it still has 1 slide - assertEquals(1, ss_read.getSlides().length); + assertEquals(1, ss_read.getSlides().size()); // And check it's as expected - s1 = ss_read.getSlides()[0]; + s1 = ss_read.getSlides().get(0); assertEquals(256, s1._getSheetNumber()); assertEquals(3, s1._getSheetRefId()); assertEquals(1, s1.getSlideNumber()); @@ -99,11 +101,12 @@ public final class TestReOrderingSlides extends TestCase { * Test doing a dummy re-order on a slideshow with * two slides in it */ + @Test public void testReOrder2() throws Exception { // Has two slides - assertEquals(2, ss_two.getSlides().length); - HSLFSlide s1 = ss_two.getSlides()[0]; - HSLFSlide s2 = ss_two.getSlides()[1]; + assertEquals(2, ss_two.getSlides().size()); + HSLFSlide s1 = ss_two.getSlides().get(0); + HSLFSlide s2 = ss_two.getSlides().get(1); // Check slide 1 is as expected assertEquals(256, s1._getSheetNumber()); @@ -126,11 +129,11 @@ public final class TestReOrderingSlides extends TestCase { HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); // Check it still has 2 slides - assertEquals(2, ss_read.getSlides().length); + assertEquals(2, ss_read.getSlides().size()); // And check it's as expected - s1 = ss_read.getSlides()[0]; - s2 = ss_read.getSlides()[1]; + s1 = ss_read.getSlides().get(0); + s2 = ss_read.getSlides().get(1); assertEquals(256, s1._getSheetNumber()); assertEquals(4, s1._getSheetRefId()); assertEquals(1, s1.getSlideNumber()); @@ -142,11 +145,12 @@ public final class TestReOrderingSlides extends TestCase { /** * Test re-ordering slides in a slideshow with 2 slides on it */ + @Test public void testReOrder2swap() throws Exception { // Has two slides - assertEquals(2, ss_two.getSlides().length); - HSLFSlide s1 = ss_two.getSlides()[0]; - HSLFSlide s2 = ss_two.getSlides()[1]; + assertEquals(2, ss_two.getSlides().size()); + HSLFSlide s1 = ss_two.getSlides().get(0); + HSLFSlide s2 = ss_two.getSlides().get(1); // Check slide 1 is as expected assertEquals(256, s1._getSheetNumber()); @@ -169,11 +173,11 @@ public final class TestReOrderingSlides extends TestCase { HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); // Check it still has 2 slides - assertEquals(2, ss_read.getSlides().length); + assertEquals(2, ss_read.getSlides().size()); // And check it's as expected - s1 = ss_read.getSlides()[0]; - s2 = ss_read.getSlides()[1]; + s1 = ss_read.getSlides().get(0); + s2 = ss_read.getSlides().get(1); assertEquals(257, s1._getSheetNumber()); assertEquals(6, s1._getSheetRefId()); assertEquals(1, s1.getSlideNumber()); @@ -186,12 +190,13 @@ public final class TestReOrderingSlides extends TestCase { * Test doing a dummy re-order on a slideshow with * three slides in it */ + @Test public void testReOrder3() throws Exception { // Has three slides - assertEquals(3, ss_three.getSlides().length); - HSLFSlide s1 = ss_three.getSlides()[0]; - HSLFSlide s2 = ss_three.getSlides()[1]; - HSLFSlide s3 = ss_three.getSlides()[2]; + assertEquals(3, ss_three.getSlides().size()); + HSLFSlide s1 = ss_three.getSlides().get(0); + HSLFSlide s2 = ss_three.getSlides().get(1); + HSLFSlide s3 = ss_three.getSlides().get(2); // Check slide 1 is as expected assertEquals(256, s1._getSheetNumber()); @@ -218,12 +223,12 @@ public final class TestReOrderingSlides extends TestCase { HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); // Check it still has 3 slides - assertEquals(3, ss_read.getSlides().length); + assertEquals(3, ss_read.getSlides().size()); // And check it's as expected - s1 = ss_read.getSlides()[0]; - s2 = ss_read.getSlides()[1]; - s3 = ss_read.getSlides()[2]; + s1 = ss_read.getSlides().get(0); + s2 = ss_read.getSlides().get(1); + s3 = ss_read.getSlides().get(2); assertEquals(256, s1._getSheetNumber()); assertEquals(3, s1._getSheetRefId()); @@ -239,12 +244,13 @@ public final class TestReOrderingSlides extends TestCase { /** * Test re-ordering slides in a slideshow with 3 slides on it */ + @Test public void testReOrder3swap() throws Exception { // Has three slides - assertEquals(3, ss_three.getSlides().length); - HSLFSlide s1 = ss_three.getSlides()[0]; - HSLFSlide s2 = ss_three.getSlides()[1]; - HSLFSlide s3 = ss_three.getSlides()[2]; + assertEquals(3, ss_three.getSlides().size()); + HSLFSlide s1 = ss_three.getSlides().get(0); + HSLFSlide s2 = ss_three.getSlides().get(1); + HSLFSlide s3 = ss_three.getSlides().get(2); // Check slide 1 is as expected assertEquals(256, s1._getSheetNumber()); @@ -263,6 +269,18 @@ public final class TestReOrderingSlides extends TestCase { // (1 -> 2, 2 -> 3) ss_three.reorderSlide(3, 1); + // refresh the slides + s1 = ss_three.getSlides().get(0); + s2 = ss_three.getSlides().get(1); + s3 = ss_three.getSlides().get(2); + + assertEquals(1, s1.getSlideNumber()); + assertEquals(2, s2.getSlideNumber()); + assertEquals(3, s3.getSlideNumber()); + + assertEquals("Slide 3", ((HSLFTextShape)s1.getShapes().get(0)).getText()); + assertEquals("Slide 1", ((HSLFTextShape)s3.getShapes().get(0)).getText()); + // Write out, and read back in ByteArrayOutputStream baos = new ByteArrayOutputStream(); hss_three.write(baos); @@ -272,16 +290,16 @@ public final class TestReOrderingSlides extends TestCase { HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); // Check it still has 3 slides - assertEquals(3, ss_read.getSlides().length); + assertEquals(3, ss_read.getSlides().size()); // And check it's as expected - HSLFSlide _s1 = ss_read.getSlides()[0]; - HSLFSlide _s2 = ss_read.getSlides()[1]; - HSLFSlide _s3 = ss_read.getSlides()[2]; + HSLFSlide _s1 = ss_read.getSlides().get(0); + HSLFSlide _s2 = ss_read.getSlides().get(1); + HSLFSlide _s3 = ss_read.getSlides().get(2); // 1 --> 3 - assertEquals(s1._getSheetNumber(), _s3._getSheetNumber()); - assertEquals(s1._getSheetRefId(), _s3._getSheetRefId()); + assertEquals(s1._getSheetNumber(), _s1._getSheetNumber()); + assertEquals(s1._getSheetRefId(), _s1._getSheetRefId()); assertEquals(1, s1.getSlideNumber()); // 2nd slide is not updated @@ -290,8 +308,8 @@ public final class TestReOrderingSlides extends TestCase { assertEquals(2, s2.getSlideNumber()); // 3 --> 1 - assertEquals(s3._getSheetNumber(), _s1._getSheetNumber()); - assertEquals(s3._getSheetRefId(), _s1._getSheetRefId()); + assertEquals(s3._getSheetNumber(), _s3._getSheetNumber()); + assertEquals(s3._getSheetRefId(), _s3._getSheetRefId()); assertEquals(3, s3.getSlideNumber()); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java index 4acda5beb9..cbaa02ec7e 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java @@ -17,14 +17,12 @@ package org.apache.poi.hslf.usermodel; +import static org.junit.Assert.assertEquals; -import junit.framework.TestCase; - -import org.apache.poi.hslf.*; -import org.apache.poi.hslf.record.ParentAwareRecord; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.RecordContainer; import org.apache.poi.POIDataSamples; +import org.apache.poi.hslf.record.*; +import org.junit.Before; +import org.junit.Test; /** * Tests that the record setup done by SlideShow @@ -33,17 +31,20 @@ import org.apache.poi.POIDataSamples; * * @author Nick Burch (nick at torchbox dot com) */ -public final class TestRecordSetup extends TestCase { +public final class TestRecordSetup { // SlideShow primed on the test data - private HSLFSlideShow ss; + @SuppressWarnings("unused") + private HSLFSlideShow ss; private HSLFSlideShowImpl hss; - public TestRecordSetup() throws Exception { + @Before + public void init() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); ss = new HSLFSlideShow(hss); } + @Test public void testHandleParentAwareRecords() { Record[] records = hss.getRecords(); for(int i=0; i> textParass = slideOne.getTextParagraphs(); + List textParas = textParass.get(0); + HSLFTextRun rtr = textParas.get(0).getTextRuns().get(0); - assertNull(rtr._getRawCharacterStyle()); - assertNull(rtr._getRawParagraphStyle()); + assertNotNull(rtr.getCharacterStyle()); + assertNotNull(textParas.get(0).getParagraphStyle()); assertFalse(rtr.isBold()); // Now set it to not bold rtr.setBold(false); - //setting bold=false doesn't change the internal state - assertNull(rtr._getRawCharacterStyle()); - assertNull(rtr._getRawParagraphStyle()); + // in Pre 3.12: setting bold=false doesn't change the internal state + // now: also allow explicitly disable styles and there aren't any non rich text runs anymore + assertNotNull(rtr.getCharacterStyle()); + assertNotNull(textParas.get(0).getParagraphStyle()); assertFalse(rtr.isBold()); // And now make it bold rtr.setBold(true); - assertNotNull(rtr._getRawCharacterStyle()); - assertNotNull(rtr._getRawParagraphStyle()); + assertNotNull(rtr.getCharacterStyle()); + assertNotNull(textParas.get(0).getParagraphStyle()); assertTrue(rtr.isBold()); } @@ -104,115 +111,116 @@ public final class TestRichTextRun extends POITestCase { * Test the stuff about getting/setting bold * on a rich text run */ + @Test public void testBoldRich() { - HSLFSlide slideOneR = ssRichA.getSlides()[0]; - HSLFTextParagraph[] textRunsR = slideOneR.getTextParagraphs(); - HSLFTextRun[] rtrs = textRunsR[1].getTextRuns(); - assertEquals(3, rtrs.length); + HSLFSlide slideOneR = ssRichA.getSlides().get(0); + List> textParass = slideOneR.getTextParagraphs(); + List textParas = textParass.get(1); + assertEquals(3, textParas.size()); - assertTrue(rtrs[0].isBold()); - assertFalse(rtrs[1].isBold()); - assertFalse(rtrs[2].isBold()); + assertTrue(textParas.get(0).getTextRuns().get(0).isBold()); + assertFalse(textParas.get(1).getTextRuns().get(0).isBold()); + assertFalse(textParas.get(2).getTextRuns().get(0).isBold()); - rtrs[0].setBold(true); - rtrs[1].setBold(true); + textParas.get(0).getTextRuns().get(0).setBold(true); + textParas.get(1).getTextRuns().get(0).setBold(true); - assertTrue(rtrs[0].isBold()); - assertTrue(rtrs[1].isBold()); + assertTrue(textParas.get(0).getTextRuns().get(0).isBold()); + assertTrue(textParas.get(1).getTextRuns().get(0).isBold()); - rtrs[0].setBold(false); - rtrs[1].setBold(false); + textParas.get(0).getTextRuns().get(0).setBold(false); + textParas.get(1).getTextRuns().get(0).setBold(false); - assertFalse(rtrs[0].isBold()); - assertFalse(rtrs[1].isBold()); + assertFalse(textParas.get(0).getTextRuns().get(0).isBold()); + assertFalse(textParas.get(1).getTextRuns().get(0).isBold()); } /** * Tests getting and setting the font size on rich and non * rich text runs */ + @Test public void testFontSize() { - HSLFSlide slideOne = ss.getSlides()[0]; - HSLFTextParagraph[] textRuns = slideOne.getTextParagraphs(); - HSLFTextRun rtr = textRuns[0].getTextRuns()[0]; + HSLFSlide slideOne = ss.getSlides().get(0); + List> textParass = slideOne.getTextParagraphs(); + HSLFTextRun rtr = textParass.get(0).get(0).getTextRuns().get(0); - HSLFSlide slideOneR = ssRichB.getSlides()[0]; - HSLFTextParagraph[] textRunsR = slideOneR.getTextParagraphs(); - HSLFTextRun rtrRa = textRunsR[0].getTextRuns()[0]; - HSLFTextRun rtrRb = textRunsR[1].getTextRuns()[0]; - HSLFTextRun rtrRc = textRunsR[1].getTextRuns()[3]; + HSLFSlide slideOneR = ssRichB.getSlides().get(0); + List> textParassR = slideOneR.getTextParagraphs(); + HSLFTextRun rtrRa = textParassR.get(0).get(0).getTextRuns().get(0); + HSLFTextRun rtrRb = textParassR.get(1).get(0).getTextRuns().get(0); + HSLFTextRun rtrRc = textParassR.get(1).get(3).getTextRuns().get(0); String defaultFont = "Arial"; // Start off with rich one // First run has defaults - assertEquals(44, rtrRa.getFontSize()); - assertEquals(defaultFont, rtrRa.getFontName()); + assertEquals(44, rtrRa.getFontSize(), 0); + assertEquals(defaultFont, rtrRa.getFontFamily()); // Second is size 20, default font - assertEquals(20, rtrRb.getFontSize()); - assertEquals(defaultFont, rtrRb.getFontName()); + assertEquals(20, rtrRb.getFontSize(), 0); + assertEquals(defaultFont, rtrRb.getFontFamily()); // Third is size 24, alt font - assertEquals(24, rtrRc.getFontSize()); - assertEquals("Times New Roman", rtrRc.getFontName()); + assertEquals(24, rtrRc.getFontSize(), 0); + assertEquals("Times New Roman", rtrRc.getFontFamily()); // Change 2nd to different size and font assertEquals(2, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR rtrRb.setFontSize(18); - rtrRb.setFontName("Courier"); + rtrRb.setFontFamily("Courier"); assertEquals(3, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR + Courier - assertEquals(18, rtrRb.getFontSize()); - assertEquals("Courier", rtrRb.getFontName()); + assertEquals(18, rtrRb.getFontSize(), 0); + assertEquals("Courier", rtrRb.getFontFamily()); // Now do non rich one - assertEquals(44, rtr.getFontSize()); - assertEquals(defaultFont, rtr.getFontName()); + assertEquals(44, rtr.getFontSize(), 0); + assertEquals(defaultFont, rtr.getFontFamily()); assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default - assertNull(rtr._getRawCharacterStyle()); - assertNull(rtr._getRawParagraphStyle()); + assertNotNull(rtr.getCharacterStyle()); + assertNotNull(rtr.getTextParagraph().getParagraphStyle()); // Change Font size rtr.setFontSize(99); - assertEquals(99, rtr.getFontSize()); - assertEquals(defaultFont, rtr.getFontName()); - assertNotNull(rtr._getRawCharacterStyle()); - assertNotNull(rtr._getRawParagraphStyle()); + assertEquals(99, rtr.getFontSize(), 0); + assertEquals(defaultFont, rtr.getFontFamily()); + assertNotNull(rtr.getCharacterStyle()); + assertNotNull(rtr.getTextParagraph().getParagraphStyle()); assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default // Change Font size and name rtr.setFontSize(25); - rtr.setFontName("Times New Roman"); - assertEquals(25, rtr.getFontSize()); - assertEquals("Times New Roman", rtr.getFontName()); - assertNotNull(rtr._getRawCharacterStyle()); - assertNotNull(rtr._getRawParagraphStyle()); + rtr.setFontFamily("Times New Roman"); + assertEquals(25, rtr.getFontSize(), 0); + assertEquals("Times New Roman", rtr.getFontFamily()); + assertNotNull(rtr.getCharacterStyle()); + assertNotNull(rtr.getTextParagraph().getParagraphStyle()); assertEquals(2, ss.getFontCollection().getChildRecords().length); } + @Test public void testChangeWriteRead() throws Exception { - HSLFSlideShowImpl[] h = new HSLFSlideShowImpl[] { hss, hssRichA, hssRichB }; - HSLFSlide[] s = new HSLFSlide[] { ss.getSlides()[0], ssRichA.getSlides()[0], ssRichB.getSlides()[0] }; - - for(int i=0; i> textParass = slideOne.getTextParagraphs(); + HSLFTextRun rtr = textParass.get(0).get(0).getTextRuns().get(0); + rtr.setBold(true); rtr.setFontSize(18); - rtr.setFontName("Courier"); + rtr.setFontFamily("Courier"); + HSLFTextParagraph.storeText(textParass.get(0)); // Check it took those - assertEquals(true, rtr.isBold()); - assertEquals(18, rtr.getFontSize()); - assertEquals("Courier", rtr.getFontName()); + assertTrue(rtr.isBold()); + assertEquals(18., rtr.getFontSize(), 0); + assertEquals("Courier", rtr.getFontFamily()); // Write out and back in ByteArrayOutputStream baos = new ByteArrayOutputStream(); - h[i].write(baos); + h.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); HSLFSlideShowImpl readHSLF = new HSLFSlideShowImpl(bais); @@ -221,23 +229,23 @@ public final class TestRichTextRun extends POITestCase { // Tweak existing one again, to ensure really worked rtr.setBold(false); rtr.setFontSize(17); - rtr.setFontName("CourierZZ"); + rtr.setFontFamily("CourierZZ"); // Check it took those changes - assertEquals(false, rtr.isBold()); - assertEquals(17, rtr.getFontSize()); - assertEquals("CourierZZ", rtr.getFontName()); + assertFalse(rtr.isBold()); + assertEquals(17., rtr.getFontSize(), 0); + assertEquals("CourierZZ", rtr.getFontFamily()); // Now, look at the one we changed, wrote out, and read back in // Ensure it does contain our original modifications - HSLFSlide slideOneRR = readS.getSlides()[0]; - HSLFTextParagraph[] textRunsRR = slideOneRR.getTextParagraphs(); - HSLFTextRun rtrRRa = textRunsRR[0].getTextRuns()[0]; + HSLFSlide slideOneRR = readS.getSlides().get(0); + List> textParassRR = slideOneRR.getTextParagraphs(); + HSLFTextRun rtrRRa = textParassRR.get(0).get(0).getTextRuns().get(0); - assertEquals(true, rtrRRa.isBold()); - assertEquals(18, rtrRRa.getFontSize()); - assertEquals("Courier", rtrRRa.getFontName()); + assertTrue(rtrRRa.isBold()); + assertEquals(18., rtrRRa.getFontSize(), 0); + assertEquals("Courier", rtrRRa.getFontFamily()); } } @@ -245,16 +253,17 @@ public final class TestRichTextRun extends POITestCase { * Test that we can do the right things when the paragraph styles * run out before the character styles do */ + @Test public void testParagraphStylesShorterTheCharStyles() { // Check we have the right number of sheets - HSLFSlide[] slides = ssRichC.getSlides(); - assertEquals(14, slides.length); + List slides = ssRichC.getSlides(); + assertEquals(14, slides.size()); // Check the number of text runs on interesting sheets - HSLFSlide slideThreeC = ssRichC.getSlides()[2]; - HSLFSlide slideSevenC = ssRichC.getSlides()[6]; - assertEquals(3, slideThreeC.getTextParagraphs().length); - assertEquals(5, slideSevenC.getTextParagraphs().length); + HSLFSlide slideThreeC = ssRichC.getSlides().get(2); + HSLFSlide slideSevenC = ssRichC.getSlides().get(6); + assertEquals(4, slideThreeC.getTextParagraphs().size()); + assertEquals(5, slideSevenC.getTextParagraphs().size()); // On slide three, we should have: // TR: @@ -266,32 +275,20 @@ public final class TestRichTextRun extends POITestCase { // Illustrative Example // . - HSLFTextParagraph[] s3tr = slideThreeC.getTextParagraphs(); - HSLFTextRun[] s3rtr0 = s3tr[0].getTextRuns(); - HSLFTextRun[] s3rtr1 = s3tr[1].getTextRuns(); - HSLFTextRun[] s3rtr2 = s3tr[2].getTextRuns(); + List> s3tr = slideThreeC.getTextParagraphs(); + List s3rtr0 = s3tr.get(0).get(0).getTextRuns(); + List s3rtr1 = s3tr.get(2).get(0).getTextRuns(); + List s3rtr2 = s3tr.get(3).get(0).getTextRuns(); - assertEquals(2, s3rtr0.length); - assertEquals(1, s3rtr1.length); - assertEquals(2, s3rtr2.length); + assertEquals(2, s3rtr0.size()); + assertEquals(1, s3rtr1.size()); + assertEquals(2, s3rtr2.size()); - assertEquals("You are an important supplier of various items that I need", s3rtr0[0].getRawText()); - assertEquals("", s3rtr0[1].getRawText()); - assertEquals("Source: Internal focus groups", s3rtr1[0].getRawText()); - assertEquals("Illustrative Example", s3rtr2[0].getRawText()); - assertEquals("", s3rtr2[1].getRawText()); - - assertTrue(s3rtr0[0]._isParagraphStyleShared()); - assertTrue(s3rtr0[1]._isParagraphStyleShared()); - assertFalse(s3rtr1[0]._isParagraphStyleShared()); - assertTrue(s3rtr2[0]._isParagraphStyleShared()); - assertTrue(s3rtr2[1]._isParagraphStyleShared()); - - assertFalse(s3rtr0[0]._isCharacterStyleShared()); - assertFalse(s3rtr0[1]._isCharacterStyleShared()); - assertFalse(s3rtr1[0]._isCharacterStyleShared()); - assertFalse(s3rtr2[0]._isCharacterStyleShared()); - assertFalse(s3rtr2[1]._isCharacterStyleShared()); + assertEquals("You are an important supplier of various items that I need", s3rtr0.get(0).getRawText()); + assertEquals("", s3rtr0.get(1).getRawText()); + assertEquals("Source: Internal focus groups", s3rtr1.get(0).getRawText()); + assertEquals("Illustrative Example", s3rtr2.get(0).getRawText()); + assertEquals("", s3rtr2.get(1).getRawText()); // On slide seven, we have: // TR: @@ -300,26 +297,14 @@ public final class TestRichTextRun extends POITestCase { // (text a)(text a)(text b) // TR: // (text) - HSLFTextParagraph[] s7tr = slideSevenC.getTextParagraphs(); - HSLFTextRun[] s7rtr0 = s7tr[0].getTextRuns(); - HSLFTextRun[] s7rtr1 = s7tr[1].getTextRuns(); - HSLFTextRun[] s7rtr2 = s7tr[2].getTextRuns(); + List> s7tr = slideSevenC.getTextParagraphs(); + List s7rtr0 = s7tr.get(0); + List s7rtr1 = s7tr.get(1); + List s7rtr2 = s7tr.get(2); - assertEquals(1, s7rtr0.length); - assertEquals(3, s7rtr1.length); - assertEquals(1, s7rtr2.length); - - assertFalse(s7rtr0[0]._isParagraphStyleShared()); - assertFalse(s7rtr1[0]._isParagraphStyleShared()); - assertTrue(s7rtr1[1]._isParagraphStyleShared()); - assertTrue(s7rtr1[2]._isParagraphStyleShared()); - assertFalse(s7rtr2[0]._isParagraphStyleShared()); - - assertFalse(s7rtr0[0]._isCharacterStyleShared()); - assertTrue(s7rtr1[0]._isCharacterStyleShared()); - assertTrue(s7rtr1[1]._isCharacterStyleShared()); - assertFalse(s7rtr1[2]._isCharacterStyleShared()); - assertFalse(s7rtr2[0]._isCharacterStyleShared()); + assertEquals(1, s7rtr0.size()); + assertEquals(8, s7rtr1.size()); + assertEquals(1, s7rtr2.size()); } /** @@ -327,39 +312,44 @@ public final class TestRichTextRun extends POITestCase { * run out before the character styles do, when we tweak something * and write back out. */ - public void testParagraphStylesShorterTheCharStylesWrite() throws Exception { + @Test + @SuppressWarnings("unused") + public void testParagraphStylesShorterTheCharStylesWrite() throws Exception { assertMatchesSLTWC(ssRichC); assertMatchesFileC(ssRichC); - HSLFSlide slideSevenC = ssRichC.getSlides()[6]; - HSLFTextParagraph[] s7tr = slideSevenC.getTextParagraphs(); - HSLFTextRun[] s7rtr0 = s7tr[0].getTextRuns(); - HSLFTextRun[] s7rtr1 = s7tr[1].getTextRuns(); - HSLFTextRun[] s7rtr2 = s7tr[2].getTextRuns(); + HSLFSlide slideSevenC = ssRichC.getSlides().get(6); + List> s7tr = slideSevenC.getTextParagraphs(); + List s7rtr0 = s7tr.get(0).get(0).getTextRuns(); + List s7rtr1 = s7tr.get(1).get(0).getTextRuns(); + List s7rtr2 = s7tr.get(2).get(0).getTextRuns(); String oldText; // Reset the text on the last run // Need to ensure it's a run that really has styles! - oldText = s7rtr2[0].getRawText(); - s7rtr2[0].setText( oldText ); - assertEquals(oldText, s7rtr2[0].getRawText()); - assertEquals(oldText, s7tr[2].getRawText()); - assertEquals(oldText.length() + 1, s7rtr2[0]._getRawCharacterStyle().getCharactersCovered()); - assertEquals(oldText.length() + 1, s7rtr2[0]._getRawParagraphStyle().getCharactersCovered()); + oldText = s7rtr2.get(0).getRawText(); + s7rtr2.get(0).setText( oldText ); + HSLFTextParagraph.storeText(s7tr.get(2)); + assertEquals(oldText, s7rtr2.get(0).getRawText()); + assertEquals(oldText, HSLFTextParagraph.getRawText(s7tr.get(2))); + assertEquals(oldText.length() + 1, s7rtr2.get(0).getCharacterStyle().getCharactersCovered()); + assertEquals(oldText.length() + 1, s7rtr2.get(0).getTextParagraph().getParagraphStyle().getCharactersCovered()); assertMatchesSLTWC(ssRichC); assertMatchesFileC(ssRichC); // Reset the text on a shared paragraph - oldText = s7rtr1[2].getRawText(); - s7rtr1[2].setText( oldText ); - assertEquals(oldText, s7rtr1[2].getRawText()); - assertEquals(oldText.length() + 1, s7rtr1[2]._getRawCharacterStyle().getCharactersCovered()); + oldText = s7rtr1.get(0).getRawText(); + s7rtr1.get(0).setText( oldText ); + HSLFTextParagraph.storeText(s7tr.get(1)); + assertEquals(oldText, s7rtr1.get(0).getRawText()); + assertEquals(oldText.length(), s7rtr1.get(0).getCharacterStyle().getCharactersCovered()); assertMatchesSLTWC(ssRichC); assertMatchesFileC(ssRichC); // Reset the text on a shared paragraph+character - s7rtr1[1].setText( s7rtr1[1].getRawText() ); + s7rtr1.get(0).setText( s7rtr1.get(0).getRawText() ); + HSLFTextParagraph.storeText(s7tr.get(1)); assertMatchesSLTWC(ssRichC); assertMatchesFileC(ssRichC); } @@ -391,17 +381,11 @@ public final class TestRichTextRun extends POITestCase { byte[] r_rb = writeRecord(ref_r); byte[] s_rb = writeRecord(s_r); - assertEquals(r_rb.length, s_rb.length); - for(int j=0; j 0) { - fb.write(b, 0, read); - } - } - byte[] raw_file = fb.toByteArray(); + NPOIFSFileSystem fs = new NPOIFSFileSystem(_slTests.getFile(filenameC)); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + InputStream is = fs.createDocumentInputStream("PowerPoint Document"); + IOUtils.copy(is, baos); + is.close(); + fs.close(); + byte[] raw_file = baos.toByteArray(); // Now write out the slideshow - ByteArrayOutputStream baos = new ByteArrayOutputStream(); + baos.reset(); s.write(baos); + fs = new NPOIFSFileSystem(new ByteArrayInputStream(baos.toByteArray())); + baos.reset(); + is = fs.createDocumentInputStream("PowerPoint Document"); + IOUtils.copy(is, baos); + is.close(); + fs.close(); byte[] raw_ss = baos.toByteArray(); + + FileOutputStream fos = new FileOutputStream("PowerPoint Document.new.stream"); + fos.write(raw_ss); + fos.close(); + // different paragraph mask, because of sanitizing + raw_ss[169030] = 0x0a; + // Ensure they're the same - assertEquals(raw_file.length, raw_ss.length); - for(int i=0; i txt : sl.getTextParagraphs()) { + for (HSLFTextParagraph p : txt) { + int indent = p.getIndentLevel(); assertTrue(indent >= 0 && indent <= 4 ); } @@ -462,78 +444,84 @@ if(false) { } } + @Test public void testReadParagraphStyles() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt")); assertTrue("No Exceptions while reading file", true); - HSLFTextRun rt; - HSLFTextParagraph[] txt; - HSLFSlide[] slide = ppt.getSlides(); - assertEquals(2, slide.length); + HSLFTextParagraph rt; + List> txt; + List slide = ppt.getSlides(); + assertEquals(2, slide.size()); - txt = slide[0].getTextParagraphs(); - assertEquals(2, txt.length); + txt = slide.get(0).getTextParagraphs(); + assertEquals(2, txt.size()); - assertEquals("Title text", txt[0].getRawText()); - assertEquals(1, txt[0].getTextRuns().length); - rt = txt[0].getTextRuns()[0]; + assertEquals("Title text", HSLFTextParagraph.getRawText(txt.get(0))); + assertEquals(1, txt.get(0).size()); + rt = txt.get(0).get(0); assertFalse(rt.isBullet()); - assertEquals( - "This is a text placeholder that \r" + - "follows the design pattern\r" + - "Defined in the slide master\r" + - "and has bullets by default", txt[1].getRawText()); - assertEquals(1, txt[1].getTextRuns().length); - rt = txt[1].getTextRuns()[0]; + String expected = + "This is a text placeholder that \r" + + "follows the design pattern\r" + + "Defined in the slide master\r" + + "and has bullets by default"; + assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(1))); + assertEquals(4, txt.get(1).size()); + rt = txt.get(1).get(0); assertEquals('\u2022', rt.getBulletChar()); assertTrue(rt.isBullet()); - txt = slide[1].getTextParagraphs(); - assertEquals(2, txt.length); + txt = slide.get(1).getTextParagraphs(); + assertEquals(2, txt.size()); - assertEquals( - "I\u2019m a text box\r" + - "With bullets\r" + - "That follow the design pattern\r" + - "From the slide master", txt[0].getRawText()); - assertEquals(1, txt[0].getTextRuns().length); - rt = txt[0].getTextRuns()[0]; + expected = + "I\u2019m a text box\r" + + "With bullets\r" + + "That follow the design pattern\r" + + "From the slide master"; + assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(0))); + assertEquals(4, txt.get(0).size()); + rt = txt.get(0).get(0); assertTrue(rt.isBullet()); assertEquals('\u2022', rt.getBulletChar()); - assertEquals( - "I\u2019m a text box with user-defined\r" + - "bullet character", txt[1].getRawText()); - assertEquals(1, txt[1].getTextRuns().length); - rt = txt[1].getTextRuns()[0]; + expected = + "I\u2019m a text box with user-defined\r" + + "bullet character"; + assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(1))); + assertEquals(2, txt.get(1).size()); + rt = txt.get(1).get(0); assertTrue(rt.isBullet()); assertEquals('\u263A', rt.getBulletChar()); } + @Test public void testSetParagraphStyles() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlide slide = ppt.createSlide(); HSLFTextBox shape = new HSLFTextBox(); - HSLFTextRun rt = shape.getTextParagraphs().getTextRuns()[0]; shape.setText( "Hello, World!\r" + "This should be\r" + "Multiline text"); - rt.setFontSize(42); + HSLFTextParagraph rt = shape.getTextParagraphs().get(0); + HSLFTextRun tr = rt.getTextRuns().get(0); + tr.setFontSize(42); rt.setBullet(true); - rt.setTextOffset(50); - rt.setBulletOffset(0); + rt.setLeftMargin(50); + rt.setIndent(0); rt.setBulletChar('\u263A'); slide.addShape(shape); - assertEquals(42, rt.getFontSize()); + assertEquals(42.0, tr.getFontSize(), 0); assertEquals(true, rt.isBullet()); - assertEquals(50, rt.getTextOffset()); - assertEquals(0, rt.getBulletOffset()); + assertEquals(50.0, rt.getLeftMargin(), 0); + assertEquals(0, rt.getIndent(), 0); assertEquals('\u263A', rt.getBulletChar()); shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300)); @@ -545,57 +533,67 @@ if(false) { out.close(); ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); - slide = ppt.getSlides()[0]; - shape = (HSLFTextBox)slide.getShapes()[0]; - rt = shape.getTextParagraphs().getTextRuns()[0]; - assertEquals(42, rt.getFontSize()); + slide = ppt.getSlides().get(0); + shape = (HSLFTextBox)slide.getShapes().get(0); + rt = shape.getTextParagraphs().get(0); + tr = rt.getTextRuns().get(0); + assertEquals(42.0, tr.getFontSize(), 0); assertEquals(true, rt.isBullet()); - assertEquals(50, rt.getTextOffset()); - assertEquals(0, rt.getBulletOffset()); + assertEquals(50.0, rt.getLeftMargin(), 0); + assertEquals(0, rt.getIndent(), 0); assertEquals('\u263A', rt.getBulletChar()); } + @Test public void testAddText() throws Exception { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt")); assertTrue("No Exceptions while reading file", true); - HSLFTextRun rt; - HSLFTextParagraph[] txt; - HSLFSlide[] slides = ppt.getSlides(); + HSLFTextParagraph rt; + HSLFTextRun tr; + List> txt; + List slides = ppt.getSlides(); - assertEquals(2, slides.length); - txt = slides[0].getTextParagraphs(); - assertEquals(2, txt.length); + assertEquals(2, slides.size()); + txt = slides.get(0).getTextParagraphs(); + assertEquals(2, txt.size()); - assertEquals("Title text", txt[0].getRawText()); - assertEquals(1, txt[0].getTextRuns().length); - rt = txt[0].getTextRuns()[0]; + assertEquals("Title text", HSLFTextParagraph.getRawText(txt.get(0))); + assertEquals(1, txt.get(0).size()); + rt = txt.get(0).get(0); assertFalse(rt.isBullet()); // Add some new text - txt[0].appendText("Foo! I'm new!"); - assertEquals(2, txt[0].getTextRuns().length); + HSLFTextParagraph.appendText(txt.get(0), "Foo! I'm new!", true); + assertEquals(2, txt.get(0).size()); - rt = txt[0].getTextRuns()[0]; - assertFalse(rt.isBold()); - assertEquals("Title text", rt.getRawText()); - rt = txt[0].getTextRuns()[1]; - assertFalse(rt.isBold()); - assertEquals("Foo! I'm new!", rt.getRawText()); - rt.setBold(true); + rt = txt.get(0).get(0); + tr = rt.getTextRuns().get(0); + assertFalse(tr.isBold()); + assertEquals("Title text\r", tr.getRawText()); + rt = txt.get(0).get(1); + tr = rt.getTextRuns().get(0); + assertFalse(tr.isBold()); + assertEquals("Foo! I'm new!", tr.getRawText()); + tr.setBold(true); + HSLFTextParagraph.storeText(txt.get(0)); - // And some more - txt[0].appendText("Me too!"); - assertEquals(3, txt[0].getTextRuns().length); - rt = txt[0].getTextRuns()[0]; - assertFalse(rt.isBold()); - assertEquals("Title text", rt.getRawText()); - rt = txt[0].getTextRuns()[1]; - assertTrue(rt.isBold()); - assertEquals("Foo! I'm new!", rt.getRawText()); - rt = txt[0].getTextRuns()[2]; - assertFalse(rt.isBold()); - assertEquals("Me too!", rt.getRawText()); + // And some more, attributes will be copied from previous run + HSLFTextParagraph.appendText(txt.get(0), "Me too!", true); + HSLFTextParagraph.storeText(txt.get(0)); + assertEquals(3, txt.get(0).size()); + rt = txt.get(0).get(0); + tr = rt.getTextRuns().get(0); + assertFalse(tr.isBold()); + assertEquals("Title text\r", tr.getRawText()); + rt = txt.get(0).get(1); + tr = rt.getTextRuns().get(0); + assertTrue(tr.isBold()); + assertEquals("Foo! I'm new!\r", tr.getRawText()); + rt = txt.get(0).get(2); + tr = rt.getTextRuns().get(0); + assertTrue(tr.isBold()); + assertEquals("Me too!", tr.getRawText()); // Save and re-open ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -605,55 +603,59 @@ if(false) { ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); slides = ppt.getSlides(); - assertEquals(2, slides.length); + assertEquals(2, slides.size()); - txt = slides[0].getTextParagraphs(); - assertEquals(2, txt.length); - assertEquals(3, txt[0].getTextRuns().length); - rt = txt[0].getTextRuns()[0]; - assertFalse(rt.isBold()); - assertEquals("Title text", rt.getRawText()); - rt = txt[0].getTextRuns()[1]; - assertTrue(rt.isBold()); - assertEquals("Foo! I'm new!", rt.getRawText()); - rt = txt[0].getTextRuns()[2]; - assertFalse(rt.isBold()); - assertEquals("Me too!", rt.getRawText()); + txt = slides.get(0).getTextParagraphs(); + assertEquals(2, txt.size()); + assertEquals(3, txt.get(0).size()); + rt = txt.get(0).get(0); + tr = rt.getTextRuns().get(0); + assertFalse(tr.isBold()); + assertEquals("Title text\r", tr.getRawText()); + rt = txt.get(0).get(1); + tr = rt.getTextRuns().get(0); + assertTrue(tr.isBold()); + assertEquals("Foo! I'm new!\r", tr.getRawText()); + rt = txt.get(0).get(2); + tr = rt.getTextRuns().get(0); + assertTrue(tr.isBold()); + assertEquals("Me too!", tr.getRawText()); // FileOutputStream fout = new FileOutputStream("/tmp/foo.ppt"); // ppt.write(fout); } + @Test public void testChineseParagraphs() throws Exception { - HSLFTextRun[] rts; + List rts; HSLFTextRun rt; - HSLFTextParagraph[] txt; - HSLFSlide[] slides = ssChinese.getSlides(); + List> txt; + List slides = ssChinese.getSlides(); // One slide - assertEquals(1, slides.length); + assertEquals(1, slides.size()); // One block of text within that - txt = slides[0].getTextParagraphs(); - assertEquals(1, txt.length); + txt = slides.get(0).getTextParagraphs(); + assertEquals(1, txt.size()); // One rich block of text in that - text is all the same style // TODO Is this completely correct? - rts = txt[0].getTextRuns(); - assertEquals(1, rts.length); - rt = rts[0]; + rts = txt.get(0).get(0).getTextRuns(); + assertEquals(1, rts.size()); + rt = rts.get(0); // Check we can get the english text out of that String text = rt.getRawText(); assertContains(text, "Single byte"); // And the chinese - assertContains(text, "\uff8a\uff9d\uff76\uff78"); + assertContains(txt.get(0).get(3).getTextRuns().get(0).getRawText(), "\uff8a\uff9d\uff76\uff78"); // It isn't bold or italic assertFalse(rt.isBold()); assertFalse(rt.isItalic()); // Font is Calibri - assertEquals("Calibri", rt.getFontName()); + assertEquals("Calibri", rt.getFontFamily()); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java index 000166b754..9c8f3e18cf 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java @@ -17,45 +17,50 @@ package org.apache.poi.hslf.usermodel; +import static org.junit.Assert.assertEquals; -import junit.framework.TestCase; +import java.util.List; -import org.apache.poi.hslf.*; -import org.apache.poi.hslf.model.*; import org.apache.poi.POIDataSamples; +import org.junit.Before; +import org.junit.Test; /** * Tests that SlideShow returns Sheets which have the right text in them * * @author Nick Burch (nick at torchbox dot com) */ -public final class TestSheetText extends TestCase { +public final class TestSheetText { // SlideShow primed on the test data private HSLFSlideShow ss; - public TestSheetText() throws Exception { + @Before + public void init() throws Exception { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); ss = new HSLFSlideShow(hss); } + @Test public void testSheetOne() { - HSLFSheet slideOne = ss.getSlides()[0]; + HSLFSheet slideOne = ss.getSlides().get(0); - String[] expectText = new String[] {"This is a test title","This is a test subtitle\nThis is on page 1"}; - assertEquals(expectText.length, slideOne.getTextParagraphs().length); - for(int i=0; i textParas : slideOne.getTextParagraphs()) { + assertEquals(expectText[i++], HSLFTextParagraph.getRawText(textParas)); } } public void testSheetTwo() { - HSLFSheet slideTwo = ss.getSlides()[1]; - String[] expectText = new String[] {"This is the title on page 2","This is page two\nIt has several blocks of text\nNone of them have formatting"}; - assertEquals(expectText.length, slideTwo.getTextParagraphs().length); - for(int i=0; i textParas : slideTwo.getTextParagraphs()) { + assertEquals(expectText[i++], HSLFTextParagraph.getRawText(textParas)); + } } /** @@ -69,11 +74,11 @@ public final class TestSheetText extends TestCase { HSLFSlideShow sss = new HSLFSlideShow(hss); // Should come out with 10 slides, no notes - assertEquals(10, sss.getSlides().length); - assertEquals(0, sss.getNotes().length); + assertEquals(10, sss.getSlides().size()); + assertEquals(0, sss.getNotes().size()); // Check text on first slide - HSLFSlide s = sss.getSlides()[0]; + HSLFSlide s = sss.getSlides().get(0); String exp = "Realizing the Development Dividend:\n" + "Community Capacity Building and CDM.\n" + @@ -83,7 +88,7 @@ public final class TestSheetText extends TestCase { "COP 11 \u2013 MOP 1\n" + // special long hyphen "December 5, 2005\n"; - assertEquals(1, s.getTextParagraphs().length); - assertEquals(exp, s.getTextParagraphs()[0].getRawText()); + assertEquals(1, s.getTextParagraphs().size()); + assertEquals(exp, HSLFTextParagraph.getRawText(s.getTextParagraphs().get(0))); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSlideOrdering.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSlideOrdering.java index 0aaa8acb77..e1a6a6009f 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSlideOrdering.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSlideOrdering.java @@ -17,18 +17,20 @@ package org.apache.poi.hslf.usermodel; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; + +import java.util.List; -import org.apache.poi.hslf.*; -import org.apache.poi.hslf.model.*; import org.apache.poi.POIDataSamples; +import org.junit.Before; +import org.junit.Test; /** * Tests that SlideShow returns Sheets in the right order * * @author Nick Burch (nick at torchbox dot com) */ -public final class TestSlideOrdering extends TestCase { +public final class TestSlideOrdering { private static POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); // Simple slideshow, record order matches slide order @@ -36,7 +38,8 @@ public final class TestSlideOrdering extends TestCase { // Complex slideshow, record order doesn't match slide order private HSLFSlideShow ssB; - public TestSlideOrdering() throws Exception { + @Before + public void init() throws Exception { HSLFSlideShowImpl hssA = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); ssA = new HSLFSlideShow(hssA); @@ -47,33 +50,29 @@ public final class TestSlideOrdering extends TestCase { /** * Test the simple case - record order matches slide order */ + @Test public void testSimpleCase() { - assertEquals(2, ssA.getSlides().length); + assertEquals(2, ssA.getSlides().size()); - HSLFSlide s1 = ssA.getSlides()[0]; - HSLFSlide s2 = ssA.getSlides()[1]; + HSLFSlide s1 = ssA.getSlides().get(0); + HSLFSlide s2 = ssA.getSlides().get(1); String[] firstTRs = new String[] { "This is a test title", "This is the title on page 2" }; - assertEquals(firstTRs[0], s1.getTextParagraphs()[0].getRawText()); - assertEquals(firstTRs[1], s2.getTextParagraphs()[0].getRawText()); + assertEquals(firstTRs[0], HSLFTextParagraph.getRawText(s1.getTextParagraphs().get(0))); + assertEquals(firstTRs[1], HSLFTextParagraph.getRawText(s2.getTextParagraphs().get(0))); } /** * Test the complex case - record order differs from slide order */ + @Test public void testComplexCase() { - assertEquals(3, ssB.getSlides().length); - - HSLFSlide s1 = ssB.getSlides()[0]; - HSLFSlide s2 = ssB.getSlides()[1]; - HSLFSlide s3 = ssB.getSlides()[2]; - - String[] firstTRs = new String[] { "Slide 1", "Slide 2", "Slide 3" }; - - assertEquals(firstTRs[0], s1.getTextParagraphs()[0].getRawText()); - assertEquals(firstTRs[1], s2.getTextParagraphs()[0].getRawText()); - assertEquals(firstTRs[2], s3.getTextParagraphs()[0].getRawText()); + assertEquals(3, ssB.getSlides().size()); + int i=1; + for (HSLFSlide s : ssB.getSlides()) { + assertEquals("Slide "+(i++), HSLFTextParagraph.getRawText(s.getTextParagraphs().get(0))); + } } /** @@ -88,15 +87,16 @@ public final class TestSlideOrdering extends TestCase { POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream(filename)); - HSLFSlide[] slide = ppt.getSlides(); + List slide = ppt.getSlides(); - assertEquals(titles.length, slide.length); - for (int i = 0; i < slide.length; i++) { - String title = slide[i].getTitle(); + assertEquals(titles.length, slide.size()); + for (int i = 0; i < slide.size(); i++) { + String title = slide.get(i).getTitle(); assertEquals("Wrong slide title in " + filename, titles[i], title); } } + @Test public void testTitles() throws Exception { assertSlideOrdering("basic_test_ppt_file.ppt", new String[] { "This is a test title", "This is the title on page 2" }); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java index 60676b643c..3b1313e4ea 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java @@ -19,15 +19,11 @@ package org.apache.poi.hslf.usermodel; import static org.junit.Assert.*; -import java.awt.Color; -import java.io.*; +import java.io.IOException; import java.util.List; import org.apache.poi.POIDataSamples; -import org.apache.poi.hslf.model.Table; -import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.record.*; -import org.apache.poi.hslf.usermodel.*; import org.junit.Before; import org.junit.Test; @@ -59,28 +55,28 @@ public final class TestTextRun { @Test public void testGetText() { HSLFSlide slideOne = ss.getSlides().get(0); - List textParas = slideOne.getTextParagraphs(); + List> textParas = slideOne.getTextParagraphs(); assertEquals(2, textParas.size()); // Get text works with \n - assertEquals("This is a test title", textParas.get(0).getTextRuns().get(0).getRawText()); - assertEquals("This is a test subtitle\nThis is on page 1", textParas.get(1).getTextRuns().get(0).getRawText()); + assertEquals("This is a test title", HSLFTextParagraph.getText(textParas.get(0))); + assertEquals("This is a test subtitle\nThis is on page 1", HSLFTextParagraph.getText(textParas.get(1))); // Raw text has \r instead - assertEquals("This is a test title", textParas.get(0).getTextRuns().get(0).getRawText()); - assertEquals("This is a test subtitle\rThis is on page 1", textParas.get(1).getTextRuns().get(0).getRawText()); + assertEquals("This is a test title", HSLFTextParagraph.getRawText(textParas.get(0))); + assertEquals("This is a test subtitle\rThis is on page 1", HSLFTextParagraph.getRawText(textParas.get(1))); // Now check on a rich text run HSLFSlide slideOneR = ssRich.getSlides().get(0); - List textRunsR = slideOneR.getTextParagraphs(); + textParas = slideOneR.getTextParagraphs(); - assertEquals(2, textRunsR.size()); - assertEquals("This is a title, it\u2019s in black", textRunsR.get(0).getTextRuns().get(0).getRawText()); - assertEquals("This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)", textRunsR.get(1).getTextRuns().get(0).getRawText()); - assertEquals("This is a title, it\u2019s in black", textRunsR.get(0).getTextRuns().get(0).getRawText()); - assertEquals("This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)", textRunsR.get(1).getTextRuns().get(0).getRawText()); + assertEquals(2, textParas.size()); + assertEquals("This is a title, it\u2019s in black", HSLFTextParagraph.getText(textParas.get(0))); + assertEquals("This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)", HSLFTextParagraph.getText(textParas.get(1))); + assertEquals("This is a title, it\u2019s in black", HSLFTextParagraph.getRawText(textParas.get(0))); + assertEquals("This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)", HSLFTextParagraph.getRawText(textParas.get(1))); } /** @@ -89,8 +85,8 @@ public final class TestTextRun { @Test public void testSetText() { HSLFSlide slideOne = ss.getSlides().get(0); - List textRuns = slideOne.getTextParagraphs(); - HSLFTextParagraph run = textRuns.get(0); + List> textRuns = slideOne.getTextParagraphs(); + HSLFTextParagraph run = textRuns.get(0).get(0); HSLFTextRun tr = run.getTextRuns().get(0); // Check current text @@ -110,10 +106,11 @@ public final class TestTextRun { * Test to ensure that changing non rich text between bytes and * chars works correctly */ - @Test + @SuppressWarnings("unused") + @Test public void testAdvancedSetText() { HSLFSlide slideOne = ss.getSlides().get(0); - List paras = slideOne.getTextParagraphs(); + List paras = slideOne.getTextParagraphs().get(0); HSLFTextParagraph para = paras.get(0); TextHeaderAtom tha = null; @@ -192,21 +189,21 @@ public final class TestTextRun { @Test public void testGetRichTextNonRich() { HSLFSlide slideOne = ss.getSlides().get(0); - List textRuns = slideOne.getTextParagraphs(); + List> textParass = slideOne.getTextParagraphs(); - assertEquals(2, textRuns.size()); + assertEquals(2, textParass.size()); - HSLFTextParagraph trA = textRuns.get(0); - HSLFTextParagraph trB = textRuns.get(1); + List trA = textParass.get(0); + List trB = textParass.get(1); - assertEquals(1, trA.getTextRuns().size()); - assertEquals(1, trB.getTextRuns().size()); + assertEquals(1, trA.size()); + assertEquals(1, trB.size()); - HSLFTextRun rtrA = trA.getTextRuns().get(0); - HSLFTextRun rtrB = trB.getTextRuns().get(0); + HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0); + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); - assertEquals(HSLFTextParagraph.getRawText(textRuns.subList(0, 0)), rtrA.getRawText()); - assertEquals(HSLFTextParagraph.getRawText(textRuns.subList(1, 1)), rtrB.getRawText()); + assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText()); + assertEquals(HSLFTextParagraph.getRawText(trB), rtrB.getRawText()); // assertNull(rtrA._getRawCharacterStyle()); // assertNull(rtrA._getRawParagraphStyle()); @@ -220,45 +217,36 @@ public final class TestTextRun { @Test public void testGetRichText() { HSLFSlide slideOne = ssRich.getSlides().get(0); - List textRuns = slideOne.getTextParagraphs(); + List> textParass = slideOne.getTextParagraphs(); - assertEquals(2, textRuns.size()); + assertEquals(2, textParass.size()); - HSLFTextParagraph trA = textRuns.get(0); - HSLFTextParagraph trB = textRuns.get(1); + List trA = textParass.get(0); + List trB = textParass.get(1); - assertEquals(1, trA.getTextRuns().size()); - assertEquals(3, trB.getTextRuns().size()); + assertEquals(1, trA.size()); + assertEquals(3, trB.size()); - HSLFTextRun rtrA = trA.getTextRuns().get(0); - HSLFTextRun rtrB = trB.getTextRuns().get(0); - HSLFTextRun rtrC = trB.getTextRuns().get(1); - HSLFTextRun rtrD = trB.getTextRuns().get(2); + HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0); + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0); + HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0); - assertEquals(HSLFTextParagraph.getRawText(textRuns.subList(0, 0)), rtrA.getRawText()); + assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText()); - String trBstr = HSLFTextParagraph.getRawText(textRuns.subList(1, 1)); + String trBstr = HSLFTextParagraph.getRawText(trB); assertEquals(trBstr.substring(0, 30), rtrB.getRawText()); assertEquals(trBstr.substring(30,58), rtrC.getRawText()); assertEquals(trBstr.substring(58,82), rtrD.getRawText()); -// assertNull(rtrA._getRawCharacterStyle()); -// assertNull(rtrA._getRawParagraphStyle()); -// assertNotNull(rtrB._getRawCharacterStyle()); -// assertNotNull(rtrB._getRawParagraphStyle()); -// assertNotNull(rtrC._getRawCharacterStyle()); -// assertNotNull(rtrC._getRawParagraphStyle()); -// assertNotNull(rtrD._getRawCharacterStyle()); -// assertNotNull(rtrD._getRawParagraphStyle()); - // Same paragraph styles -// assertEquals(rtrB._getRawParagraphStyle(), rtrC._getRawParagraphStyle()); -// assertEquals(rtrB._getRawParagraphStyle(), rtrD._getRawParagraphStyle()); + assertEquals(trB.get(0).getParagraphStyle(), trB.get(1).getParagraphStyle()); + assertEquals(trB.get(0).getParagraphStyle(), trB.get(2).getParagraphStyle()); // Different char styles -// assertFalse( rtrB._getRawCharacterStyle().equals( rtrC._getRawCharacterStyle() )); -// assertFalse( rtrB._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() )); -// assertFalse( rtrC._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() )); + assertNotEquals(rtrB.getCharacterStyle(), rtrC.getCharacterStyle()); + assertNotEquals(rtrB.getCharacterStyle(), rtrD.getCharacterStyle()); + assertNotEquals(rtrC.getCharacterStyle(), rtrD.getCharacterStyle()); } /** @@ -268,22 +256,18 @@ public final class TestTextRun { @Test public void testSetTextWhereNotRich() { HSLFSlide slideOne = ss.getSlides().get(0); - List textRuns = slideOne.getTextParagraphs(); - HSLFTextParagraph trB = textRuns.get(1); -// assertEquals(1, trB.getTextRuns().length); + List> textParass = slideOne.getTextParagraphs(); + List trB = textParass.get(0); + assertEquals(1, trB.size()); - HSLFTextRun rtrB = trB.getTextRuns().get(0); -// assertEquals(trB.getRawText(), rtrB.getRawText()); -// assertNull(rtrB._getRawCharacterStyle()); -// assertNull(rtrB._getRawParagraphStyle()); + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + assertEquals(HSLFTextParagraph.getText(trB), rtrB.getRawText()); // Change text via normal -// trB.setText("Test Foo Test"); - rtrB = trB.getTextRuns().get(0); -// assertEquals("Test Foo Test", trB.getRawText()); -// assertEquals("Test Foo Test", rtrB.getRawText()); -// assertNull(rtrB._getRawCharacterStyle()); -// assertNull(rtrB._getRawParagraphStyle()); + HSLFTextParagraph.setText(trB, "Test Foo Test"); + rtrB = trB.get(0).getTextRuns().get(0); + assertEquals("Test Foo Test", HSLFTextParagraph.getRawText(trB)); + assertEquals("Test Foo Test", rtrB.getRawText()); } /** @@ -293,13 +277,13 @@ public final class TestTextRun { @Test public void testSetTextWhereRich() { HSLFSlide slideOne = ssRich.getSlides().get(0); - List textRuns = slideOne.getTextParagraphs(); - HSLFTextParagraph trB = textRuns.get(1); - assertEquals(3, trB.getTextRuns().size()); + List> textParass = slideOne.getTextParagraphs(); + List trB = textParass.get(1); + assertEquals(3, trB.size()); - HSLFTextRun rtrB = trB.getTextRuns().get(0); - HSLFTextRun rtrC = trB.getTextRuns().get(1); - HSLFTextRun rtrD = trB.getTextRuns().get(2); + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0); + HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0); // TextPropCollection tpBP = rtrB._getRawParagraphStyle(); // TextPropCollection tpBC = rtrB._getRawCharacterStyle(); // TextPropCollection tpCP = rtrC._getRawParagraphStyle(); @@ -342,8 +326,8 @@ public final class TestTextRun { @Test public void testChangeTextInRichTextRunNonRich() { HSLFSlide slideOne = ss.getSlides().get(0); - List textRuns = slideOne.getTextParagraphs(); - HSLFTextParagraph trB = textRuns.get(1); + List> textRuns = slideOne.getTextParagraphs(); + List trB = textRuns.get(1); // assertEquals(1, trB.getTextRuns().length); // // HSLFTextRun rtrB = trB.getTextRuns().get(0); @@ -368,15 +352,15 @@ public final class TestTextRun { @Test public void testChangeTextInRichTextRun() { HSLFSlide slideOne = ssRich.getSlides().get(0); - List textRuns = slideOne.getTextParagraphs(); - HSLFTextParagraph trB = textRuns.get(1); - assertEquals(3, trB.getTextRuns().size()); + List> textParass = slideOne.getTextParagraphs(); + List trB = textParass.get(1); + assertEquals(3, trB.size()); // We start with 3 text runs, each with their own set of styles, // but all sharing the same paragraph styles - HSLFTextRun rtrB = trB.getTextRuns().get(0); - HSLFTextRun rtrC = trB.getTextRuns().get(1); - HSLFTextRun rtrD = trB.getTextRuns().get(2); + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0); + HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0); // TextPropCollection tpBP = rtrB._getRawParagraphStyle(); // TextPropCollection tpBC = rtrB._getRawCharacterStyle(); // TextPropCollection tpCP = rtrC._getRawParagraphStyle(); @@ -400,8 +384,8 @@ public final class TestTextRun { // assertFalse(tpCC.equals(tpDC)); // Check text in the rich runs - assertEquals("This is the subtitle, in bold\n", rtrB.getRawText()); - assertEquals("This bit is blue and italic\n", rtrC.getRawText()); + assertEquals("This is the subtitle, in bold\r", rtrB.getRawText()); + assertEquals("This bit is blue and italic\r", rtrC.getRawText()); assertEquals("This bit is red (normal)", rtrD.getRawText()); String newBText = "New Subtitle, will still be bold\n"; @@ -452,23 +436,24 @@ public final class TestTextRun { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bug-41015.ppt")); HSLFSlide sl = ppt.getSlides().get(0); - List txt = sl.getTextParagraphs(); - assertEquals(2, txt.size()); - - rt = txt.get(0).getTextRuns(); + List> textParass = sl.getTextParagraphs(); + assertEquals(2, textParass.size()); + + List textParas = textParass.get(0); + rt = textParass.get(0).get(0).getTextRuns(); assertEquals(1, rt.size()); - assertEquals(0, txt.get(0).getIndentLevel()); + assertEquals(0, textParass.get(0).get(0).getIndentLevel()); assertEquals("sdfsdfsdf", rt.get(0).getRawText()); - rt = txt.get(1).getTextRuns(); - assertEquals(2, rt.size()); - assertEquals(0, txt.get(0).getIndentLevel()); - assertEquals("Sdfsdfsdf\n" + - "Dfgdfg\n" + - "Dfgdfgdfg\n", rt.get(0).getRawText()); - assertEquals(1, txt.get(1).getIndentLevel()); - assertEquals("Sdfsdfs\n" + - "Sdfsdf\n", rt.get(1).getRawText()); + textParas = textParass.get(1); + String texts[] = {"Sdfsdfsdf\r","Dfgdfg\r","Dfgdfgdfg\r","Sdfsdfs\r","Sdfsdf\r"}; + int indents[] = {0,0,0,1,1}; + int i=0; + for (HSLFTextParagraph p : textParas) { + assertEquals(texts[i], p.getTextRuns().get(0).getRawText()); + assertEquals(indents[i], p.getIndentLevel()); + i++; + } } /** @@ -479,7 +464,7 @@ public final class TestTextRun { HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlide slide = ppt.createSlide(); - assertNull(slide.getTextParagraphs()); + assertEquals(0, slide.getTextParagraphs().size()); HSLFTextBox shape1 = new HSLFTextBox(); // HSLFTextParagraph run1 = shape1.getTextParagraphs(); @@ -565,17 +550,14 @@ public final class TestTextRun { public void test52244() throws IOException { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52244.ppt")); HSLFSlide slide = ppt.getSlides().get(0); - List runs = slide.getTextParagraphs(); - - assertEquals("Arial", runs.get(0).getTextRuns().get(0).getFontFamily()); - assertEquals(36, runs.get(0).getTextRuns().get(0).getFontSize(), 0); - - assertEquals("Arial", runs.get(1).getTextRuns().get(0).getFontFamily()); - assertEquals(24, runs.get(1).getTextRuns().get(0).getFontSize(), 0); - - assertEquals("Arial", runs.get(2).getTextRuns().get(0).getFontFamily()); - assertEquals(32, runs.get(2).getTextRuns().get(0).getFontSize(), 0); + int sizes[] = { 36, 24, 12, 32, 12, 12 }; + + int i=0; + for (List textParas : slide.getTextParagraphs()) { + assertEquals("Arial", textParas.get(0).getTextRuns().get(0).getFontFamily()); + assertEquals(sizes[i++], (int)textParas.get(0).getTextRuns().get(0).getFontSize()); + } } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextShape.java similarity index 62% rename from src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java rename to src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextShape.java index f57d1548be..07a1a68c05 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextShape.java @@ -15,26 +15,15 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.io.*; +import java.util.*; import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.record.TextHeaderAtom; -import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeType; import org.junit.Test; @@ -49,28 +38,21 @@ public final class TestTextShape { @Test public void createAutoShape(){ HSLFTextShape shape = new HSLFAutoShape(ShapeType.TRAPEZOID); - assertNull(shape.getTextParagraphs()); - assertNull(shape.getText()); assertNull(shape.getEscherTextboxWrapper()); - - HSLFTextParagraph run = shape.createTextRun(); - assertNotNull(run); assertNotNull(shape.getTextParagraphs()); assertNotNull(shape.getEscherTextboxWrapper()); assertEquals("", shape.getText()); - assertSame(run, shape.createTextRun()); - assertEquals(-1, run.getIndex()); + assertEquals(-1, shape.getTextParagraphs().get(0).getIndex()); } @Test public void createTextBox(){ HSLFTextShape shape = new HSLFTextBox(); - HSLFTextParagraph run = shape.getTextParagraphs(); - assertNotNull(run); + List paras = shape.getTextParagraphs(); + assertNotNull(paras); assertNotNull(shape.getText()); assertNotNull(shape.getEscherTextboxWrapper()); - assertSame(run, shape.createTextRun()); assertNotNull(shape.getTextParagraphs()); assertNotNull(shape.getEscherTextboxWrapper()); assertEquals("", shape.getText()); @@ -88,46 +70,45 @@ public final class TestTextShape { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text_shapes.ppt")); List lst1 = new ArrayList(); - HSLFSlide slide = ppt.getSlides()[0]; - HSLFShape[] shape = slide.getShapes(); - for (int i = 0; i < shape.length; i++) { - assertTrue("Expected TextShape but found " + shape[i].getClass().getName(), shape[i] instanceof HSLFTextShape); - HSLFTextShape tx = (HSLFTextShape)shape[i]; - HSLFTextParagraph run = tx.getTextParagraphs(); - assertNotNull(run); - int runType = run.getRunType(); + HSLFSlide slide = ppt.getSlides().get(0); + for (HSLFShape shape : slide.getShapes()) { + assertTrue("Expected TextShape but found " + shape.getClass().getName(), shape instanceof HSLFTextShape); + HSLFTextShape tx = (HSLFTextShape)shape; + List paras = tx.getTextParagraphs(); + assertNotNull(paras); + int runType = paras.get(0).getRunType(); - ShapeType type = shape[i].getShapeType(); + ShapeType type = shape.getShapeType(); + String rawText = HSLFTextParagraph.getRawText(paras); switch (type){ case TEXT_BOX: - assertEquals("Text in a TextBox", run.getRawText()); + assertEquals("Text in a TextBox", rawText); break; case RECT: if(runType == TextHeaderAtom.OTHER_TYPE) - assertEquals("Rectangle", run.getRawText()); + assertEquals("Rectangle", rawText); else if(runType == TextHeaderAtom.TITLE_TYPE) - assertEquals("Title Placeholder", run.getRawText()); + assertEquals("Title Placeholder", rawText); break; case OCTAGON: - assertEquals("Octagon", run.getRawText()); + assertEquals("Octagon", rawText); break; case ELLIPSE: - assertEquals("Ellipse", run.getRawText()); + assertEquals("Ellipse", rawText); break; case ROUND_RECT: - assertEquals("RoundRectangle", run.getRawText()); + assertEquals("RoundRectangle", rawText); break; default: - fail("Unexpected shape: " + shape[i].getShapeName()); + fail("Unexpected shape: " + shape.getShapeName()); } - lst1.add(run.getRawText()); + lst1.add(rawText); } List lst2 = new ArrayList(); - HSLFTextParagraph[] run = slide.getTextParagraphs(); - for (int i = 0; i < run.length; i++) { - lst2.add(run[i].getRawText()); + for (List paras : slide.getTextParagraphs()) { + lst2.add(HSLFTextParagraph.getRawText(paras)); } assertTrue(lst1.containsAll(lst2)); @@ -139,15 +120,13 @@ public final class TestTextShape { HSLFSlide slide = ppt.createSlide(); HSLFTextShape shape1 = new HSLFTextBox(); - HSLFTextParagraph run1 = shape1.createTextRun(); - run1.setText("Hello, World!"); + shape1.setText("Hello, World!"); slide.addShape(shape1); shape1.moveTo(100, 100); HSLFTextShape shape2 = new HSLFAutoShape(ShapeType.RIGHT_ARROW); - HSLFTextParagraph run2 = shape2.createTextRun(); - run2.setText("Testing TextShape"); + shape2.setText("Testing TextShape"); slide.addShape(shape2); shape2.moveTo(300, 300); @@ -156,31 +135,30 @@ public final class TestTextShape { out.close(); ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); - slide = ppt.getSlides()[0]; - HSLFShape[] shape = slide.getShapes(); + slide = ppt.getSlides().get(0); + List shape = slide.getShapes(); - assertTrue(shape[0] instanceof HSLFTextShape); - shape1 = (HSLFTextShape)shape[0]; + assertTrue(shape.get(0) instanceof HSLFTextShape); + shape1 = (HSLFTextShape)shape.get(0); assertEquals(ShapeType.TEXT_BOX, shape1.getShapeType()); - assertEquals("Hello, World!", shape1.getTextParagraphs().getRawText()); + assertEquals("Hello, World!", shape1.getText()); - assertTrue(shape[1] instanceof HSLFTextShape); - shape1 = (HSLFTextShape)shape[1]; + assertTrue(shape.get(1) instanceof HSLFTextShape); + shape1 = (HSLFTextShape)shape.get(1); assertEquals(ShapeType.RIGHT_ARROW, shape1.getShapeType()); - assertEquals("Testing TextShape", shape1.getTextParagraphs().getRawText()); + assertEquals("Testing TextShape", shape1.getText()); } @Test public void margins() throws IOException { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text-margins.ppt")); - HSLFSlide slide = ppt.getSlides()[0]; + HSLFSlide slide = ppt.getSlides().get(0); Map map = new HashMap(); - HSLFShape[] shape = slide.getShapes(); - for (int i = 0; i < shape.length; i++) { - if(shape[i] instanceof HSLFTextShape){ - HSLFTextShape tx = (HSLFTextShape)shape[i]; + for (HSLFShape shape : slide.getShapes()) { + if(shape instanceof HSLFTextShape){ + HSLFTextShape tx = (HSLFTextShape)shape; map.put(tx.getText(), tx); } } @@ -216,20 +194,20 @@ public final class TestTextShape { public void bug52599() throws IOException { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52599.ppt")); - HSLFSlide slide = ppt.getSlides()[0]; - HSLFShape[] sh = slide.getShapes(); - assertEquals(3, sh.length); + HSLFSlide slide = ppt.getSlides().get(0); + List sh = slide.getShapes(); + assertEquals(3, sh.size()); - HSLFTextShape sh0 = (HSLFTextShape)sh[0]; - assertEquals(null, sh0.getText()); - assertEquals(null, sh0.getTextParagraphs()); + HSLFTextShape sh0 = (HSLFTextShape)sh.get(0); + assertNotNull(sh0.getTextParagraphs()); + assertEquals("", sh0.getText()); - HSLFTextShape sh1 = (HSLFTextShape)sh[1]; - assertEquals(null, sh1.getText()); - assertEquals(null, sh1.getTextParagraphs()); + HSLFTextShape sh1 = (HSLFTextShape)sh.get(1); + assertNotNull(sh1.getTextParagraphs()); + assertEquals("", sh1.getText()); - HSLFTextShape sh2 = (HSLFTextShape)sh[2]; + HSLFTextShape sh2 = (HSLFTextShape)sh.get(2); assertEquals("this box should be shown just once", sh2.getText()); - assertEquals(-1, sh2.getTextParagraphs().getIndex()); + assertEquals(-1, sh2.getTextParagraphs().get(0).getIndex()); } } From b00e544e9b28a8c0a1c1ad5eddc473a6fa0285cf Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Wed, 10 Jun 2015 22:23:47 +0000 Subject: [PATCH 14/22] Fixed TextRun handling and various junit tests git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1684773 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hslf/examples/ApacheconEU08.java | 4 +- .../poi/hslf/examples/Graphics2DDemo.java | 4 +- .../apache/poi/hslf/examples/TableDemo.java | 8 +- .../poi/ddf/EscherChildAnchorRecord.java | 27 +- .../org/apache/poi/ddf/EscherProperties.java | 2 +- .../apache/poi/ddf/EscherTextboxRecord.java | 3 +- .../poi/hssf/usermodel/DummyGraphics2d.java | 17 +- .../poi/xslf/usermodel/XSLFGroupShape.java | 7 +- .../poi/xslf/usermodel/XSLFPictureShape.java | 1 + .../apache/poi/xslf/usermodel/XSLFSheet.java | 1 + .../apache/poi/xslf/usermodel/XSLFSlide.java | 1 - .../apache/poi/hslf/blip/BitmapPainter.java | 95 ------ .../apache/poi/hslf/blip/ImagePainter.java | 72 ---- .../hslf/extractor/PowerPointExtractor.java | 8 +- .../src/org/apache/poi/hslf/model/Line.java | 63 +++- .../textproperties/TextPropCollection.java | 1 + .../poi/hslf/record/EscherTextboxWrapper.java | 4 +- .../org/apache/poi/hslf/record/PPDrawing.java | 43 +-- .../poi/hslf/record/RecordContainer.java | 4 +- .../poi/hslf/record/SlideListWithText.java | 4 +- .../apache/poi/hslf/usermodel/HSLFFill.java | 5 +- .../poi/hslf/usermodel/HSLFGroupShape.java | 60 ++-- .../apache/poi/hslf/usermodel/HSLFNotes.java | 13 +- .../poi/hslf/usermodel/HSLFPictureData.java | 51 +-- .../poi/hslf/usermodel/HSLFPictureShape.java | 17 +- .../apache/poi/hslf/usermodel/HSLFShape.java | 29 +- .../poi/hslf/usermodel/HSLFShapeFactory.java | 2 +- .../apache/poi/hslf/usermodel/HSLFSheet.java | 9 +- .../poi/hslf/usermodel/HSLFSimpleShape.java | 159 +++++---- .../apache/poi/hslf/usermodel/HSLFSlide.java | 4 +- .../poi/hslf/usermodel/HSLFSlideMaster.java | 13 +- .../Table.java => usermodel/HSLFTable.java} | 37 ++- .../HSLFTableCell.java} | 35 +- .../poi/hslf/usermodel/HSLFTextParagraph.java | 276 ++++++++------- .../poi/hslf/usermodel/HSLFTextRun.java | 2 +- .../poi/hslf/usermodel/HSLFTextShape.java | 132 ++++---- .../poi/hslf/usermodel/HSLFTitleMaster.java | 8 +- .../org/apache/poi/sl/draw/DrawFactory.java | 8 +- ...rawShapeGroup.java => DrawGroupShape.java} | 7 +- .../src/org/apache/poi/sl/draw/DrawShape.java | 55 +-- .../src/org/apache/poi/sl/draw/Drawable.java | 17 + .../org/apache/poi/sl/draw/ImageRenderer.java | 21 +- .../{ShapeGroup.java => GroupShape.java} | 17 +- .../apache/poi/sl/usermodel/PictureShape.java | 10 +- .../org/apache/poi/sl/usermodel/Sheet.java | 9 + .../poi/hslf/model/AllHSLFModelTests.java | 1 - .../poi/hslf/model/TestImagePainter.java | 55 --- .../org/apache/poi/hslf/model/TestTable.java | 20 +- .../poi/hslf/usermodel/TestAddingSlides.java | 2 +- .../apache/poi/hslf/usermodel/TestBugs.java | 26 +- .../poi/hslf/usermodel/TestFontRendering.java | 27 +- .../poi/hslf/usermodel/TestNumberedList3.java | 12 +- .../poi/hslf/usermodel/TestPicture.java | 68 ++-- .../poi/hslf/usermodel/TestPictures.java | 79 +++-- .../apache/poi/hslf/usermodel/TestTable.java | 43 +-- .../poi/hslf/usermodel/TestTextRun.java | 314 +++++++++--------- test-data/slideshow/54541_cropped_bitmap2.ppt | Bin 0 -> 199168 bytes .../sample_pptx_grouping_issues.pptx | Bin 0 -> 39436 bytes 58 files changed, 976 insertions(+), 1036 deletions(-) delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java rename src/scratchpad/src/org/apache/poi/hslf/{model/Table.java => usermodel/HSLFTable.java} (91%) rename src/scratchpad/src/org/apache/poi/hslf/{model/TableCell.java => usermodel/HSLFTableCell.java} (81%) rename src/scratchpad/src/org/apache/poi/sl/draw/{DrawShapeGroup.java => DrawGroupShape.java} (87%) rename src/scratchpad/src/org/apache/poi/sl/usermodel/{ShapeGroup.java => GroupShape.java} (68%) delete mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java create mode 100644 test-data/slideshow/54541_cropped_bitmap2.ppt create mode 100644 test-data/slideshow/sample_pptx_grouping_issues.pptx diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java index 494c7f9c32..c27e8e4e8e 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java +++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java @@ -146,10 +146,10 @@ public final class ApacheconEU08 { {"Note"}, {"This presentation was created programmatically using POI HSLF"} }; - Table table1 = new Table(2, 1); + HSLFTable table1 = new HSLFTable(2, 1); for (int i = 0; i < txt1.length; i++) { for (int j = 0; j < txt1[i].length; j++) { - TableCell cell = table1.getCell(i, j); + HSLFTableCell cell = table1.getCell(i, j); cell.setText(txt1[i][j]); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontSize(10); diff --git a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java index 19fe496769..cd900902d8 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java @@ -50,7 +50,7 @@ public final class Graphics2DDemo { //define position of the drawing in the slide Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300); group.setAnchor(bounds); - group.setCoordinates(new java.awt.Rectangle(0, 0, 100, 100)); + group.setInteriorAnchor(new java.awt.Rectangle(0, 0, 100, 100)); slide.addShape(group); Graphics2D graphics = new PPGraphics2D(group); @@ -68,7 +68,7 @@ public final class Graphics2DDemo { } graphics.setColor(Color.black); graphics.setFont(new Font("Arial", Font.BOLD, 14)); - graphics.draw(group.getCoordinates()); + graphics.draw(group.getInteriorAnchor()); graphics.drawString("Performance", x + 30, y + 10); FileOutputStream out = new FileOutputStream("hslf-graphics.ppt"); diff --git a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java index abc40750cc..b931ba1b57 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java @@ -49,10 +49,10 @@ public final class TableDemo { HSLFSlide slide = ppt.createSlide(); //six rows, two columns - Table table1 = new Table(6, 2); + HSLFTable table1 = new HSLFTable(6, 2); for (int i = 0; i < txt1.length; i++) { for (int j = 0; j < txt1[i].length; j++) { - TableCell cell = table1.getCell(i, j); + HSLFTableCell cell = table1.getCell(i, j); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontFamily("Arial"); rt.setFontSize(10); @@ -88,10 +88,10 @@ public final class TableDemo { }; //two rows, one column - Table table2 = new Table(2, 1); + HSLFTable table2 = new HSLFTable(2, 1); for (int i = 0; i < txt2.length; i++) { for (int j = 0; j < txt2[i].length; j++) { - TableCell cell = table2.getCell(i, j); + HSLFTableCell cell = table2.getCell(i, j); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontSize(10); rt.setFontFamily("Arial"); diff --git a/src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java b/src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java index b6193cea4e..bbb84bae8c 100644 --- a/src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java +++ b/src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java @@ -40,13 +40,26 @@ public class EscherChildAnchorRecord private int field_4_dy2; public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) { - /*int bytesRemaining =*/ readHeader( data, offset ); + int bytesRemaining = readHeader( data, offset ); int pos = offset + 8; int size = 0; - field_1_dx1 = LittleEndian.getInt( data, pos + size );size+=4; - field_2_dy1 = LittleEndian.getInt( data, pos + size );size+=4; - field_3_dx2 = LittleEndian.getInt( data, pos + size );size+=4; - field_4_dy2 = LittleEndian.getInt( data, pos + size );size+=4; + switch (bytesRemaining) { + case 16: // RectStruct + field_1_dx1 = LittleEndian.getInt( data, pos + size );size+=4; + field_2_dy1 = LittleEndian.getInt( data, pos + size );size+=4; + field_3_dx2 = LittleEndian.getInt( data, pos + size );size+=4; + field_4_dy2 = LittleEndian.getInt( data, pos + size );size+=4; + break; + case 8: // SmallRectStruct + field_1_dx1 = LittleEndian.getShort( data, pos + size );size+=2; + field_2_dy1 = LittleEndian.getShort( data, pos + size );size+=2; + field_3_dx2 = LittleEndian.getShort( data, pos + size );size+=2; + field_4_dy2 = LittleEndian.getShort( data, pos + size );size+=2; + break; + default: + throw new RuntimeException("Invalid EscherChildAnchorRecord - neither 8 nor 16 bytes."); + } + return 8 + size; } @@ -58,8 +71,8 @@ public class EscherChildAnchorRecord LittleEndian.putInt( data, pos, getRecordSize()-8 ); pos += 4; LittleEndian.putInt( data, pos, field_1_dx1 ); pos += 4; LittleEndian.putInt( data, pos, field_2_dy1 ); pos += 4; - LittleEndian.putInt( data, pos, field_3_dx2 ); pos += 4; - LittleEndian.putInt( data, pos, field_4_dy2 ); pos += 4; + LittleEndian.putInt( data, pos, field_3_dx2 ); pos += 4; + LittleEndian.putInt( data, pos, field_4_dy2 ); pos += 4; listener.afterRecordSerialize( pos, getRecordId(), pos - offset, this ); return pos - offset; diff --git a/src/java/org/apache/poi/ddf/EscherProperties.java b/src/java/org/apache/poi/ddf/EscherProperties.java index 7ec219006b..2bee6b92e5 100644 --- a/src/java/org/apache/poi/ddf/EscherProperties.java +++ b/src/java/org/apache/poi/ddf/EscherProperties.java @@ -507,7 +507,7 @@ public final class EscherProperties { addProp(m, SHADOWSTYLE__ORIGINX, "shadowstyle.originx"); addProp(m, SHADOWSTYLE__ORIGINY, "shadowstyle.originy"); addProp(m, SHADOWSTYLE__SHADOW, "shadowstyle.shadow"); - addProp(m, SHADOWSTYLE__SHADOWOBSURED, "shadowstyle.shadowobsured"); + addProp(m, SHADOWSTYLE__SHADOWOBSURED, "shadowstyle.shadowobscured"); addProp(m, PERSPECTIVE__TYPE, "perspective.type"); addProp(m, PERSPECTIVE__OFFSETX, "perspective.offsetx"); addProp(m, PERSPECTIVE__OFFSETY, "perspective.offsety"); diff --git a/src/java/org/apache/poi/ddf/EscherTextboxRecord.java b/src/java/org/apache/poi/ddf/EscherTextboxRecord.java index c21c227968..dbf28531fe 100644 --- a/src/java/org/apache/poi/ddf/EscherTextboxRecord.java +++ b/src/java/org/apache/poi/ddf/EscherTextboxRecord.java @@ -17,6 +17,7 @@ package org.apache.poi.ddf; +import org.apache.poi.hslf.record.RecordTypes; import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.RecordFormatException; @@ -32,7 +33,7 @@ import org.apache.poi.util.RecordFormatException; */ public class EscherTextboxRecord extends EscherRecord { - public static final short RECORD_ID = (short)0xF00D; + public static final short RECORD_ID = (short)RecordTypes.EscherClientTextbox; public static final String RECORD_DESCRIPTION = "msofbtClientTextbox"; private static final byte[] NO_BYTES = new byte[0]; diff --git a/src/java/org/apache/poi/hssf/usermodel/DummyGraphics2d.java b/src/java/org/apache/poi/hssf/usermodel/DummyGraphics2d.java index beadac4646..8ada601697 100644 --- a/src/java/org/apache/poi/hssf/usermodel/DummyGraphics2d.java +++ b/src/java/org/apache/poi/hssf/usermodel/DummyGraphics2d.java @@ -28,6 +28,7 @@ import java.awt.image.ImageObserver; import java.awt.image.RenderedImage; import java.awt.image.renderable.RenderableImage; import java.text.AttributedCharacterIterator; +import java.util.Arrays; import java.util.Map; public class DummyGraphics2d @@ -262,7 +263,7 @@ public class DummyGraphics2d public void setPaint( Paint paint ) { - System.out.println( "setPain(Paint):" ); + System.out.println( "setPaint(Paint):" ); System.out.println( "paint = " + paint ); g2D.setPaint( paint ); } @@ -285,7 +286,19 @@ public class DummyGraphics2d public void setStroke(Stroke s) { System.out.println( "setStroke(Stoke):" ); - System.out.println( "s = " + s ); + if (s instanceof BasicStroke) { + BasicStroke bs = (BasicStroke)s; + StringBuilder str = new StringBuilder("s = BasicStroke("); + str.append("dash[]: "+Arrays.toString(bs.getDashArray())+", "); + str.append("dashPhase: "+bs.getDashPhase()+", "); + str.append("endCap: "+bs.getEndCap()+", "); + str.append("lineJoin: "+bs.getLineJoin()+", "); + str.append("width: "+bs.getLineWidth()+", "); + str.append("miterLimit: "+bs.getMiterLimit()+")"); + System.out.println(str.toString()); + } else { + System.out.println( "s = " + s ); + } g2D.setStroke( s ); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java index 685ae46da5..309f39fd9f 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java @@ -25,8 +25,7 @@ import java.util.List; import java.util.regex.Pattern; import org.apache.poi.openxml4j.opc.*; -import org.apache.poi.sl.usermodel.PlaceableShape; -import org.apache.poi.sl.usermodel.ShapeGroup; +import org.apache.poi.sl.usermodel.GroupShape; import org.apache.poi.util.*; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.*; @@ -38,7 +37,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.*; * @author Yegor Kozlov */ @Beta -public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, ShapeGroup { +public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, GroupShape { private static POILogger _logger = POILogFactory.getLogger(XSLFGroupShape.class); private final List _shapes; @@ -118,7 +117,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, Sha * used for calculations of grouping, scaling, and rotation * behavior of shapes placed within a group. */ - public void setInteriorAnchor(Rectangle2D anchor){ + public void setInteriorAnchor(Rectangle2D anchor) { CTGroupTransform2D xfrm = getSafeXfrm(); CTPoint2D off = xfrm.isSetChOff() ? xfrm.getChOff() : xfrm.addNewChOff(); long x = Units.toEMU(anchor.getX()); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java index b815e00d42..3d532bb953 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java @@ -169,6 +169,7 @@ public class XSLFPictureShape extends XSLFSimpleShape implements PictureShape { return id; } + @Override public Insets getClipping(){ CTPicture ct = (CTPicture)getXmlObject(); CTRelativeRect r = ct.getBlipFill().getSrcRect(); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index 43ec701301..e1fff264ca 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -481,6 +481,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC * * @param graphics */ + @Override public void draw(Graphics2D graphics){ DrawFactory drawFact = DrawFactory.getInstance(graphics); Drawable draw = drawFact.getDrawable(this); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index b6ee1bc8e2..8b5e596702 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -21,7 +21,6 @@ import java.io.IOException; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; -import org.apache.poi.sl.usermodel.Notes; import org.apache.poi.sl.usermodel.Slide; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java b/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java deleted file mode 100644 index cfeffb8008..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java +++ /dev/null @@ -1,95 +0,0 @@ -/* ==================================================================== - 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.hslf.blip; - -import org.apache.poi.hslf.usermodel.HSLFPictureData; -import org.apache.poi.hslf.usermodel.HSLFPictureShape; -import org.apache.poi.util.POILogger; -import org.apache.poi.util.POILogFactory; - - - - - -/* ==================================================================== - 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. -==================================================================== */ -import javax.imageio.ImageIO; - -import java.awt.*; -import java.awt.geom.AffineTransform; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; - -/** - * Creates BufferedImage using javax.imageio.ImageIO and draws it in the specified graphics. - * - * @author Yegor Kozlov. - */ -public final class BitmapPainter implements ImagePainter { - protected POILogger logger = POILogFactory.getLogger(this.getClass()); - - public void paint(Graphics2D graphics, HSLFPictureData pict, HSLFPictureShape parent) { - BufferedImage img; - try { - img = ImageIO.read(new ByteArrayInputStream(pict.getData())); - } catch (Exception e) { - logger.log(POILogger.WARN, "ImageIO failed to create image. image.type: " + pict.getType()); - return; - } - - boolean isClipped = true; - Insets clip = parent.getBlipClip(); - if (clip == null) { - isClipped = false; - clip = new Insets(0,0,0,0); - } - - int iw = img.getWidth(); - int ih = img.getHeight(); - - Rectangle anchor = parent.getLogicalAnchor2D().getBounds(); - - double cw = (100000-clip.left-clip.right) / 100000.0; - double ch = (100000-clip.top-clip.bottom) / 100000.0; - double sx = anchor.getWidth()/(iw*cw); - double sy = anchor.getHeight()/(ih*ch); - double tx = anchor.getX()-(iw*sx*clip.left/100000.0); - double ty = anchor.getY()-(ih*sy*clip.top/100000.0); - AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ; - - Shape clipOld = graphics.getClip(); - if (isClipped) graphics.clip(anchor.getBounds2D()); - graphics.drawRenderedImage(img, at); - graphics.setClip(clipOld); - } - -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java b/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java deleted file mode 100644 index 76359dc304..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java +++ /dev/null @@ -1,72 +0,0 @@ -/* ==================================================================== - 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.hslf.blip; - -import org.apache.poi.hslf.usermodel.HSLFPictureData; -import org.apache.poi.hslf.usermodel.HSLFPictureShape; - -import java.awt.*; - -/** - * A common interface for objects that can render ppt picture data. - *

    - * Subclasses can redefine it and use third-party libraries for actual rendering, - * for example, Bitmaps can be rendered using javax.imageio.* , WMF can be rendered using Apache Batik, - * PICT can be rendered using Apple QuickTime API for Java, etc. - *

    - * - * A typical usage is as follows: - * - * public WMFPaiter implements ImagePainter{ - * public void paint(Graphics2D graphics, PictureData pict, Picture parent){ - * DataInputStream is = new DataInputStream(new ByteArrayInputStream(pict.getData())); - * org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore wmfStore = - * new org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore(); - * try { - * wmfStore.read(is); - * } catch (IOException e){ - * return; - * } - * - * Rectangle anchor = parent.getAnchor(); - * float scale = (float)anchor.width/wmfStore.getWidthPixels(); - * - * org.apache.batik.transcoder.wmf.tosvg.WMFPainter painter = - * new org.apache.batik.transcoder.wmf.tosvg.WMFPainter(wmfStore, 0, 0, scale); - * graphics.translate(anchor.x, anchor.y); - * painter.paint(graphics); - * } - * } - * PictureData.setImagePainter(Picture.WMF, new WMFPaiter()); - * ... - * - * Subsequent calls of Slide.draw(Graphics gr) will use WMFPaiter for WMF images. - * - * @author Yegor Kozlov. - */ -public interface ImagePainter { - - /** - * Paints the specified picture data - * - * @param graphics the graphics to paintb into - * @param pict the data to paint - * @param parent the shapes that owns the picture data - */ - public void paint(Graphics2D graphics, HSLFPictureData pict, HSLFPictureShape parent); -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java index 5dceebf9c5..1167cc3558 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java +++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java @@ -247,8 +247,8 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { // Table text for (HSLFShape shape : slide.getShapes()){ - if (shape instanceof Table){ - extractTableText(ret, (Table)shape); + if (shape instanceof HSLFTable){ + extractTableText(ret, (HSLFTable)shape); } } // Slide footer, if set @@ -305,10 +305,10 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { return ret.toString(); } - private void extractTableText(StringBuffer ret, Table table) { + private void extractTableText(StringBuffer ret, HSLFTable table) { for (int row = 0; row < table.getNumberOfRows(); row++){ for (int col = 0; col < table.getNumberOfColumns(); col++){ - TableCell cell = table.getCell(row, col); + HSLFTableCell cell = table.getCell(row, col); //defensive null checks; don't know if they're necessary if (cell != null){ String txt = cell.getText(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java index b28c88ec68..c777351728 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java @@ -22,8 +22,8 @@ import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; -import java.awt.geom.Rectangle2D; -import java.awt.geom.Line2D; +import java.awt.geom.*; +import java.util.ArrayList; /** * Represents a line in a PowerPoint drawing @@ -69,4 +69,63 @@ public final class Line extends HSLFSimpleShape { Rectangle2D anchor = getLogicalAnchor2D(); return new Line2D.Double(anchor.getX(), anchor.getY(), anchor.getX() + anchor.getWidth(), anchor.getY() + anchor.getHeight()); } + + /** + * + * @return 'absolute' anchor of this shape relative to the parent sheet + * + * @deprecated TODO: remove the whole class, should work with preset geometries instead + */ + public Rectangle2D getLogicalAnchor2D(){ + Rectangle2D anchor = getAnchor2D(); + + //if it is a groupped shape see if we need to transform the coordinates + if (getParent() != null){ + ArrayList lst = new ArrayList(); + for (ShapeContainer parent=this.getParent(); + parent instanceof HSLFGroupShape; + parent = ((HSLFGroupShape)parent).getParent()) { + lst.add(0, (HSLFGroupShape)parent); + } + + AffineTransform tx = new AffineTransform(); + for(HSLFGroupShape prnt : lst) { + Rectangle2D exterior = prnt.getAnchor2D(); + Rectangle2D interior = prnt.getInteriorAnchor(); + + double scaleX = exterior.getWidth() / interior.getWidth(); + double scaleY = exterior.getHeight() / interior.getHeight(); + + tx.translate(exterior.getX(), exterior.getY()); + tx.scale(scaleX, scaleY); + tx.translate(-interior.getX(), -interior.getY()); + + } + anchor = tx.createTransformedShape(anchor).getBounds2D(); + } + + double angle = getRotation(); + if(angle != 0.){ + double centerX = anchor.getX() + anchor.getWidth()/2; + double centerY = anchor.getY() + anchor.getHeight()/2; + + AffineTransform trans = new AffineTransform(); + trans.translate(centerX, centerY); + trans.rotate(Math.toRadians(angle)); + trans.translate(-centerX, -centerY); + + Rectangle2D rect = trans.createTransformedShape(anchor).getBounds2D(); + if((anchor.getWidth() < anchor.getHeight() && rect.getWidth() > rect.getHeight()) || + (anchor.getWidth() > anchor.getHeight() && rect.getWidth() < rect.getHeight()) ){ + trans = new AffineTransform(); + trans.translate(centerX, centerY); + trans.rotate(Math.PI/2); + trans.translate(-centerX, -centerY); + anchor = trans.createTransformedShape(anchor).getBounds2D(); + } + } + return anchor; + } + + } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java index 0e46e6a7f5..17d0c1d2c5 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java @@ -285,6 +285,7 @@ public class TextPropCollection { * Clones the given text properties */ public void copy(TextPropCollection other) { + if (this == other) return; this.charactersCovered = other.charactersCovered; this.indentLevel = other.indentLevel; this.maskSpecial = other.maskSpecial; diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/EscherTextboxWrapper.java b/src/scratchpad/src/org/apache/poi/hslf/record/EscherTextboxWrapper.java index 715eb81799..10744e49d7 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/EscherTextboxWrapper.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/EscherTextboxWrapper.java @@ -87,9 +87,7 @@ public final class EscherTextboxWrapper extends RecordContainer { // Grab the children's data ByteArrayOutputStream baos = new ByteArrayOutputStream(); - for(int i=0; i<_children.length; i++) { - _children[i].writeOut(baos); - } + for (Record r : _children) r.writeOut(baos); byte[] data = baos.toByteArray(); // Save in the escher layer diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java index 09f21d1baf..09854b5ab9 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java @@ -97,7 +97,7 @@ public final class PPDrawing extends RecordAtom { findEscherChildren(erf, contents, 8, len-8, escherChildren); this.childRecords = escherChildren.toArray(new EscherRecord[escherChildren.size()]); - if (1 == this.childRecords.length && (short)0xf002 == this.childRecords[0].getRecordId() && this.childRecords[0] instanceof EscherContainerRecord) { + if (1 == this.childRecords.length && (short)RecordTypes.EscherDgContainer == this.childRecords[0].getRecordId() && this.childRecords[0] instanceof EscherContainerRecord) { this.textboxWrappers = findInDgContainer((EscherContainerRecord) this.childRecords[0]); } else { // Find and EscherTextboxRecord's, and wrap them up @@ -106,37 +106,30 @@ public final class PPDrawing extends RecordAtom { this.textboxWrappers = textboxes.toArray(new EscherTextboxWrapper[textboxes.size()]); } } - private EscherTextboxWrapper[] findInDgContainer(final EscherContainerRecord escherContainerF002) { + private EscherTextboxWrapper[] findInDgContainer(final EscherContainerRecord dgContainer) { final List found = new LinkedList(); - final EscherContainerRecord SpgrContainer = findFirstEscherContainerRecordOfType((short)0xf003, escherContainerF002); - final EscherContainerRecord[] escherContainersF004 = findAllEscherContainerRecordOfType((short)0xf004, SpgrContainer); - for (EscherContainerRecord spContainer : escherContainersF004) { + final EscherContainerRecord spgrContainer = findFirstEscherContainerRecordOfType((short)RecordTypes.EscherSpgrContainer, dgContainer); + final EscherContainerRecord[] spContainers = findAllEscherContainerRecordOfType((short)RecordTypes.EscherSpContainer, spgrContainer); + for (EscherContainerRecord spContainer : spContainers) { StyleTextProp9Atom nineAtom = findInSpContainer(spContainer); - EscherSpRecord sp = null; - final EscherRecord escherContainerF00A = findFirstEscherRecordOfType((short)0xf00a, spContainer); - if (null != escherContainerF00A) { - if (escherContainerF00A instanceof EscherSpRecord) { - sp = (EscherSpRecord) escherContainerF00A; - } - } - final EscherRecord escherContainerF00D = findFirstEscherRecordOfType((short)0xf00d, spContainer); - if (null == escherContainerF00D) { continue; } - if (escherContainerF00D instanceof EscherTextboxRecord) { - EscherTextboxRecord tbr = (EscherTextboxRecord) escherContainerF00D; - EscherTextboxWrapper w = new EscherTextboxWrapper(tbr); - w.setStyleTextProp9Atom(nineAtom); - if (null != sp) { - w.setShapeId(sp.getShapeId()); - } - found.add(w); + EscherSpRecord sp = (EscherSpRecord)findFirstEscherRecordOfType((short)RecordTypes.EscherSp, spContainer); + EscherTextboxRecord clientTextbox = (EscherTextboxRecord)findFirstEscherRecordOfType((short)RecordTypes.EscherClientTextbox, spContainer); + if (null == clientTextbox) { continue; } + + EscherTextboxWrapper w = new EscherTextboxWrapper(clientTextbox); + w.setStyleTextProp9Atom(nineAtom); + if (null != sp) { + w.setShapeId(sp.getShapeId()); } + found.add(w); } return found.toArray(new EscherTextboxWrapper[found.size()]); } + private StyleTextProp9Atom findInSpContainer(final EscherContainerRecord spContainer) { - final EscherContainerRecord escherContainerF011 = findFirstEscherContainerRecordOfType((short)0xf011, spContainer); - if (null == escherContainerF011) { return null; } - final EscherContainerRecord escherContainer1388 = findFirstEscherContainerRecordOfType((short)0x1388, escherContainerF011); + EscherContainerRecord clientData = findFirstEscherContainerRecordOfType((short)RecordTypes.EscherClientData, spContainer); + if (null == clientData) { return null; } + final EscherContainerRecord escherContainer1388 = findFirstEscherContainerRecordOfType((short)0x1388, clientData); if (null == escherContainer1388) { return null; } final EscherContainerRecord escherContainer138A = findFirstEscherContainerRecordOfType((short)0x138A, escherContainer1388); if (null == escherContainer138A) { return null; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java index be732d44ca..91a590afe8 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java @@ -294,7 +294,7 @@ public abstract class RecordContainer extends Record // Write out our header, less the size mout.write(new byte[] {headerA,headerB}); byte[] typeB = new byte[2]; - LittleEndian.putShort(typeB,(short)type); + LittleEndian.putShort(typeB, 0, (short)type); mout.write(typeB); mout.write(new byte[4]); @@ -320,7 +320,7 @@ public abstract class RecordContainer extends Record // Write out our header, less the size baos.write(new byte[] {headerA,headerB}); byte[] typeB = new byte[2]; - LittleEndian.putShort(typeB,(short)type); + LittleEndian.putShort(typeB,0,(short)type); baos.write(typeB); baos.write(new byte[] {0,0,0,0}); diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java b/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java index 315455d90c..195b59c08f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java @@ -93,8 +93,6 @@ public final class SlideListWithText extends RecordContainer { } int clen = endPos - i - 1; - boolean emptySet = false; - if(clen == 0) { emptySet = true; } // Create a SlideAtomsSets, not caring if they're empty //if(emptySet) { continue; } @@ -149,7 +147,7 @@ public final class SlideListWithText extends RecordContainer { } public void setInstance(int inst){ - LittleEndian.putShort(_header, (short)((inst << 4) | 0xF)); + LittleEndian.putShort(_header, 0, (short)((inst << 4) | 0xF)); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFill.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFill.java index 9b74711fc6..09d97a3b74 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFill.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFill.java @@ -128,9 +128,10 @@ public final class HSLFFill { }; } case FILL_PICTURE: { + final HSLFPictureData pd = getPictureData(); + if (pd == null) break; + return new TexturePaint() { - final HSLFPictureData pd = getPictureData(); - public InputStream getImageData() { return new ByteArrayInputStream(pd.getData()); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java index 5e47776d6e..5133ff1229 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java @@ -21,8 +21,7 @@ import java.awt.geom.Rectangle2D; import java.util.*; import org.apache.poi.ddf.*; -import org.apache.poi.sl.usermodel.ShapeContainer; -import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.usermodel.*; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.POILogger; @@ -31,7 +30,7 @@ import org.apache.poi.util.POILogger; * * @author Yegor Kozlov */ -public class HSLFGroupShape extends HSLFShape implements ShapeContainer { +public class HSLFGroupShape extends HSLFShape implements GroupShape { /** * Create a new ShapeGroup. This constructor is used when a new shape is created. @@ -87,13 +86,8 @@ public class HSLFGroupShape extends HSLFShape implements ShapeContainer { protected static POILogger logger = POILogFactory.getLogger(HSLFNotes.class); - private List> _runs; + private List> _paragraphs = new ArrayList>(); /** * Constructs a Notes Sheet from the given Notes record. @@ -49,13 +49,16 @@ public final class HSLFNotes extends HSLFSheet implements Notes l : HSLFTextParagraph.findTextParagraphs(getPPDrawing(), this)) { + if (!_paragraphs.contains(l)) _paragraphs.add(l); + } + + if (_paragraphs.isEmpty()) { logger.log(POILogger.WARN, "No text records found for notes sheet"); } // Set the sheet on each TextRun - for (List ltp : _runs) { + for (List ltp : _paragraphs) { for (HSLFTextParagraph tp : ltp) { tp.supplySheet(this); } @@ -67,7 +70,7 @@ public final class HSLFNotes extends HSLFSheet implements Notes> getTextParagraphs() { - return _runs; + return _paragraphs; } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java index b848a2cb9b..230a6401d2 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java @@ -17,31 +17,22 @@ package org.apache.poi.hslf.usermodel; -import java.awt.Graphics2D; import java.io.IOException; import java.io.OutputStream; import java.security.MessageDigest; -import org.apache.poi.hslf.blip.BitmapPainter; -import org.apache.poi.hslf.blip.DIB; -import org.apache.poi.hslf.blip.EMF; -import org.apache.poi.hslf.blip.ImagePainter; -import org.apache.poi.hslf.blip.JPEG; -import org.apache.poi.hslf.blip.PICT; -import org.apache.poi.hslf.blip.PNG; -import org.apache.poi.hslf.blip.WMF; +import org.apache.poi.hslf.blip.*; import org.apache.poi.poifs.crypt.CryptoFunctions; import org.apache.poi.poifs.crypt.HashAlgorithm; -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; +import org.apache.poi.sl.usermodel.PictureData; +import org.apache.poi.util.*; /** * A class that represents image data contained in a slide show. * * @author Yegor Kozlov */ -public abstract class HSLFPictureData { +public abstract class HSLFPictureData implements PictureData { protected POILogger logger = POILogFactory.getLogger(this.getClass()); @@ -91,13 +82,6 @@ public abstract class HSLFPictureData { */ protected abstract int getSignature(); - protected static final ImagePainter[] painters = new ImagePainter[8]; - static { - HSLFPictureData.setImagePainter(HSLFPictureShape.PNG, new BitmapPainter()); - HSLFPictureData.setImagePainter(HSLFPictureShape.JPEG, new BitmapPainter()); - HSLFPictureData.setImagePainter(HSLFPictureShape.DIB, new BitmapPainter()); - } - /** * Returns the raw binary data of this Picture excluding the first 8 bytes * which hold image signature and size of the image data. @@ -233,31 +217,4 @@ public abstract class HSLFPictureData { public int getSize(){ return getData().length; } - - public void draw(Graphics2D graphics, HSLFPictureShape parent){ - ImagePainter painter = painters[getType()]; - if(painter != null) painter.paint(graphics, this, parent); - else logger.log(POILogger.WARN, "Rendering is not supported: " + getClass().getName()); - } - - /** - * Register ImagePainter for the specified image type - * - * @param type image type, must be one of the static constants defined in the Picture class. - * @param painter - */ - public static void setImagePainter(int type, ImagePainter painter){ - painters[type] = painter; - } - - /** - * Return ImagePainter for the specified image type - * - * @param type blip type, must be one of the static constants defined in the Picture class. - * @return ImagePainter for the specified image type - */ - public static ImagePainter getImagePainter(int type){ - return painters[type]; - } - } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java index c97c281680..03a9861ae6 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java @@ -28,8 +28,7 @@ import javax.imageio.ImageIO; import org.apache.poi.ddf.*; import org.apache.poi.hslf.blip.Bitmap; import org.apache.poi.hslf.record.Document; -import org.apache.poi.sl.usermodel.ShapeContainer; -import org.apache.poi.sl.usermodel.ShapeType; +import org.apache.poi.sl.usermodel.*; import org.apache.poi.util.*; @@ -38,7 +37,7 @@ import org.apache.poi.util.*; * * @author Yegor Kozlov */ -public class HSLFPictureShape extends HSLFSimpleShape { +public class HSLFPictureShape extends HSLFSimpleShape implements PictureShape { /** * Windows Enhanced Metafile (EMF) @@ -165,11 +164,7 @@ public class HSLFPictureShape extends HSLFSimpleShape { } } - /** - * Returns the picture data for this picture. - * - * @return the picture data for this picture. - */ + @Override public HSLFPictureData getPictureData(){ HSLFSlideShow ppt = getSheet().getSlideShow(); HSLFPictureData[] pict = ppt.getPictureData(); @@ -247,13 +242,11 @@ public class HSLFPictureShape extends HSLFSimpleShape { } /** - * Returns the clipping values as percent ratio relatively to the image size. * The anchor specified by {@link #getLogicalAnchor2D()} is the displayed size, * i.e. the size of the already clipped image - * - * @return the clipping as insets converted/scaled to 100000 (=100%) */ - public Insets getBlipClip() { + @Override + public Insets getClipping() { EscherOptRecord opt = getEscherOptRecord(); double top = getFractProp(opt, EscherProperties.BLIP__CROPFROMTOP); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java index a6be80f92f..a68f3a74e9 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java @@ -165,14 +165,12 @@ public abstract class HSLFShape implements Shape { public Rectangle2D getAnchor2D(){ EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); int flags = spRecord.getFlags(); - Rectangle2D anchor=null; + Rectangle2D anchor; if ((flags & EscherSpRecord.FLAG_CHILD) != 0){ EscherChildAnchorRecord rec = getEscherChild(EscherChildAnchorRecord.RECORD_ID); - anchor = new java.awt.Rectangle(); if(rec == null){ logger.log(POILogger.WARN, "EscherSpRecord.FLAG_CHILD is set but EscherChildAnchorRecord was not found"); EscherClientAnchorRecord clrec = getEscherChild(EscherClientAnchorRecord.RECORD_ID); - anchor = new java.awt.Rectangle(); anchor = new Rectangle2D.Float( (float)clrec.getCol1()*POINT_DPI/MASTER_DPI, (float)clrec.getFlag()*POINT_DPI/MASTER_DPI, @@ -187,10 +185,8 @@ public abstract class HSLFShape implements Shape { (float)(rec.getDy2()-rec.getDy1())*POINT_DPI/MASTER_DPI ); } - } - else { + } else { EscherClientAnchorRecord rec = getEscherChild(EscherClientAnchorRecord.RECORD_ID); - anchor = new java.awt.Rectangle(); anchor = new Rectangle2D.Float( (float)rec.getCol1()*POINT_DPI/MASTER_DPI, (float)rec.getFlag()*POINT_DPI/MASTER_DPI, @@ -201,10 +197,6 @@ public abstract class HSLFShape implements Shape { return anchor; } - public Rectangle2D getLogicalAnchor2D(){ - return getAnchor2D(); - } - /** * Sets the anchor (the bounding box rectangle) of this shape. * All coordinates should be expressed in points (72 dpi). @@ -262,8 +254,9 @@ public abstract class HSLFShape implements Shape { * @return escher property or null if not found. */ public static T getEscherProperty(EscherOptRecord opt, int propId){ - return opt.lookup(propId); - } + if (opt == null) return null; + return opt.lookup(propId); + } /** * Set an escher property for this shape. @@ -475,15 +468,6 @@ public abstract class HSLFShape implements Shape { logger.log(POILogger.INFO, "Rendering " + getShapeName()); } - /** - * Return shape outline as a java.awt.Shape object - * - * @return the shape outline - */ - public java.awt.Shape getOutline(){ - return getLogicalAnchor2D(); - } - public EscherOptRecord getEscherOptRecord() { EscherOptRecord opt = getEscherChild(EscherOptRecord.RECORD_ID); if (opt == null) { @@ -516,8 +500,7 @@ public abstract class HSLFShape implements Shape { public double getRotation(){ int rot = getEscherProperty(EscherProperties.TRANSFORM__ROTATION); - double angle = Units.fixedPointToDouble(rot) % 360.0; - return angle; + return Units.fixedPointToDouble(rot); } public void setRotation(double theta){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java index 0f9dd2815e..9f715fb389 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java @@ -69,7 +69,7 @@ public final class HSLFShapeFactory { List props = f.createProperties( opt.serialize(), 8, opt.getInstance() ); EscherSimpleProperty p = (EscherSimpleProperty)props.get(0); if(p.getPropertyNumber() == 0x39F && p.getPropertyValue() == 1){ - group = new Table(spContainer, parent); + group = new HSLFTable(spContainer, parent); } else { group = new HSLFGroupShape(spContainer, parent); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java index 547e095efb..0247a75936 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java @@ -22,6 +22,8 @@ import java.util.*; import org.apache.poi.ddf.*; import org.apache.poi.hslf.record.*; +import org.apache.poi.sl.draw.DrawFactory; +import org.apache.poi.sl.draw.Drawable; import org.apache.poi.sl.usermodel.Sheet; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -288,8 +290,11 @@ public abstract class HSLFSheet implements Sheet { return _background; } - public void draw(Graphics2D graphics){ - + @Override + public void draw(Graphics2D graphics) { + DrawFactory drawFact = DrawFactory.getInstance(graphics); + Drawable draw = drawFact.getDrawable(this); + draw.draw(graphics); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java index 6c053d49f4..5ddf311e52 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java @@ -18,16 +18,15 @@ package org.apache.poi.hslf.usermodel; import java.awt.Color; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; import java.io.ByteArrayOutputStream; -import java.util.ArrayList; import org.apache.poi.ddf.*; import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.hslf.record.*; +import org.apache.poi.sl.draw.DrawPaint; import org.apache.poi.sl.draw.geom.*; import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound; import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.util.LittleEndian; @@ -196,7 +195,7 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { public StrokeStyle getStrokeStyle(){ return new StrokeStyle() { public PaintStyle getPaint() { - return null; + return DrawPaint.createSolidPaint(HSLFSimpleShape.this.getLineColor()); } public LineCap getLineCap() { @@ -204,15 +203,15 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { } public LineDash getLineDash() { - return null; + return HSLFSimpleShape.this.getLineDashing(); } public LineCompound getLineCompound() { - return null; + return HSLFSimpleShape.this.getLineCompound(); } public double getLineWidth() { - return 0; + return HSLFSimpleShape.this.getLineWidth(); } }; @@ -234,61 +233,6 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { getFill().setForegroundColor(color); } - /** - * - * @return 'absolute' anchor of this shape relative to the parent sheet - */ - public Rectangle2D getLogicalAnchor2D(){ - Rectangle2D anchor = getAnchor2D(); - - //if it is a groupped shape see if we need to transform the coordinates - if (getParent() != null){ - ArrayList lst = new ArrayList(); - for (ShapeContainer parent=this.getParent(); - parent instanceof HSLFGroupShape; - parent = ((HSLFGroupShape)parent).getParent()) { - lst.add(0, (HSLFGroupShape)parent); - } - - AffineTransform tx = new AffineTransform(); - for(HSLFGroupShape prnt : lst) { - Rectangle2D exterior = prnt.getAnchor2D(); - Rectangle2D interior = prnt.getCoordinates(); - - double scaleX = exterior.getWidth() / interior.getWidth(); - double scaleY = exterior.getHeight() / interior.getHeight(); - - tx.translate(exterior.getX(), exterior.getY()); - tx.scale(scaleX, scaleY); - tx.translate(-interior.getX(), -interior.getY()); - - } - anchor = tx.createTransformedShape(anchor).getBounds2D(); - } - - double angle = getRotation(); - if(angle != 0.){ - double centerX = anchor.getX() + anchor.getWidth()/2; - double centerY = anchor.getY() + anchor.getHeight()/2; - - AffineTransform trans = new AffineTransform(); - trans.translate(centerX, centerY); - trans.rotate(Math.toRadians(angle)); - trans.translate(-centerX, -centerY); - - Rectangle2D rect = trans.createTransformedShape(anchor).getBounds2D(); - if((anchor.getWidth() < anchor.getHeight() && rect.getWidth() > rect.getHeight()) || - (anchor.getWidth() > anchor.getHeight() && rect.getWidth() < rect.getHeight()) ){ - trans = new AffineTransform(); - trans.translate(centerX, centerY); - trans.rotate(Math.PI/2); - trans.translate(-centerX, -centerY); - anchor = trans.createTransformedShape(anchor).getBounds2D(); - } - } - return anchor; - } - /** * Find a record in the underlying EscherClientDataRecord * @@ -424,11 +368,6 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { return (adjval == -1) ? null : new Guide(name, "val "+adjval); } - public LineDecoration getLineDecoration() { - // TODO Auto-generated method stub - return null; - } - public CustomGeometry getGeometry() { ShapeType st = getShapeType(); String name = st.getOoxmlName(); @@ -442,11 +381,89 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { return geom; } - public Shadow getShadow() { - // TODO Auto-generated method stub - return null; + + public double getShadowAngle() { + EscherOptRecord opt = getEscherOptRecord(); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.SHADOWSTYLE__OFFSETX); + int offX = (prop == null) ? 0 : prop.getPropertyValue(); + prop = getEscherProperty(opt, EscherProperties.SHADOWSTYLE__OFFSETY); + int offY = (prop == null) ? 0 : prop.getPropertyValue(); + return Math.toDegrees(Math.atan2(offY, offX)); + } + + public double getShadowDistance() { + EscherOptRecord opt = getEscherOptRecord(); + EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.SHADOWSTYLE__OFFSETX); + int offX = (prop == null) ? 0 : prop.getPropertyValue(); + prop = getEscherProperty(opt, EscherProperties.SHADOWSTYLE__OFFSETY); + int offY = (prop == null) ? 0 : prop.getPropertyValue(); + return Units.toPoints((long)Math.hypot(offX, offY)); } + /** + * @return color of the line. If color is not set returns java.awt.Color.black + */ + public Color getShadowColor(){ + Color clr = getColor(EscherProperties.SHADOWSTYLE__COLOR, EscherProperties.SHADOWSTYLE__OPACITY, -1); + return clr == null ? Color.black : clr; + } - + public Shadow getShadow() { + EscherOptRecord opt = getEscherOptRecord(); + EscherProperty shadowType = opt.lookup(EscherProperties.SHADOWSTYLE__TYPE); + if (shadowType == null) return null; + + return new Shadow(){ + public SimpleShape getShadowParent() { + return HSLFSimpleShape.this; + } + + public double getDistance() { + return getShadowDistance(); + } + + public double getAngle() { + return getShadowAngle(); + } + + public double getBlur() { + // TODO Auto-generated method stub + return 0; + } + + public SolidPaint getFillStyle() { + return DrawPaint.createSolidPaint(getShadowColor()); + } + + }; + } + + public LineDecoration getLineDecoration() { + return new LineDecoration() { + + public DecorationShape getHeadShape() { + return DecorationShape.NONE; + } + + public DecorationSize getHeadWidth() { + return DecorationSize.MEDIUM; + } + + public DecorationSize getHeadLength() { + return DecorationSize.MEDIUM; + } + + public DecorationShape getTailShape() { + return DecorationShape.NONE; + } + + public DecorationSize getTailWidth() { + return DecorationSize.MEDIUM; + } + + public DecorationSize getTailLength() { + return DecorationSize.MEDIUM; + } + }; + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java index 048655fa64..e238751038 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java @@ -72,7 +72,9 @@ public final class HSLFSlide extends HSLFSheet implements Slide l : HSLFTextParagraph.findTextParagraphs(getPPDrawing(), this)) { + if (!_paragraphs.contains(l)) _paragraphs.add(l); + } for(List ltp : _paragraphs) { for (HSLFTextParagraph tp : ltp) { diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java index 1c6518e5e0..a6dfedf073 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java @@ -32,7 +32,7 @@ import org.apache.poi.hslf.record.*; * @author Yegor Kozlov */ public final class HSLFSlideMaster extends HSLFMasterSheet { - private final List> _runs = new ArrayList>(); + private final List> _paragraphs = new ArrayList>(); /** * all TxMasterStyleAtoms available in this master @@ -46,8 +46,11 @@ public final class HSLFSlideMaster extends HSLFMasterSheet { public HSLFSlideMaster(MainMaster record, int sheetNo) { super(record, sheetNo); - _runs.addAll(HSLFTextParagraph.findTextParagraphs(getPPDrawing())); - for (List p : _runs) { + for (List l : HSLFTextParagraph.findTextParagraphs(getPPDrawing(), this)) { + if (!_paragraphs.contains(l)) _paragraphs.add(l); + } + + for (List p : _paragraphs) { for (HSLFTextParagraph htp : p) { htp.supplySheet(this); } @@ -58,7 +61,7 @@ public final class HSLFSlideMaster extends HSLFMasterSheet { * Returns an array of all the TextRuns found */ public List> getTextParagraphs() { - return _runs; + return _paragraphs; } /** @@ -138,7 +141,7 @@ public final class HSLFSlideMaster extends HSLFMasterSheet { protected void onAddTextShape(HSLFTextShape shape) { List runs = shape.getTextParagraphs(); - _runs.add(runs); + _paragraphs.add(runs); } public TxMasterStyleAtom[] getTxMasterStyleAtoms(){ diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java similarity index 91% rename from src/scratchpad/src/org/apache/poi/hslf/model/Table.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java index 8f3b245c15..b028758e6f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java @@ -15,9 +15,10 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import org.apache.poi.ddf.*; +import org.apache.poi.hslf.model.Line; import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.util.LittleEndian; @@ -31,7 +32,7 @@ import java.awt.*; * * @author Yegor Kozlov */ -public final class Table extends HSLFGroupShape { +public final class HSLFTable extends HSLFGroupShape { protected static final int BORDER_TOP = 1; protected static final int BORDER_RIGHT = 2; @@ -44,7 +45,7 @@ public final class Table extends HSLFGroupShape { protected static final int BORDERS_NONE = 8; - protected TableCell[][] cells; + protected HSLFTableCell[][] cells; /** * Create a new Table of the given number of rows and columns @@ -52,23 +53,23 @@ public final class Table extends HSLFGroupShape { * @param numrows the number of rows * @param numcols the number of columns */ - public Table(int numrows, int numcols) { + public HSLFTable(int numrows, int numcols) { super(); if(numrows < 1) throw new IllegalArgumentException("The number of rows must be greater than 1"); if(numcols < 1) throw new IllegalArgumentException("The number of columns must be greater than 1"); int x=0, y=0, tblWidth=0, tblHeight=0; - cells = new TableCell[numrows][numcols]; + cells = new HSLFTableCell[numrows][numcols]; for (int i = 0; i < cells.length; i++) { x = 0; for (int j = 0; j < cells[i].length; j++) { - cells[i][j] = new TableCell(this); - Rectangle anchor = new Rectangle(x, y, TableCell.DEFAULT_WIDTH, TableCell.DEFAULT_HEIGHT); + cells[i][j] = new HSLFTableCell(this); + Rectangle anchor = new Rectangle(x, y, HSLFTableCell.DEFAULT_WIDTH, HSLFTableCell.DEFAULT_HEIGHT); cells[i][j].setAnchor(anchor); - x += TableCell.DEFAULT_WIDTH; + x += HSLFTableCell.DEFAULT_WIDTH; } - y += TableCell.DEFAULT_HEIGHT; + y += HSLFTableCell.DEFAULT_HEIGHT; } tblWidth = x; tblHeight = y; @@ -94,7 +95,7 @@ public final class Table extends HSLFGroupShape { * @param escherRecord EscherSpContainer container which holds information about this shape * @param parent the parent of the shape */ - public Table(EscherContainerRecord escherRecord, ShapeContainer parent) { + public HSLFTable(EscherContainerRecord escherRecord, ShapeContainer parent) { super(escherRecord, parent); } @@ -105,7 +106,7 @@ public final class Table extends HSLFGroupShape { * @param col the column index (0-based) * @return the cell */ - public TableCell getCell(int row, int col) { + public HSLFTableCell getCell(int row, int col) { return cells[row][col]; } @@ -124,13 +125,13 @@ public final class Table extends HSLFGroupShape { EscherOptRecord opt = (EscherOptRecord)lst.get(lst.size()-2); EscherArrayProperty p = opt.lookup(0x3A0); for (int i = 0; i < cells.length; i++) { - TableCell cell = cells[i][0]; + HSLFTableCell cell = cells[i][0]; int rowHeight = cell.getAnchor().height*MASTER_DPI/POINT_DPI; byte[] val = new byte[4]; LittleEndian.putInt(val, 0, rowHeight); p.setElement(i, val); for (int j = 0; j < cells[i].length; j++) { - TableCell c = cells[i][j]; + HSLFTableCell c = cells[i][j]; addShape(c); Line bt = c.getBorderTop(); @@ -177,12 +178,12 @@ public final class Table extends HSLFGroupShape { maxrowlen = Math.max(maxrowlen, row.size()); } } - cells = new TableCell[lst.size()][maxrowlen]; + cells = new HSLFTableCell[lst.size()][maxrowlen]; for (int i = 0; i < lst.size(); i++) { row = lst.get(i); for (int j = 0; j < row.size(); j++) { HSLFTextShape tx = (HSLFTextShape)row.get(j); - cells[i][j] = new TableCell(tx.getSpContainer(), getParent()); + cells[i][j] = new HSLFTableCell(tx.getSpContainer(), getParent()); cells[i][j].setSheet(tx.getSheet()); } } @@ -256,7 +257,7 @@ public final class Table extends HSLFGroupShape { public void setAllBorders(Line line){ for (int i = 0; i < cells.length; i++) { for (int j = 0; j < cells[i].length; j++) { - TableCell cell = cells[i][j]; + HSLFTableCell cell = cells[i][j]; cell.setBorderTop(cloneBorder(line)); cell.setBorderLeft(cloneBorder(line)); if(j == cells[i].length - 1) cell.setBorderRight(cloneBorder(line)); @@ -273,7 +274,7 @@ public final class Table extends HSLFGroupShape { public void setOutsideBorders(Line line){ for (int i = 0; i < cells.length; i++) { for (int j = 0; j < cells[i].length; j++) { - TableCell cell = cells[i][j]; + HSLFTableCell cell = cells[i][j]; if(j == 0) cell.setBorderLeft(cloneBorder(line)); if(j == cells[i].length - 1) cell.setBorderRight(cloneBorder(line)); @@ -300,7 +301,7 @@ public final class Table extends HSLFGroupShape { public void setInsideBorders(Line line){ for (int i = 0; i < cells.length; i++) { for (int j = 0; j < cells[i].length; j++) { - TableCell cell = cells[i][j]; + HSLFTableCell cell = cells[i][j]; if(j != cells[i].length - 1) cell.setBorderRight(cloneBorder(line)); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java similarity index 81% rename from src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java index cfdee76633..b1e7c3e4bb 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java @@ -15,15 +15,14 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; import java.awt.Rectangle; import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherOptRecord; import org.apache.poi.ddf.EscherProperties; -import org.apache.poi.hslf.usermodel.HSLFShape; -import org.apache.poi.hslf.usermodel.HSLFTextBox; +import org.apache.poi.hslf.model.Line; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; @@ -32,7 +31,7 @@ import org.apache.poi.sl.usermodel.ShapeType; * * @author Yegor Kozlov */ -public final class TableCell extends HSLFTextBox { +public final class HSLFTableCell extends HSLFTextBox { protected static final int DEFAULT_WIDTH = 100; protected static final int DEFAULT_HEIGHT = 40; @@ -47,7 +46,7 @@ public final class TableCell extends HSLFTextBox { * @param escherRecord {@link EscherSpContainer} container which holds information about this shape * @param parent the parent of the shape */ - protected TableCell(EscherContainerRecord escherRecord, ShapeContainer parent){ + protected HSLFTableCell(EscherContainerRecord escherRecord, ShapeContainer parent){ super(escherRecord, parent); } @@ -57,7 +56,7 @@ public final class TableCell extends HSLFTextBox { * @param parent the parent of this Shape. For example, if this text box is a cell * in a table then the parent is Table. */ - public TableCell(ShapeContainer parent){ + public HSLFTableCell(ShapeContainer parent){ super(parent); setShapeType(ShapeType.RECT); @@ -81,25 +80,25 @@ public final class TableCell extends HSLFTextBox { Rectangle cellAnchor = getAnchor(); Rectangle lineAnchor = new Rectangle(); switch(type){ - case Table.BORDER_TOP: + case HSLFTable.BORDER_TOP: lineAnchor.x = cellAnchor.x; lineAnchor.y = cellAnchor.y; lineAnchor.width = cellAnchor.width; lineAnchor.height = 0; break; - case Table.BORDER_RIGHT: + case HSLFTable.BORDER_RIGHT: lineAnchor.x = cellAnchor.x + cellAnchor.width; lineAnchor.y = cellAnchor.y; lineAnchor.width = 0; lineAnchor.height = cellAnchor.height; break; - case Table.BORDER_BOTTOM: + case HSLFTable.BORDER_BOTTOM: lineAnchor.x = cellAnchor.x; lineAnchor.y = cellAnchor.y + cellAnchor.height; lineAnchor.width = cellAnchor.width; lineAnchor.height = 0; break; - case Table.BORDER_LEFT: + case HSLFTable.BORDER_LEFT: lineAnchor.x = cellAnchor.x; lineAnchor.y = cellAnchor.y; lineAnchor.width = 0; @@ -116,7 +115,7 @@ public final class TableCell extends HSLFTextBox { } public void setBorderLeft(Line line) { - if(line != null) anchorBorder(Table.BORDER_LEFT, line); + if(line != null) anchorBorder(HSLFTable.BORDER_LEFT, line); this.borderLeft = line; } @@ -125,7 +124,7 @@ public final class TableCell extends HSLFTextBox { } public void setBorderRight(Line line) { - if(line != null) anchorBorder(Table.BORDER_RIGHT, line); + if(line != null) anchorBorder(HSLFTable.BORDER_RIGHT, line); this.borderRight = line; } @@ -134,7 +133,7 @@ public final class TableCell extends HSLFTextBox { } public void setBorderTop(Line line) { - if(line != null) anchorBorder(Table.BORDER_TOP, line); + if(line != null) anchorBorder(HSLFTable.BORDER_TOP, line); this.borderTop = line; } @@ -143,16 +142,16 @@ public final class TableCell extends HSLFTextBox { } public void setBorderBottom(Line line) { - if(line != null) anchorBorder(Table.BORDER_BOTTOM, line); + if(line != null) anchorBorder(HSLFTable.BORDER_BOTTOM, line); this.borderBottom = line; } public void setAnchor(Rectangle anchor){ super.setAnchor(anchor); - if(borderTop != null) anchorBorder(Table.BORDER_TOP, borderTop); - if(borderRight != null) anchorBorder(Table.BORDER_RIGHT, borderRight); - if(borderBottom != null) anchorBorder(Table.BORDER_BOTTOM, borderBottom); - if(borderLeft != null) anchorBorder(Table.BORDER_LEFT, borderLeft); + if(borderTop != null) anchorBorder(HSLFTable.BORDER_TOP, borderTop); + if(borderRight != null) anchorBorder(HSLFTable.BORDER_RIGHT, borderRight); + if(borderBottom != null) anchorBorder(HSLFTable.BORDER_BOTTOM, borderBottom); + if(borderLeft != null) anchorBorder(HSLFTable.BORDER_LEFT, borderLeft); } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index ca6ddf6e80..f80bd3fc92 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -17,7 +17,10 @@ package org.apache.poi.hslf.usermodel; +import static org.apache.poi.hslf.record.RecordTypes.OutlineTextRefAtom; + import java.awt.Color; +import java.io.IOException; import java.util.*; import org.apache.poi.hslf.model.PPFont; @@ -52,8 +55,7 @@ public final class HSLFTextParagraph implements TextParagraph { private final TextHeaderAtom _headerAtom; private TextBytesAtom _byteAtom; private TextCharsAtom _charAtom; - private StyleTextPropAtom _styleAtom; - private TextPropCollection _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph); + private final TextPropCollection _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph); protected TextRulerAtom _ruler; protected List _runs = new ArrayList(); @@ -61,11 +63,6 @@ public final class HSLFTextParagraph implements TextParagraph { private HSLFSheet _sheet; private int shapeId; - /** - * all text run records that follow TextHeaderAtom. - * (there can be misc InteractiveInfo, TxInteractiveInfo and other records) - */ - private Record[] _records; // private StyleTextPropAtom styleTextPropAtom; private StyleTextProp9Atom styleTextProp9Atom; @@ -76,32 +73,30 @@ public final class HSLFTextParagraph implements TextParagraph { * @param tha the TextHeaderAtom that defines what's what * @param tba the TextBytesAtom containing the text or null if {@link TextCharsAtom} is provided * @param tca the TextCharsAtom containing the text or null if {@link TextBytesAtom} is provided - * @param sta the StyleTextPropAtom which defines the character stylings */ /* package */ HSLFTextParagraph( TextHeaderAtom tha, TextBytesAtom tba, - TextCharsAtom tca, - StyleTextPropAtom sta + TextCharsAtom tca ) { + if (tha == null) { + throw new IllegalArgumentException("TextHeaderAtom must be set."); + } _headerAtom = tha; - _styleAtom = sta; _byteAtom = tba; _charAtom = tca; } /* package */ HSLFTextParagraph(HSLFTextParagraph other) { - _headerAtom = other._headerAtom; - _styleAtom = other._styleAtom; - _byteAtom = other._byteAtom; - _charAtom = other._charAtom; - _paragraphStyle = other._paragraphStyle; - _parentShape = other._parentShape; - _sheet = other._sheet; - _ruler = other._ruler; // ???? - shapeId = other.shapeId; - _records = other._records; - } + _headerAtom = other._headerAtom; + _byteAtom = other._byteAtom; + _charAtom = other._charAtom; + _parentShape = other._parentShape; + _sheet = other._sheet; + _ruler = other._ruler; + shapeId = other.shapeId; + _paragraphStyle.copy(other._paragraphStyle); + } public void addTextRun(HSLFTextRun run) { _runs.add(run); @@ -120,7 +115,7 @@ public final class HSLFTextParagraph implements TextParagraph { } public void setParagraphStyle(TextPropCollection paragraphStyle) { - _paragraphStyle = paragraphStyle; + _paragraphStyle.copy(paragraphStyle); } /** @@ -196,20 +191,52 @@ public final class HSLFTextParagraph implements TextParagraph { _ruler = getTextRuler(); if (_ruler == null) { _ruler = TextRulerAtom.getParagraphInstance(); - _headerAtom.getParentRecord().appendChildRecord(_ruler); + Record childAfter = _byteAtom; + if (childAfter == null) childAfter = _charAtom; + if (childAfter == null) childAfter = _headerAtom; + _headerAtom.getParentRecord().addChildAfter(_ruler, childAfter); } return _ruler; } /** - * Returns records that make up this text run + * Returns records that make up the list of text paragraphs + * (there can be misc InteractiveInfo, TxInteractiveInfo and other records) * * @return text run records */ public Record[] getRecords(){ - return _records; + Record r[] = _headerAtom.getParentRecord().getChildRecords(); + return getRecords(r, new int[]{0}, _headerAtom); } + private static Record[] getRecords(Record[] records, int[] startIdx, TextHeaderAtom headerAtom) { + if (records == null) { + throw new NullPointerException("records need to be set."); + } + + for (; startIdx[0] < records.length; startIdx[0]++) { + Record r = records[startIdx[0]]; + if (r instanceof TextHeaderAtom && (headerAtom == null || r == headerAtom)) break; + } + + if (startIdx[0] >= records.length) { + logger.log(POILogger.INFO, "header atom wasn't found - container might contain only an OutlineTextRefAtom"); + return new Record[0]; + } + + int length; + for (length = 1; startIdx[0]+length < records.length; length++) { + if (records[startIdx[0]+length] instanceof TextHeaderAtom) break; + } + + Record result[] = new Record[length]; + System.arraycopy(records, startIdx[0], result, 0, length); + startIdx[0] += length; + + return result; + } + /** Numbered List info */ public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) { this.styleTextProp9Atom = styleTextProp9Atom; @@ -220,11 +247,6 @@ public final class HSLFTextParagraph implements TextParagraph { return this.styleTextProp9Atom; } - /** Characters covered */ - public StyleTextPropAtom getStyleTextPropAtom() { - return this._styleAtom; - } - /** * Fetch the value of the given Paragraph related TextProp. * Returns -1 if that TextProp isn't present. @@ -232,14 +254,9 @@ public final class HSLFTextParagraph implements TextParagraph { * Master Sheet will apply. */ private int getParaTextPropVal(String propName) { - TextProp prop = null; - boolean hardAttribute = false; - if (_paragraphStyle != null){ - prop = _paragraphStyle.findByName(propName); - - BitMaskTextProp maskProp = (BitMaskTextProp)_paragraphStyle.findByName(ParagraphFlagsTextProp.NAME); - hardAttribute = maskProp != null && maskProp.getValue() == 0; - } + TextProp prop = _paragraphStyle.findByName(propName); + BitMaskTextProp maskProp = (BitMaskTextProp)_paragraphStyle.findByName(ParagraphFlagsTextProp.NAME); + boolean hardAttribute = (maskProp != null && maskProp.getValue() == 0); if (prop == null && !hardAttribute){ HSLFSheet sheet = getSheet(); int txtype = getRunType(); @@ -258,11 +275,6 @@ public final class HSLFTextParagraph implements TextParagraph { */ public void setParaTextPropVal(String propName, int val) { // Ensure we have the StyleTextProp atom we're going to need - if(_paragraphStyle == null) { - _styleAtom = findStyleAtomPresent(_headerAtom, -1); - _paragraphStyle = _styleAtom.getParagraphStyles().get(0); - } - assert(_paragraphStyle!=null); TextProp tp = fetchOrAddTextProp(_paragraphStyle, propName); tp.setValue(val); @@ -615,10 +627,7 @@ public final class HSLFTextParagraph implements TextParagraph { protected void setFlag(int index, boolean value) { // Ensure we have the StyleTextProp atom we're going to need - if(_paragraphStyle == null) { - _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph); - } - + assert(_paragraphStyle!=null); BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(_paragraphStyle, ParagraphFlagsTextProp.NAME); prop.setSubValue(value,index); } @@ -653,12 +662,13 @@ public final class HSLFTextParagraph implements TextParagraph { boolean afterHeader = false; StyleTextPropAtom style = null; for (Record record : header.getParentRecord().getChildRecords()) { - if (afterHeader && record.getRecordType() == RecordTypes.TextHeaderAtom.typeID) { + long rt = record.getRecordType(); + if (afterHeader && rt == RecordTypes.TextHeaderAtom.typeID) { // already on the next header, quit searching break; } afterHeader |= (header == record); - if (afterHeader && record.getRecordType() == RecordTypes.StyleTextPropAtom.typeID) { + if (afterHeader && rt == RecordTypes.StyleTextPropAtom.typeID) { // found it style = (StyleTextPropAtom)record; } @@ -789,12 +799,20 @@ public final class HSLFTextParagraph implements TextParagraph { * If TextSpecInfoAtom is present, we must update the text size in it, * otherwise the ppt will be corrupted */ - for (Record r : paragraphs.get(0)._records) { + for (Record r : paragraphs.get(0).getRecords()) { if (r instanceof TextSpecInfoAtom) { ((TextSpecInfoAtom)r).setParentSize(rawText.length()+1); break; } } + + if (_txtbox instanceof EscherTextboxWrapper) { + try { + ((EscherTextboxWrapper)_txtbox).writeOut(null); + } catch (IOException e) { + throw new RuntimeException("failed dummy write", e); + } + } } /** @@ -817,7 +835,7 @@ public final class HSLFTextParagraph implements TextParagraph { if (!isFirst) { TextPropCollection tpc = htp.getParagraphStyle(); HSLFTextParagraph prevHtp = htp; - htp = new HSLFTextParagraph(htp._headerAtom, htp._byteAtom, htp._charAtom, htp._styleAtom); + htp = new HSLFTextParagraph(htp._headerAtom, htp._byteAtom, htp._charAtom); htp.getParagraphStyle().copy(tpc); htp.setParentShape(prevHtp.getParentShape()); htp.setShapeId(prevHtp.getShapeId()); @@ -930,24 +948,14 @@ public final class HSLFTextParagraph implements TextParagraph { /** * For a given PPDrawing, grab all the TextRuns */ - public static List> findTextParagraphs(PPDrawing ppdrawing) { + public static List> findTextParagraphs(PPDrawing ppdrawing, HSLFSheet sheet) { List> runsV = new ArrayList>(); for (EscherTextboxWrapper wrapper : ppdrawing.getTextboxWrappers()) { - runsV.addAll(findTextParagraphs(wrapper)); + runsV.add(findTextParagraphs(wrapper, sheet)); } return runsV; } - /** - * Scans through the supplied record array, looking for - * a TextHeaderAtom followed by one of a TextBytesAtom or - * a TextCharsAtom. Builds up TextRuns from these - * - * @param records the records to build from - * @param found vector to add any found to - */ - protected static List> findTextParagraphs(final Record[] records) { - return findTextParagraphs(records, null); - } + /** * Scans through the supplied record array, looking for * a TextHeaderAtom followed by one of a TextBytesAtom or @@ -955,14 +963,73 @@ public final class HSLFTextParagraph implements TextParagraph { * * @param wrapper an EscherTextboxWrapper */ - protected static List> findTextParagraphs(EscherTextboxWrapper wrapper) { + protected static List findTextParagraphs(EscherTextboxWrapper wrapper, HSLFSheet sheet) { // propagate parents to parent-aware records RecordContainer.handleParentAwareRecords(wrapper); int shapeId = wrapper.getShapeId(); - List> rv = findTextParagraphs(wrapper.getChildRecords(), wrapper.getStyleTextProp9Atom()); - for (List htpList : rv) { - for (HSLFTextParagraph htp : htpList) { + List rv = null; + + OutlineTextRefAtom ota = (OutlineTextRefAtom)wrapper.findFirstOfType(OutlineTextRefAtom.typeID); + if (ota != null) { + // if we are based on an outline, there are no further records to be parsed from the wrapper + if (sheet == null) { + throw new RuntimeException("Outline atom reference can't be solved without a sheet record"); + } + + List> sheetRuns = sheet.getTextParagraphs(); + assert(sheetRuns != null); + + int idx = ota.getTextIndex(); + for (List r : sheetRuns) { + if (r.isEmpty()) continue; + int ridx = r.get(0).getIndex(); + if (ridx > idx) break; + if (ridx == idx) { + if (rv == null) { + rv = r; + } else { + // create a new container + // TODO: ... is this case really happening? + rv = new ArrayList(rv); + rv.addAll(r); + } + } + } + if(rv == null || rv.isEmpty()) { + logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx); + } + } else { + if (sheet != null) { + // check sheet runs first, so we get exactly the same paragraph list + List> sheetRuns = sheet.getTextParagraphs(); + assert(sheetRuns != null); + + for (List paras : sheetRuns) { + if (!paras.isEmpty() && paras.get(0)._headerAtom.getParentRecord() == wrapper) { + rv = paras; + break; + } + } + } + + if (rv == null) { + // if we haven't found the wrapper in the sheet runs, create a new paragraph list from its record + List> rvl = findTextParagraphs(wrapper.getChildRecords()); + switch (rvl.size()) { + case 0: break; // nothing found + case 1: rv = rvl.get(0); break; // normal case + default: + throw new RuntimeException("TextBox contains more than one list of paragraphs."); + } + } + } + + if (rv != null) { + StyleTextProp9Atom styleTextProp9Atom = wrapper.getStyleTextProp9Atom(); + + for (HSLFTextParagraph htp : rv) { htp.setShapeId(shapeId); + htp.setStyleTextProp9Atom(styleTextProp9Atom); } } return rv; @@ -974,77 +1041,59 @@ public final class HSLFTextParagraph implements TextParagraph { * a TextCharsAtom. Builds up TextRuns from these * * @param records the records to build from - * @param styleTextProp9Atom an optional StyleTextProp9Atom with numbered lists info */ - protected static List> findTextParagraphs(Record[] records, StyleTextProp9Atom styleTextProp9Atom) { + protected static List> findTextParagraphs(Record[] records) { List> paragraphCollection = new ArrayList>(); - if (records == null) { - throw new NullPointerException("records need to be filled."); - } - - int recordIdx; - for (recordIdx = 0; recordIdx < records.length; recordIdx++) { - if (records[recordIdx] instanceof TextHeaderAtom) break; - } - - if (recordIdx == records.length) { - logger.log(POILogger.INFO, "No text records found."); - return paragraphCollection; - } - - for (int slwtIndex = 0; recordIdx < records.length; slwtIndex++) { - List paragraphs = new ArrayList(); - paragraphCollection.add(paragraphs); - - TextHeaderAtom header = (TextHeaderAtom)records[recordIdx++]; + int[] recordIdx = {0}; + + for (int slwtIndex = 0; recordIdx[0] < records.length; slwtIndex++) { + TextHeaderAtom header = null; TextBytesAtom tbytes = null; TextCharsAtom tchars = null; TextRulerAtom ruler = null; MasterTextPropAtom indents = null; - List otherRecordList = new ArrayList(); - - for (; recordIdx < records.length; recordIdx++) { - Record r = records[recordIdx]; + for (Record r : getRecords(records, recordIdx, null)) { long rt = r.getRecordType(); - if (RecordTypes.TextHeaderAtom.typeID == rt) break; - else if (RecordTypes.TextBytesAtom.typeID == rt) tbytes = (TextBytesAtom)r; - else if (RecordTypes.TextCharsAtom.typeID == rt) tchars = (TextCharsAtom)r; - // don't search for RecordTypes.StyleTextPropAtom.typeID here ... see findStyleAtomPresent below - else if (RecordTypes.TextRulerAtom.typeID == rt) ruler = (TextRulerAtom)r; - else if (RecordTypes.MasterTextPropAtom.typeID == rt) { + if (RecordTypes.TextHeaderAtom.typeID == rt) { + header = (TextHeaderAtom)r; + } else if (RecordTypes.TextBytesAtom.typeID == rt) { + tbytes = (TextBytesAtom)r; + } else if (RecordTypes.TextCharsAtom.typeID == rt) { + tchars = (TextCharsAtom)r; + } else if (RecordTypes.TextRulerAtom.typeID == rt) { + ruler = (TextRulerAtom)r; + } else if (RecordTypes.MasterTextPropAtom.typeID == rt) { indents = (MasterTextPropAtom)r; - otherRecordList.add(indents); - } else { - otherRecordList.add(r); } + // don't search for RecordTypes.StyleTextPropAtom.typeID here ... see findStyleAtomPresent below } - assert(header != null); + if (header == null) break; + if (header.getParentRecord() instanceof SlideListWithText) { // runs found in PPDrawing are not linked with SlideListWithTexts header.setIndex(slwtIndex); } - Record otherRecords[] = otherRecordList.toArray(new Record[otherRecordList.size()]); - if (tbytes == null && tchars == null) { tbytes = new TextBytesAtom(); - // header.getParentRecord().addChildAfter(tbytes, header); + // don't add record yet - set it in storeText logger.log(POILogger.INFO, "bytes nor chars atom doesn't exist. Creating dummy record for later saving."); } String rawText = (tchars != null) ? tchars.getText() : tbytes.getText(); StyleTextPropAtom styles = findStyleAtomPresent(header, rawText.length()); + List paragraphs = new ArrayList(); + paragraphCollection.add(paragraphs); + // split, but keep delimiter for (String para : rawText.split("(?<=\r)")) { - HSLFTextParagraph tpara = new HSLFTextParagraph(header, tbytes, tchars, styles); + HSLFTextParagraph tpara = new HSLFTextParagraph(header, tbytes, tchars); paragraphs.add(tpara); - tpara.setStyleTextProp9Atom(styleTextProp9Atom); tpara._ruler = ruler; - tpara._records = otherRecords; tpara.getParagraphStyle().updateTextSize(para.length()); HSLFTextRun trun = new HSLFTextRun(tpara); @@ -1059,6 +1108,10 @@ public final class HSLFTextParagraph implements TextParagraph { } } + if (paragraphCollection.isEmpty()) { + logger.log(POILogger.DEBUG, "No text records found."); + } + return paragraphCollection; } @@ -1166,9 +1219,8 @@ public final class HSLFTextParagraph implements TextParagraph { TextPropCollection charStyle = sta.addCharacterTextPropCollection(1); wrapper.appendChildRecord(sta); - HSLFTextParagraph htp = new HSLFTextParagraph(tha, tba, null, sta); + HSLFTextParagraph htp = new HSLFTextParagraph(tha, tba, null); htp.setParagraphStyle(paraStyle); - htp._records = new Record[0]; HSLFTextRun htr = new HSLFTextRun(htp); htr.setCharacterStyle(charStyle); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index 0fb443b604..1e1dca888f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -92,7 +92,7 @@ public final class HSLFTextRun implements TextRun { * Change the text */ public void setText(String text) { - _runText = text; + _runText = HSLFTextParagraph.toInternalString(text); } // --------------- Internal helpers on rich text properties ------- diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java index e05ae79a60..60e9eb84e2 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java @@ -159,10 +159,29 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape } protected EscherTextboxWrapper getEscherTextboxWrapper(){ - if(_txtbox == null){ - EscherTextboxRecord textRecord = getEscherChild(EscherTextboxRecord.RECORD_ID); - if(textRecord != null) _txtbox = new EscherTextboxWrapper(textRecord); + if(_txtbox != null) return _txtbox; + + EscherTextboxRecord textRecord = getEscherChild(EscherTextboxRecord.RECORD_ID); + if (textRecord == null) return null; + + HSLFSheet sheet = getSheet(); + if (sheet != null) { + PPDrawing drawing = sheet.getPPDrawing(); + if (drawing != null) { + EscherTextboxWrapper wrappers[] = drawing.getTextboxWrappers(); + if (wrappers != null) { + for (EscherTextboxWrapper w : wrappers) { + // check for object identity + if (textRecord == w.getEscherRecord()) { + _txtbox = w; + return _txtbox; + } + } + } + } } + + _txtbox = new EscherTextboxWrapper(textRecord); return _txtbox; } @@ -507,13 +526,17 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape _paragraphs.addAll(HSLFTextParagraph.createEmptyParagraph()); _txtbox = _paragraphs.get(0).getTextboxWrapper(); } else { - initParagraphsFromSheetRecords(); - if (_paragraphs.isEmpty()) { - List> llhtp = HSLFTextParagraph.findTextParagraphs(_txtbox); - if (!llhtp.isEmpty()) { - _paragraphs.addAll(llhtp.get(0)); - } + _paragraphs = HSLFTextParagraph.findTextParagraphs(_txtbox, getSheet()); + if (_paragraphs == null || _paragraphs.isEmpty()) { + throw new RuntimeException("TextRecord didn't contained any text lines"); } +// initParagraphsFromSheetRecords(); +// if (_paragraphs.isEmpty()) { +// List> llhtp = HSLFTextParagraph.findTextParagraphs(_txtbox); +// if (!llhtp.isEmpty()) { +// _paragraphs.addAll(llhtp.get(0)); +// } +// } } for (HSLFTextParagraph p : _paragraphs) { @@ -536,57 +559,47 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape } } - protected void initParagraphsFromSheetRecords(){ - EscherTextboxWrapper txtbox = getEscherTextboxWrapper(); - HSLFSheet sheet = getSheet(); - - if(sheet == null || txtbox == null) return; - - OutlineTextRefAtom ota = null; - - Record[] child = txtbox.getChildRecords(); - for (int i = 0; i < child.length; i++) { - if (child[i] instanceof OutlineTextRefAtom) { - ota = (OutlineTextRefAtom)child[i]; - break; - } - } - - List> sheetRuns = _sheet.getTextParagraphs(); - _paragraphs.clear(); - if (sheetRuns != null) { - if (ota != null) { - int idx = ota.getTextIndex(); - for (List r : sheetRuns) { - if (r.isEmpty()) continue; - int ridx = r.get(0).getIndex(); - if (ridx > idx) break; - if (ridx == idx) _paragraphs.addAll(r); - } - if(_paragraphs.isEmpty()) { - logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx); - } - } else { - int shapeId = getShapeId(); - for (List r : sheetRuns) { - if (r.isEmpty()) continue; - if (r.get(0).getShapeId() == shapeId) _paragraphs.addAll(r); - } - } - } - - // ensure the same references child records of TextRun - // TODO: check the purpose of this ... -// if(_txtrun != null) { -// for (int i = 0; i < child.length; i++) { -// for (Record r : _txtrun.getRecords()) { -// if (child[i].getRecordType() == r.getRecordType()) { -// child[i] = r; -// } -// } +// protected void initParagraphsFromSheetRecords(){ +// EscherTextboxWrapper txtbox = getEscherTextboxWrapper(); +// HSLFSheet sheet = getSheet(); +// +// if (sheet == null || txtbox == null) return; +// List> sheetRuns = _sheet.getTextParagraphs(); +// if (sheetRuns == null) return; +// +// _paragraphs.clear(); +// OutlineTextRefAtom ota = (OutlineTextRefAtom)txtbox.findFirstOfType(OutlineTextRefAtom.typeID); +// +// if (ota != null) { +// int idx = ota.getTextIndex(); +// for (List r : sheetRuns) { +// if (r.isEmpty()) continue; +// int ridx = r.get(0).getIndex(); +// if (ridx > idx) break; +// if (ridx == idx) _paragraphs.addAll(r); +// } +// if(_paragraphs.isEmpty()) { +// logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx); +// } +// } else { +// int shapeId = getShapeId(); +// for (List r : sheetRuns) { +// if (r.isEmpty()) continue; +// if (r.get(0).getShapeId() == shapeId) _paragraphs.addAll(r); // } // } - } +// +// // ensure the same references child records of TextRun - see #48916 +//// if(_txtrun != null) { +//// for (int i = 0; i < child.length; i++) { +//// for (Record r : _txtrun.getRecords()) { +//// if (child[i].getRecordType() == r.getRecordType()) { +//// child[i] = r; +//// } +//// } +//// } +//// } +// } /* // 0xB acts like cariage return in page titles and like blank in the others @@ -740,7 +753,8 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape * Also updates the styles to the correct text length. */ protected void storeText() { - HSLFTextParagraph.storeText(_paragraphs); + List paras = getTextParagraphs(); + HSLFTextParagraph.storeText(paras); } // Accesser methods follow diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java index fc6131d952..b1e38d977b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java @@ -29,7 +29,7 @@ import org.apache.poi.hslf.record.SlideAtom; * @author Yegor Kozlov */ public final class HSLFTitleMaster extends HSLFMasterSheet { - private final List> _runs = new ArrayList>(); + private final List> _paragraphs = new ArrayList>(); /** * Constructs a TitleMaster @@ -38,14 +38,16 @@ public final class HSLFTitleMaster extends HSLFMasterSheet { public HSLFTitleMaster(org.apache.poi.hslf.record.Slide record, int sheetNo) { super(record, sheetNo); - _runs.addAll(HSLFTextParagraph.findTextParagraphs(getPPDrawing())); + for (List l : HSLFTextParagraph.findTextParagraphs(getPPDrawing(), this)) { + if (!_paragraphs.contains(l)) _paragraphs.add(l); + } } /** * Returns an array of all the TextRuns found */ public List> getTextParagraphs() { - return _runs; + return _paragraphs; } /** diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java index df4d635a69..6eb30eb707 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java @@ -69,8 +69,8 @@ public class DrawFactory { return getDrawable((FreeformShape>)shape); } else if (shape instanceof TextShape) { return getDrawable((TextShape>)shape); - } else if (shape instanceof ShapeGroup) { - return getDrawable((ShapeGroup)shape); + } else if (shape instanceof GroupShape) { + return getDrawable((GroupShape)shape); } else if (shape instanceof PictureShape) { return getDrawable((PictureShape)shape); } else if (shape instanceof Background) { @@ -110,8 +110,8 @@ public class DrawFactory { return new DrawTextShape(shape); } - public > DrawShapeGroup getDrawable(T shape) { - return new DrawShapeGroup(shape); + public > DrawGroupShape getDrawable(T shape) { + return new DrawGroupShape(shape); } public DrawPictureShape getDrawable(T shape) { diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawGroupShape.java similarity index 87% rename from src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java rename to src/scratchpad/src/org/apache/poi/sl/draw/DrawGroupShape.java index ceda9280c4..31f2496b32 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShapeGroup.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawGroupShape.java @@ -7,9 +7,9 @@ import java.awt.geom.Rectangle2D; import org.apache.poi.sl.usermodel.*; -public class DrawShapeGroup> extends DrawShape implements Drawable { +public class DrawGroupShape> extends DrawShape implements Drawable { - public DrawShapeGroup(T shape) { + public DrawGroupShape(T shape) { super(shape); } @@ -31,6 +31,7 @@ public class DrawShapeGroup> extends DrawS tx.translate(-interior.getX(), -interior.getY()); DrawFactory drawFact = DrawFactory.getInstance(graphics); + AffineTransform at2 = graphics.getTransform(); for (Shape child : shape) { // remember the initial transform and restore it after we are done with the drawing @@ -46,7 +47,7 @@ public class DrawShapeGroup> extends DrawS graphics.setRenderingHint(Drawable.GRESTORE, true); } + graphics.setTransform(at2); graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, tx0); - } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java index 6cb60c9b01..2bebbfa892 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java @@ -25,11 +25,10 @@ public class DrawShape implements Drawable { if (!(shape instanceof PlaceableShape)) return; PlaceableShape ps = (PlaceableShape)shape; - Rectangle2D anchor = ps.getAnchor(); AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM); - if(tx != null) { - anchor = tx.createTransformedShape(anchor).getBounds2D(); - } + final Rectangle2D anchor = (tx != null) + ? tx.createTransformedShape(ps.getAnchor()).getBounds2D() + : ps.getAnchor(); // rotation double rotation = ps.getRotation(); @@ -39,7 +38,8 @@ public class DrawShape implements Drawable { double centerY = anchor.getCenterY(); // normalize rotation - rotation = (360.+(rotation%360.))%360.; + rotation %= 360.; + if (rotation < 0) rotation += 360.; int quadrant = (((int)rotation+45)/90)%4; double scaleX = 1.0, scaleY = 1.0; @@ -53,26 +53,43 @@ public class DrawShape implements Drawable { // think of it, as if you paint the shape on a canvas. First you rotate the canvas, which might // be already (differently) scaled, so you can paint the shape in its default orientation // and later on, turn it around again to compare it with its original size ... - AffineTransform txg = new AffineTransform(); // graphics coordinate space - AffineTransform txs = new AffineTransform(tx); // shape coordinate space + + // graphics coordinate space + AffineTransform txg = new AffineTransform(); txg.translate(centerX, centerY); - txg.rotate(Math.toRadians(quadrant*90)); + txg.rotate(Math.toRadians(90)); txg.translate(-centerX, -centerY); - txs.translate(centerX, centerY); - txs.rotate(Math.toRadians(-quadrant*90)); - txs.translate(-centerX, -centerY); - txg.concatenate(txs); - Rectangle2D anchor2 = txg.createTransformedShape(ps.getAnchor()).getBounds2D(); + + boolean oldVariant = true; + Rectangle2D anchor2; + + if (oldVariant) { + // shape coordinate space + AffineTransform txs = new AffineTransform(tx); + txs.translate(centerX, centerY); + txs.rotate(Math.toRadians(90)); + txs.translate(-centerX, -centerY); + txg.concatenate(txs); + anchor2 = txg.createTransformedShape(ps.getAnchor()).getBounds2D(); + } else { + anchor2 = txg.createTransformedShape(anchor).getBounds2D(); + } + scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth(); scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight(); + + graphics.translate(centerX, centerY); + graphics.rotate(Math.toRadians(rotation-quadrant*90.)); + graphics.scale(scaleX, scaleY); + graphics.rotate(Math.toRadians(quadrant*90)); + graphics.translate(-centerX, -centerY); + } else { + graphics.translate(centerX, centerY); + graphics.rotate(Math.toRadians(rotation)); + graphics.scale(scaleX, scaleY); + graphics.translate(-centerX, -centerY); } - // transformation is applied reversed ... - graphics.translate(centerX, centerY); - graphics.rotate(Math.toRadians(rotation-quadrant*90.)); - graphics.scale(scaleX, scaleY); - graphics.rotate(Math.toRadians(quadrant*90)); - graphics.translate(-centerX, -centerY); } //flip horizontal diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java b/src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java index 8789082afd..54128b82c6 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java @@ -32,6 +32,23 @@ public interface Drawable { public boolean isCompatibleValue(Object val) { return true; } + + public String toString() { + switch (intKey()) { + case 1: return "DRAW_FACTORY"; + case 2: return "GROUP_TRANSFORM"; + case 3: return "IMAGE_RENDERER"; + case 4: return "TEXT_RENDERING_MODE"; + case 5: return "GRADIENT_SHAPE"; + case 6: return "PRESET_GEOMETRY_CACHE"; + case 7: return "FONT_HANDLER"; + case 8: return "FONT_FALLBACK"; + case 9: return "FONT_MAP"; + case 10: return "GSAVE"; + case 11: return "GRESTORE"; + default: return "UNKNOWN_ID "+intKey(); + } + } } /** diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java b/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java index 9704c2c0a7..f4a298cdb6 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java @@ -30,18 +30,35 @@ import javax.imageio.ImageIO; /** * For now this class renders only images supported by the javax.imageio.ImageIO * framework. Subclasses can override this class to support other formats, for - * example, Use Apache batik to render WMF: + * example, use Apache Batik to render WMF, PICT can be rendered using Apple QuickTime API for Java: * *
      * 
      * public class MyImageRendener extends ImageRendener {
    + *     InputStream data;
      *
      *     public boolean drawImage(Graphics2D graphics,Rectangle2D anchor,Insets clip) {
      *         // draw image
    + *       DataInputStream is = new DataInputStream(data);
    + *       org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore wmfStore =
    + *               new org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore();
    + *       try {
    + *           wmfStore.read(is);
    + *       } catch (IOException e){
    + *           return;
    + *       }
    + *
    + *       float scale = (float)anchor.width/wmfStore.getWidthPixels();
    + *
    + *       org.apache.batik.transcoder.wmf.tosvg.WMFPainter painter =
    + *               new org.apache.batik.transcoder.wmf.tosvg.WMFPainter(wmfStore, 0, 0, scale);
    + *       graphics.translate(anchor.x, anchor.y);
    + *       painter.paint(graphics);
      *     }
      *
      *     public void loadImage(InputStream data, String contentType) throws IOException {
      *         if ("image/wmf".equals(contentType)) {
    + *             this.data = data;
      *             // use Apache Batik to handle WMF
      *         } else {
      *             super.loadImage(data,contentType);
    @@ -147,12 +164,14 @@ public class ImageRenderer {
             int iw = img.getWidth();
             int ih = img.getHeight();
     
    +        
             double cw = (100000-clip.left-clip.right) / 100000.0;
             double ch = (100000-clip.top-clip.bottom) / 100000.0;
             double sx = anchor.getWidth()/(iw*cw);
             double sy = anchor.getHeight()/(ih*ch);
             double tx = anchor.getX()-(iw*sx*clip.left/100000.0);
             double ty = anchor.getY()-(ih*sy*clip.top/100000.0);
    +
             AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ;
     
             Shape clipOld = graphics.getClip();
    diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/GroupShape.java
    similarity index 68%
    rename from src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java
    rename to src/scratchpad/src/org/apache/poi/sl/usermodel/GroupShape.java
    index 7bd940c36c..d71bb253fe 100644
    --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeGroup.java
    +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/GroupShape.java
    @@ -19,6 +19,21 @@ package org.apache.poi.sl.usermodel;
     
     import java.awt.geom.Rectangle2D;
     
    -public interface ShapeGroup extends Shape, ShapeContainer, PlaceableShape {
    +public interface GroupShape extends Shape, ShapeContainer, PlaceableShape {
    +
    +    /**
    +     * Gets the coordinate space of this group.  All children are constrained
    +     * to these coordinates.
    +     *
    +     * @param anchor the coordinate space of this group
    +     */
         Rectangle2D getInteriorAnchor();
    +    
    +    /**
    +     * Sets the coordinate space of this group.  All children are constrained
    +     * to these coordinates.
    +     *
    +     * @param anchor the coordinate space of this group
    +     */
    +    void setInteriorAnchor(Rectangle2D anchor);
     }
    diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureShape.java
    index 970f04353c..a2c0824e0c 100644
    --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureShape.java
    +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/PictureShape.java
    @@ -20,9 +20,17 @@ package org.apache.poi.sl.usermodel;
     import java.awt.Insets;
     
     public interface PictureShape extends SimpleShape {
    -	PictureData getPictureData();
    +    /**
    +     * Returns the picture data for this picture.
    +     *
    +     * @return the picture data for this picture.
    +     */
    +    PictureData getPictureData();
     
     	/**
    +	 * Returns the clipping values as percent ratio relatively to the image size.
    +	 * The clipping are returned as insets converted/scaled to 100000 (=100%).
    +	 * 
     	 * @return the clipping rectangle, which is given in percent in relation to the image width/height
     	 */
     	Insets getClipping();
    diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java
    index 6f4ba0ac67..f94b7727a7 100644
    --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java
    +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Sheet.java
    @@ -17,6 +17,8 @@
     
     package org.apache.poi.sl.usermodel;
     
    +import java.awt.Graphics2D;
    +
     
     /**
      * Common parent of Slides, Notes and Masters
    @@ -34,4 +36,11 @@ public interface Sheet extends ShapeConta
     	MasterSheet getMasterSheet();
     
     	Background getBackground();
    +	
    +	/**
    +	 * Convenience method to draw a sheet to a graphics context
    +	 *
    +	 * @param graphics
    +	 */
    +	void draw(Graphics2D graphics);
     }
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java
    index ca9e6c9a2f..14301af2ba 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java
    @@ -29,7 +29,6 @@ import org.junit.runners.Suite;
         TestFreeform.class,
         TestHeadersFooters.class,
         TestHyperlink.class,
    -    TestImagePainter.class,
         TestLine.class,
         TestMovieShape.class,
         TestOleEmbedding.class,
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java
    deleted file mode 100644
    index 963beeefbe..0000000000
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -/* ====================================================================
    -   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.hslf.model;
    -
    -import java.awt.Graphics2D;
    -
    -import junit.framework.TestCase;
    -
    -import org.apache.poi.hslf.blip.BitmapPainter;
    -import org.apache.poi.hslf.blip.ImagePainter;
    -import org.apache.poi.hslf.usermodel.HSLFPictureData;
    -import org.apache.poi.hslf.usermodel.HSLFPictureShape;
    -
    -/**
    - * Test Picture shape.
    - *
    - * @author Yegor Kozlov
    - */
    -public final class TestImagePainter extends TestCase {
    -
    -    private static class CustomImagePainter implements ImagePainter {
    -        public CustomImagePainter() {
    -            // no fields to initialise
    -        }
    -        public void paint(Graphics2D graphics, HSLFPictureData pict, HSLFPictureShape parent){
    -            //do noting
    -        }
    -    }
    -
    -    public void testImagePainter() {
    -
    -        ImagePainter pntr = HSLFPictureData.getImagePainter(HSLFPictureShape.PNG);
    -        assertTrue(HSLFPictureData.getImagePainter(HSLFPictureShape.PNG) instanceof BitmapPainter);
    -        assertTrue(HSLFPictureData.getImagePainter(HSLFPictureShape.JPEG) instanceof BitmapPainter);
    -        assertTrue(HSLFPictureData.getImagePainter(HSLFPictureShape.DIB) instanceof BitmapPainter);
    -
    -        HSLFPictureData.setImagePainter(HSLFPictureShape.WMF, new CustomImagePainter());
    -        assertTrue(HSLFPictureData.getImagePainter(HSLFPictureShape.WMF) instanceof CustomImagePainter);
    -    }
    -}
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java
    index 0c5fcb69bb..3337d58c36 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java
    @@ -43,15 +43,15 @@ public final class TestTable {
     
             HSLFSlide slide = ppt.createSlide();
     
    -        Table tbl = new Table(2, 5);
    +        HSLFTable tbl = new HSLFTable(2, 5);
             slide.addShape(tbl);
     
    -        TableCell cell = tbl.getCell(0, 0);
    +        HSLFTableCell cell = tbl.getCell(0, 0);
             //table cells have type=TextHeaderAtom.OTHER_TYPE, see bug #46033
             assertEquals(TextHeaderAtom.OTHER_TYPE, cell.getTextParagraphs().get(0).getRunType());
     
    -        assertTrue(slide.getShapes().get(0) instanceof Table);
    -        Table tbl2 = (Table)slide.getShapes().get(0);
    +        assertTrue(slide.getShapes().get(0) instanceof HSLFTable);
    +        HSLFTable tbl2 = (HSLFTable)slide.getShapes().get(0);
             assertEquals(tbl.getNumberOfColumns(), tbl2.getNumberOfColumns());
             assertEquals(tbl.getNumberOfRows(), tbl2.getNumberOfRows());
     
    @@ -61,8 +61,8 @@ public final class TestTable {
     
             ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
             slide = ppt.getSlides().get(0);
    -        assertTrue(slide.getShapes().get(0) instanceof Table);
    -        Table tbl3 = (Table)slide.getShapes().get(0);
    +        assertTrue(slide.getShapes().get(0) instanceof HSLFTable);
    +        HSLFTable tbl3 = (HSLFTable)slide.getShapes().get(0);
             assertEquals(tbl.getNumberOfColumns(), tbl3.getNumberOfColumns());
             assertEquals(tbl.getNumberOfRows(), tbl3.getNumberOfRows());
         }
    @@ -75,7 +75,7 @@ public final class TestTable {
             HSLFSlideShow ppt = new HSLFSlideShow();
             HSLFSlide slide = ppt.createSlide();
             List shapes;
    -        Table tbl1 = new Table(1, 5);
    +        HSLFTable tbl1 = new HSLFTable(1, 5);
             assertEquals(5, tbl1.getNumberOfColumns());
             assertEquals(1, tbl1.getNumberOfRows());
             slide.addShape(tbl1);
    @@ -83,7 +83,7 @@ public final class TestTable {
             shapes = slide.getShapes();
             assertEquals(1, shapes.size());
     
    -        Table tbl2 = (Table)shapes.get(0);
    +        HSLFTable tbl2 = (HSLFTable)shapes.get(0);
             assertSame(tbl1.getSpContainer(), tbl2.getSpContainer());
     
             assertEquals(tbl1.getNumberOfColumns(), tbl2.getNumberOfColumns());
    @@ -93,13 +93,13 @@ public final class TestTable {
         @Test
         public void testIllegalCOnstruction(){
             try {
    -            new Table(0, 5);
    +            new HSLFTable(0, 5);
                 fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1");
             } catch (IllegalArgumentException e){
     
             }
             try {
    -            new Table(5, 0);
    +            new HSLFTable(5, 0);
                 fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1");
             } catch (IllegalArgumentException e){
     
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java
    index c0634f05fc..800df623e3 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java
    @@ -281,7 +281,7 @@ public final class TestAddingSlides extends TestCase {
             assertEquals(14, doc.getNotesSlideListWithText().getSlideAtomsSets().length);
     
             //remove all slides, corresponding notes should be removed too
    -        for (int i = 0; i < slides.size(); i++) {
    +        for (int i = slides.size(); i > 0; i--) {
                 ppt.removeSlide(0);
             }
             assertEquals(0, ppt.getSlides().size());
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
    index 12e3ff6c30..b7dba80b82 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
    @@ -18,14 +18,10 @@
     package org.apache.poi.hslf.usermodel;
     
     import static org.junit.Assert.*;
    -import static org.junit.Assert.assertNotNull;
    -import static org.junit.Assert.assertTrue;
     
    -import java.io.ByteArrayOutputStream;
    -import java.io.File;
    -import java.io.FileInputStream;
    -import java.io.IOException;
    -import java.io.InputStream;
    +import java.awt.Color;
    +import java.awt.Rectangle;
    +import java.io.*;
     import java.util.ArrayList;
     import java.util.Date;
     import java.util.HashMap;
    @@ -44,14 +40,14 @@ import org.apache.poi.ddf.EscherProperties;
     import org.apache.poi.hslf.HSLFTestDataSamples;
     import org.apache.poi.hslf.exceptions.OldPowerPointFormatException;
     import org.apache.poi.hslf.model.*;
    -import org.apache.poi.hslf.record.Document;
    -import org.apache.poi.hslf.record.Record;
    -import org.apache.poi.hslf.record.SlideListWithText;
    +import org.apache.poi.hslf.model.textproperties.TextPropCollection;
    +import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType;
    +import org.apache.poi.hslf.record.*;
     import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
    -import org.apache.poi.hslf.record.TextHeaderAtom;
    -import org.apache.poi.util.LittleEndian;
    -import org.apache.poi.util.StringUtil;
    -import org.apache.poi.util.Units;
    +import org.apache.poi.poifs.filesystem.DocumentEntry;
    +import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    +import org.apache.poi.util.*;
    +import org.junit.Ignore;
     import org.junit.Test;
     
     /**
    @@ -527,7 +523,7 @@ public final class TestBugs {
             for (List tr : _slides.get(0).getTextParagraphs()) {
                 if (! tr.get(0).isDrawingBased()) str++;
             }
    -        assertEquals(1, str);
    +        assertEquals(2, str);
         }
         
         @Test
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java
    index 3638bad82e..cc78643a8b 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java
    @@ -17,29 +17,22 @@
     
     package org.apache.poi.hslf.usermodel;
     
    -import static org.junit.Assert.assertTrue;
    +import static org.junit.Assert.*;
     import static org.junit.Assume.assumeTrue;
     
    -import java.awt.Color;
    -import java.awt.Dimension;
    -import java.awt.Font;
    -import java.awt.Graphics2D;
    -import java.awt.GraphicsEnvironment;
    -import java.awt.RenderingHints;
    +import java.awt.*;
     import java.awt.geom.AffineTransform;
     import java.awt.geom.Rectangle2D;
     import java.awt.image.BufferedImage;
     import java.awt.image.DataBufferByte;
     import java.io.File;
     import java.io.InputStream;
    -import java.util.Arrays;
    -import java.util.HashMap;
    -import java.util.Map;
    +import java.util.*;
     
     import javax.imageio.ImageIO;
     
     import org.apache.poi.POIDataSamples;
    -import org.apache.poi.hslf.model.TextPainter;
    +import org.apache.poi.sl.draw.Drawable;
     import org.apache.poi.util.TempFile;
     import org.junit.Ignore;
     import org.junit.Test;
    @@ -50,7 +43,7 @@ import org.junit.Test;
     public class TestFontRendering {
         private static POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
     
    -    @Ignore("This fails on some systems because fonts are rendered slightly different")
    +    // @Ignore2("This fails on some systems because fonts are rendered slightly different")
         @Test
         public void bug55902mixedFontWithChineseCharacters() throws Exception {
             // font files need to be downloaded first via
    @@ -86,7 +79,7 @@ public class TestFontRendering {
             
             Dimension pgsize = ss.getPageSize();
             
    -        HSLFSlide slide = ss.getSlides()[0];
    +        HSLFSlide slide = ss.getSlides().get(0);
             
             // render it
             double zoom = 1;
    @@ -95,8 +88,8 @@ public class TestFontRendering {
             
             BufferedImage imgActual = new BufferedImage((int)Math.ceil(pgsize.width*zoom), (int)Math.ceil(pgsize.height*zoom), BufferedImage.TYPE_3BYTE_BGR);
             Graphics2D graphics = imgActual.createGraphics();
    -        graphics.setRenderingHint(TextPainter.KEY_FONTFALLBACK, fallbackMap);
    -        graphics.setRenderingHint(TextPainter.KEY_FONTMAP, fontMap);
    +        graphics.setRenderingHint(Drawable.FONT_FALLBACK, fallbackMap);
    +        graphics.setRenderingHint(Drawable.FONT_MAP, fontMap);
             graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
             graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
             graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    @@ -116,7 +109,7 @@ public class TestFontRendering {
             if(!Arrays.equals(expectedData, actualData)) {
                 ImageIO.write(imgActual, "PNG", TempFile.createTempFile("TestFontRendering", ".png"));
             }
    -        assertTrue("Expected to have matching raster-arrays, but found differences, size " + expectedData.length + " and " + actualData.length, 
    -                Arrays.equals(expectedData, actualData));
    +        
    +        assertArrayEquals("Expected to have matching raster-arrays, but found differences", expectedData, actualData);
         }
     }
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java
    index ab358f65a0..5ad2bac1c4 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java
    @@ -79,10 +79,14 @@ public final class TestNumberedList3 {
     		assertEquals(Short.valueOf((short)1), autoNumbers[0].getAutoNumberStartNumber());//Default value = 1 will be used 
     		assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme());
     		
    -		final List textProps = textParass.get(1).get(0).getStyleTextPropAtom().getCharacterStyles();
    -		assertEquals(1, textProps.size());
    -		final TextPropCollection textProp = textProps.get(0);
    -		assertEquals(67, textProp.getCharactersCovered());
    +		int chCovered = 0;
    +		for (HSLFTextParagraph htp : textParass.get(1)) {
    +    		for (HSLFTextRun htr : htp.getTextRuns()) {
    +    		    TextPropCollection textProp = htr.getCharacterStyle();
    +    		    chCovered += textProp.getCharactersCovered();
    +    		}
    +		}
    +		assertEquals(67, chCovered);
     		
     		assertTrue(textParass.get(0).get(0).isBullet());
     		
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java
    index 2410d6ca65..8e5652fb81 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java
    @@ -17,18 +17,11 @@
     
     package org.apache.poi.hslf.usermodel;
     
    -import static org.junit.Assert.assertEquals;
    -import static org.junit.Assert.assertNotNull;
    -import static org.junit.Assert.assertNull;
    -import static org.junit.Assert.assertSame;
    +import static org.junit.Assert.*;
     
    -import java.awt.Dimension;
    -import java.awt.Graphics2D;
    -import java.awt.Rectangle;
    +import java.awt.*;
     import java.awt.image.BufferedImage;
    -import java.io.ByteArrayInputStream;
    -import java.io.File;
    -import java.io.InputStream;
    +import java.io.*;
     import java.util.HashMap;
     import java.util.Map;
     
    @@ -36,8 +29,12 @@ import javax.imageio.ImageIO;
     
     import org.apache.poi.POIDataSamples;
     import org.apache.poi.ddf.EscherBSERecord;
    -import org.apache.poi.hslf.usermodel.*;
    +import org.apache.poi.hssf.usermodel.DummyGraphics2d;
    +import org.apache.poi.sl.draw.Drawable;
    +import org.apache.poi.sl.usermodel.Slide;
    +import org.apache.poi.sl.usermodel.SlideShow;
     import org.apache.poi.util.JvmBugs;
    +import org.apache.poi.xslf.usermodel.XMLSlideShow;
     import org.junit.Ignore;
     import org.junit.Test;
     
    @@ -143,45 +140,42 @@ public final class TestPicture {
         }
     
         @Test
    -    @Ignore("Just for visual validation - antialiasing is different on various systems")
    +    // @Ignore("Just for visual validation - antialiasing is different on various systems")
         public void bug54541() throws Exception {
    -//        InputStream xis = _slTests.openResourceAsStream("54542_cropped_bitmap.pptx");
    -//        XMLSlideShow xss = new XMLSlideShow(xis);
    -//        xis.close();
    -//        
    -//        Dimension xpg = xss.getPageSize();
    -//        for(XSLFSlide slide : xss.getSlides()) {
    -//            BufferedImage img = new BufferedImage(xpg.width, xpg.height, BufferedImage.TYPE_INT_RGB);
    -//            Graphics2D graphics = img.createGraphics();
    -//            fixFonts(graphics);
    -//            slide.draw(graphics);
    -//            ImageIO.write(img, "PNG", new File("testx.png"));
    -//        }
    -//
    -//        System.out.println("########################");
    -        
    -        InputStream is = _slTests.openResourceAsStream("54541_cropped_bitmap.ppt");
    -        HSLFSlideShow ss = new HSLFSlideShow(is);
    +        String file = new String[]{
    +            "54542_cropped_bitmap.pptx",
    +            "54541_cropped_bitmap.ppt",
    +            "54541_cropped_bitmap2.ppt",
    +            "sample_pptx_grouping_issues.pptx"
    +        }[3];
    +        InputStream is = _slTests.openResourceAsStream(file);
    +        SlideShow ss = file.endsWith("pptx") ? new XMLSlideShow(is) : new HSLFSlideShow(is);
             is.close();
             
    +        boolean debugOut = false;
             Dimension pg = ss.getPageSize();
             int i=1;
    -        for(HSLFSlide slide : ss.getSlides()) {
    -            BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_RGB);
    -            Graphics2D graphics = img.createGraphics();
    -            fixFonts(graphics);
    -            slide.draw(graphics);
    -            ImageIO.write(img, "PNG", new File("test"+(i++)+".png"));
    +        for(Slide slide : ss.getSlides()) {
    +            if (debugOut) {
    +                DummyGraphics2d graphics = new DummyGraphics2d();
    +                slide.draw(graphics);
    +            } else {
    +                BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_RGB);
    +                Graphics2D graphics = img.createGraphics();
    +                fixFonts(graphics);
    +                slide.draw(graphics);
    +                ImageIO.write(img, "PNG", new File("test"+(i++)+"hslf.png"));
    +            }
             }
         }
         
         @SuppressWarnings("unchecked")
         private void fixFonts(Graphics2D graphics) {
             if (!JvmBugs.hasLineBreakMeasurerBug()) return;
    -        Map fontMap = (Map)graphics.getRenderingHint(TextPainter.KEY_FONTMAP);
    +        Map fontMap = (Map)graphics.getRenderingHint(Drawable.FONT_MAP);
             if (fontMap == null) fontMap = new HashMap();
             fontMap.put("Calibri", "Lucida Sans");
             fontMap.put("Cambria", "Lucida Bright");
    -        graphics.setRenderingHint(TextPainter.KEY_FONTMAP, fontMap);        
    +        graphics.setRenderingHint(Drawable.FONT_MAP, fontMap);        
         }
     }
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
    index 25f61e1b10..61c309106d 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
    @@ -22,17 +22,12 @@ import static org.junit.Assert.assertArrayEquals;
     import java.io.ByteArrayInputStream;
     import java.io.ByteArrayOutputStream;
     import java.net.URL;
    +import java.util.List;
     
     import junit.framework.TestCase;
     
     import org.apache.poi.POIDataSamples;
    -import org.apache.poi.hslf.blip.DIB;
    -import org.apache.poi.hslf.blip.EMF;
    -import org.apache.poi.hslf.blip.JPEG;
    -import org.apache.poi.hslf.blip.PICT;
    -import org.apache.poi.hslf.blip.PNG;
    -import org.apache.poi.hslf.blip.WMF;
    -import org.apache.poi.hslf.model.*;
    +import org.apache.poi.hslf.blip.*;
     
     /**
      * Test adding/reading pictures
    @@ -65,9 +60,9 @@ public final class TestPictures extends TestCase{
             ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
     
             //make sure we can read this picture shape and it refers to the correct picture data
    -        HSLFShape[] sh = ppt.getSlides()[0].getShapes();
    -        assertEquals(1, sh.length);
    -        pict = (HSLFPictureShape)sh[0];
    +        List sh = ppt.getSlides().get(0).getShapes();
    +        assertEquals(1, sh.size());
    +        pict = (HSLFPictureShape)sh.get(0);
             assertEquals(idx, pict.getPictureIndex());
     
             //check picture data
    @@ -110,9 +105,9 @@ public final class TestPictures extends TestCase{
             ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
     
             //make sure we can read this picture shape and it refers to the correct picture data
    -        HSLFShape[] sh = ppt.getSlides()[0].getShapes();
    -        assertEquals(1, sh.length);
    -        pict = (HSLFPictureShape)sh[0];
    +        List sh = ppt.getSlides().get(0).getShapes();
    +        assertEquals(1, sh.size());
    +        pict = (HSLFPictureShape)sh.get(0);
             assertEquals(idx, pict.getPictureIndex());
     
             //check picture data
    @@ -156,9 +151,9 @@ public final class TestPictures extends TestCase{
             ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
     
             //make sure we can get this picture shape and it refers to the correct picture data
    -        HSLFShape[] sh = ppt.getSlides()[0].getShapes();
    -        assertEquals(1, sh.length);
    -        pict = (HSLFPictureShape)sh[0];
    +        List sh = ppt.getSlides().get(0).getShapes();
    +        assertEquals(1, sh.size());
    +        pict = (HSLFPictureShape)sh.get(0);
             assertEquals(idx, pict.getPictureIndex());
     
             //check picture data
    @@ -195,9 +190,9 @@ public final class TestPictures extends TestCase{
             ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
     
             //make sure we can read this picture shape and it refers to the correct picture data
    -        HSLFShape[] sh = ppt.getSlides()[0].getShapes();
    -        assertEquals(1, sh.length);
    -        pict = (HSLFPictureShape)sh[0];
    +        List sh = ppt.getSlides().get(0).getShapes();
    +        assertEquals(1, sh.size());
    +        pict = (HSLFPictureShape)sh.get(0);
             assertEquals(idx, pict.getPictureIndex());
     
             //check picture data
    @@ -235,9 +230,9 @@ public final class TestPictures extends TestCase{
             ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
     
             //make sure we can read this picture shape and it refers to the correct picture data
    -        HSLFShape[] sh = ppt.getSlides()[0].getShapes();
    -        assertEquals(1, sh.length);
    -        pict = (HSLFPictureShape)sh[0];
    +        List sh = ppt.getSlides().get(0).getShapes();
    +        assertEquals(1, sh.size());
    +        pict = (HSLFPictureShape)sh.get(0);
             assertEquals(idx, pict.getPictureIndex());
     
             //check picture data
    @@ -274,9 +269,9 @@ public final class TestPictures extends TestCase{
             ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
     
             //make sure we can read this picture shape and it refers to the correct picture data
    -        HSLFShape[] sh = ppt.getSlides()[0].getShapes();
    -        assertEquals(1, sh.length);
    -        pict = (HSLFPictureShape)sh[0];
    +        List sh = ppt.getSlides().get(0).getShapes();
    +        assertEquals(1, sh.size());
    +        pict = (HSLFPictureShape)sh.get(0);
             assertEquals(idx, pict.getPictureIndex());
     
             //check picture data
    @@ -302,11 +297,11 @@ public final class TestPictures extends TestCase{
             HSLFPictureData pdata;
     
             HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("pictures.ppt"));
    -        HSLFSlide[] slides = ppt.getSlides();
    +        List slides = ppt.getSlides();
             HSLFPictureData[] pictures = ppt.getPictureData();
             assertEquals(5, pictures.length);
     
    -        pict = (HSLFPictureShape)slides[0].getShapes()[0]; //the first slide contains JPEG
    +        pict = (HSLFPictureShape)slides.get(0).getShapes().get(0); //the first slide contains JPEG
             pdata = pict.getPictureData();
             assertTrue(pdata instanceof JPEG);
             assertEquals(HSLFPictureShape.JPEG, pdata.getType());
    @@ -314,7 +309,7 @@ public final class TestPictures extends TestCase{
             ppt_bytes = slTests.readFile("clock.jpg");
             assertArrayEquals(src_bytes, ppt_bytes);
     
    -        pict = (HSLFPictureShape)slides[1].getShapes()[0]; //the second slide contains PNG
    +        pict = (HSLFPictureShape)slides.get(1).getShapes().get(0); //the second slide contains PNG
             pdata = pict.getPictureData();
             assertTrue(pdata instanceof PNG);
             assertEquals(HSLFPictureShape.PNG, pdata.getType());
    @@ -322,7 +317,7 @@ public final class TestPictures extends TestCase{
             ppt_bytes = slTests.readFile("tomcat.png");
             assertArrayEquals(src_bytes, ppt_bytes);
     
    -        pict = (HSLFPictureShape)slides[2].getShapes()[0]; //the third slide contains WMF
    +        pict = (HSLFPictureShape)slides.get(2).getShapes().get(0); //the third slide contains WMF
             pdata = pict.getPictureData();
             assertTrue(pdata instanceof WMF);
             assertEquals(HSLFPictureShape.WMF, pdata.getType());
    @@ -336,7 +331,7 @@ public final class TestPictures extends TestCase{
             System.arraycopy(ppt_bytes, 22, b2, 0, b2.length);
             assertArrayEquals(b1, b2);
     
    -        pict = (HSLFPictureShape)slides[3].getShapes()[0]; //the forth slide contains PICT
    +        pict = (HSLFPictureShape)slides.get(3).getShapes().get(0); //the forth slide contains PICT
             pdata = pict.getPictureData();
             assertTrue(pdata instanceof PICT);
             assertEquals(HSLFPictureShape.PICT, pdata.getType());
    @@ -350,7 +345,7 @@ public final class TestPictures extends TestCase{
             System.arraycopy(ppt_bytes, 512, b2, 0, b2.length);
             assertArrayEquals(b1, b2);
     
    -        pict = (HSLFPictureShape)slides[4].getShapes()[0]; //the fifth slide contains EMF
    +        pict = (HSLFPictureShape)slides.get(4).getShapes().get(0); //the fifth slide contains EMF
             pdata = pict.getPictureData();
             assertTrue(pdata instanceof EMF);
             assertEquals(HSLFPictureShape.EMF, pdata.getType());
    @@ -375,20 +370,20 @@ public final class TestPictures extends TestCase{
     
     		// Now test what happens when we use the SlideShow interface
     		HSLFSlideShow ppt = new HSLFSlideShow(hslf);
    -        HSLFSlide[] slides = ppt.getSlides();
    +        List slides = ppt.getSlides();
             HSLFPictureData[] pictures = ppt.getPictureData();
    -        assertEquals(12, slides.length);
    +        assertEquals(12, slides.size());
             assertEquals(2, pictures.length);
     
     		HSLFPictureShape pict;
     		HSLFPictureData pdata;
     
    -        pict = (HSLFPictureShape)slides[0].getShapes()[1]; // 2nd object on 1st slide
    +        pict = (HSLFPictureShape)slides.get(0).getShapes().get(1); // 2nd object on 1st slide
             pdata = pict.getPictureData();
             assertTrue(pdata instanceof WMF);
             assertEquals(HSLFPictureShape.WMF, pdata.getType());
     
    -        pict = (HSLFPictureShape)slides[0].getShapes()[2]; // 3rd object on 1st slide
    +        pict = (HSLFPictureShape)slides.get(0).getShapes().get(2); // 3rd object on 1st slide
             pdata = pict.getPictureData();
             assertTrue(pdata instanceof WMF);
             assertEquals(HSLFPictureShape.WMF, pdata.getType());
    @@ -411,20 +406,20 @@ public final class TestPictures extends TestCase{
     
     		// Now test what happens when we use the SlideShow interface
     		HSLFSlideShow ppt = new HSLFSlideShow(hslf);
    -        HSLFSlide[] slides = ppt.getSlides();
    +        List slides = ppt.getSlides();
             HSLFPictureData[] pictures = ppt.getPictureData();
    -        assertEquals(27, slides.length);
    +        assertEquals(27, slides.size());
             assertEquals(2, pictures.length);
     
     		HSLFPictureShape pict;
     		HSLFPictureData pdata;
     
    -        pict = (HSLFPictureShape)slides[6].getShapes()[13];
    +        pict = (HSLFPictureShape)slides.get(6).getShapes().get(13);
             pdata = pict.getPictureData();
             assertTrue(pdata instanceof WMF);
             assertEquals(HSLFPictureShape.WMF, pdata.getType());
     
    -        pict = (HSLFPictureShape)slides[7].getShapes()[13];
    +        pict = (HSLFPictureShape)slides.get(7).getShapes().get(13);
             pdata = pict.getPictureData();
             assertTrue(pdata instanceof WMF);
             assertEquals(HSLFPictureShape.WMF, pdata.getType());
    @@ -446,9 +441,9 @@ public final class TestPictures extends TestCase{
     
         public void testGetPictureName() throws Exception {
             HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("ppt_with_png.ppt"));
    -        HSLFSlide slide = ppt.getSlides()[0];
    +        HSLFSlide slide = ppt.getSlides().get(0);
     
    -        HSLFPictureShape p = (HSLFPictureShape)slide.getShapes()[0]; //the first slide contains JPEG
    +        HSLFPictureShape p = (HSLFPictureShape)slide.getShapes().get(0); //the first slide contains JPEG
             assertEquals("test", p.getPictureName());
         }
     
    @@ -469,7 +464,7 @@ public final class TestPictures extends TestCase{
     
             ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
     
    -        HSLFPictureShape p = (HSLFPictureShape)ppt.getSlides()[0].getShapes()[0];
    +        HSLFPictureShape p = (HSLFPictureShape)ppt.getSlides().get(0).getShapes().get(0);
             assertEquals("tomcat.png", p.getPictureName());
         }
     }
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java
    index 4a456dc771..2270cd420f 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java
    @@ -19,10 +19,12 @@
     
     package org.apache.poi.hslf.usermodel;
     
    -import junit.framework.TestCase;
    +import static org.junit.Assert.*;
    +
    +import java.util.List;
     
    -import org.apache.poi.hslf.model.Table;
     import org.apache.poi.POIDataSamples;
    +import org.junit.Test;
     
     
     /**
    @@ -30,40 +32,39 @@ import org.apache.poi.POIDataSamples;
      * 
      * @author Alex Nikiforov [mailto:anikif@gmail.com]
      */
    -public final class TestTable extends TestCase {
    +public class TestTable {
         private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
     
    -	protected void setUp() throws Exception {
    -	}
    -
    -	public void testTable() throws Exception {
    +    @Test
    +    public void testTable() throws Exception {
     		HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("54111.ppt"));
     		assertTrue("No Exceptions while reading file", true);
     
    -		final HSLFSlide[] slides = ppt.getSlides();
    -		assertEquals(1, slides.length);
    -		checkSlide(slides[0]);
    +		List slides = ppt.getSlides();
    +		assertEquals(1, slides.size());
    +		checkSlide(slides.get(0));
     	}
    +	
     	private void checkSlide(final HSLFSlide s) {
    -		HSLFTextParagraph[] textRuns = s.getTextParagraphs();
    -		assertEquals(2, textRuns.length);
    +		List> textRuns = s.getTextParagraphs();
    +		assertEquals(2, textRuns.size());
     
    -		HSLFTextRun textRun = textRuns[0].getTextRuns()[0];
    +		HSLFTextRun textRun = textRuns.get(0).get(0).getTextRuns().get(0);
     		assertEquals("Table sample", textRun.getRawText().trim());
    -		assertEquals(1, textRuns[0].getTextRuns().length);
    -		assertFalse(textRun.isBullet());
    +		assertEquals(1, textRuns.get(0).get(0).getTextRuns().size());
    +		assertFalse(textRun.getTextParagraph().isBullet());
     
    -		assertEquals("Dummy text", textRuns[1].getRawText());
    +		assertEquals("Dummy text", HSLFTextParagraph.getRawText(textRuns.get(1)));
     		
    -		final HSLFShape[] shapes = s.getShapes();
    +		List shapes = s.getShapes();
     		assertNotNull(shapes);
    -		assertEquals(3, shapes.length);
    -		assertTrue(shapes[2] instanceof Table);
    -		final Table table = (Table) shapes[2];
    +		assertEquals(3, shapes.size());
    +		assertTrue(shapes.get(2) instanceof HSLFTable);
    +		final HSLFTable table = (HSLFTable) shapes.get(2);
     		assertEquals(4, table.getNumberOfColumns());
     		assertEquals(6, table.getNumberOfRows());
     		for (int x = 0; x < 4; x ++) {
    -			assertEquals("TH Cell " + (x + 1), table.getCell(0, x).getTextParagraphs().getRawText());
    +			assertEquals("TH Cell " + (x + 1), HSLFTextParagraph.getRawText(table.getCell(0, x).getTextParagraphs()));
     			for (int y = 1; y < 6; y++) {
     				assertEquals("Row " + y + ", Cell " + (x + 1), table.getCell(y, x).getText());
     			}
    diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java
    index 3b1313e4ea..9dda9af244 100644
    --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java
    +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java
    @@ -19,10 +19,12 @@ package org.apache.poi.hslf.usermodel;
     
     import static org.junit.Assert.*;
     
    -import java.io.IOException;
    +import java.awt.Color;
    +import java.io.*;
     import java.util.List;
     
     import org.apache.poi.POIDataSamples;
    +import org.apache.poi.hslf.model.textproperties.TextPropCollection;
     import org.apache.poi.hslf.record.*;
     import org.junit.Before;
     import org.junit.Test;
    @@ -99,7 +101,7 @@ public final class TestTextRun {
     
     		// Ensure trailing \n's are NOT stripped, it is legal to set a text with a trailing '\r'
     		tr.setText(changeTo + "\n");
    -		assertEquals(changeTo + "\n", tr.getRawText());
    +		assertEquals(changeTo + "\r", tr.getRawText());
     	}
     
     	/**
    @@ -121,7 +123,6 @@ public final class TestTextRun {
     		    else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r;
     		    else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r;
     		}
    -		
     
     		// Bytes -> Bytes
     		assertNull(tca);
    @@ -197,18 +198,13 @@ public final class TestTextRun {
     		List trB = textParass.get(1);
     
     		assertEquals(1, trA.size());
    -		assertEquals(1, trB.size());
    +		assertEquals(2, trB.size());
     
     		HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0);
     		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
     
     		assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText());
    -		assertEquals(HSLFTextParagraph.getRawText(trB), rtrB.getRawText());
    -
    -//		assertNull(rtrA._getRawCharacterStyle());
    -//		assertNull(rtrA._getRawParagraphStyle());
    -//		assertNull(rtrB._getRawCharacterStyle());
    -//		assertNull(rtrB._getRawParagraphStyle());
    +		assertEquals(HSLFTextParagraph.getRawText(trB.subList(0, 1)), rtrB.getRawText());
     	}
     
     	/**
    @@ -284,39 +280,39 @@ public final class TestTextRun {
     		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
     		HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0);
     		HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0);
    -//		TextPropCollection tpBP = rtrB._getRawParagraphStyle();
    -//		TextPropCollection tpBC = rtrB._getRawCharacterStyle();
    -//		TextPropCollection tpCP = rtrC._getRawParagraphStyle();
    -//		TextPropCollection tpCC = rtrC._getRawCharacterStyle();
    -//		TextPropCollection tpDP = rtrD._getRawParagraphStyle();
    -//		TextPropCollection tpDC = rtrD._getRawCharacterStyle();
    +		TextPropCollection tpBP = rtrB.getTextParagraph().getParagraphStyle();
    +		TextPropCollection tpBC = rtrB.getCharacterStyle();
    +		TextPropCollection tpCP = rtrC.getTextParagraph().getParagraphStyle();
    +		TextPropCollection tpCC = rtrC.getCharacterStyle();
    +		TextPropCollection tpDP = rtrD.getTextParagraph().getParagraphStyle();
    +		TextPropCollection tpDC = rtrD.getCharacterStyle();
     
     //		assertEquals(trB.getRawText().substring(0, 30), rtrB.getRawText());
    -//		assertNotNull(tpBP);
    -//		assertNotNull(tpBC);
    -//		assertNotNull(tpCP);
    -//		assertNotNull(tpCC);
    -//		assertNotNull(tpDP);
    -//		assertNotNull(tpDC);
    -//		assertTrue(tpBP.equals(tpCP));
    -//		assertTrue(tpBP.equals(tpDP));
    -//		assertTrue(tpCP.equals(tpDP));
    -//		assertFalse(tpBC.equals(tpCC));
    -//		assertFalse(tpBC.equals(tpDC));
    -//		assertFalse(tpCC.equals(tpDC));
    +		assertNotNull(tpBP);
    +		assertNotNull(tpBC);
    +		assertNotNull(tpCP);
    +		assertNotNull(tpCC);
    +		assertNotNull(tpDP);
    +		assertNotNull(tpDC);
    +		assertEquals(tpBP,tpCP);
    +		assertEquals(tpBP,tpDP);
    +		assertEquals(tpCP,tpDP);
    +		assertNotEquals(tpBC,tpCC);
    +		assertNotEquals(tpBC,tpDC);
    +		assertNotEquals(tpCC,tpDC);
     
     		// Change text via normal
    -//		trB.setText("Test Foo Test");
    +		HSLFTextParagraph.setText(trB, "Test Foo Test");
     
     		// Ensure now have first style
    -//		assertEquals(1, trB.getTextRuns().length);
    -//		rtrB = trB.getTextRuns().get(0);
    -//		assertEquals("Test Foo Test", trB.getRawText());
    -//		assertEquals("Test Foo Test", rtrB.getRawText());
    -//		assertNotNull(rtrB._getRawCharacterStyle());
    -//		assertNotNull(rtrB._getRawParagraphStyle());
    -//		assertEquals( tpBP, rtrB._getRawParagraphStyle() );
    -//		assertEquals( tpBC, rtrB._getRawCharacterStyle() );
    +		assertEquals(1, trB.get(0).getTextRuns().size());
    +		rtrB = trB.get(0).getTextRuns().get(0);
    +		assertEquals("Test Foo Test", HSLFTextParagraph.getRawText(trB));
    +		assertEquals("Test Foo Test", rtrB.getRawText());
    +		assertNotNull(rtrB.getCharacterStyle());
    +		assertNotNull(rtrB.getTextParagraph().getParagraphStyle());
    +		assertEquals( tpBP, rtrB.getTextParagraph().getParagraphStyle() );
    +		assertEquals( tpBC, rtrB.getCharacterStyle() );
     	}
     
     	/**
    @@ -328,21 +324,21 @@ public final class TestTextRun {
     		HSLFSlide slideOne = ss.getSlides().get(0);
     		List> textRuns = slideOne.getTextParagraphs();
     		List trB = textRuns.get(1);
    -//		assertEquals(1, trB.getTextRuns().length);
    -//
    -//		HSLFTextRun rtrB = trB.getTextRuns().get(0);
    -//		assertEquals(trB.getRawText(), rtrB.getRawText());
    -//		assertNull(rtrB._getRawCharacterStyle());
    -//		assertNull(rtrB._getRawParagraphStyle());
    +		assertEquals(1, trB.get(0).getTextRuns().size());
    +
    +		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
    +		assertEquals(HSLFTextParagraph.getRawText(trB.subList(0, 1)), rtrB.getRawText());
    +		assertNotNull(rtrB.getCharacterStyle());
    +		assertNotNull(rtrB.getTextParagraph().getParagraphStyle());
     
     		// Change text via rich
    -//		rtrB.setText("Test Test Test");
    -//		assertEquals("Test Test Test", trB.getRawText());
    -//		assertEquals("Test Test Test", rtrB.getRawText());
    +		rtrB.setText("Test Test Test");
    +		assertEquals("Test Test Test", HSLFTextParagraph.getRawText(trB.subList(0, 1)));
    +		assertEquals("Test Test Test", rtrB.getRawText());
     
     		// Will now have dummy props
    -//		assertNotNull(rtrB._getRawCharacterStyle());
    -//		assertNotNull(rtrB._getRawParagraphStyle());
    +        assertNotNull(rtrB.getCharacterStyle());
    +        assertNotNull(rtrB.getTextParagraph().getParagraphStyle());
     	}
     
     	/**
    @@ -357,31 +353,31 @@ public final class TestTextRun {
     		assertEquals(3, trB.size());
     
     		// We start with 3 text runs, each with their own set of styles,
    -		//  but all sharing the same paragraph styles
    +		// but all sharing the same paragraph styles
     		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
     		HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0);
     		HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0);
    -//		TextPropCollection tpBP = rtrB._getRawParagraphStyle();
    -//		TextPropCollection tpBC = rtrB._getRawCharacterStyle();
    -//		TextPropCollection tpCP = rtrC._getRawParagraphStyle();
    -//		TextPropCollection tpCC = rtrC._getRawCharacterStyle();
    -//		TextPropCollection tpDP = rtrD._getRawParagraphStyle();
    -//		TextPropCollection tpDC = rtrD._getRawCharacterStyle();
    +		TextPropCollection tpBP = rtrB.getTextParagraph().getParagraphStyle();
    +		TextPropCollection tpBC = rtrB.getCharacterStyle();
    +		TextPropCollection tpCP = rtrC.getTextParagraph().getParagraphStyle();
    +		TextPropCollection tpCC = rtrC.getCharacterStyle();
    +		TextPropCollection tpDP = rtrD.getTextParagraph().getParagraphStyle();
    +		TextPropCollection tpDC = rtrD.getCharacterStyle();
     
     		// Check text and stylings
    -//		assertEquals(trB.getRawText().substring(0, 30), rtrB.getRawText());
    -//		assertNotNull(tpBP);
    -//		assertNotNull(tpBC);
    -//		assertNotNull(tpCP);
    -//		assertNotNull(tpCC);
    -//		assertNotNull(tpDP);
    -//		assertNotNull(tpDC);
    -//		assertTrue(tpBP.equals(tpCP));
    -//		assertTrue(tpBP.equals(tpDP));
    -//		assertTrue(tpCP.equals(tpDP));
    -//		assertFalse(tpBC.equals(tpCC));
    -//		assertFalse(tpBC.equals(tpDC));
    -//		assertFalse(tpCC.equals(tpDC));
    +		assertEquals(HSLFTextParagraph.getRawText(trB).substring(0, 30), rtrB.getRawText());
    +		assertNotNull(tpBP);
    +		assertNotNull(tpBC);
    +		assertNotNull(tpCP);
    +		assertNotNull(tpCC);
    +		assertNotNull(tpDP);
    +		assertNotNull(tpDC);
    +		assertEquals(tpBP, tpCP);
    +		assertEquals(tpBP, tpDP);
    +		assertEquals(tpCP, tpDP);
    +		assertNotEquals(tpBC, tpCC);
    +		assertNotEquals(tpBC, tpDC);
    +		assertNotEquals(tpCC, tpDC);
     
     		// Check text in the rich runs
     		assertEquals("This is the subtitle, in bold\r", rtrB.getRawText());
    @@ -394,32 +390,32 @@ public final class TestTextRun {
     		rtrB.setText(newBText);
     		rtrC.setText(newCText);
     		rtrD.setText(newDText);
    -		assertEquals(newBText, rtrB.getRawText());
    -		assertEquals(newCText, rtrC.getRawText());
    -		assertEquals(newDText, rtrD.getRawText());
    +		HSLFTextParagraph.storeText(trB);
     
    -//		assertEquals(newBText + newCText + newDText, trB.getRawText());
    +		assertEquals(newBText.replace('\n','\r'), rtrB.getRawText());
    +		assertEquals(newCText.replace('\n','\r'), rtrC.getRawText());
    +		assertEquals(newDText.replace('\n','\r'), rtrD.getRawText());
    +
    +		assertEquals(newBText.replace('\n','\r') + newCText.replace('\n','\r') + newDText.replace('\n','\r'), HSLFTextParagraph.getRawText(trB));
     
     		// The styles should have been updated for the new sizes
    -//		assertEquals(newBText.length(), tpBC.getCharactersCovered());
    -//		assertEquals(newCText.length(), tpCC.getCharactersCovered());
    -//		assertEquals(newDText.length()+1, tpDC.getCharactersCovered()); // Last one is always one larger
    +		assertEquals(newBText.length(), tpBC.getCharactersCovered());
    +		assertEquals(newCText.length(), tpCC.getCharactersCovered());
    +		assertEquals(newDText.length()+1, tpDC.getCharactersCovered()); // Last one is always one larger
     
    -//		assertEquals(
    -//				newBText.length() + newCText.length() + newDText.length(),
    -//				tpBP.getCharactersCovered()
    -//		);
    -
    -		// Paragraph style should be sum of text length
    -//		assertEquals(newBText.length() + newCText.length() + newDText.length(), tpBP.getCharactersCovered());
    +        // Paragraph style should be sum of text length
    +		assertEquals(
    +			newBText.length() + newCText.length() + newDText.length() +1,
    +			tpBP.getCharactersCovered() + tpCP.getCharactersCovered() + tpDP.getCharactersCovered()
    +		);
     
     		// Check stylings still as expected
    -//		TextPropCollection ntpBC = rtrB._getRawCharacterStyle();
    -//		TextPropCollection ntpCC = rtrC._getRawCharacterStyle();
    -//		TextPropCollection ntpDC = rtrD._getRawCharacterStyle();
    -//		assertEquals(tpBC.getTextPropList(), ntpBC.getTextPropList());
    -//		assertEquals(tpCC.getTextPropList(), ntpCC.getTextPropList());
    -//		assertEquals(tpDC.getTextPropList(), ntpDC.getTextPropList());
    +		TextPropCollection ntpBC = rtrB.getCharacterStyle();
    +		TextPropCollection ntpCC = rtrC.getCharacterStyle();
    +		TextPropCollection ntpDC = rtrD.getCharacterStyle();
    +		assertEquals(tpBC.getTextPropList(), ntpBC.getTextPropList());
    +		assertEquals(tpCC.getTextPropList(), ntpCC.getTextPropList());
    +		assertEquals(tpDC.getTextPropList(), ntpDC.getTextPropList());
     	}
     
     
    @@ -467,82 +463,86 @@ public final class TestTextRun {
     		assertEquals(0, slide.getTextParagraphs().size());
     
     		HSLFTextBox shape1 = new HSLFTextBox();
    -//		HSLFTextParagraph run1 = shape1.getTextParagraphs();
    -//		assertSame(run1, shape1.createTextRun());
    -//		run1.setText("Text 1");
    +		List run1 = shape1.getTextParagraphs();
    +		shape1.setText("Text 1");
     		slide.addShape(shape1);
     
     		//The array of Slide's text runs must be updated when new text shapes are added.
    -//		HSLFTextParagraph[] runs = slide.getTextParagraphs();
    -//		assertNotNull(runs);
    -//		assertSame(run1, runs.get(0));
    -//
    -//		HSLFTextBox shape2 = new HSLFTextBox();
    -//		HSLFTextParagraph run2 = shape2.getTextParagraphs();
    -//		assertSame(run2, shape2.createTextRun());
    -//		run2.setText("Text 2");
    -//		slide.addShape(shape2);
    -//
    -//		runs = slide.getTextParagraphs();
    -//		assertEquals(2, runs.length);
    -//
    -//		assertSame(run1, runs.get(0));
    -//		assertSame(run2, runs.get(1));
    -//
    -//		//as getShapes()
    -//		HSLFShape[] sh = slide.getShapes();
    -//		assertEquals(2, sh.length);
    -//		assertTrue(sh.get(0) instanceof HSLFTextBox);
    -//		HSLFTextBox box1 = (HSLFTextBox)sh.get(0);
    -//		assertSame(run1, box1.getTextParagraphs());
    -//		HSLFTextBox box2 = (HSLFTextBox)sh.get(1);
    -//		assertSame(run2, box2.getTextParagraphs());
    -//
    -//		//test Table - a complex group of shapes containing text objects
    -//		HSLFSlide slide2 = ppt.createSlide();
    -//		assertNull(slide2.getTextParagraphs());
    -//		Table table = new Table(2, 2);
    -//		slide2.addShape(table);
    -//		runs = slide2.getTextParagraphs();
    -//		assertNotNull(runs);
    -//		assertEquals(4, runs.length);
    +		List> runs = slide.getTextParagraphs();
    +		assertNotNull(runs);
    +		assertSame(run1, runs.get(0));
    +
    +		HSLFTextBox shape2 = new HSLFTextBox();
    +		List run2 = shape2.getTextParagraphs();
    +		shape2.setText("Text 2");
    +		slide.addShape(shape2);
    +
    +		runs = slide.getTextParagraphs();
    +		assertEquals(2, runs.size());
    +
    +		assertSame(run1, runs.get(0));
    +		assertSame(run2, runs.get(1));
    +
    +		// as getShapes()
    +		List sh = slide.getShapes();
    +		assertEquals(2, sh.size());
    +		assertTrue(sh.get(0) instanceof HSLFTextBox);
    +		HSLFTextBox box1 = (HSLFTextBox)sh.get(0);
    +		assertSame(run1, box1.getTextParagraphs());
    +		HSLFTextBox box2 = (HSLFTextBox)sh.get(1);
    +		assertSame(run2, box2.getTextParagraphs());
    +
    +		// test Table - a complex group of shapes containing text objects
    +		HSLFSlide slide2 = ppt.createSlide();
    +		assertTrue(slide2.getTextParagraphs().isEmpty());
    +		HSLFTable table = new HSLFTable(2, 2);
    +		slide2.addShape(table);
    +		runs = slide2.getTextParagraphs();
    +		assertNotNull(runs);
    +		assertEquals(4, runs.size());
     	}
     
     	@Test
     	public void test48916() throws IOException {
    -//        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("SampleShow.ppt"));
    -//        for(HSLFSlide slide : ppt.getSlides()){
    -//            for(HSLFShape sh : slide.getShapes()){
    -//                if(sh instanceof HSLFTextShape){
    -//                    HSLFTextShape tx = (HSLFTextShape)sh;
    -//                    HSLFTextParagraph run = tx.getTextParagraphs();
    -//                    //verify that records cached in  TextRun and EscherTextboxWrapper are the same
    -//                    Record[] runChildren = run.getRecords();
    -//                    Record[] txboxChildren = tx.getEscherTextboxWrapper().getChildRecords();
    -//                    assertEquals(runChildren.length, txboxChildren.length);
    -//                    for(int i=0; i < txboxChildren.length; i++){
    -//                        assertSame(txboxChildren.get(i), runChildren.get(i));
    -//                    }
    -//                    //caused NPE prior to fix of Bugzilla #48916 
    -//                    run.getTextRuns().get(0).setBold(true);
    -//                    run.getTextRuns().get(0).setFontColor(Color.RED);
    -//                }
    -//            }
    -//        }
    -//        ByteArrayOutputStream out = new ByteArrayOutputStream();
    -//        ppt.write(out);
    -//        ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
    -//        for(HSLFSlide slide : ppt.getSlides()){
    -//            for(HSLFShape sh : slide.getShapes()){
    -//                if(sh instanceof HSLFTextShape){
    -//                    HSLFTextShape tx = (HSLFTextShape)sh;
    -//                    HSLFTextParagraph run = tx.getTextParagraphs();
    -//                    HSLFTextRun rt = run.getTextRuns().get(0);
    -//                    assertTrue(rt.isBold());
    -//                    assertEquals(rt.getFontColor(), Color.RED);
    -//                }
    -//            }
    -//        }
    +        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("SampleShow.ppt"));
    +        List slides = ppt.getSlides();
    +        for(HSLFSlide slide : slides){
    +            for(HSLFShape sh : slide.getShapes()){
    +                if (!(sh instanceof HSLFTextShape)) continue;
    +                HSLFTextShape tx = (HSLFTextShape)sh;
    +                List paras = tx.getTextParagraphs();
    +                //verify that records cached in  TextRun and EscherTextboxWrapper are the same
    +                Record[] runChildren = paras.get(0).getRecords();
    +                Record[] txboxChildren = tx.getEscherTextboxWrapper().getChildRecords();
    +                assertEquals(runChildren.length, txboxChildren.length);
    +                for(int i=0; i < txboxChildren.length; i++){
    +                    assertSame(txboxChildren[i], runChildren[i]);
    +                }
    +                // caused NPE prior to fix of Bugzilla #48916
    +                for (HSLFTextParagraph p : paras) {
    +                    for (HSLFTextRun rt : p.getTextRuns()) {
    +                        rt.setBold(true);
    +                        rt.setFontColor(Color.RED);
    +                    }
    +                }
    +                tx.storeText();
    +            }
    +        }
    +        ByteArrayOutputStream out = new ByteArrayOutputStream();
    +        ppt.write(out);
    +        
    +        ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
    +        for(HSLFSlide slide : ppt.getSlides()){
    +            for(HSLFShape sh : slide.getShapes()){
    +                if(sh instanceof HSLFTextShape){
    +                    HSLFTextShape tx = (HSLFTextShape)sh;
    +                    List run = tx.getTextParagraphs();
    +                    HSLFTextRun rt = run.get(0).getTextRuns().get(0);
    +                    assertTrue(rt.isBold());
    +                    assertEquals(rt.getFontColor(), Color.RED);
    +                }
    +            }
    +        }
     
         }
     
    diff --git a/test-data/slideshow/54541_cropped_bitmap2.ppt b/test-data/slideshow/54541_cropped_bitmap2.ppt
    new file mode 100644
    index 0000000000000000000000000000000000000000..3d79dbd33b2db3de403c66ad0345d8f4aca336b9
    GIT binary patch
    literal 199168
    zcmeF&bx<5#yD0j>-QC?SK!UpmNgxCZ?mD=;Gk9Ac_G_ndv|
    zR^9LZck0w$RX=+5>RvtFtEZo54Gd$WSZlde#Ot8{tq6i(KrgRIAo%~K9TunuLj6Yr
    zCI|!#RR6BNyuQBvM=Qu5s00840YLMAm;b{@;Q2q!@9#bQ3l6w%fA2X0014xj)~0;mAg02%--fDS+p
    zU;r=zm;lTG762=N4ZsfI0K5Tk0=NL&fVY5m03HA@fDgbA5C8}QgaE<-5r8N_3?L4W
    z07wF)0MY;%fGj``@E#x!_&YX=z)}hD0q_x^3{U}l0;mE$1JnTO01bd9Knw5%pbgLg
    z=mP#8OCMMo01N>}0Aqj&z!YExFb7xwECE&kYk&;^46p^*0qg+|07rlmz!~5Ia0R#l
    z+yNc{Pk0{>FACRZ3+$H&aJtJ4;(`f
    ztOgPQD(DIZ23VJLadb2VURBM>)bVdF`hP1gKqP_sXD0Grw?YG}(9^@y8SEsO2`Pvm
    z7S{Wpf8#sc|JL?5CjZS-z;*oNZ%+H$cmEj#>I9a5pNYTaZ!Y?~&)*pTcl+Odf6uY@
    zKi2=Y0mBH=SAH+0FRS)m>YuHDGv+@na*FRiDE!S4|9Nb2p#C?HcmY{Q0?1bHnTZX^dT)UJ-T-^>0^7uajK>3HI{tqm`@izp
    zf1WdN`2X)>OMYe^4FYZXQ~gbwAcMD5Vs6kN%-3+`53*>;#DA{|?Y*27kmI26fw~(a
    zJn*wW-tO;BCZY#V7ZZ)T7k
    zqJ)v6M)HSJOeU0OR{j#Fo!1b-;#IfJoCN;)o%wg6&3ycyc=_+F+8goMb%}Cu^wQWM
    zC`^6~`rWLN^EO}pj_2pobU};nM4u30!cT`<+wYg0Muk^jeed1B;kHDXP7~wvR7hKd
    z6v;>uTYZ?c@{OJLAup{uF^tXbXumw3B2x3MGg}VSIXrjIaB`mWA=J&!u2`{;xg7Ww
    z9lGyued(z^tCdi5R}u0P+^8_4CR97x1GU^USl_UIv}59W0Nrs@uh4?9AY9pw@N~$_
    zJ|M7l4D#Q@{bq{?72@yDcI-65@0YQx?icbr($@^hyUciKE%ywDW_RbK%nv%@AHf@a
    z9nVFvcW4&@qZp8q3Ur*_!;AWXy~>wij>$1;?9(Fou&^8>9gNT@?U80+7VhAB@}wb;D8LRQO0z{hHcI2HQpP8)cJGsg#uUTraNLtT>bx~pSP
    zu2uW-T|*--(%S_S3Q;nw7e1pno*6tavJN}0Zg;)YM>mE?=ZKqze}>>}g1qslbK`Ai
    zt|vq-XTk`Bbi=JUg{Q;c9}0cErZ;~!@~1wC^+YL{kAoR)p=9S@19#T_w-4gz
    zu}CbpJ<_NX0r~*7t<+;LX9mMnA-YAFZzBFt;2KiW)Vypc7pMGUAAHH`ufF9d7t3<@&BKsZ&ra
    z$|D#27KO)7psxKbZk1G|_NW&wolk4ucjkb@Qb##5@eg(CrI)_w9Tf$Y3_xMC-RsT`
    zl#~vRpP)$NHJd&QJkB(z9R6$kTWb+~X$^jx)r=%vdoIft#MkJRPL~DfL*xrSIV3+M
    zjP5G!{@7b`Z1P?gGT*%y{gfdv3s;iNW_qU4#VehHggAFLeQ>jw{dmjcw#9^!JZn$z
    zL%Z&aD__#KV_!tZH)&Mlcg*-@Nvz5&sTD&NpLp!*j8?uRc{1;uCzVgIYWAttw>DVt
    z>vtiy$E!I+{K!-Moft7SU5QN@S3a5iWgfY<5Sc@RK$Jlgk3v-Tm8R>@=G_#mLH3s9
    zB>OSB#cij8*P1MLh=70qY2{Z{ElN!LnP=Y)7((bUgExCeEclW5u>&0bANfdKSvg|v
    zy4&FBp@}mqnrk!vRA|YTO|C1pQs2lg=ZR-$3iuMc=2;qV8k^j`HD?zW{sA~1
    zXfh~86n9KXV(Ck`R@a9kru1*$szy#eq-$$-o30)y_&uu$zT-CayIAe8h)gq$M4$wsA^K~dwo5Ch#Wb}gccGwsFA}nA
    z73qyTZmc`ZZkOG%udlD??VkGW=0;zRM!Ok1-(_%2j9X~W?s=C-mSQpBAa)^nz^Df+
    zAck$))8etfAj9FZzpKqZ4-kLMTz!RUIcz(vGk9xt?>vKDhkm&$d9z3GveM5Dc~g5j
    zwPh)2zeaR;dfK3E*D}9eP44@|S(DDYSWfZ4WK#C^ep7^nU=Tk%3@p%Qvz#eBBb{Cn
    zLVa7pH%jj#Pec~oSPP;~{m9<_uV?j1Q`nz|1=l%_x-HyaEF-L!dSAKMK`s%C50SO~
    zGV^o}LF5c7K|*8tc)n&pk5RWk`pIhN7MiDqc#2FMiR~x3(VD
    zQl%*_?26p-d(F12n5Of99e=v;6KRAWTIS)3%LXPIbzFMA4)dHY88eJ#xbzmq#bJ4E
    z%o*34KGLUWXVv>%?!Wd3yis0$wtJoU@N`X6-{o0086=I|XN`ze)p$zkk0s*QKOJ--&(Mi#y&_<3GQ06|d$uOYj{M>X$7$7TEG<I{yLH%R5ViP=hInz-$_0e^?iA*avC&0&ZKzB87_Nw954{Ou(ysM#
    zdiwFHI`iqI{)|Pi^j(I)bgk{T%#=yGwCWk65=Uzl5T2(M8gn!o4=4c`{<8
    zz-KXwY|Yj~2XEf)`EqKdXDXydU$`s1|1?FR83a>0%Sv#eO&Xgb(;7ofM8~tCr=ZZs
    z@Bf96MFa9cayRd8z2`ujdIZ(a`Yi1d!^QtO&o6LF7VE3m{r>6$bzj{`MU}n+-Zi5P
    z$L_3{cyuNT8MgADf(Uwys*Ty-*DjyVJVeQgJWn?7j*F{ZiYz9X4hwec`B#pUZX9(n
    z?l9Fv8f+g2^pf0Z-(WE$$QO}S{qQsB{MmN%#R~&@_SEOpD~3pelDcYttSjh7L;s%T
    z@j#>Fz@BSy-QbD5LmFEpJ(Z9fW8;_csE9d9!-;tK;qEs``N&6Y^S2hf`d-n(PnkvF
    zov~Itjlr4KN%QRj(-X9S4MKuqqdurT0g1d&WbF8X?qb~u)E9xB{ZI~*KIjoU%n#i7
    z{ZCN|dhT69N0-|NI|ED=5iL5+&1Nk3wFNcS{_0)mqa$-YyD^KmSsqjEKBvnw35s(~
    zn+!HKm#HBtA{sf*TqB;t0wTf-oyhnmel?n097~#*XJrI`>{Ub}^S<5?@M9?F8h?eh
    zMDcz1?rTX5lMWT)3KzW>;}Xf1$Jpbq)BbyYbPut}CwtOB^R|5#5Uj{V7i>U;erK1%
    zv^2}z{(4F{%$QdnI45W>6ej(((D6piYrEIBZA($
    zfem{yZ&NyQwsKa%rAVFQ0%ezLu8!x$4)E(S#!IKSzcSgl9L*=Aq@S5{tz9C|gRc|5
    zFXp}@@tOW|zI|Cjj=k+q*IwoM*7@LN9z%@fTMXC9_T`(j*ry1e+enNB7=6zL;u>F)
    z6T)iwKgQv-A8d)Fs2G1Ih#KcF>oTU?Q*!SFWvM;wf>Jdz7S&m^1JaSa%1H*5@zl*f
    z?xdQs__jJY)JNv_MvINrW%RwN7^qa<7EtFj4J+pux4XZ8=dDM1@iRxsRfs8Pc=+Au);VHmInscEhnT;7ja9D1$OS3O
    zn7%lQ;rWK=lnma2o_G=2r!SDp-a~uVBR8XOOT0hU7^t8G4`VKf_Hz7$k=tC6@t~=d
    zhVG4`bbiW&`Qsh9sb_H4l}JQisi6qDSB;3=#;#mGV8c%RO|Tp%0UE0`k2iQfZ<>(dodtF_?qHxk=g
    zt6@9qA9=$cvMMJT&=-@d99lN(Nsjh#JRV#3jK{q8HnIKvWbm5;4L2)^uh7p
    zLWHvZ=UDz~rcsXTKQUVPnBr0KP&5q
    z6xSt@thcH@Y`3rm^Lx0jC8|yKqT(h7H#obcNA@<6fBc>McoZ
    zUBUTFWyE`t1w(WA!1~X6bPOEP7R4)PnRjaL^b|I$Gq+cN@-*LfJ~`4D2Fs
    z{ssq}d3k#d>}DO+%?bQB}LPfjuXfgdM52-L0^pzSbjuO**+
    zSHef)+_#Phl+RhL!VcP$WlL}HqxK<`yCKrEEz+E-f9FjEw;;*8X*`eV<~}l8;*tf9
    zF#dft9s9U;gV&d5S6~9TsQu*YQ~AXByrM
    z%E7Kow{2g+9#`74GhkkWo!H}S#=+8N+y%e+Tyt0Ni^t&%OdGd=Mk4R8MyPBKxK=37X7!{#>D!r1;
    zuE!GNHRCux{V3UIw)5D8EitOWnbOJ&sYpmFk3KIEXX1TOQ0lrGyFC(nNye!KSf2B6
    zPdTIG;6C}K7c07#E)#(|TP(C^Bk)VcS9O0h^L)53BfkY=BXyu;K{e!Z8Sv$+v)#Ef
    zCpW9E7#XJl8f?hnIO89sn?pSFZKW~Af+oW|)-~xapq>u=QL
    zHka&V*bS|$>DtG3dRRLxKj)~l5h(Pme)N0JQN(KAjG%Z5tR@xx1q;1&A+qtERf4?)
    zKa*0`8<+3RtXkyoug%~ei*~9#5QHC$_&GUBDe5+0Mx!tZEoH
    zN+0-fG$(=NjXG{%=BjZWI^$}HNlQOvH!6k8#aQ%C6uBTcja;%q6YmZbEL2dO{?;vm
    zX8tFIRU+usF>W#2se$phOW|v!sFFSr;n)@9ITs(RCAM75=_(YEDa1R!p~B5~al{?U
    z>$&^*df#yTo8h#spg?-V)!^;eTlslLmZ5oHr0Letic}nNet`m
    z)lT)swUhEpd+?<(1q9`#oVK~cvS8mrtMJaR(b#CmTEfO;eNirtUS(S0YiWlKU-mQL
    zA{CN*w@AULFko_RlGK`~&P1>XcZ90m0uN=LqQ?$jcKzpxdbcJcn5GgXB~}ru8J5bV
    zKSG;H6w9f97XOKXz%bb;!(xrxFMt#?F3CbFUCUSmcJP0L{|O4$ou%-}1k<2UT3LU9)^doeZ25PbWZ7ht>-rD&Th%I&5}XnyrjB}
    z9T(@+N2x2rNV)NJimvf`vlqRu#lh)*P?1W6MNR$HF7PZo;*bD0PIK~wT4nuexrH{L9hUq^0UaW~s#9b;Ta@Qi%MQJ4KH~pb};)_7Y!{C=@hU(EsD=c=iJ#EN(yL
    zE-`}2mp|Gkp;~(Kx{X9H?+J10Kd(!**{g0aowvCrZ#b>(>RpViDhl>04GQcR-hL%$
    z>UC;pTs-kOBokkDqD4M{VYW|srz*XvwWQb5>W$HAm@mPR%kG-lB`oyT=Jmegg5^w(uxwvRn}sp*z$uYQKZf3!!d<%x%d=N}|wB!eKu>jO;!`tnI1Zl}TwK
    zy0b0RW>HeXF0nR$=`9Kg*7#%vQvBgOO?+47%q50H1w!F4&`(*-gV8MUl%+D=sGRUf
    zPs^?;kY73Rz2Llj!4PK#RkzI6+pL()>NvH5Nmr3~cVx?`%+XwA=@{^y@gaBb1;tZ3
    z)l55=(H9n_D7IyfP$tnmF1Io1p54V*N?I60`13SiD))X$GQL&qQ+TAs=U=2IRv%{)
    z9Euzak=MaP_scH`rR*RsZcyW^Jw529(+5YbOCzQtY>V})
    z7(I!nv9axTCn
    z?keK}8-8KqMK{~Z{UY_FRo@+_WKr!(J3rvDSnGN`{=D;Dx&W7c1%W4k!#<-c26bcD
    zxS6cVr=_C0>n_LTZT;MM&1nq?Yb+gGS6!z+pC{}iQgft~!3@uB|MA!XeGdXUI|B5@
    zPFX{&iCR`|U!_@YM%4#zRpR$jz*JRpQB
    zqR7w1iFNKUpoooZXe#sXPJx6iQ1tf;Z+$#UUAYY&gOaJu6$y$lQ?|xJu0qmg)iAG2fPB(w+^^o-
    zh}Vd*b3qSULkTXEauuQ+rWWybua;hs?)|i;5kBNCABER-sj<3-9pg)#fjRq2rQ**e
    zkB483OE^b;`@F#Dy#b7n-A>*v<{JpN!{*dd=NC3OzQZQW%+hCQ(tuE}wk(x_&pMS3
    zJPUq$^$2=y20w6qF{sFK^bF>(ZcsfA1(+YVxcRNh$jX-U^I17@C%A5n8EWhP(b9h<
    zT!Pbi@A(H_c9UnNYH+1)cloC0_1vG#`wZkD<(>4*&$9N@Z|#gqko&R0|8ua{S-4r&
    zj0BVl==QGCWpO4;ux#n^6#RYMQqaq%UI@)Cj>I8;z$LWE1`+3Ss&-T&qL95@3-c>8
    z?&$o;ITg#WIqSNTrrSf#Jrv|8RyNx(X_Yu`9o<((p*ce*dxB?GvKbNyzC9LgI~vo)
    z-AQ{hX(`%vd(@H75wxn9c9hT!AvbT|`+rA}R>tEjUU*O6YS7VFLr1z_iTw_gWAf`y
    zX61n}8UE>U)m}ZPVC0WS!mQ5SF|;JP^DzudyX(Hj?9mSf5A6O_vNLAKP1{a4s-mwB
    zr0WOx0X5;q?W5QjbaZTO#*em*EA%oAIeY9d_MBD$kDc68U+P@d`TxY@6H
    z)?1M8SHrHjoe#`%_XV+`gr$BGecMtqhww@8QdPFlao3~}9VR`4YoXD$#@I!8!UhJt
    zX7A+y=^&2uO@-LSjwhXy_FFyNI;Z4b!JFR<*|lrQY&T%8f#c=&$$ogAd=kjwc!KP4
    zv-a(r@yAu;4&T{V)9u|0*Vj|O)si9w&C~~Qp`thDO3l0WVl?mf_}plM^;fV<13eIa
    z$2UEA9qot%F-U@ebHR8PG%~qeBVZn`J4+TdPb>zW8U|LYm-LJNsdaz{cXSarh_uS5201
    zYW(q193Px@lq8e6571dY8b_5%r=EiTAY!Jv;LQRW24PlXy%T4{$O=-|XLfTIO2^jTS9??C*Id965B+D*bxT@SL01YlGI(%M;^O8ei2q?<
    zOXoy}(;i90nVADVi@>hMr7k53O<7|#bGCvKnr{YaPR@Z@ODZai!l$?XWbTA-(1RD1
    zzi@0=aud^f%B(WO8N)el%5$VSOv3egj?DFpgS@7%L)ch2Qqu)O@vR$8L^3Aj?kqKl
    zfMOsqO3xINMZVa;1My`XXSHVYhZh8aI!VG870UpvQCz4?WkjPTf`cbd@>GO`c*#&(
    z;qmCL*e>6r3=TAgr4RsU0#GvZ3!{iE|zt@73Z`|1qkvdQ^#EeZ1Tu
    zLzP@oD`kg5X0#95^E8{}+nbhCmTn&&sm7on&Dh-=_<}n_uKcH`?tbP&F6g9I2lN%v
    zrFI1>1S#Rc?(H8}Z!>S8b>$}P(;=Kyb56JiGLaegK&-@ZSEvs6j;iC>(!o9TV9l)-
    z_dxn*M1?>XCM4cs>eL?^;y7v7DzGdvzo}UHs(76olBze9VexIdxf~cbKI0DF3~`Un
    zRlGh_EEb7eGd=c*K1s@|cnz{O%=KW1+Qf=H6dy0Q%r?!y#q$(7?(@F1${bAWzHE-z
    zo6M;DE^_$Y57wurI1iAy&C!^+Os^{J_FWfl-H!NEU
    z&f*`9<*!yp7tI_IztYo0(y4z7%{_mE(M}uUq;YxOPmQg(xIYDrJOplhJgu_6X&<}@
    zk17}8GG(wHoo^jp_(JAy=}oqZUSn)cB`Aft)}yS&$ZsHcqx1AtHcV_YykZ&$b$#P1l7;q{m?|6@(U!Gq@CcV>-bfRIXnr2y
    zSkya+&o}aCJjOJ{fg8<(yT=}l<
    zqmU5q;4%JKTgzhPs?6Wh^vm(ejQ!_?ngQjwj3@SU`$bX(pGRQr>yM%=uI-m50^2Vq
    zm>Xt0XD#t3(xj1BZ8b}Ch_3vsp
    z1jg%bmz-jkuT~la4WDlP9z`C12#Ofp`o4;@G8mGa9Q3P+niq|fF9@+7p?izAD(+Uv
    zd^Pgt@D1b`k>CuOd=YV6GP?`Jm#dC01X&L=4|$WxHhs!5Yp_|gYzv+4(rq>2XvWG93|p
    zGH+27GrX}cxUQK^okhd5tz8ow=A0?c2Y1EUW}wIx35R_6$p;r&(G*0mbQ_fVW1VY4
    zIxpi8=};0QF`Q!#M89cfh9->YKfX+pHNfnx)>QsN{4reLs122jKpOAr(76Vv;WJ
    z;IrdtgN%fEjrlpHC1z&whlvP9+;ZNYe4MKX3o3szzokdFTJq
    z@76XvY}=FZrBlT=e;XreUPkkdq(T_Ql1&qNxvweB{P<+-HFy~Og;N+!oMU5gz0RB&
    zV{TK{Hvvkn1P)|98KcX?S4(nYijdXWw$qoFU?l_&(d;;u14|m{*V17u5FpM`kX02~
    zSze~3fFBD#Xs2&RqBF#YGrcMl4X+)yd^+yev6%_qyEzFYhzp&Eau21BSTa@&`Sin}
    zNxZehSUf#)bgr@kXArBMu9t9{SWElD49u2+;P0>%8U2OS>ArBPnhxoWCqB39Om^)F
    z-W9Y**@wFlSgg8z*J48*T>`evXwtJXSS>
    zybHN$T8oZl2IkzcixV@utQ}B&motUY`XPat_1Ca1WxM^>V*{OJSd`+p_?^=eeXvvp
    z6zr`^y$#Ua^*R>zI9#K|tPJN$(h{6jAXQnSNCI5S+w|(rtP|$73S4AL--{FKty1wj
    zM-UcY@YpysRcOfB4;4$xz>MjX=S@dkb_hhae8ps3srL=-Ba#0~n=vq93LrCGhQkynmIrX(0~y>alQi>720XhF@?F
    z{Q%l_LegXnkRWublKt|z47}~#ohJn*pc1Ag!faam#HBcv9IlNal@8e{OK2tz#!oya
    zWT*Nj4T-$yTi2DB${XES94DjIg-hsqw|-qotCS^dCR=oVYG@Xew1fr83SatAp~)~3
    zMOaWC&$58m(lDoEIp6LXxWsjJuk6}u3>%Xqp&
    z*DXN=!IC~8S?E~Df@DN}jy{V#jK?lyx~=TnzkR$pb`pUIXk&9At?f*=V=dC9v0rw`)
    zqN_D#13#=I^pth}0RGs*8)Hc^`yQ%9#&`jLvnKf>^2DBZQE6|)<
    z4gO^`|0nnAM#MOv24^Sx-aiv*#q1-`z%gxjG4$0bXe5BVu~^FJk86zLLj6mzi}UTq
    zZ4mc*Lk*9M;~(Gkb>fw7y!48Uy1u=V`<0qe8Q=RNHpfkJ8Wjp330!wyG!_C8p3Vs-
    z(rW<+;?F!Cnrs1xvJj}ld!4jc`R*z`nl1sO!V4V_2aPpTXyy@ype+qzsi(a>3RC!y
    zYco@*C^3l$ZHIAaGzY4OvEO#478bw4O;vNsVvrP_e|Gk=LE}yXUv6rU)$`qdB;DS|
    zXyfs^#=eqJyUH_ZR;A3_AtLT9TU-vi#|Y6vVBde<%6Q)7c!_J#rKjF)!%Fkwoi?kY
    z(F(i4L5Sv>QG`8;k+}rsJ@p5N$;%p^nnnxNT{G~*l~!*}-u3!ieQrXIOxfFF9UG#C
    zSKK8yr>-v=dA6C~I~2diadTOw~1#901=qfLzy{Afujvr!&7U{^wtSN^%2#Iy=S
    zSSj(lI&$Zb0gPzG#2piEx20wflt~H}WMS3qmnV)wy)h~o8pro$((0?veT5jAwcSsN
    z$G`1D2K{mH!jjMC&#%5OyKNaN?!hfK`xParGI-3O5B_A`;J~HUkGa_En#2svVRf@i
    z92eh+CI%JISC?%Xh;0)xY&^oP7{fPpTlh=H>!Y~Ex3~iK23nKAsDNvceQHpLp%ajEl
    z_zO90bg$EO=!H~piB)0k2rBqV|tj}K?^hyQJQ5lhJwxC)R1)(l~>q7U*6*jJ;|;m
    zrp|)`FOr>RvgcuE-l{bkH-x@1ON_Q?AYmAD=YKGwlX|Xz}
    z39d8^CVSQ|1ciWIX@wCP#9;+UWx{q1pCV?Cz$=nGWA9588_PV&E?ulJ>CB_{tvoz$
    zG9zEU!s=sD&vq$*s$<+W7&MfeX^oyYHOFtF=ZQ}rc5YiSun@;XLT)z`FcEG{FRT9JAy;7iSI-C&TKJ4yFr${y_IiC|7n3@zxc7*xq9%^L7!EJ
    z-b`<3baIsVQR?-UgZ7^tu#pioQ6`6HD^3-qDM`I;?Xo0|x*(5nUrTmh#$naD)CBXc
    zeISjRL>sBBx-8YN6iuu_MRk*P9UN=9A^gfWaQ2Cj!RIsA>lyt5t##ZVYbdsj**xc3
    z?XgwnzA{pWV`Qi5=$=csq(kMpVyiC)!^rhao74=o6B1RD+^!4MdQ~LLNI(rT%G1KwbY!pL`m55oRb@IZ<=s6w36)qubkOO;^MrG`7
    z`KF2N8J0kv&?rTpb{dCkBYag(R;WUx*JGLdLbxeL+Sy)8-4Isbn{g^R!zI%1;ad#-
    zP#^IN1Dqf>zuuaf38ikgTkkdW3Qs}cXKhqyf*8M?6Cj^+LT+7+{>ZdaOX@SKOLmb|
    z4lp>F^(sEw`QF#m8y}(%KocIG)+Qw3wI=1?R4KX5BVIb0tD7ICrPbg=WNik2lJQj=
    zuB5a|q9#XNStyz!tewStjT=j)3ckolVRU4?x2XxrYYlB(Qzz}SFYW{Kp2BwmI$?!4yN`k1wesxc`yVIWYi_=F
    zm>RmwWAj;;zni30{N~7)Dj@$GXVtfJr?8Oiw=?Bn*oXO#AJ;?mj;bezP~x@Ist-r5
    zwb4O*;Xz;AF6a;0k7OJcz(oYv)a+(4Hg=rarJcz=jtnI@uI>um-&poYk}=cQzHE`I
    zpGdzYW}0_)`O}ZC4<+z*v7p6vFoek;flQgylzJnOYc*e<$InPm-YhY0Vlvnt-EM^qq9Mypu6udPhPtJEW*B1Krmx3HkL|lYD!3<{yzQ*WS*To&%M$nrA
    z>tk+r_{$J_bmlPrsRY|O&0Y0C`Y;k%FuCE`|*?cX;Dm
    z(CP?m+!F6X!jHys>b$GoGcooRyV+Vk_+38uZXwoJT!DZ
    zgC#zxKSZM^p6@N~xrI~t_A8K`&`ZI0L=r4ORhC*TQJFwJL3B6#Kd+r#bxpc|Zu_Fo
    zv16gVsj-Wq>6}%srqR;sh|zjN8fnXRBBc-7SHCi%#kTxGg#DaKTUtEGp7(H?Q-vDfWf{~YA{9$ro^
    zWF%~@%PEop?D(QpCJ91a;ko
    z5zeDyisyRa>=%CNEdyH|9fMu3d7HhiULd+TzaWN6DIGb8B_+6c;>sbkSnov*Gg2KX
    z@X849^8Nwr8(!wF(i`hZ@sop&1mcYKNUH)BQy4E5pkQ=m-<|dCOC|Rm;=9LjX~T<^
    ziPexiqA|A>4jv}HM*2~_U-WO%8Qx=1(YbVvd>CD@aOylr;3uIRpXqLTH)sbFOtrB-
    zj#lqs5}JtXZtw`e0{G7^VrQ>5!R%+`1bq1i4RtJ5c=
    zH9e7*52~WJN2F~2VWExms|1op9E9Bdc{~-@9+Iw(<-XS_CZm8ionKAvoN|W^k!o0s_V)Sd
    zyqRK#9@ohB$gnm+t3N}C#8+qNI*I9eSMMmf{Td$O>#}z#=Bbj1Mr;gN388En)PC~2
    zQEHDonx?rh168n61ffC9oP7g%nN^bYrmlkPFpa-A?P`=!=d9`_?2Ufc(=6z0=?}IV#MdUNEm!CX=H9Y7XV$cntO$;uNmjTC
    zd7?5yO09R=a{Ccl&GQS^_76ovl&BJponE#Q78oro$h_Jpp$4J}%gfz7js*(Vo0wOF
    zf{kM5sd6Z#Yw5rL!vOUu&8W(sRnN|0Xw|`4E!qZMR|!Kk9g_f;f`*Op<=th2c0JAr
    z!if
    zqaRtgHKHxfQCGs!pnK&=)iaz4$ndTtpZSiH%&-y=mG&+%#be;r9dUI=jQl#SYHOnO
    z%nC)qEFv2&bb03$t@_DD&k{Wl1dx&t^LFQL26z8#yN);GCIEjo^$Ns_$_yRLz*VWOwmf5l;1~gD}o$kLz2w%`|14_AC=je5&4j88Kr8k-pg3Qt}YB
    z4q=5e!=90GeShScSo#r@pmsW=s*5XXZrC$7*;`jgEaYGgbHlXA1)fKG>Ad6yb$cBqtV~U?h4ifj)@J1A?-J01izgHFYus%!U4@zx@Ce(MEzOJ|1Lr&Kb
    zG>;|sh7}&<@mf4?_{Ph5B-JMRyvJFJ4ShZ}q?)WpGc7erX=Fb1vyt47niMD9-SlzY
    z)jC+P>}O&bPASdu7<36+;xBQ5acS*Ts7d4eY&Lk7|Q03UwW*?h-)(BTbw418%(Z#@ls;T}|
    z2WfyO-p-EHe>yBkZWByGKWaA%od;j&QoR5N?c*A2hf@QWV<&Ecx{;18mjyB~V;%Hy
    zynN?1u?Qbz6nYd(39-TKZMezx<
    zAfmH)%O|%0H=(g*Kn+Tw*Sb0wf^NcUn@VN<{GBEmCq|`b*VKj8VBoP5868v3b2(4f
    zrN=jM(8cTKZjz^!hyb>?>?K!xfa@~T?@mNV>z8f&x+_SiOLz?vYJ0PBMM1@9`e$~{
    zhu$3n;9p{xrDGEOi@Bix9Jc7Pf5g!7jR~npGuy_AM^v=0x4|=q`5KTKzUQ`OMHhV1
    zb%7;2!_k?QUR@oB+rq^0IWcej&HGddDO!C39F@rwKEe
    zxj$~+L%
    zy&>l|soOA-atCj&0lwHW^x7C7uz6L#VqWJH;bys+bHbonk!B4T0nhSCO(xNKodwt#
    z{-N+!Rh)aVwxx}UYRaC0kSOGF8x_KEJWsRRd1L6f#)MQc3TJF4tnKx$QJQ?QVH(Ee
    zh34%3v1dJHFeYGIyc+;d!7mtXOWoFO{s}g+jwV*Yn>E5CafwE+j1Fs+Ctbv03_n)H
    z(468mpv`C1Ea>xa_6IFj+ZFl;D&LEvkMtnE8H?U7}jk
    zrHdd~q$HKQFOWAN$If7R4P&)GU)&tvw=Lsn7r$E#gEe8EW
    ztl^u#3B2p++^t&0n!&u6;F;;@;z6^mRU%8B!3u+JTrg9JmX%8VXXLopQrRM&#F*c%aP*QPlT#{Hd!5ngS=K>Q12InPN-Cu%nvN76X{h+DQ`L!+%`b^`s
    z&NE=uXPEOfeeb&NQ~lyOUM-g%Dr!;JLHw8`B40oA+1}eW@$c8rY?P|@=soqA(|zJ;9Xs5MZ5qF
    z5J#U8XC_$&;W9demiO+saB(GYza99?t>PP&9nrZWzkPx;c{5iAp-|Ntl$h&}8iY=qjg%?_D%&uO9}3<1@Ce;tu~8AdqqoO`2?UrGNo(x`Ctaw@WPB-{*m33x
    z1E-)LwX0zePU}{n3g?SajiK`3wNNqHxb_H2Dg{0YUr8SJUS3{pXf1lH{i=5}f6uK|
    znbe_OJ;AGCgL-L0IykhhPxnZAiIk+CChZVf@eK2RkfPfTrV@oq*ZO2+l837bi^(7v
    z7Zpm|(`<;D;S8CbBmRLaJn20?8)Ek71hhmsVU*M)j~F2-*3;1mY9r-T^RB+tNG(ef5(+NkQ?)45!o)}oD*_q4(tLSO1cZ`jYm
    zjC{W_(YFR^R^&s=rXU*^B;m+`cEQxz1UULY?ZxnT*Y1s`9-gVerK#K^R-xNqa50*I
    z2=(@gf943n(aI9S`={t6i#?Ui(^q_
    zauXY35P4l9lwk!a13!U4KOVRM2rRS*5lH?n^V0{(#E;$ujs~(trGW2>bSvmbZoBgq
    zW*;orb>4T|fu(QQk*6NA-CKxSe$OsDd+LaF9e|j#Yb5xtknOJDMouD0+o738NO4utH6oGEWTu7cpk|z(g^dM}0$V583RR5B(BW
    zHwEBe#vbe=lwyv)MhQ~V1a66O>mzwoZff2_gI+i*xTv|~7U^UDr2&#+ky4=>j)2!f
    z_(KeU>?ImoI$}V~pCS1-B3XebZTfxRbb-e3mN8+>$j_K09e}Pvh=`Z=UCo|r93TAk1|{09xNn9
    zn+r}^I)XDD=@Bi5`B`FBV9e$N^Kde7Q{)K5n;Mdy{GpzLOh5gW%d=RBLxsFlB;F~(ae`3?g{g?KlhYfJy=KQg#Qdvumk~v1*}EI
    z;kZXE7(OuR{8>_TE}4JWXZwDA&URmWoqgvozGCmV<4#n-0P66dJ$dR7`kGby
    z01?J>(^Eu`FQAm&V~dES1*~|F9C+5=de=LxOdQjpgU4-rd>4+5Bla+yO#yDJD>-bR
    z`1wykuEa%LC@!G5OC4wf%Z2WF4Ojlz1B*BliB+y>C4dnJqo07rg9$ZF4wN(=uT@Oj
    z(sKmSKE}}?#{rwujsqA(8ikN>oyUa^H+syOooZfwvn#ED_bp|!&QO@%Y+`F
    z^|km8bVK6~Ugl&=+HqZz2vwGo(jA
    z#}dWACy27MIgRLqcdEYjHGahq$+Q_j8J^FB9_H?h*She#*|FRtPPk_2Bpe(1lK%R<
    zE#%MOh!K(UAdWg{TifMd$`5x4dBZ8rWZZ?$`uAGh6Cj=)7KCTgB2
    z?nOHQM{?)Se8?U@anfc^%-Xy6+-m)#@+_hVKXzu)owkaeBSn7aT7_}
    z58MCtOP|4UNa-_M8TMN=;{uAi)ZR9*wEE_?{rk@zSOg^Nxt5k0TP}F5!nYXx2Fg^N
    zu5#pxZJ-D6;fz;9ms26VLJUW*2JC+x(`W#qtfPqSCUfb_kPD^fm=6%aH0>!m(aLM2ket}Mov(V*?)l-Pwuww{VeZ+3D|&+Z
    zGfWXM2eDL9?j|-8@%*lvNu7W-?13Ye!uvFcMJA6qWrov|o
    zS_dHyWR6lgnIvM_!(H2~I-Ry*04M;s6%zQqBuMAr
    zCFgE0Gf>uuswRMN5gk@zjW{V{ePX$J@&TiEhr{vC;!#Y%ULNAhKe%(Vjb5<}4ku%$?|$5Rj;HJzl%j(x4ZHU$k8R()!8T4{_9o|T3gF7k
    zEnD@>l2vCg1LI-bMf!<;JcHLTxi1r)-30s+=yV1N)LaUlAauZQC(q%@jNWH^nka9q
    zbIl2Iu8=WqrTcNFBS9yGGu#4P!l`NWREseitZuaNz_^{g=^)Y0B%WGGkwP?YOW2W@
    zNJH72WZDyyxoKj%!ei)vHj*P3E7d;lAW5*I_Bhkfo?a{2wNK#oPk#`)Xvv9?<#&5+
    z(`RqDZ!AA*Go*C*;EoA&NFn>%FMq?f@4n9Zw=%CaJ~AgyPTQaT>HoAFZ+n|FW8}Vl
    zc<&;*;UNge)q&f8j%hpgxv%{E(ghTEsoia0c~K|5CY%54f#v0TX+5x%u{M$U6h9Ki
    zB)Ec61CaqW2#z%+EHK!Hu+E^fK&}sCVqU|GR8DZ1qrQB`vdvi9iYlztK3=jZX
    zJeVdJ(a5MbiPF2r&J8j}ioasF5~mcvi}xVUUJrHJ%I_YucQ6A$l>E7ijVXINdCn&H
    z;O(+6W<6JKw3$Z^m>2Qtr}3PgNB8r{*>g62?F~-Y#I^gc#oV2M<7~|t$nkNmJXD#>@PenR9Q_iQntcQ+R`p}7H{%d8Ib4bmc@xE}=2ZsgoB&KeJ}cfJ
    zj&`KKjOB4{pF3%5Dds1N;4#Z(xg4PZOK=v10C=98v^*A)PNo~lp>JA=SFCSuAF~b+
    zd5mw&S5BbkL05C@6&nF0ynJ!eJ92#5o_pl9jmI~_;gF>tz-SJ~ZSRgPwgqmWcy7U_
    zX69@apP>HokQL+1bU9YF@lDL&NP_e#dZRQZ@Fl#V_wD~6={Yg^2MUN)t2j6kW`Vmv
    zy-faM`eX$01{|{EWD@-DQx90rP#zPNzmE_I|0EYJ7PYq$0j0W5BJ
    ztp^yb>nDY#CpOJ#Yx_
    zhM5d@-Gs?oZIgQrF<6L-RX}Qz)CpmH_j{OIDTi;%W)e(Ik=13j3qK{MNU4*Is*nC`
    zpx^SsO;&J%%g`60PI9~;;td3nz!6#U=#w0xT__i!z6fCqA^e0A_(ZV}Umk&q6y?gf
    z^L%ju#a-&i`s2@^*;B4Rc}C%9foz5?_Io#gBnSEp^FqRFhMzSR`61uSMYfF?+kcnr=Yge9yG)BMGX
    zQf|=N^QY(~oL{H?PN6&7<+bmDpLn@xZ$0QVlZubAa~Y#77^feNNvv
    zoktGxprlPF9PrKYq{n?$_M2e)+@C+TGI5qP-rQ~P{~H;T$}xFe32xk$Nq9gc#E
    zD=Cz}=qw~YaR>7VxDfwDw0eXBp27~NK;R
    zMSbFv*D$SB_sP=66SST|d2+ZN<&Ts?JZE
    zOc8Af4oASJXFqE37H~Lcyzoz*ccNfa^_G54P!PCbxKVSK<%?<6Z=Efp8!cO>Wg9ht}U$dhw~A*=~_PNtU7uSrsJVr)rTlS5Mxsu6&wy)7Ds?kmC^`l=|l7p*r=$rGO26L
    zUC8d?rPYt(Ag^V5KJhn`Cq+W9;vIOGLEx4KZ5K7WO-)X98ti9Hhk(2{F(
    zj&p>+x{o*lDTn#Oi{P~5d=clN`vMExlO>0oFF(~nx1zGv*+eu~q3Q~vm4L;kNv9=h
    zQK!JC3b6P=7%$r`c)-+4^BfwcBClLhM&~y`>Z3Ub>GXTG2YTbyqDKutVxO
    zv^P%sffmkJ!*q}vaI(ZbkE~>BEPutz={|ZEuOs%cm-X`)<$#VZzp%~u6*wO0eHyw>
    zCU+VoPKH45R-Nw2+I+b}{jH)lxNp>5>PfV}U0&-RXakEgt{n1(P&DZE(eTfCxV
    zioj0R?>fX8;v(s9RCL(63eQ-KB#!uotB3<0=dp%qWdRZhT8(nVBY;hSBXhYco@vr`
    z-BY?C4|QDtF4`=GsEAn4pu1^;cX4wLM<>OT3T+a|NYA8cHB^tY8}Mo=V5B3WFX3RM
    zn00_v$`OimE6zhWf9NBuYI0B%!l+HHqQ=vQoEzp|O@L9nig-IIvDHtqs0D)lk&
    zU;ToG9>cBn{5@O8b)a2duO9e`2Nn%z0g8Saff{Za`$P!wPrxE2D+5}@sN*bkjY@01
    zb-qJ#I>t3FsGweT2+%p(`J?Vu?YdSws8?oW);#CG;5z1*w*@$?OK;&QEOk%*i-g79
    zw31?Z@Oi;R%{~E(GV!-q5jHqicd9Cj8U!W!c0f+av^eI_uo^9N;6K!Q{;^Ql^3M@<
    zw4du+&!+YBz@pRnskENBC9ViHn!1ttN^+PE>P#L$RkgOyFWKQ(ndEuc>H$E==?Rp^
    zT%%_cpn{Hi4vhBvbSAbW6hKlgI}d%KQnp{Iw5nZq)M*&os<~ZWj~=+B^42kJGPw1n
    zmL)+t2`!z-VD`C_IbE!AErp&lv@V<`qWn>=y>P+nw4x|ySufn8b}45|1gEPPA9K%n
    zvn|zT1sZCWNwrz)njFrZI`s8y@A`MEnJqi;ymgC?>F4&Z+Nobl9BPdR_nh@(Ykj}#
    z{A@Ohb*UAltb6F$REOqQ*0buK?ltlQa;HjNzwWl_VoP^k=k;yUeRL1CL;b5`D%!7m
    zy7#(Ry_Y&BTGI2o#icE`{p;tEcK2ziepNeOZP7D{7By3;`d0UM@1wfiwz>VI{?G)3
    z?)J;w|B}GsUgQo4ZM*AQUaGi6y1o(a`WrFuFV#NxS=1JFmbTTA8o+TTSO2F_*7u|P
    zJQ^$-bg#w0yI3E%gVMckiYankaM55D@wu}Ly7jo%XsP0!r-7YJCf(DVrCYD+(a)Wz
    zU1P{4YCWTpcxh%$)v0S#=a2I2>N}mQckdFDu6OUNI$XlnJvBCTFZUT=(Aa;(hVG;K
    z)dsg8RE-P9Zk6lXp#D@}y!agV+#h%8KC643fJ67tv+F+U7p?0&^^@9iDNu7cTDQ)Z
    zU8*8=s+Ou;>niRIb<B}!7RYTQax6#_CW0$+=dDMAopI)q`yL~$J|djA?XD%z(uYAon{fr{2MOi`jD
    zqIaJ`??v^gs6IWnj_Fxdr`n*Udye+&cd4Q===PuLbc;I{)K>Sn?xA&kaCGjEQomc@
    zD=qa5s#ia^s9wE4J-?n+&+fL(eP*{`+-v@^%NIX`?xSZ^{d#u27tw+MMSZ1y(K~kE
    z;Va$uk{pX3%6)jv{6^1AdogrTvtzOQv$V?aLiv+NbvDd9>6|ZP&KyUjJ;`r?I=9_%Bxf
    zD;?8w={{~fE;#F6>KEN##eJ6bZCJnlO7&lAzk3heM?aSy*VDb~a5-SNAGA;Hex-6r
    zV9|x@M0LC?S1vOd_%HtAFWNW1`OOO*@=7;QL)Ccw?z!h4=d`!K{q4>`&|px#m$Rrd
    zKk|`}*x&rk-#E?a@9(!i{nJ0ScfIRf7hdM&Y~PQ1Z@r`6{LSCA-}KA9EF(P17n?-a|a*7*sIjoD`
    zedCsvfsa_g#o?U8TAE
    zj&+{E#J#Wj$i42x_k7+Q^5P@sx82IzuYfJhaPh7tgnK$zy9^Fn+D~@I_@$w^<{6V{?$)hq<;G9>N)=Z_U;2}uc}HI
    z@TCL@2`!<6By>X!MQk8AmVb#jzfz=#0Rsw1v5O4|I##fuQX(Y+Iyx2@6;N>&%%J{u
    zDT9Sx0uq6M)X?Vq``I7+^))MB^35a=hVR>J-S^&m?m4@iefHU>-23YJs`r^^!9|p)
    zfzgu&sPQw#>eVz7>GE(Y`0?!PU;lbWA|L$V2QvbxJZ$PKU-?Qp7Lf;eH0rW9Myw$#
    z|J&dGwtM^A-`;J$`Q{l(uqV%E&z_w+a6goYO|SolKm4Kl_{Tq
    zLwuCofBy5IPhF@B4tuS&;$IVjcI6+;sldHJ$D(i{Qh*UqJg;5eOZs4dN#)@wMwFB8
    zSln>&#TRD}R~72axIgu&Pj%zRk6+yE4T(OUh5n!%4IOhbPc^7R##lU*ZJ48St%t{p
    zLu7FG-FIhWb^gp}KGU6b)>-Lr*wxQ}{`2m~KmKt#cg{qa9d_8E+i=4Tv(f+J7r)55
    zLKCjjPd~l;#3w${b0qAHL#^d!Ho73->^MZ_3N#)x*ei#K55Q@@@s05(^ugP%yY5=q
    z7wSxR)jsN)F45*-0Edgu;z@qjivnusSq{Zny-64S(uK6$cH1rMl6`?HHy96pi@^rT
    zQO=+qBMN@`%U`CG>1T+*K$+u?J1&Ly9CHk3=bd-XXVR)123=#g6q!ikhw_vw;p77)
    zTp570Dk}{*S3br8SK%omg72Jj&dK~`Joo|Uop)ZI>)uV3gR5{$haU(T`zu^}@rb{Y
    zSzhJcmwd&yeDHuuEBw+tR|Yt99`Mk8l_QHV9cWx=Rhi!k&A*+1wxt7Oufqc>&
    z@Osv-3%nG5co-w+!AWxf9QFr3@PVYK+#Pq^(Oq%H6{$b`>!INmC9JvTn%(C<_qp!F
    zAO3Lm)`m3Gr%&(p+;h)lhcmeH$}79CeeG+h12UtnQF;c-9`k09A2K-bUXEB#eZd76
    zbeCLmNjkbue)5w!gj4_W9B{w^X~%R__MumYhmQJfp!8nn(%ankc=e3@a2nQ@enl@p
    zyHXAf`8@~4L)D|SvOV~UAJ+hmvMGA=+%wljpChZXbP6|m4)i?lr?@@XvQKlB!qY9+fwr+cXXv(J{yz5=>$`Bq-(SycHmkxZ<6Pe9psD~YQ+%b96xL^F@7k6i#
    zd1mI}wD2Y`TKI>9j-&&)lymPI{>pUh!
    z@D@$Dci(;Y?u9RWVdAAl{n8h*!_T(4(8kQp7*?_OhE|NUjFizw`hpH{Go)rjz-kN7+NT(vbSgmEtH=)!eBBz
    zDk*uWOcClO&oQCcVjSDTAQB%r@NmsF*JRdEY!zuQc)<%=G@Q(L)KN!edGdyn=<$ZH
    z=w-4D+UQ1an`JyxzGRI`%5>$!K(Y+pl_T@ZUiPwlPCwCbl3ta;=h
    z=8Xx@77n*foH(&pCsl_2V!Yhbt#X%NetFwulTCWEpoK?r;WwOR3qwmfbc{E;1+J@Z
    z<%vn}w$n~KCEqato3hITsti734y%RZYSB^Tv*=9Pt6uf0tYh@buA-C3=g!jLqT8Yo
    zQE>9_nIod4Che84d}TZL+;g++f_`H7m3pgsz3j5fQl@YSSycV26Z)WY`J(e^ciwqt
    zd*?gfnfLS?^EB;@GtOx1tg}w9&hVrjBU)?WIC|;Px#YF9a9%B(M(Rg?5Kbxah67LA
    zEM7d9_s~NRO`9uwQfK%hcXSeehYLRCqT}e%k70gZ;~NjrIj4;B7OrZ~&f1vtse%;5yOz4zWbqZQ@#*t}~fC3|$DxDVy`!b#Cj7)h>T;K2&SX7LB)Ja#Cl6A~AM
    zK_@R!k@*a-CiJ$Af9kV3c2>+4RK$S(D_-%6vjfBa+0si)WL>4C1l{`!nUM1PJ66DFiw
    zA|S&DdQo00pIe+w{AN6SQ#-f!ljus(ori%_@d9l~a
    zDoe%~hUN2U#4T1KvNwtfPrMO=w=lMRuBXvs!+B{$X`(H?>@K_P0#(BszVt*nZJJM1P#Y(tF6|HTB`S~d=<^O7qN&u9Qe^whl5UC#EMFb4x+vEr7z8h#Wg*U
    zS2^j@D$*(ZMUS3=``5khb(uewu3I?uO!u>ML@RV0%h^f0_h66<^%KLXlrb7kMx8M%
    zOTHAr-=F^Ur^HJ~jNDe(a-G;Mi@K#y8q6uQ3PK)7I@7X^4
    z?33y2cUnZR+5p=S*#UAFJ$1qsMK6F|A9&z_S%&S#@Ga{XkLtSUJI5q==2vdUj2S)t
    z*ujlA-YB`nuqY!UJir$nd8Sv}QWw?s^TAv{PyMn%NHRZo^PAtCJpm7`$BiLLF13a7
    zGm=o&L~00;ygHgkf3L+=sC|KFm+)S>OQ5M>yV9#G!{Gmpvvx
    zd3fo<+y=h%eCAZ#ZJ5IHTbte!A|*-+xVBy{PW0k#{7J*t{Pern9ScJvAS0%5KxhJJ92BO3Gj<@Xw3&%e1muh;z`bjepfT=E
    z!!|jpGJrE&6n)!mw`Itv4CAn@EQBnDndFp*lI@wWx&f3gIt))fmF&8fIHR{r$AXTA
    zB0s}ru;2aecXQ)cjN!8!xq&?RqXTDpu;Nk13@6%Xkx{vgHrgn|S!Gl*eK8DWl&@i#
    z=lCOM>7twpx`rhh4`X6lrXLxRhbNpfOiiWB2I#af1Dh?ipIilbH{`bj)e0qQw*5xiz
    zs}9P*3qQJ^yLU}DXgkQ{9$k(EphHg2=?E_6fV{P1+H-orBc42?J9N;SIB{Y|6eT--
    z(MjdE0;kcH14Bz*=i;pllVgjC?p#4rA36|a)sgW%{*{%VOnP1o3r+Jwc=O!B4mc%p
    z%FpT2FF<$WjWSM9#nq#E3IsYJm}F6S)9oY%)Y_i(^xm539^gL`!GOy06rwBRee
    z?(wf(fYL$Poo8sHNA|&Bp&bh%7$p$mghCX!mR<(vx(rI1d{z0FBw#UH>2R2w5~=}{
    zP?m)&QgH?pqHGzI@{~iN1^5K^RJc|V@KYX87I;=^u1#K=eCwBuEHOsTG-VhMe4;C|
    zfr(*g(uA)u-;rq=u%VJh2Okg)SH;s0ni?P=lTcZO0{H07q%H?ZPFv&+V>~OvkdBXj
    z{Yzt=C$Zv{XkfXJf9^?F^gO8#~kDQ4#pj@RDKV)&BPZ#Jg>Mgd|BFoJEQ@AVL
    z((bj_UYmG1Ag@@Mq$EQ*MsmX|V#Nb_G)$dI*;Umc2T^udH0E{2FFYlOM)-v!Y5?JqkL9lR5so=F&FA`0nriv}6wci_z--5JgWfrf-WdF9uL3>!~7?X(=8!h?S@
    zi)73f&;@;whw}ksCpUh|w#v!Oj|ccQtSX~(tKNDrr_zs)ec(?W(mi}t*Yb&Sq~nEc
    zl|0VUFO8K>*Co4%2uQ0u_84&vhEnu{KRR=5_0cMmR~vLNsOZHJWg%XZ9n%^I)*hjzy)EAt8czoiRbl1ObG>jLMKkF!#;`sIu@W
    zr;-V$avY3aBVvT!6|reaFMH5I2W1a#lCdgA*)n?cTnnc)$TB#Up@*heV_g*&`)6`a
    z#aLPy6>5xXnG}>P8W!126f+J(CgoKqd4!yJ1`HHGfa9y^MFTQ_qt_uPnN^@`?sP9;{4
    zl6N?~_{!PfiHrcwejS-t!7Co=MO~9sz331vA@35M06OXdZ5=bcu))~dlgr|8OJld{
    z8o%to+vCdN(R1a|=hVx&pod@QK_Qr2BoGdQ_vjrq_(U(0xP!SKjff6%Nv!hLgHT{D
    zzlH}+93fPT?ccqnxtO@hO>m*`-t$myiw2TQtTA+GG3HEkp@81fs06q}5xGPd;bCr0
    zQ`QEzP-y1GKZu?%&k<$h@?j`B=|uy}^!^QNv9~0j$rF{9*J0Foj%X(HM+LQrlybQi
    z&8Vc_k}w^}A5JLKqTyy4yg0}a^GS(M-Y}lLE**rU%%#LE6hAQum(THn&$$7Pk|!dx
    zd`x~D&cdJ*KiuI=6OX*ni?uM;T#`#zVNRc8*?3vcdNTIg
    z?O^3&>wT6{-jX>8C*8{q4_ok@O*`9UX(O9Wa;4+w|b57N9kp6@Y6dU)!Y1F
    zq32k5u^^b9P48mcu^z*?mlp*gXr6grJ*DtX8qdtr3&HeI?ro=z%E)_@a>~GO#{Flp
    zlx%z*3dpdX*A`Kj7`3!!Om72``3X46s}^pdzGo&Dtpr(qH9Qhsgp!g+{JFLf%qoe<
    zNTeh5u39*v}w7eTQ4AtHFP`p;DhtE
    z0uhm+hKNQ4g$DWD+XimjZ_^+U$-o~wSo2kWdc!lFn`FeViB@#l1%(vQP2m@Pda`{%^oI_d+OGGy*fRR$f(s40fA=LJLh9?QH6&MVElhX#va
    zg;IngKtCAH2;t?cXB1BGQiSpZ0A)1tI|#1Al%-H-3YXt=Y2{3cE+2=fQF7#ONBoY=gZS2HFX$JjbL%Ejul{u`F*no6g}j
    zthZuHNBAKZIp8km;5=i-jMOW9c64)6=xDnDF8Az;Y?sDR9}V`V<1pP&?WcIkg8e^X
    zEDH_6cn&p!STBSR#uBeI;2aF+kqPk=3dqn--l*WbhYPruAB3XwEUo|Eb}vtRv1ENgFh-G^BTSYJQg3Wqj%3xGYmR+mdX=Gl6(jw@q-t*oQpqY
    zLE*)ZuvVVp!*je;nUYt!>%!r_K;Ftv?ve#=`Rf_ELD9l<;j28Jqa%-_WRQ;E;)g!)
    z4U~na^qYxK{>&?_|M}e4XwIul(JnsK5$M;6JS9)zEq?2ML1#F~r5@+THNUdObDjIk
    z7Oz#F?xNGk+tQ6Be!vgV
    zOBGLWSANfGSRjx5c=a59bm&kz+?A*FK}P%*9cOfavha8g2MD9i^Ps(1J{|a>S0G}6
    z!y(!LcylccuEI;dpz4Q>$m0x3KlmCdz)co%i7r6NGd~=3fw$5P9`FswM$ghb#}}SN
    zzI5u^QT8XY5g~{m?A0l-l2|e-2b|HxW66m|*)2KnA+2;wK2rh86_2H}(ruN)t5qd=
    zO&ut!47*Y%@Om~F{B3+NSdJm2_Y=T?F&*e1qpEnI;eayCyonz;3J)Bh%H&P_6khj?
    zzo2mTm!G?=yk(G8t}29q78H&$R0@<2zba9vDNTi#$G}HbdR11POOC=_^o8;TXcx^Y
    zr&7^F*K>w0O?mg8xtHH{l`nbvbu%wLR6ac5kz8;y){>L1i?_m8{MUWSQ0Jd9=IEr7c6-yZC>Z%0j;{Oe8o@k
    z*Z;g$$>LC<
    zdKPB}qnvbSbQz0#*LrtOyUNWE_ky0`8J=p4@=HUP?DI0P1>s!O&+$WUI-R?I`Wwlj
    zru%f^Q}5MiU7J|7aZ!h230Om}h=T3W2VfIre@_>$L!~q99Seh1IaNU#8K_1py&77b
    zOS#pf!y$su2<54UI(PmmH}|>Uu&PY)fqqTuR=(nGZan{!d%Twutwu@~j-_<+Kf$}G
    z$_%A`78R|c2wf1S|E1409t~AxiUiyn8faYA
    zus9IF0HljZfO5(>SC6A{x@Qc|LjiOc3Mk_d?n*<;Faf@bUhsgY;%g{02FqjqhU{bp
    zc<$$CuyRjVI$rQJzxsK)czLSmRGq6|b;_2=tDZ$@(&V9svORXTDC+;Il4;mSEGkO{
    zIcvNcu?Af|f-~b*$u)*m>GF$Es?s?foq2*r_lLm@`pvj+%q8zeJD1p!Ftt9<
    zoE2Vt{2Cs3oqes|<|+AVCVvprLrS*E&u2c%ap9v3`uAfCoV{ze%P9#aI_kyws^-{8X#MprvJY9
    zsC0Ba|NKc`?B1~dl$7tW#|P4uSTg2uV)*ySqmOrU9vR^2fd}Iw&yU3?E~3yAF?v+C
    z4(YC|yfTi;2ao4>&yK(4c(UB%PsHmPeK_v<>%BeRADR=iLKhD|GADI`ckAO|4chCk_~dtG@<@G{5%{+JbJm&-JN&cneXP*
    zoP&2dyv!B7MSe?kyKT42p^k61c+K48sm~aA>C4yI>z$SpPCQ}YeTtXt+@1fg=jYeR
    z43T_=&b}A_|Lco!jOEcVQm?u*7VmjP&ylQKsqv{y-%5!M``wu3V;@8CdH(t5_g)C}
    z$q0KK7^Cm^!ePT+eKxU%N#13d5$}fhCa}C-DD-{^T1zZ7u;QXD(&(i|9P&
    zk_OD<{PVw?FG|`m3@;q@lAAETKDBATg`u0drU~({07oDFo|H$PhaQ@fFH!oIFWnhN
    z`d7hiw%t1Oth~~|rorp3zb@a4@reQWd@8|GsA0rnIput`My>K1mSyRvx!XJLIrKTl9==<4red6E|2t(>I;;+_wIP8?=as
    z+Vfu+ufYf1=;_*4leccmj~$cO(QCHoJ=?|q_T#qFDl50>9TShd7ya-DZPnFRYtcKm
    z=rP-*%{S}eo3Q@Gw)VQ~B<>gQv}23jGRrA5Zq@NEqMM|%!b&T)6<1!VMKqN3(As#D
    z=e9!*eQQq#5p}ePHkvcKd+)PfTXLyUZS^(QYLmCwu8kYNTDYJk+Z9*-XXc4$B-1z9
    zbW$6;!b)xYs;jpZR$RF)v+U@$<4!xbd;c2mQ3amY@4atZYUyR#8f&iIHhu19iD$Xd
    zV_HOhjofs9!9^FQF6r>On@wtKthHuaW&F5y@~Nk!Ug(tGx7~ib7LjAyaN~_q9(q6P
    zD>IUgJl{G0ysXD{*LzN*clD%BZ~OD@DL1{+QA8(srqAzP@clMsg|Vq)x}tK;>llX-~9HsQpd`!x%OIlt$x|VxnKKgNIpD4&o!)}8u;vc?@7bt
    zST@>Z<96$9GxPqh_utpH-{E;_%nVS&KI-jnOT%ZF$~%sH+fnI6>YjmX0F3dNq?@Brv-;FollzH$E&syuO-M;XpFJ{^{+iu@>-(#=FLBLz*2OpZ#
    zF1hqS(y5$$%4q}TAA6$ByzS3z%-9v%kw?8f^UA;FR+HPPWtMC2J^KBbFNQhoL&qGK
    z4v5pb^xrQ_hco@lXY`!WtiRmV)>?brHud0xvdqleZ%d~U!@qX@jW?vDp)dFNEoZ>7
    z#Beb4l&(1sb>u#Vh1tM&`^VR`zuXls&qdl@v+r)>S6j7lz*R>5)O8GF)2ZkLZkc&&
    zrhESKSH7Zg#;1LGdZy`YIA+cUzshlZ+ibUOIxYA(EIf03oZWDRVeeS(dtjhPEd$h3
    z9dXo=X~<=K2Tpxc8n-+#N7445^2T&N?is&)9EL_L3aD}nS??vy!4Wx&QnuJ?%WMQ?
    zjD`F5JN}%#<-cF{AFX)1=DKU_T?If?$s2!&r>7#=iJ}6M5)yXDh25Rl1&S?YHzp>E
    z-3o|;MF`Rj64Fu<(zQ$N|2J=TS46xs@c!Jnv+tXoH*fNr-^_e7Z)RR}#>xl5CI!#q
    zyBqh`jbC@rJ|%pX{J?;5TN*CC(bc3dNyc~2ooN;iBs@37HjQuy3!m<|e6zH_ee?k9
    zES`sW&m)TRsS~$8sa*FiHtW4%qVutO+m}iOZh3@8r`SH=S?1%4xMnTG#*NhJ)=aYT
    zg>|DfbB;fWFb>$&AW-S%*m3>yT{dNH==I2AT6-(=-CCSTg@G53xtFNF=(0gwX75(_
    zDOlG!e(ba)lh7fPPP7?tVx`aahKuTZa*gtLjk`W9#WLa6GmaNd=e>G)(41{!bWH+Z
    zUr%!56&^ceFm_PEq1VTjnx9|uw9keoIUS2f^|kEaxVH0VH?7~)LavOmzZ7F_T6TVc
    zjIBgjpHsGa9;vhU{_$|_T?wOcuRZr1y6eAk*X`u;-J5!4n|5((ueEXa>};({Q`PQy
    ze&gC%MaL&bnTVGh@l3w(w1Ldxo=bZ5x+KBb%gMPGh|lfzaVQu*T3WfG!&=@_+1TE(
    zOV#umj!7-??j=7lpJ60&{}?`G^6zC+UocN!AGbZL>~qFJqjHl+=$uXQVfXu*gjo*K
    z?3HXS<2OipW8{MUZuv#|S5N2YPB-0IF1fFdgkf_hyX_9Y>Fo&1Ps#U{dLdUjeYDqB
    z8Sme2-Wc7d%b-Om(RWi%I~zW<*9*vN0e;xdvXd@yW@QgUd;<#Vj>e%Z?5C`08gK(hx@J{G2SBvSjjFOXXm;$H`ui~seazB
    zi+enmpS{)Nsa}{?$NPgG=KDA~wyLxo<0NaodFAMsu|AK=a%4DLyTtf}i1qO_pEIyB
    zZo@{Ok<*-vJQs|%?5)}9!XpQ#qM&679Tz9{+R}J$e)83E0j}*6+Mg-+=(qRn=q2-a
    zoZ7h|VQ0YTWud=t?{qeb4VuPFlM33qHHDL#99P*TKfr0}#=ha}rW>3(u~lyB(X?qx
    zcP=r0a%fU;`{0*z-u6#7ec~D)?y%=}gLa)1TrO!RYX)yF+!ZFUuU65-!N?Nh=y+v!4r92+mX&-LbY4Px3m52OwZgyMvw!YeaDU;C9L(?sW
    zmL(ok53o4pCfQFreag-fzlgV;B}~SZ7w%V@)%Q-qo16VSA80h2a(sKi4gIm#rH?#I
    zI+>Qp4Ky{$cW>mJ;;-**pa&a2askKDF6WP^oI$0=u`&-TjW-!c^eK+dX&O6I^CYKy>7a-?
    zoQfvTwk2svnU+_`Jd4PAI?ZQ8WY@h*+CS2s+Oz@3*Z;ml+>MB`t9pvMD_&2`^UUh?
    z&N*l8B}=i&&Q13|nw|Vq>&o_NInQQo%Iu-_oY&Yg=aBPl`2v%?lE+7OCC$*ajC-2b
    zDSC0eK)+c_H*WJdnpiwNWW+S_2#&(=;Yr&Z_KfI|a(3y3v!mV*-0Kx=&|u)Sw=-o^
    zm!*w(w0+!iCp|x|n_)=Xv5gO_AB#Wp_|fXLp_}seGY*mK4hHm!N?UZbsqXuL0cDo=
    zCT%FmoL6}#THng}xovRQ_mxo*8+=C^_b(h=?mSV#DpE}0$-C@r>ocvLP1FXIMLBg%
    zJ1Kr6IsSEs)J(TFuD$mR7_J{yc4dopOq*?Ew^~&kyr|BbA01I4ThHslk>*hjoF)1u
    zT?eFUtZTcdeCcSD{evWKyI1Z}mC?&;V<>gD*H+i^Zl>*K_e;C9bEdI!$cjA{iY<4a
    zn&F)1Z|dD>u!>}__^qQJ7?k@uIK4SPS$plW9YH=};nAblv&*|>l)zOVGpZ8b>TwaM+UuJ>ZSmiKzatskYuUD5tc3%kY1
    zv2zPd&-e5_GUKvwX7oGx3#;`KH|8g=9#*N7c(+n7X!Hwj*7F`y
    zk9QwEeNbhB(bI$tXZ`FlA3T3NX5sDV{4%AR7tR%WKMgPp_uoHm6i3qcRrg1u)~GB9
    z9miWY_T;%jodqj({DyBClUtd0ZcvKPvDO_&`FEewqw6eh%{MC(A5VQh(TubImd)-H
    zUh1))v!`bpm|vcEP~T_Ch2LJC<4tci*8XNc`^)CVZ}j6WHAeb2wvbQD9hl|UerfB{
    z1)IV%C06chX0Kp+==`?$zK0E-msE_8sA%SB)K@ayC&DoOl7Yv(4fc_XEKJ8WFOb8T
    z_31q-N8Q+aK>XI?*B#e9v%OFdW>_%yT$qIKtEHA3mgsg%~
    zy;^Z(;M^6_nkC2#6dII29|0#ewmhtL=e~6x^k;eg8?}U^Rpm+hB%#-Wk1gwd~aDkFEF-!jL|v+GH5+gEcVIxO#Vc&6@yrPr-O
    z=Dlcf^hy7=Sr*cTQx~g@IXlzmood<@=KxKG9(#4SZmsK|L_dlY$;PaSk+NNWFK58AwXWhp-~DOKZ%Wx|PRGnN}#
    zSv1=Dr*x&1QU_E0fT4YualLn0&eQ06{*j*KOUvzz!dg$8zIJ}SULM7%E!I7jP0T#^
    zBFkT;ey74Qeb3F;J+>lIv%}C3+gD@SZ1Ee$^q>1?9A&a8w;12w(ogqTHBsi_15f~d*3fuN@I{-;@0b}r}-G=9+h#~yK&6J_)VrpJGvA$
    zSyA-Iob!ity;nVMH2mGsNB1Q!|F*aAa6?Yoq-Q+Go)cC!;a&6Zp2Ay-Nf7hf+oBtc
    zj+C0#u2^R4LRHH~?~XUE_(Oc*p^KV5BRWXB>6u9!3ts+8GD7+nvxC8!)9?0|J~*Y}
    z@(ztVr0lykLjRmfBcBz$)7CP}?mb-Bd*8CjX)1dgh;Pc_ExNaU)xhO;+KU=Usb5r)
    zF?l<2S^Ki*gKhVff*5Y4X5fp@Z8W@^D|KGG}J{R!JE-jZ)suZ+F?_4k`_1LOg$;RQb2J^P{2@3Ju*5F=$B`Nh8J}(o*261xl
    zagLu3P8u>-zst(p$4|#Zr}p=HAU&gDa>$9jEu~k_^Kywhwl*nIFOk#8Q!JuqUbyYj
    z^}Q}xUthQ7TxZn9_<>pk5WDR$h){?-2s#A=Q-Q=<(9vjs2b=|d0JC%
    zWW((3*2z;Qw=7T`P#N?)Awkrqa@x=BMZ0S);v?>lN5&OM`|l
    z^4*rVpD{Ci_}qXap__i+6s~D-G_1Krr(LC??Grl&UQDvJOc}gd!PhNgX=J}s3#LTN
    zx|%ObSRUdM@40(i%i!icWjnMBcCni!E^D6hW{$IL$l+!4ZI{h|Wvkle@sVbozUol|
    zPyE*=!9~B=pD$pb{unWK_=BPIcMx-(Qc_HsxYI8TBgUkQD?4MeV!|3~unrxhhQn?$vz%GYEM^RuF3ec`
    zZ^HjXMjv(ym^FMqfBn~>Su=))H4J`MA-sjmI_Te`8g%Kx4{HoU&_g)-NSQvfgjtVt
    z%|Q6SBaL4cb_3*_rfU-XEJY}b5ylkek8em=1NgZn1=cfWNDIU8pjz<5xh>TgriP$;
    zOru}P!FpGvB*hr!7lv0ch>>KvbzzuA#BC-2pO~4Ba6x_XcsVeM!M89}xa1jkf!~&0
    zs{4H{)&)NQ%Fn0q1=Sl2H2jsHPvglIpAT65m7nKG^~d>Y_KR8l&-syJn$&*+A5sjH
    zYlDA=X^^V{UA!6L6vIe^;F-lVe)Nmj?$uK;DoBE{w2^5J~iYXOe
    z%34&4lf1DRt`OITX$ol3U;N)|%P>(*8K$tD$GZotkl+lMGI3yzRR%B!?#Z*kO-OVN
    z>-T4$(m3wG>;?MVe@$`7R7*198AF5X2NOy1=l)4>5-4&-E|2%5h9r|DR!uU=!XV}i
    z+iD@RY^&9jk!QwzVmAO;`?y3}`y%*>4aXZ+4GT3UXLpC6BT
    z`0%079b5|C5-+^7a1I0Ued^RHp*tSWj}2$Z5-o(uFj{BvPizn-&u>W;cQjrtEiLkt
    ziH(hA(=cYt7$zel;}ds+^pP+~T987<#l_{b?#MG{2~8h^w0Ki#?r+Bt!rpc>lKkNtdTPX&H*YiLhD_Vb}V
    z75J&CJr($A_F1lw)ViQ3BmaUc$Wo15A%4B!wDTp@U`iTlJ)
    zB>dFG71FwX@biHy0zWlzMc}8)Uvi~02^os^y`&1#{*C+-B|#nvbNHbQNzBA=Rj$v!74nsmhg_{d~+75>HjGRQDs2NNSR>#se#H;2h}_c*e{}k{YRjf;znap6yv-7P-+6V1RWo{g+%w6a0x0tb}Rnba0wbdc3YqC_5%t8X&@;0*zNqk
    z$tB4YQ37AIeW^K@#9h@~QnxkdlDMs!OX{}fToSicb4lISoJ-=iYA&f;gKD{yswQ=l
    z_JOpAG?&arWhqrn$|i0<gOuLPK;@k
    z+YJ8#C1wWE7*vmG%=#k&AF1Q4dkAJN`1WG3XE1bYDb^&HNHC@d=@&>wavEEi?aa}6
    zV$2RE$ev+#vgTc^c{dx$Ubti!X9QfIafXqMBeWM^V_w26#<+_4o}0ylvm#yutMec+
    zH{y>k;F?XfM@mtvacZe{PRgkyJxxg<3bcEi|FwjQ&R
    z>4I^wKJ>-F%yM>&yq;Ocj&s+u_pA8k#mr{*=@PhJ$BymSBb+Nzgr{
    z;-~!j9i60rU-dr2ujDV_7YXnC_?0V8_|-zHI=@I-Nl#Arb&gFqdfhAckoT5@Xw_daPNTHP`3sn3y6}j*q7+
    ztXpVo{ab<35a3DtGkChD`A^ipYf`{dgZ<5_L0-x;lyRB
    z4$#RR0~9pI{J|o$9`wEoBMw_mm3n(eN)k5YDG3{`0UO*6shPMVM#51BEds*~hNJoL
    zZU*a1XtrEXMH7gpMtF|aij0`&OW-*s0xls?7mThGNb}bM&s*X-x{mn>j?52|7H<(A
    zU6G(IVSN%6!nlh05HcySn;|LUw`Pd@@7pnwj6v{3{Lyyonv_k$Ajt#ZWBuH!rTYs%
    zuIjDpqMrXy={B3!y5`a)t?c)gZe*P(-Lc4vpgxhlkpVJJpmfQEm>EixVYWji70h{^
    z5OdjckU1&V?D{hFTP@&|%pu{+_u>E-Ge{gWA;7?w%|c-IMSKxpAjag06OJMvGyH+G
    z67}U^PkL`@{CDB^-lRqlhotv@1jk?8d&7^Q_kM;j1i8hOUCq6>)<1zSd*pzV$W5%N
    z^`NP3nv0@Y3?8srb6cCorZ{vbEs*Pq%nwh>d83T#zV
    z4v17hYDi5v_#Mv#Wxy6Z9PI?+G+_TR*5VwO0c++~2diKWt=%_aEnD0i?UrB$t*W$#
    zXw3-tNE690Tr!<3oZ_p8nPWUcUOt{tBq0%;+MomoPH*8~gO5|c!*$i!JIV-p?*Ev8Hk;LjA>AhL8meZbJ^sUw$Y5(W--pMHuVVtH^TN|ecB(?
    z*9F|%JMvawg?jCdX3%zTN>VhK&B
    zv%MFoZ351))AlH}0&s@((VudL5!<&Ht)5tH2#;4AT+)!tt#_%(88#(Vx%5jN;L@+Z
    z5-#0pOz>k~g-Z?iY5UN}SH}+{wh4`inAjA+uAbOzR8n!VLA`+3TENx(Up2&C8vV|u
    zsw&4C)&Y*y6KmG=Xsd@T=Bsk-*Dv50Uf+UazYHN98-H_B5uf=0}RXvCUBc6!}P9yKN596$p>!Wmp8
    zoNWk)w4EfJ$5p~WB?rppT5RSx3ShQzPMrb|5cR1GD9
    z1hXZ(6{Cc$$cLb0o5D}k5~=R4dWlH#^I5e-)IRDlete%sb3P6^zYDCY;^pv5X9zXc`re#_4GPJn_GsFH4YdmjK^H&L9%I;Qh2fJ||N8
    z_si$|TFzvVaG>Qx{4>lmcKyOUhWy6kH<{6d)Wa|bTlQq1XR0BI40p~eF^!JDy@gSQ
    z@Qf%KW_Vr$){R157uM#3MkE7)BJWTDFqFlBJXCvTu-MQ%A`^+BeAqx<;-6tY4uphT
    zH4x&0Orw4h2u;n9yjFNfJh2JFKT#xrL5zH!Dto8MzQHHYNyGvr#q`f342MrPXXN>~
    z8vFn>LRFI=NQ^4P0T}_kM<9X`5J?b8$EVV!4(ufApTTn?Z63w{;Hsk{po6reitO_*
    zls4fwDih|u64cHkBsfV{%G`7w7CqB(U1eKRSqz2ssk(9WA$T-grM8-~$AX5L6L8R7{
    zgGf#I6_F7nw8B3rjV|~nbz2qxWL-{g{F8XnD;V}2DdEm|{Y{J4jn`kkW__3O>lPa>
    zUbB9|`sMm-*ynK0D)P>fggab+O_!ni8&)k}K>b&J{y8%`GiJz|Me7zXFzhmP@#2+>
    zAsmqKNIG;tgFyl{SYW_EF`Kn|;#cxZfEY1f>NI0Z+ipQ(zrn0An6AGfJWvFI@hp$T
    z=sO*FCZT_>~VfF
    zT?15A0+f|SS6$)PH8V6q0lSK%f7$pMIjJQlJ=kAKTvO)x3a3Qu8yy^
    zw&<#B9PrWB_S4bzP*Hg2Ms{mfirW8Ls=XiZzi_IzqLQz+mT%9Ve|!08YQl}5t}ZTL
    z9Uam2ISvs1Xlqk;{ViAj!hsLCt)=auB>&FML4^NW!afP+8}Ls{(??z1Q&tw2mz{Tw*%gZsvSI*_)DJ)?i
    zI_n-ozcTg~UWfyMUvgW@B`&#KyvY{&`rw#4py3E2!c!Ur(Yai5OM_(xm|zZWX*$0u
    zchqr3NeN0Q!`j+YPELgXS^(=02;$rE|9$O0?KSX1zYO?i^-=(jRmf#dPEK}qHVm+U
    zURug6D=V$2EYHu+d;dNYHe6tpZC#1?^0LYb)EDR#?5hmkyVTS&Ae;>rju96g6EIg)
    za7#HPD7Y>s(XmmK;Sp`Tx7+ABrddvZSP>u&@YvadB~eetuR~79fq&wN9Kkk(ijs;c$|ZlkyAlGT&#E
    zSCmCYh95YvKO!OmZnCnn{rvn<5xAU^yqxTUg8Y=^q{xV{%#8Gd`}aFJI%a2O6&Dq~
    z4h?-9A75Bh7!~~{J|Pa3sIaJ@gi~C?DM2L*2=qtH8JX#TeN0Tun>TL&{?gL2kkF8$
    z$Br1TU+3%VgW^CszoAe>`2Pl`{li}VkNBrm0Fb+P?_N+);LTe%j~zR9@9w?5d-t9@
    zcXsaFIXiZ2x4d9^?)F)=xP`qa~>PksG-P0dUe>Mgi(^$JRa_7q=R
    zG$Q-+aMZQNk6Rv%GtI3*5G?C;*agIJa>Te4`8p5=w}+jo#~P&I)0$jHcv
    zlP1{MTBB;9N;*3`SzWTiQ{W$rLN5TF8mJkMa0|UgCBlD=Y^hV0r1<_%@(+>Lc|6G2
    z^XAV*V|(Vz>ACaf>_4y%`psK6^cF1y_|Kd@?efyu-Tl=A>-$fiKDm75(yG-fjf}S)
    zIJkfJo?S2;Idfr7F75_x22L1u&sHit+!FTW8_2R|zJ$v_{^^T5-
    z4h{)Mi=CdHR#2FK{KWCVz`#?dEO6`NEfjC>0V
    z^8I{$Qd3e&xm+(#4-AL#^mW*4bSQ7$L>@Lj{3hxRGM<&4KGF-@eVu%fpBm&TxzQ9%>I~I1U?QXX*owsK;ss
    z8XzolbMtUyHVHuhU}~WHU-+fTg99Xzs%jpEAqed;w}psA^FLrhomD8%TERa>4vHSw
    zKxQdUpi>(dfFC-w2(!=uETP~A^FNsCp$cXw*mKFWXBjLp$AeoK5CRPZ_V7i`2#`zy
    zaWJuoxlkggL%|FM0}Y=V;0y}(u%vE;Pibh-g-RGWbpv1Uo0OEq*0l4FHkv
    zCk+A(29ZMo+4H;cKO8gyG!pb1=y%W`pg%#QK%+rpKx0AUK;uCZK;-PJNubG~DWIvK
    zX`tz#86a{-)-2F$&>YZQ&^*w5&;rmxkRE6eXfbFBXenqJXgO#FXeDSBXfGJBajUJNf^0ws{jJ?1ylm+WTKB
    zIUptv506WiF2R8H1Lw}2!@w3&4Yhgp?AfYSt1e%@Oyy_jXV0Du4-bc9i0(IT+`yyG
    zojaSFni?A$CnO|5C^~xd=RncdwF>wF)%=Afr23}E)MUM_wC!~?d^@*l#~=ZJ3A_R;r7+5SBMw4
    z)G@@cEnBv{d-o2H?%usSY0{(>D^?T~6kND)K}JRfLecf>*C$S#xM9PF^z`(iq9XX6
    zFku3+4ENWrUBj2DLPBufa{+e2RYx8=$vq*RG_{Gc%htYv$|gd+XLM
    z6%`dAO;uGD@R&1a4nRv;@%!(;Po6v(c($^#YTddu^p-7K0^tA;poQvy5CHFX?b@Ms
    z;LU8me*N%eGw9S3s53M)gv*N;FKTOR1DUgD&j!e8-~i;-t>oPqO&BT^@Ch4pbMxWD
    zhocH$HWkB-_wV0R_ZAiw6xf6zJf6S5e~T6^Pzzva)20n#oIZW}%$YOss#-@!2ifV;
    zrHhS?&DynVU0q!fSKq#U9UL5b_UwroJ!sG%GPdQvS_1eNeZFP6-*rBMX
    zh@4^>4`73K`_ZFEzy?}=IXO8jZ&bSZswebcN
    zU%!40!~(sjN4Ia^o;PnEpzi4CICt(`ctO{IPGQ7|5epV9K&1mj&zw0UDJhAnL0JuO
    zPMI>r($W%@0)g*j6@7#{f@50BWh<~K5RjXEzYF4gXsidTY+Sj;o84ytU*#%Rz}KE4e#8!1Mi3w9Kf^}Vie(@
    zvb}EVwS|97Vc4moHyp1cADPE&zQ8#t~>*0oq~1hM{SN^n%*7c=2M~0>+4X^XAP692iDK
    z5Imr>tK&>y0Hl{JS%Ng6IzWJj4I+h{2Kjva`0?ncU;~BfgD_DmQG-ws+}+(F-k_&|
    z@Q>(F`_R`w;zGXwmtYzyh@PGvzz@Ihh5iN7*ZuqV(RVa&-W-($;{p->S=QER?c4E>
    z{V%Md0ye~Ww0lxgQVo9j1roc_wryxOot&JId7vG#3JfGJ=(rKQCJPQGvw>*Ci8J1{G$}bL$LMcpsKbU$0(m7slY}(D5*-lgBbHTA
    z2hfFSgEQ)8`}XZ{hDW6wvUURdLq+?)z=yi2Na3R3aQ?~Hum2}#1^`$D=H%u&IyvD>
    z+OOQ*v3@x6%^R$@%o6NjK`gWuK&Nn`dRbXH8cek92#301*EJAK(OXt0X4udWV93eI
    zg)g-8)E5QY^bxQYsNC@&meKz5?bEwXcRFjl3N1+ilp29{W03jm$-
    zL8T^&%^CuS;ODLej1`3fvWD+_+y5SMG@QA0-$x{R->;l*a@C7#{3rH|E!vX7o
    z_+bN~Zs48N0w}g863PFB>2+0+q9dsJn)V;3d1z?hWSh_l6L3L{rh3rWvABZAje{OC
    zZX684N7Q9iUHB+?9Ptt|VSMQL3DB{vo`gm&Hdvw)1N4vy<3h(12f^dnC=f4h$CF3!
    zOMMY%d^h8R$C5O#fwKXQA0IRp9>>5teBt7!P~ew3hR#m_n=dx%2{c|}KYlz7P-sIP
    z@Uz2DxgZM&VbY|a5hHL`%;z??f1$l-|N9TBK;M9W{`o%|8h8tU%ST1!Td!(#K|_IBNJ=n06w3}^5;9jPZ<7#&wpbjI3mYU13)D-d?&!_xObAxua|$m
    zu-6tjt1S-vQ2bMPsn)pZ2D-w9*PfF%yIX0
    ze@!hPEiHU&BcO-6m#(_)`lTLzUYv5Y{~x^{{4b3LMEI}EuotGS*6~luogL>wfBP=U
    zar}q?RW%=c{e=Cp2@HN3J@GND=VOQ2UFLTLR2HHhss10R2qOFoF;LhFZiwDRF`1
    zlbDj=GDmpL8FfV`I9`pL7JMJY*#z4T|dj
    zQdvlZ|GEr&VcKd7|14Ia@g<*^n^*cOD3EV+Q~^IC1^)eXbnw}Z^qV&U?3DB8N$;Sb
    z7@(=)2_^-2=ubQy$$3F{87MzupdF5q}>zDc~DPgL=2FXWT8;yUaogFYt
    zx3Iw*sRittf`Z`SkV%s~W#s}@d$7HZ&yQXZO2(nCgLvtpepmMTzF--q_TmphP-?d6QgRo)>V*
    z_PT#vNALmvi>CRgsQUH7$K16=R~_Vlzpk#QszRFE6Tpl%#V~xKBBe~gNfx=qz6o&|
    z+$%s`<8zWv;LxF5_K0}8CzLe)Rp$JK9YMaoKlbi<$#)Oxq2~Pi0NYasqgi?B-_;Qi
    z&X7&CyntEby*hV874T715nXkS1Kvt1zREq^WjeoeAqRX_vOA!^2K*>z^7bmPoa?f3
    zuAky3k`JB#(bDql*6sb{#|W8x3bvvGM-yN#GyDqc0*M_D*bxCbg7{s#Je8FE6_tH;
    zHL!5b#ntiOwSt;u3)#p0dY7U9%<+MG({T`l=&EZR2v|5RP;Z9s%+VPE{n2DyMI3cKYJoQ4p7A*OE{^Co)U(NKsy2wAZi58
    zt6}#DMHE33xdB
    z5$95};gAt7Pz^KApUJ=(Uu*VGw57-h@QT{vf8m&yf_%-A5Bu^9Q%v;D7Y?kzd#=nw
    zhqy&Ww$GkDvbD81c@oD<;w(y>HVLTUBqdY?CugU#=gycPIgG=xZLA+a9Ks_EoMSd`
    z_QacFMP;u(J#E)7`_HeSMy^Gw&T;?~_efhxsE=z;l>jZ>nk65>%U@araGD2ZLEXD{
    z4H`MJ#NQv@G2A$J<_vlPnCXG2G`~2q_|z#2i&H0Y6tK%n7fwkrJC(wFZ*LzkbcnZH
    zcPyNHK6a@6txIY7fa3psu!qmc{+O#o`|qo*MMRxX$G^f_
    zzzz*?zL~eGst4W$7#nkQbJ2s)Q%`YpJP!WF!SXor7biv{Nf8m@_wL_)^3>s_s|!9g
    zo6deTgqxX(mk8(x0+m!e$ig{8cH!KAa0T@@6pF~pKgI#zmWV(YuI6Th@7Um>)ZJHA
    z4b3~6`WlA7!YaVZLgZK{tb*&>6{q>-1qLFJg1kJODm-o4G#n9(&zIl}4zNU%4jtbp
    zw|!`H(dq(D8>Ul3h!tl)`t|GUBiB7ZgRY>y{@+_cjl7Fgo#g-pKY9U-?f}Slt`0tb
    z4D#--fGWUt1b_SM+yNt4QAqLE0PgMH@IsWWHK;!7W>1vq3IUo(My
    zadFYJ=TDCuHNSYlGBzfim&L`2iIK~fk@-~>71v?^`h{~puCPQQ{|F9z)Df`DCkoQuhOArc
    z(Ou40?Tb1Bj2DR1gpNQ~HhBE_yw|VE)Dn+(<;rDzniKOv__zf$nX%ou!#4PUUrccYS%lWBg!!@@3{Kc~NX)%o-1
    zl9Lk2+BqJtC^|Z9?p#bpVNa#&(B8J@yQ26XKoQN3{zEYMnWN!X0nFQwCH>^3)rXEi
    zT>}$7K3Ea``C33Hjz~wKsfopMVRPq{B_*b0WS%{92GY)ol`H@J^G|#?4YAO9p~8X!
    z(h(dre`seL$9|obJSrxIA~eCQe9I;8fIkrCIgU%Ptk3g(DX
    zQ`g5bNuH>GA6FQltspOTFbK|a_^3+lH
    zQBeA-j=)P%0oCE%?K{XAzN)#w&=501_V)JpATmB#OJ_&%C@?S}Ec`V(0`w6@g@s)9
    z6PX40dg$ay=m>&TR2;{BIB|}MP@;~Yt{~+q2Tb?^-W@`HM*|S%#URhaLVaXi*=yPc)_t9fJ6H{ZmM|Kz&M@2?}vsh7w
    zjsSZq{kto8_tE;t7S7S?j|8BiVIa>|IFVLIIe-G9
    z+V0)IZ)=Vz@8NJ`EfBFGDB*@!Eqklx<%>h7pA7zIXT(c
    z+HN;9i;0OrfCmpA#Jgjf&G`7Z;E*7g`OOVm1V&H`fssj~`BZ;Fc6d9pCM#uH>Vv`V}1kj%|^X^&d7Y
    z@71f+yu8Clj@-L*2djqgvUt;`P518IyLRnbI`$E>$mhpMI|6oDb+)6UZ=XJXY8nA*
    zst!~CcxrRIc8?w@WBD0g&WnF&PoO5Ayt$jzCovhf5^y-pylAmUx$v
    zvSa)9ojZ4~TD1yGCa`=IhfAOrfI^H!p*ob3FHz=sd0|*V`H%GyZUc2{_vld)6~+I;
    zsosi8SQGxawI83_)A5cswu{QiVd9Hiva;k7-U@A~{YN_Mm^hGU-9wkh$z#wxVPG#d
    zSo%~>@Q6kv?j(Xi$`+YJVKFowcc;U9Di|^RhCd1Yy-NriImUt(Ywl;8|
    z4xL;G4Z1Z60S+GChh@5rO{&ekv%xQXV2ny><|_~wZi?!
    zZvT(?2UejdAfXH25q#(fw1~jKwhy12sUoNpwDlk(0=6TFF*fFLI8m{&em*`&j~tme
    zaiY1oIhK#o{q@2jK%A*5+CZ{NfqmCZssO17T4dqe;9k{^9u+2%P4Aa#--Uln_R7k}
    znV68M*)hwP#tQeWQ|Lki2}E#<)gdrrZ5B0Db%Q>btl469(jQmxgj)vi`h}y
    zO|a56gan+jlEY342MJl(W|E)Q6p>U+RzG#@K51HQ3hSu5v036_xXJwq{^?|T#vpW@#s;yl_oSO=-k<}
    z+qZ8wFfafF%5!o8M~;Mp8dl=bDnL2{ZFB_AzxB5{btr`$L4QLH_+I=A+J6EbLH&b)
    zuh7s^6aAw)5$=dWD^gy;sVFV0OMMQ)KM2Gme1=yeSbbcA)>KEYPmafnb1ze_uQPMUz;g`~&V#2?K%Cu?#VQ$RGJ90v<8&$}72LCEW6&
    zlKhHyDY;1*SxE)&lTxD6UPncEh4?!;dbxP|JbmJR-O}&qF87P)p6pxy%yhc9$rkVR
    zreV``UoBPiUo$0i*^*#`k$!rresgCBEneckM8|pg^ne9xLJcOr*s|v3KJ(Dydahds
    z_~`GpTkm4O`SHus4lnJT-F$ANJ%IFJKg*@CXtfud7@wMhP9c~f1ZJR_xvrVphl
    z*j)eB9RW7itE#>|a-_JhkV6@6XNM0E{1y1wT0jN`7=(UNO+AeC@;Mn;ZkyD$*&20a6fpY5nR!OrP<}GSoxT0gso^}tniu=xz
    z%vdcGX59ScqNefdJA@vP2sM;^v!qST){eeQ)V)?658oP|I5#wAen9Xl=dcyF_WGAB
    z?Ou6+Gw8Pn{@JARtAT)DBK!+DQS(17Ogtm_XQBJG9RYs@HQNz{PMA;_7RG)5K48!w
    zoIzKE*p*T-t6L{8Z5_9uS*T&txD}1k4Vwp?Y!qhE%=c*XfLE<|$4YEE+1klM!q=_E
    z{V%D7o=e%M;tAPn~IRv`yJ)=CRWG
    zjI*DY?R_t!?IE+4B`uyDzq(P}v>xe8l-{jt6gyibb(u_*euFm~+63)y?rGe{c~5Ka
    z9WA}BT01}NVEwSoeM@PZhu!wucHMHctJ#^BdNwWOO}dSo)M?5>X&wD`-G<5xnc8W{
    z{0{y5HR(ONI=dY6b6r>
    zG|~Q}T_4?MYJDW7dvxm9qhoiarrrCsR5xg*s@G0uYR7f^+mE!6{(XLHd;Mmw_DS8@
    z-@;~XtGCmXN|tO)U1IZgX=wWFfQUu*9{U^vT%r=Qi;*byR49I7vL#xjE|83f+W#s5
    zLV4m2i)8?E`XvB#=G3y9j*b8VE?j@Kxt^T6_?Hu;kmuR=?4%Y{6?LkaS;+_TkC(1S
    zb`)7Y%FbaB_*Y5nml}z$TEahqBB6mrWCasZ+%gWQlv`3-{H`eL`OA&b=Mhf)Q)%1x!SImb*CxUI~yKsbH$?V-Nbgw3R{f2(e~cu7BAwPt~uWJ
    z{)~|I3>Oz#!W1n+A?(R_$Ir#-7p+xQ>s9}NV-w=v7p6S7iCW$(a(4R+eaVbPjgu~Pc@@|8
    zR7zX@#Eu)^x84-db?M!1)66;!`mL2p=Vq;2OZ+0=RC0)f!s<54hMh;8=&bM5dYMm$
    z4eqV>KWTOGSsU|^Hfvr>?z+|J{=Vj~)-{gZD&-&6bX91B1zS71?N$!i-}K3nhCz$8
    z{7#&WeC!_M6Bz#{J~1^XC#@itiw3{EqJURWQpu%Lv*oYu3d3)d3bSyr_nF|SEcP8I^4S2Y4cK<
    z5&he$DM+@{ZrWyK>&}PT>3U0#2$h+Y&}KAj&%
    z%*vJ_2F-m}G>V@mo;kZo_ViBC^SedNkPcqaBXIqE|J}!89y&$`2E}J&m7Pc9l_t9vQn)h
    zU?m?N&+c;ZS56`D@05Jl1hOea@@ixLAKB!qipt#F9J|L4cI;VkX#27w$5y+Yx^q&+
    zWTo`Dfz4GrN;V(RqUDwrO4e-$y=^^#)BKOLPE#YKmOXB}>spHwcO;LSOT03Za^KhL
    z(H6<*wVk3CwFsZsJZe#ogyovS%hdc=_J6x>p6`MEfhR4ZuiXiJosf{4oyIA}>yM&J
    zUI|Kp$Eief&&u>HhN+-~f?yLTxZ~f#E<8LuARqv+&&kO_;}7|V@RqF_KRN!v96l>p
    zvB&Y+IgcI+0h$E-n6AMP6;%K$5T1=6;pyW}Cg0hH1zxDf4*-J=So(2CfaSPo$;sMs
    zGMWF`g>%9xz)C(kIIuKi?P9y0-jvQ3qMuHiM%(O-_}W5-znYq}e8KiB(UU@4DIa%z-u!4mJrlY3^bo
    z<+`eA`uui@Q^nIKEBkJm@40=gpVfI^5C6!xq_o7u!orfg3SLoZd1*PBU_zr_hWS;j
    z9V+LRl$91^Z4X#OQ-a*_*~I^YJ$WW9A-dq4GLU#-6%0_Y{F(7jfI-^=%U%AmKGGn7!t@diV;YmBA8_mvKY;yN}3+taqHJ(
    z+q_-g;_d9N9{LO1k8cUTdp7o6dN%(JElDbVSgD3suwMd_PI(!pqO6>Qi5voJB58ub
    z1jd9#pJ$HH0Srhsn{tYJqQer3gz&S2L1sRAP3*XEG{X0
    z9Tqfm)(nPWTDEGjeAPUMz%?o`WUJ3X1ib+dPuc%-@yMy+;xDe|<%emxjayee9m6eupIXF70
    z99=*KKGTd5F7RJkK}NP*TpxLiTSX9tAU^Rha$3C=8tK2)^jJtsf-$&@_?s)CT_1BBK?}&dxr1%)GOV
    zw1PtSlNKina|#__I2}8!0;k2V+_
    zwRv8|?Gs^9zG>WI9E(R9b22-_Eh*-d6%)C!7%QQHeX`Js2r!t=!G&K*1pv=3;-rEO
    zX};M8oD>9GjvrWG#Uy+L!{-zU;pf9YxItM*+gP{9_gwn+BrSi<;3r>Ag#d%Kn!(HG
    zmX?r@+|dxKFuS^uAH^4T1Vr-D`Vo>3O%_Sa_uyYnF4ou>;!`=78yy{uvrmT%8FKyl
    z4LXVhFdb~K-?Th@;ria>n78LAxouK@W~k(5sOoooPK4#QK<9h0@8UCavfh`Kk(KsH
    z43YyehFq+XB<_P^x3`c2Vy)4i9~W9HwvqX8+?Jv;J0jqpvV!l_V_N|}Qc&xX4^19P#`obL
    zd)a{hQVs{FyWqo5c=w+M|>~X=$h~iRCet8LYy#F&8SHyuH0O6;raRg$IeDJq|UkE~e)PjznwCX7ih`qshC7vR`dQnx8H?-
    zEiLTa2^l*!Vb?C~0>*BAdc~WX#G9~Y6Qej|lUQS;SYwkoBU6~MSw7a-6ndPgQ5>F{
    z8WYE+#;gtO$)k9LV`2*Z|9&A;$Xdk0g~%oug;iUK_z&Kq1^z+jpHu}ufaD$E{cKpD
    zpq^TV(NPr~&g*H@s#O7iABRNwD5?029DucL1esqc_IwVm{FFd|<%`h85qq|T@7w_Q
    zKSJ`M$*6+=Y2HdI5W2p+lu5UUDnQTw!7)2EUpQumJ*bBqzaumV&D59hR%rNKX#cc5
    zcD{QnD6nKJceid74+cCf&pwr7sMKR6o
    z2_Qg6n%{{93Mc5a0r#fh*VHPAWPx3ZMI=PtCRJd@49swnqe!q^0WH4}{A@#AyRf8y
    zBzZ(f0C@~L3;WuQMaViD9rEcrbCkPGCr?!cPv!2StFCbXEx(tlqHC9Ssm>1xHrQ5I
    zScuG{*?&2Q|z5u=$aE
    zLmt1x3rRfr@iGEj-?=;KeTTUBd5}MHa!D^hCtl)>OtALszXyI{`;Vr8RBA|E
    zqO0z40HuR+Aq7O<)excM+p2;P{Iuow^7nf32f(jgnt%hB^0p{Fn4)~B6Z#?WK!+U-^XRo5;E!
    zY%$}I>amNa_gQ(>n~06
    z=3r5lu;t$>YWe>&5cqjBQXTxsNsm^}_mSzGVe_z<$K5eG#-Py!i}rtRZtm~ln~(W^
    z99sisVZiIrQ&}YT{JgmNPvpEN@Xzy=>70Jg2KhT}`et=KXCvw1yTl$}JCe!c6=RzP
    z>=VqkyLM`u?&%0KS&@i81oW+gZuk}{5eNQx4%7_(E}hfvTO%<~T;J#`L~Up_ZuhST
    zc29WAtt`e_^sr~a-|pQ@vYAmd;Qi-IO%!9TaDafHtpIeY^9?KZ_;%@>ZcSSLshxRxx1mew@VJJCfT~KS9oa>K@19{O8yT6qrcKEH*8Q(CM^CRHYxqUruVck1O3t@%pbGfO
    zGKq}BqDP0ednGmSA=UX@~
    z@>9n+fVoO4{1EUTH1pO_!OjIQB}MGy!b*N578M{c$aChL(U*^%d7o9Dv}ealX~Ard
    zNan9&r723zS8+fv<-%`tkoT4Bnhn-xdd3gvhEHvce1*<|{X{@O+
    zY5D0?rwIIC#cPq{y2k+`|FFApJx(2RS609&<@~d1=_yt6@}bkF;cS|K;NZykxXc5G
    zUv?DD_SC&n6s71}IY98wZdy!#X6=d3vg3P0ikxoi~Q9o4hXA2s-vB!ni6})ID3#3tpYka-YP0VgNL|xl8!lhSOoq$
    zRd%Apd?yD;GtLsuO+ZlZ9PK<*6>x+U*|&~ffIZ0y+Za8%%0!>oM@GtILk)j*&v!;G
    z@-E^)UEqKa&vf@ny5|d@p?!UnRq2-|$TxH4y2bFp|Iw%G>O$g0X%KPX`#Dgp3gDm~
    z9NOTctb(&>JY>5?AK%Ni{N$`v#6=x{f25)iL>#C)9QaTLN{JwZD&YIuAjtgDC-;lM
    zUw4X0l#(CE0a69nYCr{{?AQJ==Z_HZV=KL=<^OSf7lmABI3TP71oJpZjSqhOi^QHf
    zQ%ItO{74Rbr~>S{vTTPS0{@TXxG3y8#sMMbg@!toKv8l;91w9p!~qcpL>v%tK*RwN
    z2SgkYaX`cY5eGyZ5OF}n0TBm891w9p!~qcpL>v%tK*WLCEY+?;ro+a
    ze%`KL?&+C00Q3L6Fou>zMR{qEr?Z!{gU`#SKi~Dt;UW_09V%)Hw>T;Yg!eOXx#N}gPH9au!NAvu1;nRMxh{>KzMZ>7n{WTec>cMv
    z6XM^ezixncf^Gi^{sZ-CzWN)ZLc0$5Org(50q2gQzx6{Se;z4zV`PN5K4vTtZ``=A>zFhNZ)o|Pws?borB$Irhlfv`5c>W1!E$nV
    zU04Xt|9QvY!Dt;X
    zF7Wwv-j4tG_UkW;|B<7DhsXmVUwkI;K7{=5<4J#KLfq1&p(93wV~+9Jb^g9qu=D?r
    zcK`o5?|+$}Lr3FluoVA#dN5EUmrGub^s$4yI!`FX8Ak&SK3~Y^fe`Zfx7V>zFd_J;}k4y>i!EwTmByvgK(oJFnJTCGgBP|d`p&T$Y2!#SJ
    zmsBbg;2{x};iJ;FW{X?0q#gh7^}}Ck>h;-u(OdJMPxt@GPD&sj6(Ir8#*<4fmx~x5
    zAD^V8B&62X)z;P5p_Aq2W_x;hlHS1Qmz3aZgH1vKU%=yb#+~B
    zEnmPZD=)>8|2)s>Z%;6x!-SFhOGJ^{@L((K!D`MyAA90*Tzss5
    zfZvUq*UijMg@%QAdwX5Ea@oSd!rtCKGBWbysT10JwP<&sdpCe^5G>AFg7ygZvK{~J
    z_y;5i9^RS%e9HVE*=d09zk1E;ncY)Eqhn8OAK!mqV_|v8!_)n^sYzOT>f|Y?dRiNURHYYgy|6j{Zl7Qg98J0Y3w+C>ZG=ork;T=cudTie(H07O$kW^|iukwBG!=1e
    z1^*FPu*F*R#EGADAPbgHar}e4pH$I@nMv&vCWPSCqgYh`U@Ismm_PGc9Kpl;@lUb+
    z=QE2m*5v|GhmRQCymjN|%^Ny82XyrgJ$HI;e#YF{#VIW<6&=CR(c#vuo9GmPbYM`x
    zC5wxQjEamv#=Cc{9qgV(goVQG2L%Q^e(=EF-YzyS_Tr@rZtiYy@8~-TiSZT|mtMXq
    zz+4FBJbd`T!^0iD?6&nSYwO#XP@x>i33=#dHY#&#Ih$M2GBk)j{&8=P6)NBXYtcb+
    zayTe~6>>z<%fLZ{f(8vDi`DY-Boef|JT3zV4vZN!DthF|fB^$2KjmyLjmd?0@Hd~a
    zCd}lb3@CxEf@DYej0`BGxddhnnbgY^LWOD0#mECTFb51A7&&4@D&D?3WC-fQC6yNZ
    z5UjZgh-8-8Lx&GXFF?l6xfTsnd=&o_MJ&|cxumGW{5&}&86d2$udk@6C@wAr8^t8f
    zg@uL5$;r4K065vmva+%lFJ90~3QjhOy(}#)&CMkrXk$ww0u!je$ww)&V-k1b47@=g
    zupI#ejR%21OAvMZj~N^K!>H(a^GfXPi|yW7e2;DXZ97p0{TJEyp~vaYVIrY4WM^a>4)
    zN+xax;bnRGi(;~iub#&%sjJ(%YnQsVc1%V_EtiWmGVidksMOR~735Q=fiW>OS89Gf
    zzo8+wxVWmmzJ|+n@b=CrEF@($HP!L?1q?G$8Kb)7oE)Esh-x1BQZSNg7y@);Qc^~K
    zKFI?aN=rlI<3Uu_)m^@G$1^y%ytcOg@Zo*|0j1T|=2lh_2?G2H23qE4k8$UQd3h=2*eQe_0KU3
    z{+BGlGA{()xqbT;-M{&Tv|%X_Q3;W
    zDSGlmr0`E09ug9=aN$CTcjU;C8#iv;zI_`DJLk`zS5Qy@0R)0=<;s=L&dym`S?kxY
    z-?nYr)TvXKE?s)-)~!8z_H5a*1+=fP@2*|D7A;zI=FAywZEX(^kCP`)Ub%7wWhyEv
    zT3T9C?VUJrA|N1u(y_6zJ9g|q35O3KM!(S4*GKn3QbIz)&p-bR{DaQU&YnAWE)cG(
    zs|$Hnty<;k>Wb>_-MhDX^=b_bjljS_Q&ZD*>(*`9upvA=e9V|JPo9v)Qpnt9@Xx%!
    zdHeS5n>TNUr2|XV?cyRyz{ZKWM;37th7%_YHY#A9Dth_;EP;Y*I
    zKG@EkI|u!*S+hn{Q**(B1)iRsa7Uq`p%W)g%*n}t$x!&HQKMi8RaI439HrsBeED){
    z65a!j2s(^s9Q*FwyB|M(423(k;2%lwImn3RI3)f0>#uNe!-frmjerwqe$%E+aET*F
    zj)WLWN=gR~9Qf_G-%tg77iyU~b0(hS;1ZKA(ZN5SF(E)IZ*On34g}zY=3w;_0Gm8{
    z@~Km&09|-gBpp3^6zxSrfI7sZfj}?x04u;ibLPxJ43rPlK}E<8)uHdKSg``-T)1!n
    zI>G${%F)r$fi>;y>|jb{p;$$KdHVFJmX;Qf4<3vcefso)&angvCqH)V*n)xrl!Lno
    zSR7V>DWUTvOP1jB(4j-99a(Urfxa+r-aL#oD1`Wb5r6*6`hNx+K;71@TOm2r2soj2
    zFvrG?8`0~>j~{>S+BGC0pqrq{(0oKh1T+b#A3JsoU~_VE+Pin}{Q2{NTXcb)J9omX
    zT)%#O+O%nUdU_}U$o%Q2pHSxT;ltzN;!sprSQrfS;K2iRb#)kBO-&8=Vu%L@U@~M!
    znWW05CKw%RM`;r#Ot^IElDN1y(2lB65xf)nCS*nl=&&#iECoZ%m@xx9Xb8|ED=X{a
    z>WXs6{Ab7z(V73yNeFuA^y$+f9u$j4L5FbN@EFUMErY8mDk?%!R8$mn1x!L+@api-
    zU;vomso?*iWIPT41599UZVp|oUAq?A#v=fz4yHtpp#B_)y?F7Wm6er&fdRA!6QFQp
    zfqh{n+Sd{j6XB^K6~Js{WHf8mEEN?MRHv-041a}T2pGUa2bB5CFTdQsf8Wf^4C4aK
    z2SQ3p%FWFUWwr_bA2M=eJT$}SW0-@sfok+|47C_!;n*?SLixZU24z?ZQ$Dl{V_c_B
    zoq#UT7;^zs^a4!z;3CiwFf~O{xI3dm14@`QX%Yt63WPIY
    z+`W5u_-!opU@8ue4b{Ow7!aWlFu)3M0#H6&7F;@X2&=&^&=njD00|yAc}#)eLojIp
    zbm68j7Qjm&FAz@sKNQ%vZ(mpw-3n-j-O(>_CxQYolw+oZDHfbOZX9A_Vo)Y(K@voz
    z6Q{hE6(`Z3|AdSfk+5tTnzn5Da=7SmT2q6GO!L(fn>~!NQq5N7>F?|
    zL%pyyE~z9ahX%yJB6LilNh|}BaOa3yHtb6Qjg=+Qng3Ay`}z67)u1E82?L5OqR=!5
    zOdE*ifCk8EXJ=c@5-capzoz>hYw!?_IT#CnaJ17`bR)z!@~g2)eRIYbR2*
    zU;vdO(9*z6E5aGR5og3x0cb{Wf(JAWNa8b-Qjx+x*<;qqC!h&z10gU1+C>>?>&O}V
    z)f%9{M(kZ9sm$vO1jGWwSi%M#Hu+%t4#Ni32wpe9)euwSRR^H4rwwdGkHBg}1CJTd
    zK_e2oeux0%muk2q4=fOm7zlt=_6!1n#Zdzh5CVFun`LT35j*ESOHDo%mp8}fy>9fL?L!6Ha3x$E-)4Zv#<&Ou`v9Bpnt*RoL95rl+%#
    zQ-U@PXO?JbFY#O8X*L8=6LCY>L5K~A@IctAi~i6A-$PuHpb7hHdBR#@JzrSM71TEh
    zcy$dtE|y$L4B2@L5x
    zW@sG5_rEOwt8+@UmX=MT!oN8qp{?M5$r36y+b)J^qI
    zI_9}utgUT;&2|6l#=+-qMjhN4bZ~y~Vg0zn`@?ir1|K>Ss=p^dPa|xvapc(}ephW`
    z@0&)NYx-`SQ3)0hz)!!es_m80c+95i6!TK9~HH~8Rb$u_H2iO$k!BOi~GpUF#FF#m-OljD-f@P2`1cq9eyHIFDR=lFUZgIi4L(04boMJ+PW{{(B9m&eG(OqFw`z!Cdx`)@1!vrZ-laS*|rXx5?zrLgS0G%rC2$UwTo@{DP^)9xZ>_uK9i&
    z{3%6b@lPeCn86tf1(@iNRUQGixFkO`I@ao0u#sNyimCaV3P+t&-rtbd-P40J7WbW_)mwg5
    zpH1tej;nUvp)Pyok0C*8cKL3$3tbzOq~H>B&^!KFRBB;WErcOT#(!oNgUG`K#N+Ru
    zl={~ZEN7d;KW!||Sj=H=J_WCN4g5N8Rq>02)cB_!{wGXAHm=W8n)^bdOU{~MMSH|^
    zlzZl>^vTfb9BV2Oc}^nWf~?P3nLuml=T1GZS@yhrsgIG>0F{INw;T1Cc}iA(dH;n=
    z`%F^p*>85A*=u_)Ue^}uoeJ#&?4bI%(Dd0v|XZNo6ePwU^
    z_Oi6-d+oWj#?ijNFYP^Zw)nW8x=YWH?KNAX-xA58deXzqWG9;S-LOmQw59a%m*TUm
    zWv)9*S$T3!sz?=UjeM!qKTTOKUsWSh^HHX8aJX$;RDN+8#K6)gtd7|xd;1HKNc^XO
    zzcq84!#`R6C2b~(Kp%h`suWa2CPiPk6}e3(>e#vrrNL>NIu@V!ckJmd0VdsoZgzJ*
    zDG}u(ZsRI<;%2`S=VgxQh_71Nd&V5;@iRO3o-8$RR<~ZWdJml6Z`{wEg__a}tR=_p
    z>0@$3YP(&pjjED~I?{0`Bz<;vC|EVTZiB%KMVDNqu$X;r{`OHB#WmQkNE{(`Mwpf&
    zP;>kPix8uT>ioYo{;^<|m!F%Nla`U5vu{DlDyf$$-xe83Bo_6(T-#??X5Ss&J=f~>
    zowZzg*aY!@W5m197ayR(nP%K`?pfJ`Zc>`Q(k6DC+itQKVkD0_bhR<-5v9?!=&tyk
    z&<;DaqiYU7EG0GZh`(c&UJHwhaNxN)o(TUl
    zg;N7T=WP-HfEk`&)YR8h;5X933J>>;{cGZsMi#7*dHJYsh7;$}Gnos~66Z2yjWhZm
    zvLB$K-G7sY#JIUV2FOWB4wc|c5g)Kce3(wJnT9ajEbAoC38vtE8^ZI
    z9EJF=--orH(S1LA?*yNZYt_EG@c*nQ#J(y1VWFHgbE19Mvu<>Ks4SZ{yZW
    zX0BQE;^KDiI|p4Hyt9*IimOU6$zkrQ$x;s<(vU@J#@#_fWQhRVDzNnt8-B1m4q%{~
    zr{}+;XYhcTa<)1ALvq*xPhgXhu)8okB|cSSeDcz+1zWo2AL^14BzLE&?~c3yiq5?k
    z@0Xc6K}K$9kM0vX_nafqSF`6hD+x8fUYj1tUUQVV8YE$E|J`G&ZqIK>+1PZya=we5
    zL64Y?-&O4G6XPj<=x~o4+kcBPo*rg6C(g$^yXzi0vrY?t-WG^qD>+Y^`Lf>W`j98UGYr7~cYe{7;|PwK%=k{;}2F`FHgsHP%Vb
    zo+jDr5Al9_5~JNYGm`r(cqy$MDr@M)F}>Qw$z0s=FvoYVWYX3yv8yDrRR$++>7S@H
    zB2QywyzZVfGs74Ux0J;6f(k(mo^&y58U&kAEO1So3Io>W2@iA#z`MG-dU<(arxxAY
    zPi6Zgg_Am%(1!32nJKPnYHB^b+#Q_m`r1G7aq-h0oP3xQaj&Q6{hk)4gEpzjPWg!=
    zH&jAmc@H^b+3|LLe~p(?^^-at)>F?)>hX1n>sFmy4~fU?aQqMS2vqNwwzXr)Mv1ho
    z(xIEX#;XiU+N6+aej?uSf`340#*2zdK?Ac<77r5emKxk<<0%fF$>Z4{kSGl=W
    zRov40hFU=*)Jq;D;z0@?IWiC8=}<$@sGI~`&}-=M9fGDJo?&c8^~Y7+2Jzq0MzYn=
    z%g5dHwDuX}9giNFJ8pVlB%`S)Gyexp@97)~HHi^Vq-JJG%q#4>G*?R9UE0L4$8n4A
    zoR4$dOe9?PNv7|Xj9t?$T~R)F%b-~0fmupZ()X%HA3m67aVa`9GBYRtRlTsfv58Ms
    zSD8r-nbbqMw0h{7B#<+!@aX7hyz~P@0Jb2~pR&S6E$sOFcY_GxAJ4zgOf-i)C2wl1
    zsjb9IOD2pPKTJ-3%(&6VckD|Wt(YslC8UR;lZ=U#&!TmX%SN7_4SL(;KeoOLtZA|OF
    zFSe_ONB5&QdRQEn@GIIZ^;%u*VYYPuoK
    zjF{83*vT_QC*C;cvwuG}kU>-Z28-6)%LnaK%-ubX&`@(5~S8qDN{
    z4dk)?8(&0r`@qM%*A}d{Q4Z^iNCpP{RK2W{|JnwBiWNcp!|#*TPCg&|y|KF+zl_7y
    zVhHZ$@W|qVZdkb2edTbS5pMgx4>$fJ^@?_~-;o|}=
    zck$3w1jgZ$I5M)5@UHuRGa`^;n82zUS0qP^OK0+bw1RurGE733z0?7Fo-o``WM%7kfvs2lV}lWz`Pi&*1|Z
    z-)9>U#6Ol^&@}vP1i!YxuUe=Ts(CdTnTejh0R?5R8hG_3MP=nB)dD`AgJX9g_=(a0
    zbY|-ivy8(`BiSu$1gQk|vOf^saZ6OH3P
    zrkvPYOKx6)Z9ZLKAZ~=YpKW-JjdGZWQbQq{WI-*guHMl+n+gJ4tptD
    z_-}dtEuQkiM?grjMH??O!9HysHqHv_YO1gzfWN}m*bG57J`3u<Pr;?>~uIv2_t<|cqIjDuY&WYP&kU=f2c2kx~90X;A~(ixhG!5&)@
    z{{>8jmn{Qk#ZRA#&hNjV3buRxClS;^p+#-Q|3g%~>IXabLBKC#^u#Wx8X-46=S3wG
    zNn9{vA@t-3~W$No^>gh8K
    zdWgqmmOeh5LC^p23mVz~^wS$3%}C^A3K#kBUyKbKGa5odp9Mxn5Ig-46i$TC(lf|C
    zayV0uTxRO&rs?XY9nwwL)yvS;%fz9lmj!d^84yDl=rLAnZt_Q!^Q9Q@u@!uBC0R*{
    zyzlYLz5ne)-#?CDGea|%@;C=KD;#Q`0%TG
    zKm5vH(N9I|NCWY9S-fx_-+%e+-&}j&j0AU*NW%9|-+cd$d4cnPwmB$ZNE?AYeE$Oe
    z|1*AzkW3yit88kDQC<^1VpQa$Ns$vKeqG1pDWOA#rk^tg_P*?04~zfM=@TMGjm9S+
    zzqTV{{DhE!gVN4?f$yJ&uUi<{zi;sOLxV>Q`MQo#!~J{9B%jg~9sCE)pAtHKV(83C
    zp)+y*nvS2R296n)dWrEx4WDBLhVlPcRBI}Z@_XguSm^Kk^&KuRz3eM8$V>m2kr02s
    zOrQ%nSU0XIet`oMp|9|$Daz$lm%#un%UWN?7VWjRYv60p0PFwBFN*N^15Zi5zJoNp
    zWh>VgG&=QoI5WTQVjj}cZ6jaP8EqE@TYNznv{&7(fp!hFYoJ{N?HXv;K)VLoHPEhs
    zb`7*^pj`v)8fe!*y9U}d(5``Y4YX^ZT?6eJXxBiy2HG{yu7P(nAol+pmWl1cKW(uA
    zV)Mjy;;*Kd&L`C2FZ)4zVq*Qa+9BjM`h;|99&rdXj9e
    zW{%ii=v)&L5bX~TTPdamTJvuU(F^te3)~&>|L@jM^!0sn4NJt-#FSApkzxz#{?tJ9
    z|EcXK^6oODH7$Yl_cJXflv=YE=7Ls+Od8F4dB0S{Q2)P?+!6o(Zu=L4H%XqB*+FbM
    zQ;&w2A~c{Qwg3{SqIONxtq8rSf!;}3|ME=g|J3#?pro6#Xb0#Z_HJ80O`a+LpnlR<
    J`VbHz{0|2N*d+h}
    
    literal 0
    HcmV?d00001
    
    diff --git a/test-data/slideshow/sample_pptx_grouping_issues.pptx b/test-data/slideshow/sample_pptx_grouping_issues.pptx
    new file mode 100644
    index 0000000000000000000000000000000000000000..bf0c70253f54147f479bad319a555855af4ce46d
    GIT binary patch
    literal 39436
    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
    
    literal 0
    HcmV?d00001
    
    
    From a602060b48dafc861fcdb9a5087af8a4fb23c716 Mon Sep 17 00:00:00 2001
    From: Andreas Beeker 
    Date: Sat, 13 Jun 2015 23:26:46 +0000
    Subject: [PATCH 15/22] Rendering of rotated group shapes fixed, other smaller
     fixes, defaulting to white transparent slide background
    
    git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1685344 13f79535-47bb-0310-9956-ffa450edef68
    ---
     .../apache/poi/xslf/usermodel/XSLFSlide.java  |  6 ++
     .../poi/hslf/usermodel/HSLFShapeFactory.java  |  4 +-
     .../apache/poi/hslf/usermodel/HSLFSlide.java  |  1 +
     .../poi/hslf/usermodel/HSLFTextParagraph.java |  6 ++
     .../poi/hslf/usermodel/HSLFTextShape.java     | 17 +++---
     .../apache/poi/sl/draw/DrawBackground.java    |  2 +
     .../src/org/apache/poi/sl/draw/DrawShape.java | 61 +++++++++----------
     .../src/org/apache/poi/sl/draw/DrawSheet.java |  8 +++
     .../poi/sl/usermodel/PlaceableShape.java      |  2 +
     .../apache/poi/sl/usermodel/ShapeType.java    |  4 +-
     .../org/apache/poi/sl/usermodel/Slide.java    |  5 ++
     11 files changed, 70 insertions(+), 46 deletions(-)
    
    diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
    index 8b5e596702..32fec6e48c 100644
    --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
    +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
    @@ -248,4 +248,10 @@ public final class XSLFSlide extends XSLFSheet implements Slide {
             return (_headerAtom != null) ? _headerAtom.getTextType() : -1;
         }
     
    +    public void setRunType(int runType) {
    +        if (_headerAtom != null) _headerAtom.setTextType(runType);
    +    }
    +    
    +    
         /**
          * Is this Text Run one from a {@link PPDrawing}, or is it
          *  one from the {@link SlideListWithText}?
    @@ -1151,6 +1156,7 @@ public final class HSLFTextParagraph implements TextParagraph {
                             HSLFTextRun nextRun = new HSLFTextRun(para);
                             nextRun.setText("");
                             runs.add(nextRun);
    +                        ccRun++;
                         } else {
                             // need to add +1 to the last run of the last paragraph
                             len++;
    diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java
    index 60e9eb84e2..b9df58c43a 100644
    --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java
    +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java
    @@ -214,9 +214,8 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape
         public int getRunType() {
             getEscherTextboxWrapper();
             if (_txtbox == null) return -1;
    -        TextHeaderAtom headerAtom = (TextHeaderAtom)_txtbox.findFirstOfType(TextHeaderAtom.typeID);
    -        assert(headerAtom != null);
    -        return headerAtom.getTextType();
    +        List paras = HSLFTextParagraph.findTextParagraphs(_txtbox, getSheet());
    +        return (paras.isEmpty()) ? -1 : paras.get(0).getRunType();
         }
     
         /**
    @@ -228,9 +227,10 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape
         public void setRunType(int type) {
             getEscherTextboxWrapper();
             if (_txtbox == null) return;
    -        TextHeaderAtom headerAtom = (TextHeaderAtom)_txtbox.findFirstOfType(TextHeaderAtom.typeID);
    -        assert(headerAtom != null);
    -        headerAtom.setTextType(type);
    +        List paras = HSLFTextParagraph.findTextParagraphs(_txtbox, getSheet());
    +        if (!paras.isEmpty()) {
    +            paras.get(0).setRunType(type);
    +        }
         }
         
         /**
    @@ -711,10 +711,7 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape
          */
         public String getText() {
             String rawText = getRawText();
    -        TextHeaderAtom _headerAtom = (TextHeaderAtom)_txtbox.findFirstOfType(TextHeaderAtom.typeID);
    -        int runType = (_headerAtom == null) ? -1 : _headerAtom.getTextType();
    -
    -        return HSLFTextParagraph.toExternalString(rawText, runType);
    +        return HSLFTextParagraph.toExternalString(rawText, getRunType());
         }
     
         
    diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java
    index 30b3386266..7b78c69aa3 100644
    --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java
    +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java
    @@ -4,6 +4,7 @@ import java.awt.*;
     import java.awt.geom.Rectangle2D;
     
     import org.apache.poi.sl.usermodel.*;
    +import org.apache.poi.sl.usermodel.Shape;
     
     
     public class DrawBackground extends DrawShape {
    @@ -16,6 +17,7 @@ public class DrawBackground extends DrawShape {
             final Rectangle2D anchor = new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight());
     
             PlaceableShape ps = new PlaceableShape(){
    +            public ShapeContainer getParent() { return null; }
                 public Rectangle2D getAnchor() { return anchor; }
                 public void setAnchor(Rectangle2D anchor) {}
                 public double getRotation() { return 0; }
    diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java
    index 2bebbfa892..70307578bf 100644
    --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java
    +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java
    @@ -4,6 +4,7 @@ import java.awt.Graphics2D;
     import java.awt.geom.AffineTransform;
     import java.awt.geom.Rectangle2D;
     
    +import org.apache.poi.hslf.usermodel.HSLFShape;
     import org.apache.poi.sl.usermodel.PlaceableShape;
     import org.apache.poi.sl.usermodel.Shape;
     
    @@ -26,9 +27,8 @@ public class DrawShape implements Drawable {
             
             PlaceableShape ps = (PlaceableShape)shape;
             AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);
    -        final Rectangle2D anchor = (tx != null)
    -            ? tx.createTransformedShape(ps.getAnchor()).getBounds2D()
    -            : ps.getAnchor();
    +        if (tx == null) tx = new AffineTransform();
    +        final Rectangle2D anchor = tx.createTransformedShape(ps.getAnchor()).getBounds2D();
     
             // rotation
             double rotation = ps.getRotation();
    @@ -40,9 +40,10 @@ public class DrawShape implements Drawable {
                 // normalize rotation
                 rotation %= 360.;
                 if (rotation < 0) rotation += 360.;
    +
                 int quadrant = (((int)rotation+45)/90)%4;
                 double scaleX = 1.0, scaleY = 1.0;
    -
    +            
                 // scale to bounding box (bug #53176)
                 if (quadrant == 1 || quadrant == 3) {
                     // In quadrant 1 and 3, which is basically a shape in a more or less portrait orientation 
    @@ -54,42 +55,36 @@ public class DrawShape implements Drawable {
                     // be already (differently) scaled, so you can paint the shape in its default orientation
                     // and later on, turn it around again to compare it with its original size ...
     
    -                // graphics coordinate space
    -                AffineTransform txg = new AffineTransform();
    -                txg.translate(centerX, centerY);
    -                txg.rotate(Math.toRadians(90));
    -                txg.translate(-centerX, -centerY);
    -
    -                boolean oldVariant = true;
    -                Rectangle2D anchor2;
    -                
    -                if (oldVariant) {
    -                    // shape coordinate space
    -                    AffineTransform txs = new AffineTransform(tx);
    -                    txs.translate(centerX, centerY);
    -                    txs.rotate(Math.toRadians(90));
    -                    txs.translate(-centerX, -centerY);
    -                    txg.concatenate(txs);
    -                    anchor2 = txg.createTransformedShape(ps.getAnchor()).getBounds2D();
    +                AffineTransform txs;
    +                if (ps instanceof HSLFShape) {
    +                    txs = new AffineTransform(tx);
                     } else {
    -                    anchor2 = txg.createTransformedShape(anchor).getBounds2D();
    +                    // this handling is only based on try and error ... not sure why xslf is handled differently.
    +                    txs = new AffineTransform();
    +                    txs.translate(centerX, centerY);
    +                    txs.rotate(Math.PI/2.); // actually doesn't matter if +/- 90 degrees
    +                    txs.translate(-centerX, -centerY);
    +                    txs.concatenate(tx);
                     }
    -
    +                
    +                txs.translate(centerX, centerY);
    +                txs.rotate(Math.PI/2.);
    +                txs.translate(-centerX, -centerY);
    +                
    +                Rectangle2D anchor2 = txs.createTransformedShape(ps.getAnchor()).getBounds2D();
    +                
                     scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth();
                     scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight();
    -                
    -                graphics.translate(centerX, centerY);
    -                graphics.rotate(Math.toRadians(rotation-quadrant*90.));
    -                graphics.scale(scaleX, scaleY);
    -                graphics.rotate(Math.toRadians(quadrant*90));
    -                graphics.translate(-centerX, -centerY);
                 } else {
    -                graphics.translate(centerX, centerY);
    -                graphics.rotate(Math.toRadians(rotation));
    -                graphics.scale(scaleX, scaleY);
    -                graphics.translate(-centerX, -centerY);
    +                quadrant = 0;
                 }
    +            
                 // transformation is applied reversed ...
    +            graphics.translate(centerX, centerY);
    +            graphics.rotate(Math.toRadians(rotation-quadrant*90.));
    +            graphics.scale(scaleX, scaleY);
    +            graphics.rotate(Math.toRadians(quadrant*90));
    +            graphics.translate(-centerX, -centerY);
             }
     
             //flip horizontal
    diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java
    index d0026f31dc..551d0527d6 100644
    --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java
    +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java
    @@ -1,6 +1,9 @@
     package org.apache.poi.sl.draw;
     
    +import java.awt.Dimension;
    +import java.awt.Color;
     import java.awt.Graphics2D;
    +
     import java.awt.geom.AffineTransform;
     
     import org.apache.poi.sl.usermodel.*;
    @@ -15,6 +18,11 @@ public class DrawSheet> im
         }
         
         public void draw(Graphics2D graphics) {
    +        Dimension dim = sheet.getSlideShow().getPageSize();
    +        Color whiteTrans = new Color(1f,1f,1f,0f);
    +        graphics.setColor(whiteTrans);
    +        graphics.fillRect(0, 0, (int)dim.getWidth(), (int)dim.getHeight());
    +        
             DrawFactory drawFact = DrawFactory.getInstance(graphics);
             MasterSheet master = sheet.getMasterSheet();
             
    diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java
    index a265e869d7..f81a344b17 100644
    --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java
    +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/PlaceableShape.java
    @@ -20,6 +20,8 @@ package org.apache.poi.sl.usermodel;
     import java.awt.geom.Rectangle2D;
     
     public interface PlaceableShape {
    +    ShapeContainer getParent();
    +    
         /**
          * @return the position of this shape within the drawing canvas.
          *         The coordinates are expressed in points
    diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java
    index f151e0c082..91974b79df 100644
    --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java
    +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ShapeType.java
    @@ -288,7 +288,9 @@ public enum ShapeType {
         /** name of the presetShapeDefinit(i)on entry */
         public String getOoxmlName() {
             if (this == SEAL) return STAR_16.getOoxmlName();
    -        if (ooxmlId == -1) return null;
    +        if (ooxmlId == -1) {
    +            return (name().startsWith("TEXT")) ? RECT.getOoxmlName() : null;
    +        }
             
             StringBuilder sb = new StringBuilder();
             boolean toLower = true;
    diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java
    index a9095c80ff..7b238de176 100644
    --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java
    +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/Slide.java
    @@ -29,4 +29,9 @@ public interface Slide
    Date: Wed, 17 Jun 2015 22:21:13 +0000
    Subject: [PATCH 16/22] Rendering fixes
    
    git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1686117 13f79535-47bb-0310-9956-ffa450edef68
    ---
     .../apache/poi/hslf/examples/BulletsDemo.java |    4 +-
     .../apache/poi/xslf/usermodel/Tutorial2.java  |    8 +-
     .../apache/poi/xslf/usermodel/Tutorial7.java  |    4 +-
     src/java/org/apache/poi/util/Units.java       |   31 +
     .../poi/xslf/usermodel/XSLFTextParagraph.java |  286 ++--
     .../poi/xslf/usermodel/XSLFTextRun.java       |   48 +-
     .../poi/xslf/usermodel/TestXSLFAutoShape.java |   26 +-
     .../xslf/usermodel/TestXSLFTextParagraph.java |    2 +-
     .../textproperties/FontAlignmentProp.java     |    3 +-
     .../textproperties/TextPropCollection.java    |   71 +-
     .../poi/hslf/record/FontCollection.java       |    5 +-
     .../poi/hslf/usermodel/HSLFSlideMaster.java   |   58 +-
     .../poi/hslf/usermodel/HSLFTextParagraph.java | 1490 ++++++++---------
     .../poi/hslf/usermodel/HSLFTextRun.java       |   57 +-
     .../apache/poi/sl/draw/DrawTextParagraph.java |   89 +-
     .../org/apache/poi/sl/draw/DrawTextShape.java |    6 +-
     .../poi/sl/usermodel/TextParagraph.java       |  115 +-
     .../org/apache/poi/sl/usermodel/TextRun.java  |    8 +-
     .../poi/hslf/usermodel/TestPicture.java       |   62 +-
     .../poi/hslf/usermodel/TestRichTextRun.java   |   14 +-
     .../poi/hslf/usermodel/TestTextRun.java       |    2 +-
     test-data/slideshow/alterman_security2.pptx   |  Bin 0 -> 425540 bytes
     22 files changed, 1192 insertions(+), 1197 deletions(-)
     create mode 100644 test-data/slideshow/alterman_security2.pptx
    
    diff --git a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java
    index d95f970ce7..0032bc8097 100644
    --- a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java
    +++ b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java
    @@ -39,8 +39,8 @@ public final class BulletsDemo {
             HSLFTextParagraph rt = shape.getTextParagraphs().get(0);
             rt.getTextRuns().get(0).setFontSize(42);
             rt.setBullet(true);
    -        rt.setIndent(0);  //bullet offset
    -        rt.setLeftMargin(50);   //text offset (should be greater than bullet offset)
    +        rt.setIndent(0d);  //bullet offset
    +        rt.setLeftMargin(50d);   //text offset (should be greater than bullet offset)
             rt.setBulletChar('\u263A'); //bullet character
             shape.setText(
                     "January\r" +
    diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java
    index 373f01f33f..91366b9d06 100644
    --- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java
    +++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java
    @@ -48,8 +48,8 @@ public class Tutorial2 {
             XSLFTextParagraph p2 = shape1.addNewTextParagraph();
             // If spaceBefore >= 0, then space is a percentage of normal line height.
             // If spaceBefore < 0, the absolute value of linespacing is the spacing in points
    -        p2.setSpaceBefore(-20); // 20 pt from the previous paragraph
    -        p2.setSpaceAfter(300); // 3 lines after the paragraph
    +        p2.setSpaceBefore(-20d); // 20 pt from the previous paragraph
    +        p2.setSpaceAfter(300d); // 3 lines after the paragraph
             XSLFTextRun r2 = p2.addNewTextRun();
             r2.setText("Paragraph  properties apply to all text residing within the corresponding paragraph.");
             r2.setFontSize(16);
    @@ -62,8 +62,8 @@ public class Tutorial2 {
             r3.setFontColor(new Color(85, 142, 213));
     
             XSLFTextParagraph p4 = shape1.addNewTextParagraph();
    -        p4.setSpaceBefore(-20); // 20 pt from the previous paragraph
    -        p4.setSpaceAfter(300); // 3 lines after the paragraph
    +        p4.setSpaceBefore(-20d); // 20 pt from the previous paragraph
    +        p4.setSpaceAfter(300d); // 3 lines after the paragraph
             XSLFTextRun r4 = p4.addNewTextRun();
             r4.setFontSize(16);
             r4.setText(
    diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java
    index a80f23cad7..95252d72f5 100644
    --- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java
    +++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java
    @@ -45,9 +45,9 @@ public class Tutorial7 {
     
             XSLFTextParagraph p2 = shape.addNewTextParagraph();
             // indentation before text
    -        p2.setLeftMargin(60);
    +        p2.setLeftMargin(60d);
             // the bullet is set 40 pt before the text
    -        p2.setIndent(-40);
    +        p2.setIndent(-40d);
             p2.setBullet(true);
             // customize bullets
             p2.setBulletFontColor(Color.red);
    diff --git a/src/java/org/apache/poi/util/Units.java b/src/java/org/apache/poi/util/Units.java
    index bc643fd97b..107a9b583e 100644
    --- a/src/java/org/apache/poi/util/Units.java
    +++ b/src/java/org/apache/poi/util/Units.java
    @@ -16,6 +16,8 @@
     ==================================================================== */
     package org.apache.poi.util;
     
    +import org.apache.poi.hslf.usermodel.HSLFShape;
    +
     /**
      * @author Yegor Kozlov
      */
    @@ -23,6 +25,22 @@ public class Units {
         public static final int EMU_PER_PIXEL = 9525;
         public static final int EMU_PER_POINT = 12700;
     
    +    /**
    +     * Master DPI (576 pixels per inch).
    +     * Used by the reference coordinate system in PowerPoint (HSLF)
    +     */
    +    public static final int MASTER_DPI = 576;    
    +
    +    /**
    +     * Pixels DPI (96 pixels per inch)
    +     */
    +    public static final int PIXEL_DPI = 96;
    +
    +    /**
    +     * Points DPI (72 pixels per inch)
    +     */
    +    public static final int POINT_DPI = 72;    
    +
         /**
          * Converts points to EMUs
          * @param points points
    @@ -70,4 +88,17 @@ public class Units {
             int fixedPoint = (i << 16) | (f & 0xFFFF);
             return fixedPoint;
         }
    +
    +    public static double masterToPoints(int masterDPI) {
    +        double points = masterDPI;
    +        points *= HSLFShape.POINT_DPI;
    +        points /= HSLFShape.MASTER_DPI;
    +        return points;
    +    }
    +    
    +    public static int pointsToMaster(double points) {
    +        points *= HSLFShape.MASTER_DPI;
    +        points /= HSLFShape.POINT_DPI;
    +        return (int)points;
    +    }
     }
    diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
    index aef03197dd..f0cf3a78a9 100644
    --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
    +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
    @@ -137,8 +137,10 @@ public class XSLFTextParagraph implements TextParagraph {
         /**
          * Returns the alignment that is applied to the paragraph.
          *
    -     * If this attribute is omitted, then a value of left is implied.
    -     * @return ??? alignment that is applied to the paragraph
    +     * If this attribute is omitted, then null is returned.
    +     * User code can imply the value {@link TextAlign#LEFT} then.
    +     *
    +     * @return alignment that is applied to the paragraph
          */
         public TextAlign getTextAlign(){
             ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){
    @@ -152,7 +154,7 @@ public class XSLFTextParagraph implements TextParagraph {
                 }
             };
             fetchParagraphProperty(fetcher);
    -        return fetcher.getValue() == null ? TextAlign.LEFT : fetcher.getValue();
    +        return fetcher.getValue();
         }
     
         /**
    @@ -184,7 +186,7 @@ public class XSLFTextParagraph implements TextParagraph {
                 }
             };
             fetchParagraphProperty(fetcher);
    -        return fetcher.getValue() == null ? FontAlign.AUTO : fetcher.getValue();
    +        return fetcher.getValue();
         }
     
         /**
    @@ -294,7 +296,7 @@ public class XSLFTextParagraph implements TextParagraph {
          *
          * @return the bullet size
          */
    -    public double getBulletFontSize(){
    +    public Double getBulletFontSize(){
             ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){
                 public boolean fetch(CTTextParagraphProperties props){
                     if(props.isSetBuSzPct()){
    @@ -309,7 +311,7 @@ public class XSLFTextParagraph implements TextParagraph {
                 }
             };
             fetchParagraphProperty(fetcher);
    -        return fetcher.getValue() == null ? 100 : fetcher.getValue();
    +        return fetcher.getValue();
         }
     
         /**
    @@ -334,27 +336,19 @@ public class XSLFTextParagraph implements TextParagraph {
             }
        }
     
    -    /**
    -     * Specifies the indent size that will be applied to the first line of text in the paragraph.
    -     *
    -     * @param value the indent in points. 
    -     */
         @Override
    -    public void setIndent(double value){
    +    public void setIndent(Double indent){
    +        if (indent == null && !_p.isSetPPr()) return;
             CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();
    -        if(value == -1) {
    +        if(indent == -1) {
                 if(pr.isSetIndent()) pr.unsetIndent();
             } else {
    -            pr.setIndent(Units.toEMU(value));
    +            pr.setIndent(Units.toEMU(indent));
             }
         }
     
    -    /**
    -     *
    -     * @return the indent applied to the first line of text in the paragraph.
    -     */
         @Override
    -    public double getIndent(){
    +    public Double getIndent() {
     
             ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){
                 public boolean fetch(CTTextParagraphProperties props){
    @@ -367,32 +361,26 @@ public class XSLFTextParagraph implements TextParagraph {
             };
             fetchParagraphProperty(fetcher);
     
    -        return fetcher.getValue() == null ? 0 : fetcher.getValue();
    +        return fetcher.getValue();
         }
     
    -    /**
    -     * Specifies the left margin of the paragraph. This is specified in addition to the text body
    -     * inset and applies only to this text paragraph. That is the text body Inset and the LeftMargin
    -     * attributes are additive with respect to the text position.
    -     *
    -     * @param value the left margin (in points) of the paragraph
    -     */
         @Override
    -    public void setLeftMargin(double value){
    +    public void setLeftMargin(Double leftMargin){
    +        if (leftMargin == null && !_p.isSetPPr()) return;
             CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();
    -        if(value == -1) {
    +        if (leftMargin == null) {
                 if(pr.isSetMarL()) pr.unsetMarL();
             } else {
    -            pr.setMarL(Units.toEMU(value));
    +            pr.setMarL(Units.toEMU(leftMargin));
             }
     
         }
     
         /**
    -     * @return the left margin (in points) of the paragraph
    +     * @return the left margin (in points) of the paragraph, null if unset
          */
         @Override
    -    public double getLeftMargin(){
    +    public Double getLeftMargin(){
             ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){
                 public boolean fetch(CTTextParagraphProperties props){
                     if(props.isSetMarL()){
    @@ -405,32 +393,26 @@ public class XSLFTextParagraph implements TextParagraph {
             };
             fetchParagraphProperty(fetcher);
             // if the marL attribute is omitted, then a value of 347663 is implied
    -        return fetcher.getValue() == null ? 0 : fetcher.getValue();
    +        return fetcher.getValue();
         }
     
    -    /**
    -     * Specifies the right margin of the paragraph. This is specified in addition to the text body
    -     * inset and applies only to this text paragraph. That is the text body Inset and the RightMargin
    -     * attributes are additive with respect to the text position.
    -     *
    -     * @param value the right margin (in points) of the paragraph
    -     */
         @Override
    -    public void setRightMargin(double value){
    +    public void setRightMargin(Double rightMargin){
    +        if (rightMargin == null && !_p.isSetPPr()) return;
             CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();
    -        if(value == -1) {
    +        if(rightMargin == -1) {
                 if(pr.isSetMarR()) pr.unsetMarR();
             } else {
    -            pr.setMarR(Units.toEMU(value));
    +            pr.setMarR(Units.toEMU(rightMargin));
             }
         }
     
         /**
          *
    -     * @return the right margin of the paragraph
    +     * @return the right margin of the paragraph, null if unset
          */
         @Override
    -    public double getRightMargin(){
    +    public Double getRightMargin(){
             ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){
                 public boolean fetch(CTTextParagraphProperties props){
                     if(props.isSetMarR()){
    @@ -443,14 +425,11 @@ public class XSLFTextParagraph implements TextParagraph {
             };
             fetchParagraphProperty(fetcher);
             // if the marL attribute is omitted, then a value of 347663 is implied
    -        return fetcher.getValue() == null ? 0 : fetcher.getValue();
    +        return fetcher.getValue();
         }
     
    -    /**
    -     *
    -     * @return the default size for a tab character within this paragraph in points
    -     */
    -    public double getDefaultTabSize(){
    +    @Override
    +    public Double getDefaultTabSize(){
             ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){
                 public boolean fetch(CTTextParagraphProperties props){
                     if(props.isSetDefTabSz()){
    @@ -462,7 +441,7 @@ public class XSLFTextParagraph implements TextParagraph {
                 }
             };
             fetchParagraphProperty(fetcher);
    -        return fetcher.getValue() == null ? 0 : fetcher.getValue();
    +        return fetcher.getValue();
         }
     
         public double getTabStop(final int idx){
    @@ -491,16 +470,25 @@ public class XSLFTextParagraph implements TextParagraph {
         }
     
         @Override
    -    public void setLineSpacing(double linespacing){
    +    public void setLineSpacing(Double lineSpacing){
    +        if (lineSpacing == null && !_p.isSetPPr()) return;
             CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();
    -        CTTextSpacing spc = CTTextSpacing.Factory.newInstance();
    -        if(linespacing >= 0) spc.addNewSpcPct().setVal((int)(linespacing*1000));
    -        else spc.addNewSpcPts().setVal((int)(-linespacing*100));
    -        pr.setLnSpc(spc);
    +        if(lineSpacing == null) {
    +            if (pr.isSetLnSpc()) pr.unsetLnSpc();
    +        } else {
    +            CTTextSpacing spc = (pr.isSetLnSpc()) ? pr.getLnSpc() : pr.addNewLnSpc();
    +            if (lineSpacing >= 0) {
    +                (spc.isSetSpcPct() ? spc.getSpcPct() : spc.addNewSpcPct()).setVal((int)(lineSpacing*1000));
    +                if (spc.isSetSpcPts()) spc.unsetSpcPts();
    +            } else {
    +                (spc.isSetSpcPts() ? spc.getSpcPts() : spc.addNewSpcPts()).setVal((int)(-lineSpacing*100));
    +                if (spc.isSetSpcPct()) spc.unsetSpcPct();
    +            }
    +        }
         }
     
         @Override
    -    public double getLineSpacing(){
    +    public Double getLineSpacing(){
             ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){
                 public boolean fetch(CTTextParagraphProperties props){
                     if(props.isSetLnSpc()){
    @@ -515,8 +503,8 @@ public class XSLFTextParagraph implements TextParagraph {
             };
             fetchParagraphProperty(fetcher);
     
    -        double lnSpc = fetcher.getValue() == null ? 100 : fetcher.getValue();
    -        if(lnSpc > 0) {
    +        Double lnSpc = fetcher.getValue();
    +        if (lnSpc != null && lnSpc > 0) {
                 // check if the percentage value is scaled
                 CTTextNormalAutofit normAutofit = getParentShape().getTextBodyPr().getNormAutofit();
                 if(normAutofit != null) {
    @@ -528,26 +516,9 @@ public class XSLFTextParagraph implements TextParagraph {
             return lnSpc;
         }
     
    -    /**
    -     * Set the amount of vertical white space that will be present before the paragraph.
    -     * This space is specified in either percentage or points:
    -     * 

    - * If spaceBefore >= 0, then space is a percentage of normal line height. - * If spaceBefore < 0, the absolute value of linespacing is the spacing in points - *

    - * Examples: - *
    
    -     *      // The paragraph will be formatted to have a spacing before the paragraph text.
    -     *      // The spacing will be 200% of the size of the largest text on each line
    -     *      paragraph.setSpaceBefore(200);
    -     *
    -     *      // The spacing will be a size of 48 points
    -     *      paragraph.setSpaceBefore(-48.0);
    -     * 
    - * - * @param spaceBefore the vertical white space before the paragraph. - */ - public void setSpaceBefore(double spaceBefore){ + @Override + public void setSpaceBefore(Double spaceBefore){ + if (spaceBefore == null && !_p.isSetPPr()) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); CTTextSpacing spc = CTTextSpacing.Factory.newInstance(); if(spaceBefore >= 0) spc.addNewSpcPct().setVal((int)(spaceBefore*1000)); @@ -555,17 +526,8 @@ public class XSLFTextParagraph implements TextParagraph { pr.setSpcBef(spc); } - /** - * The amount of vertical white space before the paragraph - * This may be specified in two different ways, percentage spacing and font point spacing: - *

    - * If spaceBefore >= 0, then space is a percentage of normal line height. - * If spaceBefore < 0, the absolute value of linespacing is the spacing in points - *

    - * - * @return the vertical white space before the paragraph - */ - public double getSpaceBefore(){ + @Override + public Double getSpaceBefore(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetSpcBef()){ @@ -580,30 +542,11 @@ public class XSLFTextParagraph implements TextParagraph { }; fetchParagraphProperty(fetcher); - double spcBef = fetcher.getValue() == null ? 0 : fetcher.getValue(); - return spcBef; + return fetcher.getValue(); } - /** - * Set the amount of vertical white space that will be present after the paragraph. - * This space is specified in either percentage or points: - *

    - * If spaceAfter >= 0, then space is a percentage of normal line height. - * If spaceAfter < 0, the absolute value of linespacing is the spacing in points - *

    - * Examples: - *
    
    -     *      // The paragraph will be formatted to have a spacing after the paragraph text.
    -     *      // The spacing will be 200% of the size of the largest text on each line
    -     *      paragraph.setSpaceAfter(200);
    -     *
    -     *      // The spacing will be a size of 48 points
    -     *      paragraph.setSpaceAfter(-48.0);
    -     * 
    - * - * @param spaceAfter the vertical white space after the paragraph. - */ - public void setSpaceAfter(double spaceAfter){ + @Override + public void setSpaceAfter(Double spaceAfter){ CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); CTTextSpacing spc = CTTextSpacing.Factory.newInstance(); if(spaceAfter >= 0) spc.addNewSpcPct().setVal((int)(spaceAfter*1000)); @@ -611,17 +554,8 @@ public class XSLFTextParagraph implements TextParagraph { pr.setSpcAft(spc); } - /** - * The amount of vertical white space after the paragraph - * This may be specified in two different ways, percentage spacing and font point spacing: - *

    - * If spaceBefore >= 0, then space is a percentage of normal line height. - * If spaceBefore < 0, the absolute value of linespacing is the spacing in points - *

    - * - * @return the vertical white space after the paragraph - */ - public double getSpaceAfter(){ + @Override + public Double getSpaceAfter(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetSpcAft()){ @@ -635,7 +569,7 @@ public class XSLFTextParagraph implements TextParagraph { } }; fetchParagraphProperty(fetcher); - return fetcher.getValue() == null ? 0 : fetcher.getValue(); + return fetcher.getValue(); } /** @@ -647,7 +581,6 @@ public class XSLFTextParagraph implements TextParagraph { */ public void setLevel(int level){ CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); - pr.setLvl(level); } @@ -657,10 +590,7 @@ public class XSLFTextParagraph implements TextParagraph { */ public int getLevel(){ CTTextParagraphProperties pr = _p.getPPr(); - if(pr == null) return 0; - - return pr.getLvl(); - + return (pr == null || !pr.isSetLvl()) ? 0 : pr.getLvl(); } /** @@ -721,53 +651,70 @@ public class XSLFTextParagraph implements TextParagraph { } - CTTextParagraphProperties getDefaultMasterStyle(){ + /* package */ CTTextParagraphProperties getDefaultMasterStyle(){ CTPlaceholder ph = _shape.getCTPlaceholder(); - String defaultStyleSelector; - if(ph == null) defaultStyleSelector = "otherStyle"; // no placeholder means plain text box - else { - switch(ph.getType().intValue()){ - case STPlaceholderType.INT_TITLE: - case STPlaceholderType.INT_CTR_TITLE: - defaultStyleSelector = "titleStyle"; - break; - case STPlaceholderType.INT_FTR: - case STPlaceholderType.INT_SLD_NUM: - case STPlaceholderType.INT_DT: - defaultStyleSelector = "otherStyle"; - break; - default: - defaultStyleSelector = "bodyStyle"; - break; - } + String defaultStyleSelector; + switch(ph == null ? -1 : ph.getType().intValue()) { + case STPlaceholderType.INT_TITLE: + case STPlaceholderType.INT_CTR_TITLE: + defaultStyleSelector = "titleStyle"; + break; + case -1: // no placeholder means plain text box + case STPlaceholderType.INT_FTR: + case STPlaceholderType.INT_SLD_NUM: + case STPlaceholderType.INT_DT: + defaultStyleSelector = "otherStyle"; + break; + default: + defaultStyleSelector = "bodyStyle"; + break; } int level = getLevel(); // wind up and find the root master sheet which must be slide master XSLFSheet masterSheet = _shape.getSheet(); - while (masterSheet.getMasterSheet() != null){ - masterSheet = (XSLFSheet)masterSheet.getMasterSheet(); + for (XSLFSheet m = masterSheet; m != null; m = (XSLFSheet)m.getMasterSheet()) { + masterSheet = m; } - XmlObject[] o = masterSheet.getXmlObject().selectPath( - "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + - "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' " + - ".//p:txStyles/p:" + defaultStyleSelector +"/a:lvl" +(level+1)+ "pPr"); - if (o.length == 1){ - return (CTTextParagraphProperties)o[0]; - } else { - o = masterSheet.getXmlObject().selectPath( - "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + - "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' " + - ".//p:notesStyle/a:lvl" +(level+1)+ "pPr"); - - if (o.length == 1){ + String nsDecl = + "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + + "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' "; + String xpaths[] = { + nsDecl+".//p:txStyles/p:" + defaultStyleSelector +"/a:lvl" +(level+1)+ "pPr", + nsDecl+".//p:notesStyle/a:lvl" +(level+1)+ "pPr" + }; + XmlObject xo = masterSheet.getXmlObject(); + for (String xpath : xpaths) { + XmlObject[] o = xo.selectPath(xpath); + if (o.length == 1) { return (CTTextParagraphProperties)o[0]; } - - throw new IllegalArgumentException("Failed to fetch default style for " + - defaultStyleSelector + " and level=" + level); } + +// for (CTTextBody txBody : (CTTextBody[])xo.selectPath(nsDecl+".//p:txBody")) { +// CTTextParagraphProperties defaultPr = null, lastPr = null; +// boolean hasLvl = false; +// for (CTTextParagraph p : txBody.getPArray()) { +// CTTextParagraphProperties pr = p.getPPr(); +// if (pr.isSetLvl()) { +// hasLvl |= true; +// lastPr = pr; +// if (pr.getLvl() == level) return pr; +// } else { +// defaultPr = pr; +// } +// } +// if (!hasLvl) continue; +// if (level == 0 && defaultPr != null) return defaultPr; +// if (lastPr != null) return lastPr; +// break; +// } +// +// String err = "Failed to fetch default style for " + defaultStyleSelector + " and level=" + level; +// throw new IllegalArgumentException(err); + + return null; } private boolean fetchParagraphProperty(ParagraphPropertyFetcher visitor){ @@ -860,9 +807,9 @@ public class XSLFTextParagraph implements TextParagraph { } @Override - public double getDefaultFontSize() { + public Double getDefaultFontSize() { CTTextCharacterProperties endPr = _p.getEndParaRPr(); - return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100); + return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100.); } @Override @@ -871,6 +818,7 @@ public class XSLFTextParagraph implements TextParagraph { } public BulletStyle getBulletStyle() { + if (!isBullet()) return null; return new BulletStyle(){ public String getBulletCharacter() { return XSLFTextParagraph.this.getBulletCharacter(); @@ -880,7 +828,7 @@ public class XSLFTextParagraph implements TextParagraph { return XSLFTextParagraph.this.getBulletFont(); } - public double getBulletFontSize() { + public Double getBulletFontSize() { return XSLFTextParagraph.this.getBulletFontSize(); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java index 2b63a58099..d99df7e79a 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java @@ -17,26 +17,11 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; -import java.awt.font.FontRenderContext; -import java.awt.font.TextAttribute; -import java.awt.font.TextLayout; -import java.text.AttributedString; import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.Beta; import org.apache.poi.xslf.model.CharacterPropertyFetcher; -import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeStyle; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNormalAutofit; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.STSchemeColorVal; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType; +import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; /** @@ -89,28 +74,6 @@ public class XSLFTextRun implements TextRun { return buf.toString(); } - /** - * Replace a tab with the effective number of white spaces. - */ - private String tab2space(){ - AttributedString string = new AttributedString(" "); - // user can pass an object to convert fonts via a rendering hint - string.addAttribute(TextAttribute.FAMILY, getFontFamily()); - - string.addAttribute(TextAttribute.SIZE, (float)getFontSize()); - TextLayout l = new TextLayout(string.getIterator(), new FontRenderContext(null, true, true)); - double wspace = l.getAdvance(); - - double tabSz = _p.getDefaultTabSize(); - - int numSpaces = (int)Math.ceil(tabSz / wspace); - StringBuffer buf = new StringBuffer(); - for(int i = 0; i < numSpaces; i++) { - buf.append(' '); - } - return buf.toString(); - } - public void setText(String text){ _r.setT(text); } @@ -175,9 +138,10 @@ public class XSLFTextRun implements TextRun { } /** - * @return font size in points or -1 if font size is not set. + * @return font size in points or null if font size is not set. */ - public double getFontSize(){ + @Override + public Double getFontSize(){ double scale = 1; CTTextNormalAutofit afit = getParentParagraph().getParentShape().getTextBodyPr().getNormAutofit(); if(afit != null) scale = (double)afit.getFontScale() / 100000; @@ -192,7 +156,7 @@ public class XSLFTextRun implements TextRun { } }; fetchCharacterProperty(fetcher); - return fetcher.getValue() == null ? -1 : fetcher.getValue()*scale; + return fetcher.getValue() == null ? null : fetcher.getValue()*scale; } /** @@ -514,7 +478,7 @@ public class XSLFTextRun implements TextRun { return new XSLFHyperlink(_r.getRPr().getHlinkClick(), this); } - private boolean fetchCharacterProperty(CharacterPropertyFetcher fetcher){ + private boolean fetchCharacterProperty(CharacterPropertyFetcher fetcher){ boolean ok = false; if(_r.isSetRPr()) ok = fetcher.fetch(getRPr()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java index 6fc5690cca..b3c44f84a7 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java @@ -125,7 +125,7 @@ public class TestXSLFAutoShape { p.setIndent(2.0); assertEquals(2.0, p.getIndent(), 0); assertTrue(p.getXmlObject().getPPr().isSetIndent()); - p.setIndent(-1); + p.setIndent(-1d); assertEquals(0.0, p.getIndent(), 0); assertFalse(p.getXmlObject().getPPr().isSetIndent()); p.setIndent(10.0); @@ -149,44 +149,44 @@ public class TestXSLFAutoShape { assertFalse(p.getXmlObject().getPPr().isSetSpcAft()); - p.setSpaceAfter(200); + p.setSpaceAfter(200d); assertEquals(200000, p.getXmlObject().getPPr().getSpcAft().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPts()); - p.setSpaceAfter(100); + p.setSpaceAfter(100d); assertEquals(100000, p.getXmlObject().getPPr().getSpcAft().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPts()); - p.setSpaceAfter(-20); + p.setSpaceAfter(-20d); assertEquals(2000, p.getXmlObject().getPPr().getSpcAft().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPct()); - p.setSpaceAfter(-10); + p.setSpaceAfter(-10d); assertEquals(1000, p.getXmlObject().getPPr().getSpcAft().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPct()); assertFalse(p.getXmlObject().getPPr().isSetSpcBef()); - p.setSpaceBefore(200); + p.setSpaceBefore(200d); assertEquals(200000, p.getXmlObject().getPPr().getSpcBef().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPts()); - p.setSpaceBefore(100); + p.setSpaceBefore(100d); assertEquals(100000, p.getXmlObject().getPPr().getSpcBef().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPts()); - p.setSpaceBefore(-20); + p.setSpaceBefore(-20d); assertEquals(2000, p.getXmlObject().getPPr().getSpcBef().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPct()); - p.setSpaceBefore(-10); + p.setSpaceBefore(-10d); assertEquals(1000, p.getXmlObject().getPPr().getSpcBef().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPct()); assertFalse(p.getXmlObject().getPPr().isSetLnSpc()); - p.setLineSpacing(200); + p.setLineSpacing(200d); assertEquals(200000, p.getXmlObject().getPPr().getLnSpc().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPts()); - p.setLineSpacing(100); + p.setLineSpacing(100d); assertEquals(100000, p.getXmlObject().getPPr().getLnSpc().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPts()); - p.setLineSpacing(-20); + p.setLineSpacing(-20d); assertEquals(2000, p.getXmlObject().getPPr().getLnSpc().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPct()); - p.setLineSpacing(-10); + p.setLineSpacing(-10d); assertEquals(1000, p.getXmlObject().getPPr().getLnSpc().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPct()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index 0998ee8e72..37a01a73ae 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -92,7 +92,7 @@ public class TestXSLFTextParagraph { assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0); assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0); - p.setLeftMargin(36); // 0.5" + p.setLeftMargin(36d); // 0.5" leftMargin = p.getLeftMargin(); assertEquals(36.0, leftMargin, 0); expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java index c9c911ccf9..904feeedf8 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java @@ -21,12 +21,13 @@ package org.apache.poi.hslf.model.textproperties; * Definition for the font alignment property. */ public class FontAlignmentProp extends TextProp { + public static final String NAME = "fontAlign"; public static final int BASELINE = 0; public static final int TOP = 1; public static final int CENTER = 2; public static final int BOTTOM = 3; public FontAlignmentProp() { - super(2, 0x10000, "fontAlign"); + super(2, 0x10000, NAME); } } \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java index 17d0c1d2c5..84cfe9940f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java @@ -31,47 +31,10 @@ import org.apache.poi.util.LittleEndian; * properties, and the indent level if required. */ public class TextPropCollection { - /* - private static TextProp paragraphSpecialPropTypes[] = { - new ParagraphFlagsTextProp(), - new TextProp(2, 0x80, "bullet.char"), - new TextProp(2, 0x10, "bullet.font"), - new TextProp(2, 0x40, "bullet.size"), - new TextProp(4, 0x20, "bullet.color"), - new TextProp(2, 0xD00, "alignment"), - new TextProp(2, 0x1000, "linespacing"), - new TextProp(2, 0x2000, "spacebefore"), - new TextProp(2, 0x4000, "spaceafter"), - new TextProp(2, 0x8000, "text.offset"), - new TextProp(2, 0x10000, "bullet.offset"), - new TextProp(2, 0x20000, "defaulttab"), - new TextProp(2, 0x40000, "para_unknown_2"), - new TextProp(2, 0x80000, "para_unknown_3"), - new TextProp(2, 0x100000, "para_unknown_4"), - new TextProp(2, 0x200000, "para_unknown_5") - }; - - private static TextProp characterSpecialPropTypes[] = { - new CharFlagsTextProp(), - new TextProp(2, 0x10000, "font.index"), - new TextProp(2, 0x20000, "char_unknown_1"), - new TextProp(4, 0x40000, "char_unknown_2"), - new TextProp(2, 0x80000, "font.size"), - new TextProp(2, 0x100000, "char_unknown_3"), - new TextProp(4, 0x200000, "font.color"), - new TextProp(2, 0x800000, "char_unknown_4") - }; -*/ - - /** All the different kinds of paragraph properties we might handle */ public static final TextProp[] paragraphTextPropTypes = { // TextProp order is according to 2.9.20 TextPFException, // bitmask order can be different -// new TextProp(0, 0x1, "hasBullet"), -// new TextProp(0, 0x2, "hasBulletFont"), -// new TextProp(0, 0x4, "hasBulletColor"), -// new TextProp(0, 0x8, "hasBulletSize"), new ParagraphFlagsTextProp(), new TextProp(2, 0x80, "bullet.char"), new TextProp(2, 0x10, "bullet.font"), @@ -95,24 +58,9 @@ public class TextPropCollection { new TextProp(0, 0x2000000, "hasBulletScheme"), // TODO: check size // 0xFC000000 MUST be zero and MUST be ignored }; + /** All the different kinds of character properties we might handle */ public static final TextProp[] characterTextPropTypes = new TextProp[] { -// new TextProp(0, 0x1, "bold"), -// new TextProp(0, 0x2, "italic"), -// new TextProp(0, 0x4, "underline"), -// new TextProp(0, 0x8, "unused1"), -// new TextProp(0, 0x10, "shadow"), -// new TextProp(0, 0x20, "fehint"), -// new TextProp(0, 0x40, "unused2"), -// new TextProp(0, 0x80, "kumi"), -// new TextProp(0, 0x100, "strikethrough"), -// new TextProp(0, 0x200, "emboss"), -// new TextProp(0, 0x400, "nibble1"), -// new TextProp(0, 0x800, "nibble2"), -// new TextProp(0, 0x1000, "nibble3"), -// new TextProp(0, 0x2000, "nibble4"), -// new TextProp(0, 0x4000, "unused4"), -// new TextProp(0, 0x8000, "unused5"), new TextProp(0, 0x100000, "pp10ext"), new TextProp(0, 0x1000000, "newAsian.font.index"), // A bit that specifies whether the newEAFontRef field of the TextCFException10 structure that contains this CFMasks exists. new TextProp(0, 0x2000000, "cs.font.index"), // A bit that specifies whether the csFontRef field of the TextCFException10 structure that contains this CFMasks exists. @@ -166,6 +114,19 @@ public class TextPropCollection { } return null; } + + public TextProp removeByName(String name) { + Iterator iter = textPropList.iterator(); + TextProp tp = null; + while (iter.hasNext()) { + tp = iter.next(); + if (tp.getName().equals(name)){ + iter.remove(); + break; + } + } + return tp; + } /** Add the TextProp with this name to the list */ public TextProp addWithName(String name) { @@ -192,6 +153,10 @@ public class TextPropCollection { return textProp; } + public TextPropType getTextPropType() { + return textPropType; + } + private TextProp[] getPotentialProperties() { return (textPropType == TextPropType.paragraph) ? paragraphTextPropTypes : characterTextPropTypes; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java b/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java index 0f7f05148b..b90c698dd6 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java @@ -17,6 +17,7 @@ package org.apache.poi.hslf.record; +import org.apache.poi.hslf.model.PPFont; import org.apache.poi.util.POILogger; import java.io.*; @@ -75,9 +76,9 @@ public final class FontCollection extends RecordContainer { */ public int addFont(String name) { int idx = getFontIndex(name); - if(idx != -1) return idx; + if (idx != -1) return idx; - return addFont(name, 0, 0, 4, 34); + return addFont(name, 0, 0, 4, PPFont.FF_SWISS | PPFont.VARIABLE_PITCH); } public int addFont(String name, int charset, int flags, int type, int pitch) { diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java index a6dfedf073..346dab7450 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java @@ -76,45 +76,31 @@ public final class HSLFSlideMaster extends HSLFMasterSheet { * This is the "workhorse" which returns the default style attrubutes. */ public TextProp getStyleAttribute(int txtype, int level, String name, boolean isCharacter) { - + if (_txmaster.length <= txtype) return null; + TxMasterStyleAtom t = _txmaster[txtype]; + List styles = isCharacter ? t.getCharacterStyles() : t.getParagraphStyles(); + TextProp prop = null; - for (int i = level; i >= 0; i--) { - List styles = - isCharacter ? _txmaster[txtype].getCharacterStyles() : _txmaster[txtype].getParagraphStyles(); - if (i < styles.size()) prop = styles.get(i).findByName(name); - if (prop != null) break; + for (int i = Math.min(level, styles.size()-1); prop == null && i >= 0; i--) { + prop = styles.get(i).findByName(name); } - if (prop == null) { - if(isCharacter) { - switch (txtype) { - case TextHeaderAtom.CENTRE_BODY_TYPE: - case TextHeaderAtom.HALF_BODY_TYPE: - case TextHeaderAtom.QUARTER_BODY_TYPE: - txtype = TextHeaderAtom.BODY_TYPE; - break; - case TextHeaderAtom.CENTER_TITLE_TYPE: - txtype = TextHeaderAtom.TITLE_TYPE; - break; - default: - return null; - } - } else { - switch (txtype) { - case TextHeaderAtom.CENTRE_BODY_TYPE: - case TextHeaderAtom.HALF_BODY_TYPE: - case TextHeaderAtom.QUARTER_BODY_TYPE: - txtype = TextHeaderAtom.BODY_TYPE; - break; - case TextHeaderAtom.CENTER_TITLE_TYPE: - txtype = TextHeaderAtom.TITLE_TYPE; - break; - default: - return null; - } - } - prop = getStyleAttribute(txtype, level, name, isCharacter); + + if (prop != null) return prop; + + switch (txtype) { + case TextHeaderAtom.CENTRE_BODY_TYPE: + case TextHeaderAtom.HALF_BODY_TYPE: + case TextHeaderAtom.QUARTER_BODY_TYPE: + txtype = TextHeaderAtom.BODY_TYPE; + break; + case TextHeaderAtom.CENTER_TITLE_TYPE: + txtype = TextHeaderAtom.TITLE_TYPE; + break; + default: + return null; } - return prop; + + return getStyleAttribute(txtype, level, name, isCharacter); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index c0d381e912..ee99745b5a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -34,7 +34,7 @@ import org.apache.poi.util.*; * This class represents a run of text in a powerpoint document. That * run could be text on a sheet, or text in a note. * It is only a very basic class for now - * + * * @author Nick Burch */ @@ -44,50 +44,49 @@ public final class HSLFTextParagraph implements TextParagraph { /** * How to align the text */ - /* package */ static final int AlignLeft = 0; - /* package */ static final int AlignCenter = 1; - /* package */ static final int AlignRight = 2; - /* package */ static final int AlignJustify = 3; - + /* package */static final int AlignLeft = 0; + /* package */static final int AlignCenter = 1; + /* package */static final int AlignRight = 2; + /* package */static final int AlignJustify = 3; // Note: These fields are protected to help with unit testing - // Other classes shouldn't really go playing with them! - private final TextHeaderAtom _headerAtom; - private TextBytesAtom _byteAtom; - private TextCharsAtom _charAtom; - private final TextPropCollection _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph); + // Other classes shouldn't really go playing with them! + private final TextHeaderAtom _headerAtom; + private TextBytesAtom _byteAtom; + private TextCharsAtom _charAtom; + private final TextPropCollection _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph); protected TextRulerAtom _ruler; - protected List _runs = new ArrayList(); - protected HSLFTextShape _parentShape; + protected final List _runs = new ArrayList(); + protected HSLFTextShape _parentShape; private HSLFSheet _sheet; private int shapeId; - // private StyleTextPropAtom styleTextPropAtom; - private StyleTextProp9Atom styleTextProp9Atom; + // private StyleTextPropAtom styleTextPropAtom; + private StyleTextProp9Atom styleTextProp9Atom; - /** + /** * Constructs a Text Run from a Unicode text block. * Either a {@link TextCharsAtom} or a {@link TextBytesAtom} needs to be provided. - * + * * @param tha the TextHeaderAtom that defines what's what * @param tba the TextBytesAtom containing the text or null if {@link TextCharsAtom} is provided * @param tca the TextCharsAtom containing the text or null if {@link TextBytesAtom} is provided - */ + */ /* package */ HSLFTextParagraph( TextHeaderAtom tha, TextBytesAtom tba, TextCharsAtom tca ) { - if (tha == null) { - throw new IllegalArgumentException("TextHeaderAtom must be set."); - } - _headerAtom = tha; + if (tha == null) { + throw new IllegalArgumentException("TextHeaderAtom must be set."); + } + _headerAtom = tha; _byteAtom = tba; _charAtom = tca; - } + } - /* package */ HSLFTextParagraph(HSLFTextParagraph other) { + /* package */HSLFTextParagraph(HSLFTextParagraph other) { _headerAtom = other._headerAtom; _byteAtom = other._byteAtom; _charAtom = other._charAtom; @@ -98,67 +97,67 @@ public final class HSLFTextParagraph implements TextParagraph { _paragraphStyle.copy(other._paragraphStyle); } - public void addTextRun(HSLFTextRun run) { - _runs.add(run); - } + public void addTextRun(HSLFTextRun run) { + _runs.add(run); + } - /** + /** * Fetch the rich text runs (runs of text with the same styling) that * are contained within this block of text - */ - public List getTextRuns() { - return _runs; - } + */ + public List getTextRuns() { + return _runs; + } - public TextPropCollection getParagraphStyle() { - return _paragraphStyle; - } + public TextPropCollection getParagraphStyle() { + return _paragraphStyle; + } - public void setParagraphStyle(TextPropCollection paragraphStyle) { - _paragraphStyle.copy(paragraphStyle); - } + public void setParagraphStyle(TextPropCollection paragraphStyle) { + _paragraphStyle.copy(paragraphStyle); + } - /** + /** * Supply the Sheet we belong to, which might have an assigned SlideShow * Also passes it on to our child RichTextRuns */ - public void supplySheet(HSLFSheet sheet){ + public void supplySheet(HSLFSheet sheet) { this._sheet = sheet; if (_runs == null) return; - for(HSLFTextRun rt : _runs) { + for (HSLFTextRun rt : _runs) { rt.updateSheet(); } - } + } - public HSLFSheet getSheet(){ + public HSLFSheet getSheet() { return this._sheet; } /** - * @return Shape ID + * @return Shape ID */ - protected int getShapeId(){ + protected int getShapeId() { return shapeId; } /** - * @param id Shape ID + * @param id Shape ID */ - protected void setShapeId(int id){ + protected void setShapeId(int id) { shapeId = id; } /** - * @return 0-based index of the text run in the SLWT container + * @return 0-based index of the text run in the SLWT container */ - protected int getIndex(){ + protected int getIndex() { return (_headerAtom != null) ? _headerAtom.getIndex() : -1; } /** * Sets the index of the paragraph in the SLWT container - * + * * @param index */ protected void setIndex(int index) { @@ -166,10 +165,10 @@ public final class HSLFTextParagraph implements TextParagraph { } /** - * Returns the type of the text, from the TextHeaderAtom. - * Possible values can be seen from TextHeaderAtom - * @see org.apache.poi.hslf.record.TextHeaderAtom - */ + * Returns the type of the text, from the TextHeaderAtom. + * Possible values can be seen from TextHeaderAtom + * @see org.apache.poi.hslf.record.TextHeaderAtom + */ public int getRunType() { return (_headerAtom != null) ? _headerAtom.getTextType() : -1; } @@ -177,8 +176,7 @@ public final class HSLFTextParagraph implements TextParagraph { public void setRunType(int runType) { if (_headerAtom != null) _headerAtom.setTextType(runType); } - - + /** * Is this Text Run one from a {@link PPDrawing}, or is it * one from the {@link SlideListWithText}? @@ -187,12 +185,12 @@ public final class HSLFTextParagraph implements TextParagraph { return (getIndex() == -1); } - public TextRulerAtom getTextRuler(){ + public TextRulerAtom getTextRuler() { return _ruler; } - public TextRulerAtom createTextRuler(){ + public TextRulerAtom createTextRuler() { _ruler = getTextRuler(); if (_ruler == null) { _ruler = TextRulerAtom.getParagraphInstance(); @@ -207,19 +205,19 @@ public final class HSLFTextParagraph implements TextParagraph { /** * Returns records that make up the list of text paragraphs * (there can be misc InteractiveInfo, TxInteractiveInfo and other records) - * + * * @return text run records */ - public Record[] getRecords(){ + public Record[] getRecords() { Record r[] = _headerAtom.getParentRecord().getChildRecords(); - return getRecords(r, new int[]{0}, _headerAtom); + return getRecords(r, new int[] { 0 }, _headerAtom); } private static Record[] getRecords(Record[] records, int[] startIdx, TextHeaderAtom headerAtom) { if (records == null) { throw new NullPointerException("records need to be set."); } - + for (; startIdx[0] < records.length; startIdx[0]++) { Record r = records[startIdx[0]]; if (r instanceof TextHeaderAtom && (headerAtom == null || r == headerAtom)) break; @@ -229,135 +227,113 @@ public final class HSLFTextParagraph implements TextParagraph { logger.log(POILogger.INFO, "header atom wasn't found - container might contain only an OutlineTextRefAtom"); return new Record[0]; } - + int length; - for (length = 1; startIdx[0]+length < records.length; length++) { + for (length = 1; startIdx[0] + length < records.length; length++) { if (records[startIdx[0]+length] instanceof TextHeaderAtom) break; } - + Record result[] = new Record[length]; System.arraycopy(records, startIdx[0], result, 0, length); startIdx[0] += length; - + return result; } - + /** Numbered List info */ public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) { - this.styleTextProp9Atom = styleTextProp9Atom; - } + this.styleTextProp9Atom = styleTextProp9Atom; + } /** Numbered List info */ - public StyleTextProp9Atom getStyleTextProp9Atom() { - return this.styleTextProp9Atom; - } - - /** - * Fetch the value of the given Paragraph related TextProp. - * Returns -1 if that TextProp isn't present. - * If the TextProp isn't present, the value from the appropriate - * Master Sheet will apply. - */ - private int getParaTextPropVal(String propName) { - TextProp prop = _paragraphStyle.findByName(propName); - BitMaskTextProp maskProp = (BitMaskTextProp)_paragraphStyle.findByName(ParagraphFlagsTextProp.NAME); - boolean hardAttribute = (maskProp != null && maskProp.getValue() == 0); - if (prop == null && !hardAttribute){ - HSLFSheet sheet = getSheet(); - int txtype = getRunType(); - HSLFMasterSheet master = sheet.getMasterSheet(); - if (master != null) - prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); - } - - return prop == null ? -1 : prop.getValue(); + public StyleTextProp9Atom getStyleTextProp9Atom() { + return this.styleTextProp9Atom; } - - /** - * Sets the value of the given Character TextProp, add if required - * @param propName The name of the Character TextProp - * @param val The value to set for the TextProp - */ - public void setParaTextPropVal(String propName, int val) { - // Ensure we have the StyleTextProp atom we're going to need - assert(_paragraphStyle!=null); - TextProp tp = fetchOrAddTextProp(_paragraphStyle, propName); - tp.setValue(val); - } - + @Override public Iterator iterator() { return _runs.iterator(); } @Override - public double getLeftMargin() { - int val = getParaTextPropVal("text.offset"); - return val*HSLFShape.POINT_DPI/((double)HSLFShape.MASTER_DPI); + public Double getLeftMargin() { + TextProp val = getPropVal(_paragraphStyle, "text.offset", this); + return (val == null) ? null : Units.masterToPoints(val.getValue()); } @Override - public void setLeftMargin(double leftMargin) { - int val = (int)(leftMargin*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); - setParaTextPropVal("text.offset", val); + public void setLeftMargin(Double leftMargin) { + Integer val = (leftMargin == null) ? null : Units.pointsToMaster(leftMargin); + setPropVal(_paragraphStyle, "text.offset", val); } @Override - public double getRightMargin() { + public Double getRightMargin() { // TODO: find out, how to determine this value - return 0; + return null; } @Override - public void setRightMargin(double rightMargin) { + public void setRightMargin(Double rightMargin) { // TODO: find out, how to set this value } @Override - public double getIndent() { - int val = getParaTextPropVal("bullet.offset"); - return val*HSLFShape.POINT_DPI/((double)HSLFShape.MASTER_DPI); + public Double getIndent() { + TextProp val = getPropVal(_paragraphStyle, "bullet.offset", this); + return (val == null) ? null : Units.masterToPoints(val.getValue()); } @Override - public void setIndent(double intent) { - int val = (int)(intent*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); - setParaTextPropVal("bullet.offset", val); + public void setIndent(Double indent) { + Integer val = (indent == null) ? null : Units.pointsToMaster(indent); + setPropVal(_paragraphStyle, "bullet.offset", val); } @Override public String getDefaultFontFamily() { - return (_runs.isEmpty() ? "Arial" : _runs.get(0).getFontFamily()); + String typeface = null; + if (!_runs.isEmpty()) { + typeface = _runs.get(0).getFontFamily(); + } + return (typeface != null) ? typeface : "Arial"; } @Override - public double getDefaultFontSize() { - return (_runs.isEmpty() ? 12 : _runs.get(0).getFontSize()); + public Double getDefaultFontSize() { + Double d = null; + if (!_runs.isEmpty()) { + d = _runs.get(0).getFontSize(); + } + + return (d != null) ? d : 12d; } /** * Sets the type of horizontal alignment for the paragraph. - * + * * @param align - the type of alignment */ public void setAlignment(org.apache.poi.sl.usermodel.TextParagraph.TextAlign align) { - int alignInt; - switch (align) { - default: - case LEFT: alignInt = TextAlignmentProp.LEFT; break; - case CENTER: alignInt = TextAlignmentProp.CENTER; break; - case RIGHT: alignInt = TextAlignmentProp.RIGHT; break; - case DIST: alignInt = TextAlignmentProp.DISTRIBUTED; break; - case JUSTIFY: alignInt = TextAlignmentProp.JUSTIFY; break; - case JUSTIFY_LOW: alignInt = TextAlignmentProp.JUSTIFYLOW; break; - case THAI_DIST: alignInt = TextAlignmentProp.THAIDISTRIBUTED; break; + Integer alignInt = null; + if (align != null) switch (align) { + default: + case LEFT: alignInt = TextAlignmentProp.LEFT;break; + case CENTER: alignInt = TextAlignmentProp.CENTER; break; + case RIGHT: alignInt = TextAlignmentProp.RIGHT; break; + case DIST: alignInt = TextAlignmentProp.DISTRIBUTED; break; + case JUSTIFY: alignInt = TextAlignmentProp.JUSTIFY; break; + case JUSTIFY_LOW: alignInt = TextAlignmentProp.JUSTIFYLOW; break; + case THAI_DIST: alignInt = TextAlignmentProp.THAIDISTRIBUTED; break; } - setParaTextPropVal("alignment", alignInt); + setPropVal(_paragraphStyle, "alignment", alignInt); } @Override public org.apache.poi.sl.usermodel.TextParagraph.TextAlign getTextAlign() { - switch (getParaTextPropVal("alignment")) { + TextProp tp = getPropVal(_paragraphStyle, "alignment", this); + if (tp == null) return null; + switch (tp.getValue()) { default: case TextAlignmentProp.LEFT: return TextAlign.LEFT; case TextAlignmentProp.CENTER: return TextAlign.CENTER; @@ -371,34 +347,33 @@ public final class HSLFTextParagraph implements TextParagraph { @Override public FontAlign getFontAlign() { - switch(getParaTextPropVal("fontAlign")) { - default: - case -1: return FontAlign.AUTO; + TextProp tp = getPropVal(_paragraphStyle, FontAlignmentProp.NAME, this); + if (tp == null) return null; + + switch (tp.getValue()) { case FontAlignmentProp.BASELINE: return FontAlign.BASELINE; case FontAlignmentProp.TOP: return FontAlign.TOP; case FontAlignmentProp.CENTER: return FontAlign.CENTER; case FontAlignmentProp.BOTTOM: return FontAlign.BOTTOM; + default: return FontAlign.AUTO; } } @Override public BulletStyle getBulletStyle() { - if (getBulletChar() == 0) return null; + if (!isBullet()) return null; return new BulletStyle() { public String getBulletCharacter() { - char chr = HSLFTextParagraph.this.getBulletChar(); - return (chr == 0 ? "" : ""+chr); + Character chr = HSLFTextParagraph.this.getBulletChar(); + return (chr == null || chr == 0) ? "" : "" + chr; } public String getBulletFont() { - int fontIdx = HSLFTextParagraph.this.getBulletFont(); - if (fontIdx == -1) return getDefaultFontFamily(); - PPFont ppFont = getSheet().getSlideShow().getFont(fontIdx); - return ppFont.getFontName(); + return HSLFTextParagraph.this.getBulletFont(); } - public double getBulletFontSize() { + public Double getBulletFontSize() { return HSLFTextParagraph.this.getBulletSize(); } @@ -417,666 +392,669 @@ public final class HSLFTextParagraph implements TextParagraph { _parentShape = parentShape; } - /** - * - * @return indentation level - */ - public int getIndentLevel() { - return _paragraphStyle == null ? 0 : _paragraphStyle.getIndentLevel(); - } - - /** - * Sets indentation level - * - * @param level indentation level. Must be in the range [0, 4] - */ - public void setIndentLevel(int level) { - if( _paragraphStyle != null ) _paragraphStyle.setIndentLevel((short)level); - } - - /** - * Sets whether this rich text run has bullets - */ - public void setBullet(boolean flag) { - setFlag(ParagraphFlagsTextProp.BULLET_IDX, flag); - } - - /** - * Returns whether this rich text run has bullets - */ - public boolean isBullet() { - return getFlag(ParagraphFlagsTextProp.BULLET_IDX); - } - - /** - * Returns whether this rich text run has bullets - */ - public boolean isBulletHard() { - return getFlag(ParagraphFlagsTextProp.BULLET_IDX); - } - - /** - * Sets the bullet character - */ - public void setBulletChar(char c) { - setParaTextPropVal("bullet.char", c); - } - - /** - * Returns the bullet character - */ - public char getBulletChar() { - int val = getParaTextPropVal("bullet.char"); - return (char)(val == -1 ? 0 : val); - } - - /** - * Sets the bullet size - */ - public void setBulletSize(int size) { - setParaTextPropVal("bullet.size", size); - } - - /** - * Returns the bullet size - */ - public int getBulletSize() { - return getParaTextPropVal("bullet.size"); - } - - /** - * Sets the bullet color - */ - public void setBulletColor(Color color) { - int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB(); - setParaTextPropVal("bullet.color", rgb); - } - - /** - * Returns the bullet color - */ - public Color getBulletColor() { - int rgb = getParaTextPropVal("bullet.color"); - if (rgb == -1) { - // if bullet color is undefined, return color of first run - if (_runs.isEmpty()) return null; - return _runs.get(0).getFontColor(); - } - - int cidx = rgb >> 24; - if (rgb % 0x1000000 == 0){ - if (_sheet == null) return null; - ColorSchemeAtom ca = _sheet.getColorScheme(); - if(cidx >= 0 && cidx <= 7) rgb = ca.getColor(cidx); - } - Color tmp = new Color(rgb, true); - return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); - } - - /** - * Sets the bullet font - */ - public void setBulletFont(int idx) { - setParaTextPropVal("bullet.font", idx); - setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, true); - } - - /** - * Returns the bullet font - */ - public int getBulletFont() { - return getParaTextPropVal("bullet.font"); - } - - @Override - public void setLineSpacing(double lineSpacing) { - // if lineSpacing < 0, we need to convert points (common interface) to master units (hslf) - if (lineSpacing < 0) { - lineSpacing = (lineSpacing*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); - } - setParaTextPropVal("linespacing", (int)lineSpacing); - } - - @Override - public double getLineSpacing() { - double val = getParaTextPropVal("linespacing"); - // if lineSpacing < 0, we need to convert master units (hslf) to points (common interface) - if (val == -1) return 0; - if (val < -1) val *= HSLFShape.POINT_DPI/((double)HSLFShape.MASTER_DPI); - return val; - } - - /** - * Sets spacing before a paragraph. - *

    - * If spacebefore >= 0, then spacebefore is a percentage of normal line height. - * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates. - *

    - */ - public void setSpaceBefore(int val) { - setParaTextPropVal("spacebefore", val); - } - - /** - * Returns spacing before a paragraph - *

    - * If spacebefore >= 0, then spacebefore is a percentage of normal line height. - * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates. - *

    - * - * @return the spacing before a paragraph - */ - @Override - public double getSpaceBefore() { - int val = getParaTextPropVal("spacebefore"); - return val == -1 ? 0 : val; - } - - /** - * Sets spacing after a paragraph. - *

    - * If spaceafter >= 0, then spaceafter is a percentage of normal line height. - * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates. - *

    - */ - public void setSpaceAfter(int val) { - setParaTextPropVal("spaceafter", val); - } - - /** - * Returns spacing after a paragraph - *

    - * If spaceafter >= 0, then spaceafter is a percentage of normal line height. - * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates. - *

    - * - * @return the spacing before a paragraph - */ - @Override - public double getSpaceAfter() { - int val = getParaTextPropVal("spaceafter"); - return val == -1 ? 0 : val; - } - - /** - * Returns the named TextProp, either by fetching it (if it exists) or adding it - * (if it didn't) - * @param textPropCol The TextPropCollection to fetch from / add into - * @param textPropName The name of the TextProp to fetch/add - */ - protected static TextProp fetchOrAddTextProp(TextPropCollection textPropCol, String textPropName) { - // Fetch / Add the TextProp - return textPropCol.addWithName(textPropName); + * + * @return indentation level + */ + public int getIndentLevel() { + return _paragraphStyle == null ? 0 : _paragraphStyle.getIndentLevel(); } - protected boolean getFlag(int index) { - if (_paragraphStyle == null) return false; + /** + * Sets indentation level + * + * @param level indentation level. Must be in the range [0, 4] + */ + public void setIndentLevel(int level) { + if( _paragraphStyle != null ) _paragraphStyle.setIndentLevel((short)level); + } - BitMaskTextProp prop = (BitMaskTextProp) _paragraphStyle.findByName(ParagraphFlagsTextProp.NAME); + /** + * Sets whether this rich text run has bullets + */ + public void setBullet(boolean flag) { + setFlag(ParagraphFlagsTextProp.BULLET_IDX, flag); + } - if (prop == null) { - if (_sheet != null) { - int txtype = getRunType(); - HSLFMasterSheet master = _sheet.getMasterSheet(); - if (master != null) { - prop = (BitMaskTextProp) master.getStyleAttribute(txtype, getIndentLevel(), ParagraphFlagsTextProp.NAME, false); - } - } else { - logger.log(POILogger.WARN, "MasterSheet is not available"); + /** + * Returns whether this rich text run has bullets + */ + public boolean isBullet() { + return getFlag(ParagraphFlagsTextProp.BULLET_IDX); + } + + /** + * Sets the bullet character + */ + public void setBulletChar(Character c) { + Integer val = (c == null) ? null : (int)c.charValue(); + setPropVal(_paragraphStyle, "bullet.char", val); + } + + /** + * Returns the bullet character + */ + public Character getBulletChar() { + TextProp tp = getPropVal(_paragraphStyle, "bullet.char", this); + return (tp == null) ? null : (char)tp.getValue(); + } + + /** + * Sets the bullet size + */ + public void setBulletSize(Double size) { + setPctOrPoints("bullet.size", size); + } + + /** + * Returns the bullet size, null if unset + */ + public Double getBulletSize() { + return getPctOrPoints("bullet.size"); + } + + /** + * Sets the bullet color + */ + public void setBulletColor(Color color) { + Integer val = (color == null) ? null : new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB(); + setPropVal(_paragraphStyle, "bullet.color", val); + } + + /** + * Returns the bullet color + */ + public Color getBulletColor() { + TextProp tp = getPropVal(_paragraphStyle, "bullet.color", this); + if (tp == null) { + // if bullet color is undefined, return color of first run + return (_runs.isEmpty()) ? null : _runs.get(0).getFontColor(); + } + + int rgb = tp.getValue(); + int cidx = rgb >> 24; + if (rgb % 0x1000000 == 0) { + if (_sheet == null) + return null; + ColorSchemeAtom ca = _sheet.getColorScheme(); + if (cidx >= 0 && cidx <= 7) + rgb = ca.getColor(cidx); + } + Color tmp = new Color(rgb, true); + return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); + } + + /** + * Sets the bullet font + */ + public void setBulletFont(String typeface) { + if (typeface == null) { + setPropVal(_paragraphStyle, "bullet.font", null); + setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, false); + } + + FontCollection fc = getSheet().getSlideShow().getFontCollection(); + int idx = fc.addFont(typeface); + + setPropVal(_paragraphStyle, "bullet.font", idx); + setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, true); + } + + /** + * Returns the bullet font + */ + public String getBulletFont() { + TextProp tp = getPropVal(_paragraphStyle, "bullet.font", this); + if (tp == null) return getDefaultFontFamily(); + PPFont ppFont = getSheet().getSlideShow().getFont(tp.getValue()); + assert(ppFont != null); + return ppFont.getFontName(); + } + + @Override + public void setLineSpacing(Double lineSpacing) { + setPctOrPoints("linespacing", lineSpacing); + } + + @Override + public Double getLineSpacing() { + return getPctOrPoints("linespacing"); + } + + @Override + public void setSpaceBefore(Double spaceBefore) { + setPctOrPoints("spacebefore", spaceBefore); + } + + @Override + public Double getSpaceBefore() { + return getPctOrPoints("spacebefore"); + } + + @Override + public void setSpaceAfter(Double spaceAfter) { + setPctOrPoints("spaceafter", spaceAfter); + } + + @Override + public Double getSpaceAfter() { + return getPctOrPoints("spaceafter"); + } + + @Override + public Double getDefaultTabSize() { + // TODO: implement + return null; + } + + private Double getPctOrPoints(String propName) { + TextProp tp = getPropVal(_paragraphStyle, propName, this); + if (tp == null) return null; + int val = tp.getValue(); + return (val < 0) ? Units.masterToPoints(val) : val; + } + + private void setPctOrPoints(String propName, Double dval) { + Integer ival = null; + if (dval != null) { + ival = (dval < 0) ? Units.pointsToMaster(dval) : dval.intValue(); + } + setPropVal(_paragraphStyle, propName, ival); + } + + private boolean getFlag(int index) { + BitMaskTextProp tp = (BitMaskTextProp)getPropVal(_paragraphStyle, ParagraphFlagsTextProp.NAME, this); + return (tp == null) ? false : tp.getSubValue(index); + } + + private void setFlag(int index, boolean value) { + BitMaskTextProp tp = (BitMaskTextProp)_paragraphStyle.addWithName(ParagraphFlagsTextProp.NAME); + tp.setSubValue(value, index); + } + + /** + * Fetch the value of the given Paragraph related TextProp. Returns null if + * that TextProp isn't present. If the TextProp isn't present, the value + * from the appropriate Master Sheet will apply. + */ + protected static TextProp getPropVal(TextPropCollection props, String propName, HSLFTextParagraph paragraph) { + TextProp prop = props.findByName(propName); + if (prop != null) return prop; + + BitMaskTextProp maskProp = (BitMaskTextProp) props.findByName(ParagraphFlagsTextProp.NAME); + boolean hardAttribute = (maskProp != null && maskProp.getValue() == 0); + if (hardAttribute) return null; + + HSLFSheet sheet = paragraph.getSheet(); + int txtype = paragraph.getRunType(); + HSLFMasterSheet master = sheet.getMasterSheet(); + if (master == null) { + logger.log(POILogger.WARN, "MasterSheet is not available"); + return null; + } + + boolean isChar = props.getTextPropType() == TextPropType.character; + return master.getStyleAttribute(txtype, paragraph.getIndentLevel(), propName, isChar); + } + + /** + * Returns the named TextProp, either by fetching it (if it exists) or + * adding it (if it didn't) + * + * @param props the TextPropCollection to fetch from / add into + * @param name the name of the TextProp to fetch/add + * @param val the value, null if unset + */ + protected static void setPropVal(TextPropCollection props, String name, Integer val) { + if (val == null) { + props.removeByName(name); + return; + } + + // Fetch / Add the TextProp + TextProp tp = props.addWithName(name); + tp.setValue(val); + } + + /** + * Check and add linebreaks to text runs leading other paragraphs + * + * @param paragraphs + */ + protected static void fixLineEndings(List paragraphs) { + HSLFTextRun lastRun = null; + for (HSLFTextParagraph p : paragraphs) { + if (lastRun != null && !lastRun.getRawText().endsWith("\r")) { + lastRun.setText(lastRun.getRawText() + "\r"); + } + List ltr = p.getTextRuns(); + if (ltr.isEmpty()) { + throw new RuntimeException("paragraph without textruns found"); + } + lastRun = ltr.get(ltr.size() - 1); + assert (lastRun.getRawText() != null); + } + } + + /** + * Search for a StyleTextPropAtom is for this text header (list of paragraphs) + * + * @param header the header + * @param textLen the length of the rawtext, or -1 if the length is not known + */ + private static StyleTextPropAtom findStyleAtomPresent(TextHeaderAtom header, int textLen) { + boolean afterHeader = false; + StyleTextPropAtom style = null; + for (Record record : header.getParentRecord().getChildRecords()) { + long rt = record.getRecordType(); + if (afterHeader && rt == RecordTypes.TextHeaderAtom.typeID) { + // already on the next header, quit searching + break; + } + afterHeader |= (header == record); + if (afterHeader && rt == RecordTypes.StyleTextPropAtom.typeID) { + // found it + style = (StyleTextPropAtom) record; } } - return prop == null ? false : prop.getSubValue(index); + if (style == null) { + logger.log(POILogger.INFO, "styles atom doesn't exist. Creating dummy record for later saving."); + style = new StyleTextPropAtom((textLen < 0) ? 1 : textLen); + } else { + if (textLen >= 0) { + style.setParentTextSize(textLen); + } + } + + return style; } - protected void setFlag(int index, boolean value) { - // Ensure we have the StyleTextProp atom we're going to need - assert(_paragraphStyle!=null); - BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(_paragraphStyle, ParagraphFlagsTextProp.NAME); - prop.setSubValue(value,index); - } + /** + * Saves the modified paragraphs/textrun to the records. + * Also updates the styles to the correct text length. + */ + protected static void storeText(List paragraphs) { + fixLineEndings(paragraphs); - /** - * Check and add linebreaks to text runs leading other paragraphs - * - * @param paragraphs - */ - protected static void fixLineEndings(List paragraphs) { - HSLFTextRun lastRun = null; - for (HSLFTextParagraph p : paragraphs) { - if (lastRun != null && !lastRun.getRawText().endsWith("\r")) { - lastRun.setText(lastRun.getRawText()+"\r"); - } - List ltr = p.getTextRuns(); - if (ltr.isEmpty()) { - throw new RuntimeException("paragraph without textruns found"); - } - lastRun = ltr.get(ltr.size()-1); - assert(lastRun.getRawText() != null); - } - } + String rawText = toInternalString(getRawText(paragraphs)); - /** - * Search for a StyleTextPropAtom is for this text header (list of paragraphs) - * - * @param header the header - * @param textLen the length of the rawtext, or -1 if the length is not known - */ - private static StyleTextPropAtom findStyleAtomPresent(TextHeaderAtom header, int textLen) { - boolean afterHeader = false; - StyleTextPropAtom style = null; - for (Record record : header.getParentRecord().getChildRecords()) { - long rt = record.getRecordType(); - if (afterHeader && rt == RecordTypes.TextHeaderAtom.typeID) { - // already on the next header, quit searching - break; - } - afterHeader |= (header == record); - if (afterHeader && rt == RecordTypes.StyleTextPropAtom.typeID) { - // found it - style = (StyleTextPropAtom)record; - } - } + // Will it fit in a 8 bit atom? + boolean isUnicode = StringUtil.hasMultibyte(rawText); + // isUnicode = true; - if (style == null) { - logger.log(POILogger.INFO, "styles atom doesn't exist. Creating dummy record for later saving."); - style = new StyleTextPropAtom((textLen < 0) ? 1 : textLen); - } else { - if (textLen >= 0) { - style.setParentTextSize(textLen); - } - } - - return style; - } + TextHeaderAtom headerAtom = paragraphs.get(0)._headerAtom; + TextBytesAtom byteAtom = paragraphs.get(0)._byteAtom; + TextCharsAtom charAtom = paragraphs.get(0)._charAtom; + StyleTextPropAtom styleAtom = findStyleAtomPresent(headerAtom, rawText.length()); + // Store in the appropriate record + Record oldRecord = null, newRecord = null; + if (isUnicode) { + if (byteAtom != null || charAtom == null) { + oldRecord = byteAtom; + charAtom = new TextCharsAtom(); + } + newRecord = charAtom; + charAtom.setText(rawText); + } else { + if (charAtom != null || byteAtom == null) { + oldRecord = charAtom; + byteAtom = new TextBytesAtom(); + } + newRecord = byteAtom; + byte[] byteText = new byte[rawText.length()]; + StringUtil.putCompressedUnicode(rawText, byteText, 0); + byteAtom.setText(byteText); + } + assert (newRecord != null); - /** - * Saves the modified paragraphs/textrun to the records. - * Also updates the styles to the correct text length. - */ - protected static void storeText(List paragraphs) { - fixLineEndings(paragraphs); + RecordContainer _txtbox = headerAtom.getParentRecord(); + Record[] cr = _txtbox.getChildRecords(); + int headerIdx = -1, textIdx = -1, styleIdx = -1; + for (int i = 0; i < cr.length; i++) { + Record r = cr[i]; + if (r == headerAtom) headerIdx = i; + else if (r == oldRecord || r == newRecord) textIdx = i; + else if (r == styleAtom) styleIdx = i; + } - String rawText = toInternalString(getRawText(paragraphs)); + if (textIdx == -1) { + // the old record was never registered, ignore it + _txtbox.addChildAfter(newRecord, headerAtom); + textIdx = headerIdx + 1; + } else { + // swap not appropriated records - noop if unchanged + cr[textIdx] = newRecord; + } - // Will it fit in a 8 bit atom? - boolean isUnicode = StringUtil.hasMultibyte(rawText); - // isUnicode = true; + if (styleIdx == -1) { + // Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom + _txtbox.addChildAfter(styleAtom, newRecord); + } - TextHeaderAtom headerAtom = paragraphs.get(0)._headerAtom; - TextBytesAtom byteAtom = paragraphs.get(0)._byteAtom; - TextCharsAtom charAtom = paragraphs.get(0)._charAtom; - StyleTextPropAtom styleAtom = findStyleAtomPresent(headerAtom, rawText.length()); + for (HSLFTextParagraph p : paragraphs) { + if (newRecord == byteAtom) { + p._byteAtom = byteAtom; + p._charAtom = null; + } else { + p._byteAtom = null; + p._charAtom = charAtom; + } + } - // Store in the appropriate record - Record oldRecord = null, newRecord = null; - if (isUnicode) { - if (byteAtom != null || charAtom == null) { - oldRecord = byteAtom; - charAtom = new TextCharsAtom(); - } - newRecord = charAtom; - charAtom.setText(rawText); - } else { - if (charAtom != null || byteAtom == null) { - oldRecord = charAtom; - byteAtom = new TextBytesAtom(); - } - newRecord = byteAtom; - byte[] byteText = new byte[rawText.length()]; - StringUtil.putCompressedUnicode(rawText,byteText,0); - byteAtom.setText(byteText); - } - assert(newRecord != null); - - RecordContainer _txtbox = headerAtom.getParentRecord(); - Record[] cr = _txtbox.getChildRecords(); - int headerIdx = -1, textIdx = -1, styleIdx = -1; - for (int i=0; i paragraphs, String text, boolean newParagraph) { + text = toInternalString(text); - /** - * Adds the supplied text onto the end of the TextParagraphs, - * creating a new RichTextRun for it to sit in. - * - * @param text the text string used by this object. - */ - protected static HSLFTextRun appendText(List paragraphs, String text, boolean newParagraph) { - text = toInternalString(text); + // check paragraphs + assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); - // check paragraphs - assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); + HSLFTextParagraph htp = paragraphs.get(paragraphs.size() - 1); + HSLFTextRun htr = htp.getTextRuns().get(htp.getTextRuns().size() - 1); - HSLFTextParagraph htp = paragraphs.get(paragraphs.size()-1); - HSLFTextRun htr = htp.getTextRuns().get(htp.getTextRuns().size()-1); + boolean isFirst = !newParagraph; + for (String rawText : text.split("(?<=\r)")) { + if (!isFirst) { + TextPropCollection tpc = htp.getParagraphStyle(); + HSLFTextParagraph prevHtp = htp; + htp = new HSLFTextParagraph(htp._headerAtom, htp._byteAtom, htp._charAtom); + htp.getParagraphStyle().copy(tpc); + htp.setParentShape(prevHtp.getParentShape()); + htp.setShapeId(prevHtp.getShapeId()); + htp.supplySheet(prevHtp.getSheet()); + paragraphs.add(htp); + } + isFirst = false; - boolean isFirst = !newParagraph; - for (String rawText : text.split("(?<=\r)")) { - if (!isFirst) { - TextPropCollection tpc = htp.getParagraphStyle(); - HSLFTextParagraph prevHtp = htp; - htp = new HSLFTextParagraph(htp._headerAtom, htp._byteAtom, htp._charAtom); - htp.getParagraphStyle().copy(tpc); - htp.setParentShape(prevHtp.getParentShape()); - htp.setShapeId(prevHtp.getShapeId()); - htp.supplySheet(prevHtp.getSheet()); - paragraphs.add(htp); - } - isFirst = false; - - TextPropCollection tpc = htr.getCharacterStyle(); - // special case, last text run is empty, we will reuse it - if (htr.getLength() > 0) { - htr = new HSLFTextRun(htp); - htr.getCharacterStyle().copy(tpc); - htp.addTextRun(htr); - } - htr.setText(rawText); - } - - storeText(paragraphs); + TextPropCollection tpc = htr.getCharacterStyle(); + // special case, last text run is empty, we will reuse it + if (htr.getLength() > 0) { + htr = new HSLFTextRun(htp); + htr.getCharacterStyle().copy(tpc); + htp.addTextRun(htr); + } + htr.setText(rawText); + } - return htr; - } + storeText(paragraphs); - /** - * Sets (overwrites) the current text. - * Uses the properties of the first paragraph / textrun - * - * @param text the text string used by this object. - */ - public static HSLFTextRun setText(List paragraphs, String text) { - // check paragraphs - assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); + return htr; + } - Iterator paraIter = paragraphs.iterator(); - HSLFTextParagraph htp = paraIter.next(); // keep first - assert(htp != null); - while (paraIter.hasNext()) { - paraIter.next(); - paraIter.remove(); - } + /** + * Sets (overwrites) the current text. + * Uses the properties of the first paragraph / textrun + * + * @param text the text string used by this object. + */ + public static HSLFTextRun setText(List paragraphs, String text) { + // check paragraphs + assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); - Iterator runIter = htp.getTextRuns().iterator(); - HSLFTextRun htr = runIter.next(); - htr.setText(""); - assert(htr != null); - while (runIter.hasNext()) { - runIter.next(); - runIter.remove(); - } + Iterator paraIter = paragraphs.iterator(); + HSLFTextParagraph htp = paraIter.next(); // keep first + assert (htp != null); + while (paraIter.hasNext()) { + paraIter.next(); + paraIter.remove(); + } - return appendText(paragraphs, text, false); - } + Iterator runIter = htp.getTextRuns().iterator(); + HSLFTextRun htr = runIter.next(); + htr.setText(""); + assert (htr != null); + while (runIter.hasNext()) { + runIter.next(); + runIter.remove(); + } - public static String getText(List paragraphs) { - assert(!paragraphs.isEmpty()); - String rawText = getRawText(paragraphs); - return toExternalString(rawText, paragraphs.get(0).getRunType()); - } - - public static String getRawText(List paragraphs) { - StringBuilder sb = new StringBuilder(); - for (HSLFTextParagraph p : paragraphs) { - for (HSLFTextRun r : p.getTextRuns()) { - sb.append(r.getRawText()); - } - } - return sb.toString(); - } + return appendText(paragraphs, text, false); + } - /** - * Returns a new string with line breaks converted into internal ppt - * representation - */ - protected static String toInternalString(String s) { - String ns = s.replaceAll("\\r?\\n", "\r"); - return ns; - } + public static String getText(List paragraphs) { + assert (!paragraphs.isEmpty()); + String rawText = getRawText(paragraphs); + return toExternalString(rawText, paragraphs.get(0).getRunType()); + } - /** - * Converts raw text from the text paragraphs to a formatted string, - * i.e. it converts certain control characters used in the raw txt - * - * @param rawText the raw text - * @param runType the run type of the shape, paragraph or headerAtom. - * use -1 if unknown - * @return the formatted string - */ - public static String toExternalString(String rawText, int runType) { - // PowerPoint seems to store files with \r as the line break - // The messes things up on everything but a Mac, so translate - // them to \n - String text = rawText.replace('\r', '\n'); + public static String getRawText(List paragraphs) { + StringBuilder sb = new StringBuilder(); + for (HSLFTextParagraph p : paragraphs) { + for (HSLFTextRun r : p.getTextRuns()) { + sb.append(r.getRawText()); + } + } + return sb.toString(); + } - switch (runType) { - // 0xB acts like cariage return in page titles and like blank in the - // others - case -1: - case org.apache.poi.hslf.record.TextHeaderAtom.TITLE_TYPE: - case org.apache.poi.hslf.record.TextHeaderAtom.CENTER_TITLE_TYPE: - text = text.replace((char) 0x0B, '\n'); - break; - default: - text = text.replace((char) 0x0B, ' '); - break; - } + /** + * Returns a new string with line breaks converted into internal ppt + * representation + */ + protected static String toInternalString(String s) { + String ns = s.replaceAll("\\r?\\n", "\r"); + return ns; + } - return text; - } + /** + * Converts raw text from the text paragraphs to a formatted string, + * i.e. it converts certain control characters used in the raw txt + * + * @param rawText the raw text + * @param runType the run type of the shape, paragraph or headerAtom. + * use -1 if unknown + * @return the formatted string + */ + public static String toExternalString(String rawText, int runType) { + // PowerPoint seems to store files with \r as the line break + // The messes things up on everything but a Mac, so translate + // them to \n + String text = rawText.replace('\r', '\n'); - /** - * For a given PPDrawing, grab all the TextRuns - */ + switch (runType) { + // 0xB acts like cariage return in page titles and like blank in the + // others + case -1: + case org.apache.poi.hslf.record.TextHeaderAtom.TITLE_TYPE: + case org.apache.poi.hslf.record.TextHeaderAtom.CENTER_TITLE_TYPE: + text = text.replace((char) 0x0B, '\n'); + break; + default: + text = text.replace((char) 0x0B, ' '); + break; + } + + return text; + } + + /** + * For a given PPDrawing, grab all the TextRuns + */ public static List> findTextParagraphs(PPDrawing ppdrawing, HSLFSheet sheet) { - List> runsV = new ArrayList>(); - for (EscherTextboxWrapper wrapper : ppdrawing.getTextboxWrappers()) { - runsV.add(findTextParagraphs(wrapper, sheet)); - } - return runsV; - } + List> runsV = new ArrayList>(); + for (EscherTextboxWrapper wrapper : ppdrawing.getTextboxWrappers()) { + runsV.add(findTextParagraphs(wrapper, sheet)); + } + return runsV; + } - /** - * Scans through the supplied record array, looking for - * a TextHeaderAtom followed by one of a TextBytesAtom or - * a TextCharsAtom. Builds up TextRuns from these - * - * @param wrapper an EscherTextboxWrapper - */ - protected static List findTextParagraphs(EscherTextboxWrapper wrapper, HSLFSheet sheet) { - // propagate parents to parent-aware records - RecordContainer.handleParentAwareRecords(wrapper); - int shapeId = wrapper.getShapeId(); - List rv = null; - - OutlineTextRefAtom ota = (OutlineTextRefAtom)wrapper.findFirstOfType(OutlineTextRefAtom.typeID); - if (ota != null) { - // if we are based on an outline, there are no further records to be parsed from the wrapper - if (sheet == null) { - throw new RuntimeException("Outline atom reference can't be solved without a sheet record"); - } - - List> sheetRuns = sheet.getTextParagraphs(); - assert(sheetRuns != null); - - int idx = ota.getTextIndex(); - for (List r : sheetRuns) { - if (r.isEmpty()) continue; - int ridx = r.get(0).getIndex(); - if (ridx > idx) break; - if (ridx == idx) { - if (rv == null) { - rv = r; - } else { - // create a new container - // TODO: ... is this case really happening? - rv = new ArrayList(rv); - rv.addAll(r); - } - } - } - if(rv == null || rv.isEmpty()) { - logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx); - } - } else { - if (sheet != null) { - // check sheet runs first, so we get exactly the same paragraph list - List> sheetRuns = sheet.getTextParagraphs(); - assert(sheetRuns != null); + /** + * Scans through the supplied record array, looking for + * a TextHeaderAtom followed by one of a TextBytesAtom or + * a TextCharsAtom. Builds up TextRuns from these + * + * @param wrapper an EscherTextboxWrapper + */ + protected static List findTextParagraphs(EscherTextboxWrapper wrapper, HSLFSheet sheet) { + // propagate parents to parent-aware records + RecordContainer.handleParentAwareRecords(wrapper); + int shapeId = wrapper.getShapeId(); + List rv = null; - for (List paras : sheetRuns) { + OutlineTextRefAtom ota = (OutlineTextRefAtom)wrapper.findFirstOfType(OutlineTextRefAtom.typeID); + if (ota != null) { + // if we are based on an outline, there are no further records to be parsed from the wrapper + if (sheet == null) { + throw new RuntimeException("Outline atom reference can't be solved without a sheet record"); + } + + List> sheetRuns = sheet.getTextParagraphs(); + assert (sheetRuns != null); + + int idx = ota.getTextIndex(); + for (List r : sheetRuns) { + if (r.isEmpty()) continue; + int ridx = r.get(0).getIndex(); + if (ridx > idx) break; + if (ridx == idx) { + if (rv == null) { + rv = r; + } else { + // create a new container + // TODO: ... is this case really happening? + rv = new ArrayList(rv); + rv.addAll(r); + } + } + } + if (rv == null || rv.isEmpty()) { + logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx); + } + } else { + if (sheet != null) { + // check sheet runs first, so we get exactly the same paragraph list + List> sheetRuns = sheet.getTextParagraphs(); + assert (sheetRuns != null); + + for (List paras : sheetRuns) { if (!paras.isEmpty() && paras.get(0)._headerAtom.getParentRecord() == wrapper) { - rv = paras; - break; - } - } - } - - if (rv == null) { - // if we haven't found the wrapper in the sheet runs, create a new paragraph list from its record - List> rvl = findTextParagraphs(wrapper.getChildRecords()); - switch (rvl.size()) { - case 0: break; // nothing found - case 1: rv = rvl.get(0); break; // normal case - default: - throw new RuntimeException("TextBox contains more than one list of paragraphs."); - } - } - } - - if (rv != null) { - StyleTextProp9Atom styleTextProp9Atom = wrapper.getStyleTextProp9Atom(); - - for (HSLFTextParagraph htp : rv) { - htp.setShapeId(shapeId); - htp.setStyleTextProp9Atom(styleTextProp9Atom); - } - } - return rv; - } + rv = paras; + break; + } + } + } - /** - * Scans through the supplied record array, looking for - * a TextHeaderAtom followed by one of a TextBytesAtom or - * a TextCharsAtom. Builds up TextRuns from these - * - * @param records the records to build from - */ + if (rv == null) { + // if we haven't found the wrapper in the sheet runs, create a new paragraph list from its record + List> rvl = findTextParagraphs(wrapper.getChildRecords()); + switch (rvl.size()) { + case 0: break; // nothing found + case 1: rv = rvl.get(0); break; // normal case + default: + throw new RuntimeException("TextBox contains more than one list of paragraphs."); + } + } + } + + if (rv != null) { + StyleTextProp9Atom styleTextProp9Atom = wrapper.getStyleTextProp9Atom(); + + for (HSLFTextParagraph htp : rv) { + htp.setShapeId(shapeId); + htp.setStyleTextProp9Atom(styleTextProp9Atom); + } + } + return rv; + } + + /** + * Scans through the supplied record array, looking for + * a TextHeaderAtom followed by one of a TextBytesAtom or + * a TextCharsAtom. Builds up TextRuns from these + * + * @param records the records to build from + */ protected static List> findTextParagraphs(Record[] records) { List> paragraphCollection = new ArrayList>(); - int[] recordIdx = {0}; - + int[] recordIdx = { 0 }; + for (int slwtIndex = 0; recordIdx[0] < records.length; slwtIndex++) { - TextHeaderAtom header = null; - TextBytesAtom tbytes = null; - TextCharsAtom tchars = null; - TextRulerAtom ruler = null; + TextHeaderAtom header = null; + TextBytesAtom tbytes = null; + TextCharsAtom tchars = null; + TextRulerAtom ruler = null; MasterTextPropAtom indents = null; for (Record r : getRecords(records, recordIdx, null)) { long rt = r.getRecordType(); if (RecordTypes.TextHeaderAtom.typeID == rt) { - header = (TextHeaderAtom)r; + header = (TextHeaderAtom) r; } else if (RecordTypes.TextBytesAtom.typeID == rt) { - tbytes = (TextBytesAtom)r; + tbytes = (TextBytesAtom) r; } else if (RecordTypes.TextCharsAtom.typeID == rt) { - tchars = (TextCharsAtom)r; + tchars = (TextCharsAtom) r; } else if (RecordTypes.TextRulerAtom.typeID == rt) { - ruler = (TextRulerAtom)r; + ruler = (TextRulerAtom) r; } else if (RecordTypes.MasterTextPropAtom.typeID == rt) { - indents = (MasterTextPropAtom)r; + indents = (MasterTextPropAtom) r; } // don't search for RecordTypes.StyleTextPropAtom.typeID here ... see findStyleAtomPresent below } if (header == null) break; - + if (header.getParentRecord() instanceof SlideListWithText) { // runs found in PPDrawing are not linked with SlideListWithTexts header.setIndex(slwtIndex); @@ -1093,7 +1071,7 @@ public final class HSLFTextParagraph implements TextParagraph { List paragraphs = new ArrayList(); paragraphCollection.add(paragraphs); - + // split, but keep delimiter for (String para : rawText.split("(?<=\r)")) { HSLFTextParagraph tpara = new HSLFTextParagraph(header, tbytes, tchars); @@ -1116,7 +1094,7 @@ public final class HSLFTextParagraph implements TextParagraph { if (paragraphCollection.isEmpty()) { logger.log(POILogger.DEBUG, "No text records found."); } - + return paragraphCollection; } @@ -1124,25 +1102,25 @@ public final class HSLFTextParagraph implements TextParagraph { int paraIdx = 0, runIdx = 0; HSLFTextRun trun; - for (int csIdx=0; csIdx runs = para.getTextRuns(); trun = runs.get(runIdx); int len = trun.getLength(); - if (ccRun+len <= ccStyle) { + if (ccRun + len <= ccStyle) { ccRun += len; } else { String text = trun.getRawText(); - trun.setText(text.substring(0,ccStyle-ccRun)); + trun.setText(text.substring(0, ccStyle - ccRun)); HSLFTextRun nextRun = new HSLFTextRun(para); - nextRun.setText(text.substring(ccStyle-ccRun)); - runs.add(runIdx+1, nextRun); + nextRun.setText(text.substring(ccStyle - ccRun)); + runs.add(runIdx + 1, nextRun); - ccRun += ccStyle-ccRun; + ccRun += ccStyle - ccRun; } TextPropCollection pCopy = new TextPropCollection(0, TextPropType.character); @@ -1151,7 +1129,7 @@ public final class HSLFTextParagraph implements TextParagraph { len = trun.getLength(); if (paraIdx == paragraphs.size()-1 && runIdx == runs.size()-1) { - if (csIdx < charStyles.size()-1) { + if (csIdx < charStyles.size() - 1) { // special case, empty trailing text run HSLFTextRun nextRun = new HSLFTextRun(para); nextRun.setText(""); @@ -1204,7 +1182,7 @@ public final class HSLFTextParagraph implements TextParagraph { len += trun.getLength(); } para.setIndentLevel(p.getIndentLevel()); - ccPara += len+1; + ccPara += len + 1; } } } @@ -1237,6 +1215,6 @@ public final class HSLFTextParagraph implements TextParagraph { } public EscherTextboxWrapper getTextboxWrapper() { - return (EscherTextboxWrapper)_headerAtom.getParentRecord(); + return (EscherTextboxWrapper) _headerAtom.getParentRecord(); } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index 1e1dca888f..bb4f140415 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -17,7 +17,8 @@ package org.apache.poi.hslf.usermodel; -import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.fetchOrAddTextProp; +import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.setPropVal; +import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.getPropVal; import java.awt.Color; @@ -132,39 +133,17 @@ public final class HSLFTextRun implements TextRun { * it if required. */ private void setCharFlagsTextPropVal(int index, boolean value) { - if(getFlag(index) != value) setFlag(index, value); + // TODO: check if paragraph/chars can be handled the same ... + if (getFlag(index) != value) setFlag(index, value); } - /** - * Fetch the value of the given Character related TextProp. - * Returns -1 if that TextProp isn't present. - * If the TextProp isn't present, the value from the appropriate - * Master Sheet will apply. - */ - private int getCharTextPropVal(String propName) { - TextProp prop = null; - if (characterStyle != null){ - prop = characterStyle.findByName(propName); - } - - if (prop == null){ - HSLFSheet sheet = parentParagraph.getSheet(); - int txtype = parentParagraph.getRunType(); - HSLFMasterSheet master = sheet.getMasterSheet(); - if (master != null) - prop = master.getStyleAttribute(txtype, parentParagraph.getIndentLevel(), propName, true); - } - return prop == null ? -1 : prop.getValue(); - } - /** * Sets the value of the given Paragraph TextProp, add if required * @param propName The name of the Paragraph TextProp * @param val The value to set for the TextProp */ public void setCharTextPropVal(String propName, int val) { - TextProp tp = fetchOrAddTextProp(characterStyle, propName); - tp.setValue(val); + setPropVal(characterStyle, propName, val); } @@ -260,8 +239,8 @@ public final class HSLFTextRun implements TextRun { * @return the percentage of the font size. If the value is positive, it is superscript, otherwise it is subscript */ public int getSuperscript() { - int val = getCharTextPropVal("superscript"); - return val == -1 ? 0 : val; + TextProp tp = getPropVal(characterStyle, "superscript", parentParagraph); + return tp == null ? 0 : tp.getValue(); } /** @@ -270,14 +249,15 @@ public final class HSLFTextRun implements TextRun { * @param val the percentage of the font size. If the value is positive, it is superscript, otherwise it is subscript */ public void setSuperscript(int val) { - setCharTextPropVal("superscript", val); + setPropVal(characterStyle, "superscript", val); } /** * Gets the font size */ - public double getFontSize() { - return getCharTextPropVal("font.size"); + public Double getFontSize() { + TextProp tp = getPropVal(characterStyle, "font.size", parentParagraph); + return tp == null ? null : (double)tp.getValue(); } @@ -292,7 +272,8 @@ public final class HSLFTextRun implements TextRun { * Gets the font index */ public int getFontIndex() { - return getCharTextPropVal("font.index"); + TextProp tp = getPropVal(characterStyle, "font.index", parentParagraph); + return tp == null ? -1 : tp.getValue(); } /** @@ -329,9 +310,9 @@ public final class HSLFTextRun implements TextRun { if (sheet == null || slideShow == null) { return _fontFamily; } - int fontIdx = getCharTextPropVal("font.index"); - if(fontIdx == -1) { return null; } - return slideShow.getFontCollection().getFontWithId(fontIdx); + TextProp tp = getPropVal(characterStyle, "font.index", parentParagraph); + if (tp == null) { return null; } + return slideShow.getFontCollection().getFontWithId(tp.getValue()); } /** @@ -339,7 +320,9 @@ public final class HSLFTextRun implements TextRun { * @see java.awt.Color */ public Color getFontColor() { - int rgb = getCharTextPropVal("font.color"); + TextProp tp = getPropVal(characterStyle, "font.color", parentParagraph); + if (tp == null) return null; + int rgb = tp.getValue(); int cidx = rgb >> 24; if (rgb % 0x1000000 == 0){ @@ -370,7 +353,7 @@ public final class HSLFTextRun implements TextRun { } protected void setFlag(int index, boolean value) { - BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(characterStyle, CharFlagsTextProp.NAME); + BitMaskTextProp prop = (BitMaskTextProp)characterStyle.addWithName(CharFlagsTextProp.NAME); prop.setSubValue(value, index); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java index 3db3c6f6d0..d3c606a62d 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java @@ -55,12 +55,21 @@ public class DrawTextParagraph implements Drawable { double rightInset = insets.right; double penY = y; - double leftMargin = paragraph.getLeftMargin(); boolean firstLine = true; - double indent = paragraph.getIndent(); + Double leftMargin = paragraph.getLeftMargin(); + Double indent = paragraph.getIndent(); + if (leftMargin == null) { + leftMargin = (indent != null) ? -indent : 0; + } + if (indent == null) { + indent = (leftMargin != null) ? -leftMargin : 0; + } + //The vertical line spacing - double spacing = paragraph.getLineSpacing(); + Double spacing = paragraph.getLineSpacing(); + if (spacing == null) spacing = 100d; + for(DrawTextFragment line : lines){ double penX = x + leftMargin; @@ -77,7 +86,7 @@ public class DrawTextParagraph implements Drawable { bullet.setPosition(penX + indent, penY); } else if(indent > 0){ // a positive value means the "First Line" indentation: - // the first line is indented and other lines start at the bullet ofset + // the first line is indented and other lines start at the bullet offset bullet.setPosition(penX, penY); penX += indent; } else { @@ -96,7 +105,9 @@ public class DrawTextParagraph implements Drawable { Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape()); - switch (paragraph.getTextAlign()) { + TextAlign ta = paragraph.getTextAlign(); + if (ta == null) ta = TextAlign.LEFT; + switch (ta) { case CENTER: penX += (anchor.getWidth() - leftMargin - line.getWidth() - leftInset - rightInset) / 2; break; @@ -219,9 +230,10 @@ public class DrawTextParagraph implements Drawable { if (buColor == null) buColor = (Color)firstLineAttr.getAttribute(TextAttribute.FOREGROUND); float fontSize = (Float)firstLineAttr.getAttribute(TextAttribute.SIZE); - float buSz = (float)bulletStyle.getBulletFontSize(); - if(buSz > 0) fontSize *= buSz* 0.01; - else fontSize = -buSz; + Double buSz = bulletStyle.getBulletFontSize(); + if (buSz == null) buSz = 100d; + if (buSz > 0) fontSize *= buSz* 0.01; + else fontSize = (float)-buSz; AttributedString str = new AttributedString(buCharacter); @@ -237,10 +249,13 @@ public class DrawTextParagraph implements Drawable { protected String getRenderableText(TextRun tr) { StringBuilder buf = new StringBuilder(); TextCap cap = tr.getTextCap(); + String tabs = null; for (char c : tr.getRawText().toCharArray()) { if(c == '\t') { - // TODO: finish support for tabs - buf.append(" "); + if (tabs == null) { + tabs = tab2space(tr); + } + buf.append(tabs); continue; } @@ -255,6 +270,34 @@ public class DrawTextParagraph implements Drawable { return buf.toString(); } + + /** + * Replace a tab with the effective number of white spaces. + */ + private String tab2space(TextRun tr) { + AttributedString string = new AttributedString(" "); + String typeFace = tr.getFontFamily(); + if (typeFace == null) typeFace = "Lucida Sans"; + string.addAttribute(TextAttribute.FAMILY, typeFace); + + Double fs = tr.getFontSize(); + if (fs == null) fs = 12d; + string.addAttribute(TextAttribute.SIZE, fs.floatValue()); + + TextLayout l = new TextLayout(string.getIterator(), new FontRenderContext(null, true, true)); + double wspace = l.getAdvance(); + + Double tabSz = paragraph.getDefaultTabSize(); + if (tabSz == null) tabSz = wspace*4; + + int numSpaces = (int)Math.ceil(tabSz / wspace); + StringBuilder buf = new StringBuilder(); + for(int i = 0; i < numSpaces; i++) { + buf.append(' '); + } + return buf.toString(); + } + /** * Returns wrapping width to break lines in this paragraph @@ -271,8 +314,14 @@ public class DrawTextParagraph implements Drawable { Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape()); - double leftMargin = paragraph.getLeftMargin(); - double indent = paragraph.getIndent(); + Double leftMargin = paragraph.getLeftMargin(); + Double indent = paragraph.getIndent(); + if (leftMargin == null) { + leftMargin = (indent != null) ? -indent : 0; + } + if (indent == null) { + indent = (leftMargin != null) ? -leftMargin : 0; + } double width; TextShape> ts = paragraph.getParentShape(); @@ -323,7 +372,9 @@ public class DrawTextParagraph implements Drawable { text.append(runText); int endIndex = text.length(); - attList.add(new AttributedStringData(TextAttribute.FOREGROUND, run.getFontColor(), beginIndex, endIndex)); + Color fgColor = run.getFontColor(); + if (fgColor == null) fgColor = Color.BLACK; + attList.add(new AttributedStringData(TextAttribute.FOREGROUND, fgColor, beginIndex, endIndex)); // user can pass an custom object to convert fonts String fontFamily = run.getFontFamily(); @@ -335,10 +386,14 @@ public class DrawTextParagraph implements Drawable { if(fontHandler != null) { fontFamily = fontHandler.getRendererableFont(fontFamily, run.getPitchAndFamily()); } + if (fontFamily == null) { + fontFamily = paragraph.getDefaultFontFamily(); + } attList.add(new AttributedStringData(TextAttribute.FAMILY, fontFamily, beginIndex, endIndex)); - float fontSz = (float)run.getFontSize(); - attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz, beginIndex, endIndex)); + Double fontSz = run.getFontSize(); + if (fontSz == null) fontSz = paragraph.getDefaultFontSize(); + attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz.floatValue(), beginIndex, endIndex)); if(run.isBold()) { attList.add(new AttributedStringData(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, beginIndex, endIndex)); @@ -364,9 +419,9 @@ public class DrawTextParagraph implements Drawable { // ensure that the paragraph contains at least one character // We need this trick to correctly measure text if (text.length() == 0) { - float fontSz = (float)paragraph.getDefaultFontSize(); + Double fontSz = paragraph.getDefaultFontSize(); text.append(" "); - attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz, 0, 1)); + attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz.floatValue(), 0, 1)); } AttributedString string = new AttributedString(text.toString()); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java index 247c7c1845..bb6c6dd29f 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java @@ -95,7 +95,8 @@ public class DrawTextShape 0) { // positive value means percentage spacing of the height of the first line, e.g. // the higher the first line, the bigger the space before the paragraph @@ -112,7 +113,8 @@ public class DrawTextShape 0) { // positive value means percentage spacing of the height of the last line, e.g. // the higher the last line, the bigger the space after the paragraph diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java index 14eb03c842..e85eee140b 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java @@ -104,10 +104,18 @@ public interface TextParagraph extends Iterable { public interface BulletStyle { String getBulletCharacter(); String getBulletFont(); - double getBulletFontSize(); + + /** + * The bullet point font size + * If bulletFontSize >= 0, then space is a percentage of normal line height. + * If bulletFontSize < 0, the absolute value in points + * + * @return the bullet point font size + */ + Double getBulletFontSize(); Color getBulletFontColor(); } - + /** * The amount of vertical white space before the paragraph * This may be specified in two different ways, percentage spacing and font point spacing: @@ -116,9 +124,30 @@ public interface TextParagraph extends Iterable { * If spaceBefore < 0, the absolute value in points *

    * - * @return the vertical white space before the paragraph + * @return the vertical white space before the paragraph, or null if unset */ - double getSpaceBefore(); + Double getSpaceBefore(); + + /** + * Set the amount of vertical white space that will be present before the paragraph. + * This space is specified in either percentage or points: + *

    + * If spaceBefore >= 0, then space is a percentage of normal line height. + * If spaceBefore < 0, the absolute value of linespacing is the spacing in points + *

    + * Examples: + *
    
    +     *      // The paragraph will be formatted to have a spacing before the paragraph text.
    +     *      // The spacing will be 200% of the size of the largest text on each line
    +     *      paragraph.setSpaceBefore(200);
    +     *
    +     *      // The spacing will be a size of 48 points
    +     *      paragraph.setSpaceBefore(-48.0);
    +     * 
    + * + * @param spaceBefore the vertical white space before the paragraph, null to unset + */ + void setSpaceBefore(Double spaceBefore); /** * The amount of vertical white space after the paragraph @@ -128,40 +157,74 @@ public interface TextParagraph extends Iterable { * If spaceBefore < 0, the absolute value of linespacing is the spacing in points *

    * - * @return the vertical white space after the paragraph + * @return the vertical white space after the paragraph or null, if unset */ - double getSpaceAfter(); + Double getSpaceAfter(); /** - * @return the left margin (in points) of the paragraph + * Set the amount of vertical white space that will be present after the paragraph. + * This space is specified in either percentage or points: + *

    + * If spaceAfter >= 0, then space is a percentage of normal line height. + * If spaceAfter < 0, the absolute value of linespacing is the spacing in points + *

    + * Examples: + *
    
    +     *      // The paragraph will be formatted to have a spacing after the paragraph text.
    +     *      // The spacing will be 200% of the size of the largest text on each line
    +     *      paragraph.setSpaceAfter(200);
    +     *
    +     *      // The spacing will be a size of 48 points
    +     *      paragraph.setSpaceAfter(-48.0);
    +     * 
    + * + * @param spaceAfter the vertical white space after the paragraph, null to unset */ - double getLeftMargin(); + public void setSpaceAfter(Double spaceAfter); + + /** + * @return the left margin (in points) of the paragraph or null, if unset + */ + Double getLeftMargin(); /** - * @param leftMargin the left margin (in points) + * Specifies the left margin of the paragraph. This is specified in addition to the text body + * inset and applies only to this text paragraph. That is the text body Inset and the LeftMargin + * attributes are additive with respect to the text position. + * + * @param leftMargin the left margin (in points) or null to unset */ - void setLeftMargin(double leftMargin); + void setLeftMargin(Double leftMargin); /** - * @return the right margin (in points) of the paragraph + * Specifies the right margin of the paragraph. This is specified in addition to the text body + * inset and applies only to this text paragraph. That is the text body Inset and the RightMargin + * attributes are additive with respect to the text position. + * + * The right margin is not support and therefore ignored by the HSLF implementation. + * + * @return the right margin (in points) of the paragraph or null, if unset */ - double getRightMargin(); + Double getRightMargin(); /** * @param rightMargin the right margin (in points) of the paragraph */ - void setRightMargin(double rightMargin); + void setRightMargin(Double rightMargin); /** * @return the indent (in points) applied to the first line of text in the paragraph. + * or null, if unset */ - double getIndent(); + Double getIndent(); /** + * Specifies the indent size that will be applied to the first line of text in the paragraph. + * * @param indent the indent (in points) applied to the first line of text in the paragraph */ - void setIndent(double indent); + void setIndent(Double indent); /** * Returns the vertical line spacing that is to be used within a paragraph. @@ -171,9 +234,9 @@ public interface TextParagraph extends Iterable { * If linespacing < 0, the absolute value of linespacing is the spacing in points *

    * - * @return the vertical line spacing. + * @return the vertical line spacing or null, if unset */ - double getLineSpacing(); + Double getLineSpacing(); /** * This element specifies the vertical line spacing that is to be used within a paragraph. @@ -196,14 +259,14 @@ public interface TextParagraph extends Iterable { * * @param linespacing the vertical line spacing */ - void setLineSpacing(double lineSpacing); + void setLineSpacing(Double lineSpacing); String getDefaultFontFamily(); /** - * @return the default font size, in case its not set in the textrun + * @return the default font size, in case its not set in the textrun or null, if unset */ - double getDefaultFontSize(); + Double getDefaultFontSize(); /** * Returns the alignment that is applied to the paragraph. @@ -217,8 +280,10 @@ public interface TextParagraph extends Iterable { /** * Returns the font alignment that is applied to the paragraph. * - * If this attribute is omitted, then a value of auto (~ left) is implied. - * @return ??? alignment that is applied to the paragraph + * If this attribute is omitted, then null is return, + * user code can imply the a value of {@link FontAlign#AUTO} + * + * @return alignment that is applied to the paragraph */ FontAlign getFontAlign(); @@ -227,5 +292,11 @@ public interface TextParagraph extends Iterable { */ BulletStyle getBulletStyle(); + /** + * @return the default size for a tab character within this paragraph in points, null if unset + */ + Double getDefaultTabSize(); + + TextShape> getParentShape(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java index 8ac40c1892..bc1652afe5 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java @@ -21,8 +21,6 @@ import java.awt.Color; /** * Some text. - * - * TODO - decide on how we do rich text stuff */ public interface TextRun { enum TextCap { @@ -31,13 +29,13 @@ public interface TextRun { ALL } - public String getRawText(); - public void setText(String text); + String getRawText(); + void setText(String text); TextCap getTextCap(); Color getFontColor(); - double getFontSize(); + Double getFontSize(); String getFontFamily(); boolean isBold(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java index 8e5652fb81..4733999d49 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java @@ -22,8 +22,7 @@ import static org.junit.Assert.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import javax.imageio.ImageIO; @@ -35,7 +34,6 @@ import org.apache.poi.sl.usermodel.Slide; import org.apache.poi.sl.usermodel.SlideShow; import org.apache.poi.util.JvmBugs; import org.apache.poi.xslf.usermodel.XMLSlideShow; -import org.junit.Ignore; import org.junit.Test; /** @@ -142,29 +140,43 @@ public final class TestPicture { @Test // @Ignore("Just for visual validation - antialiasing is different on various systems") public void bug54541() throws Exception { - String file = new String[]{ - "54542_cropped_bitmap.pptx", - "54541_cropped_bitmap.ppt", - "54541_cropped_bitmap2.ppt", - "sample_pptx_grouping_issues.pptx" - }[3]; - InputStream is = _slTests.openResourceAsStream(file); - SlideShow ss = file.endsWith("pptx") ? new XMLSlideShow(is) : new HSLFSlideShow(is); - is.close(); + String files[] = { +// "sample_pptx_grouping_issues.pptx", +// "54542_cropped_bitmap.pptx", +// "54541_cropped_bitmap.ppt", +// "54541_cropped_bitmap2.ppt", +// "alterman_security.ppt", + "alterman_security2.pptx", + }; - boolean debugOut = false; - Dimension pg = ss.getPageSize(); - int i=1; - for(Slide slide : ss.getSlides()) { - if (debugOut) { - DummyGraphics2d graphics = new DummyGraphics2d(); - slide.draw(graphics); - } else { - BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_RGB); - Graphics2D graphics = img.createGraphics(); - fixFonts(graphics); - slide.draw(graphics); - ImageIO.write(img, "PNG", new File("test"+(i++)+"hslf.png")); + BitSet pages = new BitSet(); + pages.set(2); + + for (String file : files) { + InputStream is = _slTests.openResourceAsStream(file); + SlideShow ss = file.endsWith("pptx") ? new XMLSlideShow(is) : new HSLFSlideShow(is); + is.close(); + + boolean debugOut = false; + Dimension pg = ss.getPageSize(); + for (Slide slide : ss.getSlides()) { + int slideNo = slide.getSlideNumber(); + if (!pages.get(slideNo-1)) { + if (pages.nextSetBit(slideNo-1) == -1) break; else continue; + } + if (debugOut) { + DummyGraphics2d graphics = new DummyGraphics2d(); + slide.draw(graphics); + } else { + BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_ARGB); + Graphics2D graphics = img.createGraphics(); + fixFonts(graphics); + slide.draw(graphics); + graphics.setColor(Color.BLACK); + graphics.setStroke(new BasicStroke(1)); + graphics.drawRect(0, 0, (int)pg.getWidth()-1, (int)pg.getHeight()-1); + ImageIO.write(img, "PNG", new File(file.replaceFirst(".pptx?", "-")+slideNo+".png")); + } } } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java index 0468955eeb..b57e9f503c 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java @@ -470,7 +470,7 @@ public final class TestRichTextRun { assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(1))); assertEquals(4, txt.get(1).size()); rt = txt.get(1).get(0); - assertEquals('\u2022', rt.getBulletChar()); + assertEquals('\u2022', (char)rt.getBulletChar()); assertTrue(rt.isBullet()); @@ -486,7 +486,7 @@ public final class TestRichTextRun { assertEquals(4, txt.get(0).size()); rt = txt.get(0).get(0); assertTrue(rt.isBullet()); - assertEquals('\u2022', rt.getBulletChar()); + assertEquals('\u2022', (char)rt.getBulletChar()); expected = "I\u2019m a text box with user-defined\r" + @@ -495,7 +495,7 @@ public final class TestRichTextRun { assertEquals(2, txt.get(1).size()); rt = txt.get(1).get(0); assertTrue(rt.isBullet()); - assertEquals('\u263A', rt.getBulletChar()); + assertEquals('\u263A', (char)rt.getBulletChar()); } @Test @@ -513,8 +513,8 @@ public final class TestRichTextRun { HSLFTextRun tr = rt.getTextRuns().get(0); tr.setFontSize(42); rt.setBullet(true); - rt.setLeftMargin(50); - rt.setIndent(0); + rt.setLeftMargin(50d); + rt.setIndent(0d); rt.setBulletChar('\u263A'); slide.addShape(shape); @@ -522,7 +522,7 @@ public final class TestRichTextRun { assertEquals(true, rt.isBullet()); assertEquals(50.0, rt.getLeftMargin(), 0); assertEquals(0, rt.getIndent(), 0); - assertEquals('\u263A', rt.getBulletChar()); + assertEquals('\u263A', (char)rt.getBulletChar()); shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300)); slide.addShape(shape); @@ -541,7 +541,7 @@ public final class TestRichTextRun { assertEquals(true, rt.isBullet()); assertEquals(50.0, rt.getLeftMargin(), 0); assertEquals(0, rt.getIndent(), 0); - assertEquals('\u263A', rt.getBulletChar()); + assertEquals('\u263A', (char)rt.getBulletChar()); } @Test diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java index 9dda9af244..c2f7ac9d08 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java @@ -556,7 +556,7 @@ public final class TestTextRun { int i=0; for (List textParas : slide.getTextParagraphs()) { assertEquals("Arial", textParas.get(0).getTextRuns().get(0).getFontFamily()); - assertEquals(sizes[i++], (int)textParas.get(0).getTextRuns().get(0).getFontSize()); + assertEquals(sizes[i++], textParas.get(0).getTextRuns().get(0).getFontSize().intValue()); } } diff --git a/test-data/slideshow/alterman_security2.pptx b/test-data/slideshow/alterman_security2.pptx new file mode 100644 index 0000000000000000000000000000000000000000..13292286460cab6462696da2849e58edd6997f67 GIT binary patch literal 425540 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 BkW;cJK^PSTR3? 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 z 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∋0m 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%0A{^Rkkn$@1a2T2_R;l3u2*pd=b zWXBWo_NBq3_FIu{8`8T|2Uyd`bM>nNiaS2seXkH$Jas2|`qp+w$(k7Sj)M4eY^MQh zQ9E=ZE75prv8z1apZ=j@c!Zh3-vCL{d8-+}i!1ow%^VTqar56cs01y3pQU+O>P;TI z8{-~Bzkog++Tk`j3#q(Tu;7v*Nx)qIMF z6enUA0D9C!lV0UD2!2P;-OfOrWydz-y=U_0Efy-GZbNF{<-~K^oRw1-X3)yHgD0&v z7~6I&$k(9Eh#hLmjFlushOpMW)DTj5liIFhR*JK9Pj0{{r0CzI@m5p?wmD^X8)3gO zP+&=uwH*kP^cjB=ZHttYo(AKj(8<~&F|sH8xU4%C#lu$+Db9KfaC-vuUB zyz2h|H0o?@bW5>sK?zph-iNK6Gc$(=EcVn#XzTK(EfwyVy?bS$YLv#+FQKWB(`n_M zByBsus;z8#e!|!=MYYO6ktx~@5_ixN+8Qq23bay+fDr;g-jU=##4HY_WgDB`4q`4I zvt9$s-bT-H2`ik<4#V&GXs7q%vSaTX3?<_cdN0r&MrM3xLFJ5Pj6&HWLdM;8`c{iEr51?Ut1U5oZ03}t5|U$* zE4y1J5^;7?Sf!J=J>rs?-(sliRkA~iv}q=$jh0!O;>~hbup{MN8E(1~}fWMY693wj$%WJ4;&D+ys-bN$ERZ*O1w-;naF=bjhl9_;e@mPLLRE-=h$7R{!cZjRCS|w&d*ps;TuOH?3 z{?9?-dm$n(xLzmXK#J$&CNKP=~^$$t(cK=lpSe1OeEB)UcqRz@H|v0 z2>`-luQ6BQCRLP1yIa8OH#KrI5aLQHLd0x#rr13i{Gfv)pK9*HvlXU9^Fq~~V9Ui2 z7L+=c++M?6!KJpBvpdPQw1Mrq^G|(*s!2@3cLdVy-xOmjBv|1qOAntY5ZT;yQTC&Z zDlOMXB*-^OunsAOuu|%F)arIf>?%JMs@TTSGR36gwo~ zd&aFmVYP<%+mCv3+DQyiUc$o$vW@M~Pk5)MtD%&aqnn)04>sUZmhK$ABq3n>b#(@^ zR&GuDGp(hedk)NZxRy6^-RczMBNLT&QMrqxP+hL4JN^;xn%-N}+*w8{d14p{L z=;^C{g5Ja4xxH=H-*?G$KvE9jUAxl$+LOBi++7*wALBNvX}8!?(A#4}lQZvAEOJ_X z4vtTNHebxShT`2x#BkRKmmw~s`cw(+%*87V=j{PIdqa@5YZSFZ%po3J&y?VgRCW5* ziAi!zil@-L&E2iF+FDcoP9hdSWqqgnRXmxaALHGGqq<@CZmw|)!k1KpG~e{;`_umb zbj6l!+`12pQlv}4-EP@RN)m-6?3AEPgWKDRW-Q6y?CSJ^7ne$J8B;cP>P5qZ6+U*6 z*W@dt(t2AN7bLqA{vj-LEvJQ;yR9uwww4tuLe8X!-{nQd5?_!U z?v-+?)t)shbd9W1<0~&*x#J@R)f!WPAxN&YF3Uk%2@juPVVZ! z-D_c|6qEvEN$7tH@cEL*k)_eIxuW6l@5JmT@GlB_+@bi?gBvg9Lyt0FjF)9>nC1MU zTA6W7;uu-b*=@wg0YW~tdk^Hcs7#xS*u$3Lh7{713QD=FnB8cZO2#C5pvbF9TLAnW z(y|W~Doq^F8#R#b68HmGr;1ib$nQrw;ult!UHg{-qK71fDGAusS;?(myhPF z8^XJFfTE?Cn??*Fc#EUF?Poya71ga*EdySsI#Fe7L@ar)GS{lx{ z2|I7k6;WxLuWHMUyugu%sOr=LU?;!sY3fM}r)6V|-6s*nz|#PdKKE{FtJ|{dbrYxj z1!YZOY@~o7K#tuj(s+8td5=5!k6Hf!{{ZCgfzFf3igsV(C&vD0;!N7gZZjI6d9^sw zPSBYHzx~&d%Gze%m6MJtMcv`;jtOg%8@rKe@ss8aqp&eoaB<+9JZ5Wh?B@@PyIY*o zmR9wp(RGHDpdg4R+)#fxqgUzKqlQ~J0`&@E#{!Z;k_~%rr{bk_7u0ieV)g6#+#qr7 zy=&&1djA0UV!}GJU8`geM&qR~6dU}5n+m4gO4I2ib?-HQjnx%X*hRZm)`9_xa|+qm1||SW>j!wJC?qM$_HJ+}CQyi-{>X{X%aWyo zzTrll>t`_Cf>CjH(h_$Ow@_$(>=x+_s7H}+rUHV5KoPg^YA%ZXuns2AoS~^EKpO!~ z(};0?flS(zD2*CKX(eFH{OX*v%V*aA0Q*j(2^~n9mA#Pk981RP$!)ZmR|$=y+N=2v zqT34=q>9rtWQ=XxO<@>&iV-stwS4=`%LvZfJx(0aaP0eO;FfB>wKoaF)|OMbQR!L# z0OGNtXO|lGCu7-u>j1heT_B-VrH!epMQ%z?&^aH4TE;^&1Wj9u>VPulpWj`P(I(YJ z4uTKXv@karQC}iWY_jrxZB>X$0-zpA>E0`TGPGmlhRZVx$5V*3l2jG31cSHAnMFB9 zge>`NguF-qX*(cq^_mH-7O=Z3+o9zZ0lfRw7p3xCTL!A-ZLKg!BB@I!23m|0MC)vE z=17$txRX|)pX5xjdlMK zI-|q<>>Wx0B4c?zpU1zywPaIH%lc*cm9r4IZLn7x0tqy5m&mC^v2e^%0yLe^aTRhh z;#O#3w8S;?esyX&1vrxu_*tfM29K*UHs_6~?$9jMr6HF!Ew4LmgiIfLRJ8B2KQZyE zdlkFpE)eQw7CKK#1;@5fu!|UK^aV2EG3pw(pPdq444B_!EO#wAjaeV-*ZlpsC)dW zF~=xQ*Fv5;L3}?c-7Rl48c5o7DKII~i;HN5j?fYB3$7l-6#HrN_w_cF9XoRr3lna^ z;K9zS;oGZ>HtN|(SlJG$KN=+3xUgit2yNTBeQ@R&UTG_BGNc$M+C@il;w@RF+??go zlDli8Z=}fsg%RybmL5*i7`55+7s*(C+m`pm&@UNC3z4$NS_$HWsoz6*`y^Xo=vDJ; zNY=xtg{53bu5gr^_!UV8EwI}=a4u~?Lei*G2AogKgE$Z)t)eBWPOtsxj-;d;)my6 zlMm$t*`pJ735b6=w9l)*YF=n)d|R^P$ys|7%~;KalVxiJfB^*0+!2EOg&xESXzpR^=A$(uSD;4Im_MT0IJjvc$KyhQUwL zfsR@dJXOAb56d^|Y)K5SPW@oePU(`rl03h+#x7dTPx&7>I|uzaQmzB+F=0qh&?LiJn?hrp*3u= zQkIlMt%11YR5AfqqEof*kAdAH(8X44vZ zrVJz~ognNtuW{lf9BRva-bJx0-IZJ_2UFjgvm2YxQfeqIX2MYF0>;CztN4;yDoNVV z%+0GxV_c`6y(>Zqc2|D~!Q~h87Hk5B>EyrlUo7vGq+H7uI2C#LCYL94mN?pK;N}WUd6T!zh~_0P$__T+Gr&7 zIwVWm)UwlKNKpfL>AeE^4v5%tlH$lJf`2+B&S*b_x8bG(h>iYomIkjQS~wD2|V z2k-mQQ(F^Oe3su{jl!d0(xJUsDBE|0`F4p?l$~86J4dxwZ85Q8&GJ@~R3rd4J?N}r z8@w#AMk|dr%fOTu*2B*JsxcQV>e-K;tK8T8f`5jVz&CIb6Z{# zUv1F;02b-nIsGGQ(}&4*nWZ4a)wnN^S+J%m%7_6}D^IC11n(PG z#9pkT=zYo<>1n-65}-C9$Ih(AR#V9Xc51s9;&&wPJ&i=t>*6s)JcB~F8C%v^azI}`GxCgyKVzu)96EvPNV|3yL;gn0O0!yIfJYNm^Wx;Jw}&NmbUs1PK0?|Fb4q(*mdw! zZ_;M0#zGnkvvxM_X{ta`Ef-#qzXO_Tm<Af&!KJWySp2uEy#Hw z>NCgEs!d7{^kundC4_j0EFO!pR2-0&k~cJ1^Kp9)IeiS4`Qp zhdHFQLAT5ZWtSgPwXG!V4>esk6y(U}m|G9cUV0dHZRlnRlTU_5(rpFz5sLGY99oow z9VG1usQbz6had{PO0ZH27Wz`4V3~@q_b*IO-Aw$(bh5tH_Gi-Qdz;w zLeCifGC2fp@Ye9PD)FYa4zq(~U za?lhtZe#29qs56u2+5JRM?~hlQr{@yYjsW~8V4lAQztcz3yfTtzu;$zU-^Duxn&N8 zr3&CGcIisPo9=d7mOd!z`xgh<&`Ieu_6jRc8}ZvLHz{HZxOFXrw60IJ4BCusoUO?o zRXucXvrWa&SMr0plLu&;@;PeTNYjr+wURTHnz2i8v~G$1sQ?b6-l)HkiEDiqc2doV z$1fjV8ZIX0qbY+?9H0ZIhup6~+?wDlPQ`0Gg`h`2mwrvc9|U=HBZu+~Y0W zXnkS|Hq-wAbq^ON<$E$F?a`&%0`rE^#+0NUPXPTp(5BPlL{jYJUx|DHtS=q7cGcA> zu#lxBi3pzEs#Mm|vEjPYC@XAjc8<)L2dR<|)7q6KZ1hoKy9{;5^rW9m_UYWxWoWk< zBFxEGUQ&>T9QhQIBQ0% zEG4riezRH_;j4QQk=~8BcO)IS>?z7?K&anj{4*0-Olu)CxI9y%KAIIcQ#M{cQle2I z8^r!%tt^dnF02mo>sp7Xf&Ho;OL`p`q))=jigHSf1KWyhCGy1N>qCwdlD+pa8}kF& zt)|M-*2A{5n?iIgOC&(ztDVKIpD*mC3R;u`bjaxx&X69%-U;bOXi60-1Z}rYzbeG~ zlm7rLYfYoSawVH%DLJM|LQ2w-4%PFl$;GxlJrLisPG`xt&Z_O)In?VwB~iHR%~Xq7 z7REb|N0c5r+uzt{d#gL=gX?K#77Wh(*8c#E)5orh*eR|^uF!U^C>9xzBvWmA1o{+u z>^^R%esr+u5aqIemD4pO5 zXnDT45fR()svA%CHKORiakRXUkV!HDCyI1l=u<;=rSV!dY8%I1Y3a7CLqzu8AdSA1 z)Gd+mMupN6pD{=r$T7W3rj@fZ$aI)74`M8-4Zg@N6S9-Jj^>G}=@^b%1!Hb7#m%+b zt*g-^X^O3tMlDKSfvY587?U`))2%kjQ*PRI1tnb5VJJ=Utq1=AC);)0;)``QZ0bn# zYSqVjV#e~?f*~h$Vbr&EWrscX%bzL|5{AS{t4qgmi{|KMHmK6a@xaPMZ8xGe)~)Gr z#gQ#Ak|=y%0mp3Yh0;lW-|rQ0e!c5HQJUG9;?}?zPm4**w+c4_Te+l#r%4p0H3f1Z zN?jHsdEFT6mQLHP#H>Mps2lvLv79GgBNUlt<$UdO+rfvzg5&QKJ9|}_%2%?^IapOb zA=|Zxt)g`-a|iRP^71NlT3Z-!Ji^V=HNcb8zr9$+l}Qqib#^V@l(-a~Jw-h&+8Cgu zh}ec-v09R#QrzTN)U z5A8ubP?#G*MeRO(>qk zWqh>81%Wh%+X&Kt2c|d`YoQ3_Ka4LC*MhRFJ(t#%uZUKkddc#gx-Q|4tdH;&h@3|d zxpl<_tdZ7CQ+!z0VdZvu9_z|x!%|NPtrDf4a(rxf$BZ$VpUdsI5o@FqylbqVDo*Ki zUdI(loc)!UUFETLdP33xlCFE!7D`Ni^b*4F-e&Fgn?j4hUYJi>uPUlxJ1y@5bFJ=K zySqijznYh%0)0Or`O-M>c80d66q(n)3tzS6KX{-L*jUIvKT5D}V ztTAn@sShYgT6W*PSy8C(vo*tF^X(f;kiy;wSP*sZsC{X2$kU)!J7q26--lx`;dtYU zX-d+7rq)xrBa`#qqBj=VXC32`I6oS}ZZP~w)`%!t6kv_E6kM-orpD7&Z^CWX+vx-t zo#0a5i%FKYOGCE~GL)pL$bgZiv#l(d`B0JTLof)j5G0TgbGVRtEZsOaMrASP`?_OIZr5WuD;G`&Gn8%f9 z3TjV4%Bu@Jx<)wD^*8!O|)SsP$*1K>>6}u zPQ^IiV{Qh}A+WteymjwZ7EfYj5rv#7wX&rJ7~XgHqFFR8qAk`Eogi{|-YHX<=pbF* z426@ZDgfB^r1QNFH`w8AqE6&b5iw6v`4sjZ!>pStfMm>p6n}HzPXWCQv>5=1lA0ahzIP@Y@qgBO{no-&Z_Y`jg znad(E@>G~4ZyZx2ib*DSG|4QipaC0CTCoVVp)%M?&h;T9SPnmM;;q=nNnE`KPlwrFPci*PO0tIk1vj*x&|IaJ&g}#%u4`Py$jF`%8lLW-_@tVSGC=S>t$HX>kpy#m1nK){Yq?HL$9W%6`WM zSZD0vwYne?)`nbQ`XpSscK-kd4qez>tJb;l#{GLz)<=rv5aU*UIA%4BIE+sI;liMh z8)YT{segAj=Qb1gOgC+g;}*;zq^(LyL;|RqnB~hANG*Jyo6zQ0RjZAqdXPZt%?q7E ziiz4Q8}ALUyjdyxLt(8ZL>|Ar>ZBoSVqABi#toG)%mIepLXuo6w`$8G+!sNhZ8FMagT=Z0pb zVGp@#hQshV1`Sz^csfG9@<V!T{y4zD4O+g)KVSU=tuf)U^Zy`MdP|l%ODBnDbZDYf^P0`bo$PunRADSxpFO1j2nUX5xS`{FB|3UK z8^bjVYz3!7hE$Mu;QcB1<4V|4cIdI*#?fzLm6v^8MDtc9Dpn)dy^Us7J!hc>Q&pVW z&0lAUJp)Qg8xA9!*902R

    MT5^@p&3gJd) z{2k4ETybtG0^_ZVdG{T)$Jiw)NF+hhcAozLg;>Xrbk0eloWyeYNtGlK8~3d!VO@ao ze!*83KW0$$?ZBRt$>B*RL}z0LNz3ZSF4EWnLbz8-uCdT^ohu%3yq1eQG8B}60opyN zlzj?Qwj(OfLWt9_KeI;RTcGTi#u_#zV3?SlsFWJn9D|r`sBJ)mkD!4>lAt9kLp{B! z6yN(*rb0k~H?E;~N8y4z`U23BrFSP{I24&ga*?InsPPIuSOHKqPajH{#`a5{lPvP@ zl$3xWL*HoYG--T+%iuF*fduJLZWIh|cPHQ5+M|u>uz3?NTX}-eIzX5)%uw;SXD35$ z1Av@ihJjX*01klv0E$eNJ%;5(Om8eI#s2_8VY&O!$8%OOMNo<4vHt+VY(CYu$yx&5 zoykAusQF2<#y6tC%_j_U)Fd?2$E3gn)=wFBTF~d=z8i0OY}!J7ArL|9{{S`TJc#m@ z9Tl>Q_{F=w!f;pr0Ea3603jfU7L-Pj+DA&Ii9_zF7F225N1Inyi@CXV#ge5dM3PL` zrHw_=X`fK9NFpR1t4|+V5Xn~8#fgLMRw0pCsY1ypx(_@Q=HNwW7 z2|)yi1l8(^TI6N?HMOQTNjwTJ36aU8Ti97i4Q1JLAPV_-`<#x(|sU2#(<;S7W zT#Zg*OLLX)(y2U@>~GsJ7wYd6$mLD#obj0Po(j`(xPxl zQYJHY3w98rSea@Pqe44GmM+3kMI6bkA##PYXml-d1aI1(8GH+Ipzad>g`f|-IgYh% zGx#e?CGFv6F2g0TvO!TC)1=&yT1$&BTbw@(%oZ?}C)Pgf$sbSBsLLJt3K^UV#~I3w z;FyP>Zc?BL*loAUu{^H_n&lJGc%E(Pmq&y7$f&Z*q!pk6r0_TX_2aW(mN{(nQJS1= z>Wr(1q2`jQj=*oyhANmWZ$4`67PKUpPbQk;>dNw(LIxzxBXM#XSkjdp+*Bm8!v@LVZQ%xx0hjfIeL)R2HRLchfX zAvmjIrwV7*U%0<{L9`U50PVlwPW!gSMgsNzB=!q>y+~0}SRjqyRIH6U25Uq_;!3+x zUn?kDcPZqav@0TeY)Ly7#ys2=Pb7yF2e2?Hk0rv;k#D9!oN)IHZKhyydN5A7$ zf0AU`uEnIVe8xtlB4iz-+nNfly%zDgG)r#zcaEhFzFJiJ)2nm7(fjFKmp;gwaXByJ zdgm2q4!2<9F5KEq=_YpQ4QY6Ip&XVD3As+0#EWNE{{W?WG|dwG_+$8kd%_HP3AssK zipbOx%4j7g9gO0ntJ&Du&*N_fyUOl;p5bbB#)t_We3K-Yw_cP{inoa ztug^?a~xJ@kkVz$ZlZHW33&Dzu-dg016j>j%~@mNS&ha}){V&^gvUKUVyI+_9Tq>@ z=9{~gm}F{{BuZ2%719Z8xqLX!moBuNJgkC{Mw7`OxvAtbo7nQ!WW9d*Htsq6n1QR0 zl|{SQx7CO3?v(K?l&T}{_U%*0(3bCEJhJ=Nc-v*Mr&6O&6xi#eE?pNrrO%k!98r(& zR+O)7r%V%fm~Sod5Xwfjh>%m$=SY@GMgD`WA6Itu!a|goPbAF}e3gLW(H7RxZ$AKy zKkXx9K%(pxiB4f(%zy!&L~~N(Y?T`qb1Qe)TkWm1>u8@+NrOt9WsTV!M=YOktAN^U(jft8H+~R?00BHszZUtLXaTCVC_iuTCf(H8#2F94OUWnp`tcQsv$r^|vCJwHh zsy~v@Gf&WeH)lrfEwrV;R;`C&{{TPcx-i)hi$cAEg43&zdPdc9F--#4a>cNv?FA}N zWAfUkf@0jM1}v?-wJe`PM&I}OQ1OZd&9Ke2${TEJOoB+?wJU-pNM*s^wtb*h5=r1s zA3Cn!(KgNamHnt%iWHTmW7Ot@)~1 z;~ZGqEJAXT)1Dq+ml=NzLxI(;1WYK&HQ@Y=-;-syqPzH>#X`I~#H`u0ZA!Ro>v3mN zfE~M5b}8OO(0z7!ME$zec((S5K~(3y+aEvLwWPeLm@HWthHrl=U>E_D&p=UJ1- zHKNpI5;}s?cbKY;WL}3S6Y3sV5eMf}47noqLxfp5E~&=AgC6y$r76epMMo5#$d0h3 zDD6}-;FEn8V>L$GOflDpNKWR0J}jfz63VO~tP$251fBh=%sgp!CFMli4$aptf=g;3 za~m4HhXd(|$u-@Ut^s8GMY7sdNCSaamL$~_r839CF&s+CI!Ri=17IR2tj%}YiWAK} z3}3`mizmx*vb88jtF2X@B}1{~ae5DA{H=c7>u+1@LQ=4J-<_bx&b*(U;>WalZx_tf zGpsxv!|!kI8*1q*LQx7c)K{60k8-18S>wjh(w6uF7iyFw00MhfqQsZFECWK+9RP}`@|oz zyo6{Zr1tCo0Ciq|LyOQ!{Dqp%FS^=S_C+d0&YE)aTS0L{BbkxsR;JRR6$I%gr2@-t zfRi`jE4X3RDc1o?q5%H%N$+fk*xiRA4<}p$)Dc$Wy_O?LkC<_5YkNhouo6zdD0HC9 zl|fTP%A^UvS+!+?u#kl){p5RPzn3r3nM4&Y};L`UmZD*e^7A zMdV^he!&42>;C}kNI#$N+NUp%E>{ztB1RA4y`!4gxJd~kbWX?IQ)7uGLlz{~#Vp6+ za+ zFfQ>HOOQ~aCTlWDrJ=DpFT)QEo6T2tqss|xM0$YTRhc{s%L z@s@AjzH~eYAyF_%kChd-D+5VUWMu{$ULq8vk)(6bnX5RJi=Rb?{o_s$fTWGNC#5<~ zHdW%{wROv08rDo-0Hjde-uu|sH=rU>}HChe7kTs@bOIL7I5!2Py zxlW$Jw8HFT3N8id^!FS6XrkM8N@)_EQ&@oub{3w*Q~0SnU^#jT;0?Chq&Ko=wtRI+ z8?g23sA-~Bs1;&sK(HQk{xttCE_u~!>ap9=@y z$dW>)oOW@RS@4~VM-f|!XhB&&F}bg(;KdwKS~Id{Z&o_rczI`QXcE&&B_N19o;ua| zt13K=KFWVNWj`h57TO|uMMSVCx-LU4=&$c^cUm%0zh7z<p(*t8O)25W@K5-O zcVvU%y4YrXuw$s_8lvOcWJ(+@?c-7(M@*qT$v z>@_P0Ic~$Pr4BX$CP5;JK~+$;+TD||Y#om}PU2_fQVWwU3>B6cWdT4=m?ZV2$?iie?cNu?lEJDG8I9=kGltQjNf$#;9hUy^5Beh2>@&>t!LJ*c*Ca z`|V4Vq`DzA9>cRs%%!({qE?Z*NB5>QX>x<1x{$ftyNvM-)-(mI_w`C5ecv*qcDAx3K8=b(A@u&cYmnvShiujKKZg!aMFqtAPqqLtGrp(cMvfqq|v}mJW7z0G1_a5m1xO~bOuWxJIGqi70^kF{mW;@d7q@6R7p+Q#dr80+M6?BI{U%i#JMpQ;8u`d70eLT1r$S zY4kgIeVv*^UQ?nAewiHY`~LJP`)HP^zOsHIo22VyVC~7+R+bfUv?fDUo)2?%h#^IK z5TH1irOO*~v{aQ7^A=T8tR$syK#Ax@9I)E#OSDD9u$FBY^1w`t=ZsLlCd==uG?5L2IuiT9>Ct=9uu0_{JZ84`VVfO9ZAh=Qh z-eaDeQ6?%))gs}`cX$5Qp?tlJY|4Ne@3h2|9@IZ=3*-jHFyi~+2|!UIAat6awt`b7 z;F(2EtteAq>^D~e4OPhs=&|<`LnD43s^Q<}G?|za`I?SN3+5BI@ZZXFQEfhv1_b=5 zIih)JCvStV4rq^7nb^%WQxPds2VY@pySUaz-8;+@uJp$hR755n!tTQirLYtX5hG*& z02M-b?Uq!mCL3=3(3J%cK%Rm`S17ovB2ppd9Gr{GVnPX#CPv%w`qwG%U`MiVgcyjx z^9_}<)DRkQ5&r-`zNWla*0IVkuf!8M~=ijfbk3+o8+xUT8TSI*wdH6*3g-Yp_8*6Y{#G6+h zsh*Wt_hahfUwIYw9kd#f3Zw6F6f*A0Gg}%iSVLr!0Xzc{J;3&^PQ{DYH$j(>g9#ji zJanOGYF2}`Z8vbyAd*Od+!~bJM83c{&RRv%zU)Bc4r$6>ncRh^vU-xa4ec`kRIlh~ zGCSFIXh=R^2aYN@-ooZXQ%l3tAd?)4kwW80H0+q1$nBT|Q385@daXEyqMpV~m*NAA z;;j1(UKI1xNfH!$UzOr8udXS0vR>@KIv;R?KX&W*dUP4z@a(T{bwOiT*+H zbZW(0!j|hnwve>XMC~-G<;Un-jfPpktX9$pw`_tt3Tpdx(HvM44)IRH;?O(iqI!aM z`ArOSDzMbkHzUOBN8c^9=n=>?&%E0kYKcx~7H-=Og`l{00Vbj5O;hXyFXC4BHxGp( zbg1oF@`G}<(Gp3E*wzV%w(=B))1gY;Q@Eb>GlNS=4k$l`*rmj_%dPJMND)ti*BS*a zj+ky!wJeavfH!e{hrd)qfs5JeB(iN49ye zyG2P*Crt7y)Or_Z)|RxqCVAg_7PX+4Lrs<1+-K9Obb%e}q>@_-$?Q1_N?r*Q{c*hw zI?!6Z9)x@Wr7kw=l1lg*h^v@%M2`OecoAerwOcD5X8eByvzzS};?Cj{Cu*UcY`F*c z=;iFce3u{6wzv@jg%lH7=f{k>i#urWqD}a-e-M<$XE%T;Kf{yggDqj+dH}=QjGQ- zpYu(1>>eKk#b;vrbh`&>l0S1?qL3~YerFP5?2=G_MkU7=J0M_%8ZRdIcego?W}Tz>{}=Mc3eBWVVAs@Z&HomCoGb8rUO zd|hIBGYWpmcWZTjb+Vzl1!BLX#ZLM~$xoWmOXj~C?sFa>^}^Ovw^UA}$oH>F<3}DS zq>6IJ*fQ5TrAZ0Ybr~JZRALhS!HhQf<)Va@I|g@-wG@QB zY?6%AX#RzHf(f1YrmX|QM5|lNN7PBub$?J2e-4!!0-7YbhuFM=K}p|zgwJozp*C`` z7A2K!t{ZT+l)&TOiqLVJOt0~bu!~$kC=DPP=l8t~l6x*=n`pCg3w~Nc4&I(kRi1>* ze7d(m8>ui(#2A_tbSzxNteail&F#URxa~yPak>~VdsdLvzzL60JAQw?s2j0zXY0n1 zZlzA;TWn&DNDTt+U1TN{cZdY;RYb0W_5{AXV69|Awt=?5aWqMUqAlWXH16pT3Qp0- z?kX?fY*h<)Hlfuh07jv=T2z;^!gM?MA>s0~W_z%=coec1Dg&sr|V5)SYCp zaE(0DWhzGyAH-YpG>y$==!E^-s9c0?(rTpJM5a%&((-jIbJCrS-r2y+X9Bmx zm%1h?d1D#qD$p|%%Iq6J(`eK30;%M|7aBtNl5MbsBHgs<;B}`%65^~L4D+Q~s}aH8 z4Jp+PTOCJe=~;aks%&D*S>e{N(&OZl8Ybp~5qt^p{iBbvvK488FtEx5~U7MB1ojmE3FXbmuBp@ z;_Z$vh?aGR6%*<^3aqm<>O?6g(RgK?#KWbr<|R@F;O$zNvhJApjjCE7KvH0l&{gXg z)sn32!qYLgYIGxL?lf(F(nWOQ{RKv~un@_C1P+unNa{S`{{U1AtG4i5HMO_=k1+bc z*!xvXH~uAZ7_|m@tc8~jk|R;A{{Ye|>5`el3+oFBl*aV8KSZUVqYWz20tEM-K6IA( zFsR(Sg13+WjyE;jXf&DVKl*&WTVdn?0NdryYPX0P^m-2An=g2)MRUz>kK8$TS)#=$ zA`JZ|sONlpE#v+zoYjD2XPilN5>lRbtc;m&L*rCPbypZI=t(7dPb72lu1l8AbyRJ# zy<-%*SyY94{*}#FV05VxE^wt<;ti>?lPZ!y+ln~!MVF>TRmH{<4wVHZB1jt@{{Xl6 zu5aWWSzt4Rxp!))0Hz=iIO3{FHWJex{4csTD;DzyS0iCg#P398Ec`~@%j839f~eSU zOU;e9qdB@@i;OoBVJS;blsCXgJN;^u;NzvCs!6Sl*;%)kV11!#)H;(#j?&v92d*9U zq@q-!Vn-29aSl4F|F@$u5wGFuz$0*Df+ ztwgB;ktXp!a2Q2U1 zMZy%*!EmH0F&~X;X}c-AMh#x2uS#}4#;#&&=tPsCg}xvc%E0|=QVz=P1siR*79jMI z(yc1&P0&T0F(pauI~b-Y`~l6A1`3wekO|~;;L#;Oa|v1C=|X|?H4(>26jZ%}E* zaVL$*-jvmn;HZAG@h#g1B~R+!048?sDtIT^QNg~CuK2u5Y6W0U(MGYLKGO#e6OyM1 zE&{3AXxvw#e$xpv;y`s;)2Ujy?r0nc;Lu2ChaOTFtwMb#)xYEUQl2p5p>H?l)}6IF zm#C5SJni$Oxbf_KV%g1E(-cj``-KaUJr32G<>ydVjei~u_ARF2Yduc&n~OB&>Lten zg4PyScZ3GQqIy@M!wj;g(L*Gm7BS)ZV)5-~}lJGiIcaK+7-iBHo1cMo4F*|4F`JjZIwjBG_d0Xr$ zM*1DmoPwHyo%FzyJXa{*gg8(={K)Fm4wxhp9ln*^9neW2rIu-0nbNhL<_v8@q70&q zc!p$bNh%Z1Jb|?_L((BdfUfc6t69{NKJbG_S`96M-o+evtw;r5E(K2(!>S`Fyy+$s zr5Q2}MG~krgXO!6-N=NfcG_rofaZ~M_$zL#shKSA7LlbS6Z5R!D+9T7c0pNNh9PC6R2I3v*WFp7lXA_D0z~_RDDs zDfEu@G8LyvMw$G zaX#V^u-keLEuDHdTsrOTzuDC4)R=%3B>v)v$dPPKo7WV~`0EnIG4Fr%uw^MKuk^u*p6g9@!LCiZXs^~~e z#_~D}OUR?J;~PBy_!P_I4rSG#ktBLL)!!amwgy#4ces)EBh%AYkx`rr@wbE*v0FFx z0VMjxX8CTBa~DTASzjAla@w0xKu;sDzrR|+ac!2=P!kbt%wGFal0Z<{$L=cBWk?P^ zk&}SChNvtg1jgnzG}}!pBE1A{ZC!OqAT2^>K;&^k2D>@~!ej$yp&>?71wF^VV?lK6 zhKs)mz?G@M5Hu)n`|ClI^bcm6oVxvvBHOK{O{Qdo$=-U3h$g)f_KPDeFuS&p3e=br z5&G4IkC9*PrZXHT%UrK?4y4e(88&y@B@mRf64(dW)UO?NL~&^OYU&l}bm)j85AWKn z#{_+i5=rB1FvJmhG`y zS6h9sw5Sk5go?gd|pN`!B02ahHmuC+y)%2Ky zKGmrlc^9Evp?f6STU{Yw!GT&h;gLv0+!`3{EuTQ0N1l1D1s7W>%7$wssVRctQbzE4 zpL(-Ygi49w$C~7ks1Y&2qo#q=H`&~*kqZg~Xak?EL)a}Fow#-6sG=03)X@I`M5Ktt zyW5F^6bam&#L&BIME)eCVRuSssY)PhNQ#R2JCY+khA++0q^R*cesnTatRxx2FqYEd zP^2k)?tgz;R>6~Dm$IFxLP%&rgb+kX-n+d5rqeKIEL))z>X<$XjeahA3Wj4-G>6u08Y~+@zQBr z5pNu}bIvr`7mf)k^>wc;=HQc+BhX-%;%>lj{{Xe!Atzxw){oP?SE)XbpC>OEmu61O zHl>!l%_CO88uZ+Fsz;s4Hp@2)%JwBG00mCqDmUp%lVx`%97a-M#HcpN)MK6}tuLO= z{=s;zPbg@qOaZr0Onj)LC1j~2BjWjGO{|o(p`@O8{{V`5b~Z8=o@I7!A2G5tjpKTe zm3;)T>(+DxMv=h)$obbL@C%C!qXV_XNj{Q!6F~LYu1+k8cao68QlyQyGqh5rP1+wE zjh`99h$#Sl!NEVcqS4L!F~nN(qtqriC$~zFRG1dx<42(m5xkQ%DGb}&At`Gz0VhJ9g&om!An1zT~&N{_ZhpuQWI?yi;hNI{7oK7ygr0nK|HuuParwJEYx03t;$ zQb<#n{{VtzA#0*Uk?qo}N?Akki6N^n*##qxwOvMoN{p`ctr`F%n(1FbAZl=8;-vlV;8K=5 zA*60j8kB5zJ^NEsXa?L^SNF2Sq7Tq-9?{OX&=+Z>{KPk7zRLK3TGl#R8G zib>*WN(N*wHfv(S^)3?Q3iWV6krUR9!qpQzEg|15;%W^gml$_mz$gxT&+ny77ZS9w z$cKtMblxPA+bfbvqkqHRyLM08lUp~uyR25-NL{H&JcHA>)}l`PM8g}4G_i$Tv26vS zg&qFyJwF~QV!3Ie`nCmf&k|kXQ;d?3q0)Nq{p!Rups6C#%8gwMM6F0t!js=|^samD z3vHn7?sms8t5DscbpyVrr2>vv@AS1#4W9mQo@q%&~)^woLgh`j>Pyv!mlhX)ZNMo6gZT{ZFunF zin*G5M`EcnW&snoO1e_)<6n#XuX~E6gJ{m86}b^2vpltHMeGmc=G!k0F*3?j`(y~> zI3C{hjm4&sWyt|?48Qyy;H^NdAw?tsAa&ZFm7+hRO_i$`kHTA0f{)xh{N{zV=m%@D z+YZWXyKaJppn?qcow%vwM;F>1@;$4VMZ;w+t4dV_5wZL}pM?aQTU`y|Xz47L8gkX8 zx==|^-Un#wQwMKiTzv%B03gY+&2+T$@?%`x86kUNqn#I zB{l3S#nvT-l$WjbB#q*k%28WEek_{aXL09S1qu>s%q3!^k{>V|&oPvfR_LpA$=H@A zEtw>$AXg-Hm6m7mM#9m>FuQ~$d~Rv+#@MN}k;`8a8Jfp2V2|7DL*Yp~B*>nhoo)Dd zA3lt%xl%Z!cwU#?aeh>ZBzkMrMln>3xn_2LbHk=>ll;U04-hw|D(ZpzvS`J;rD}-; ziJqb;?)oE~nJuidXi{{j5fA_$rARJqpPb65Bx zG-2+bkd*e{tkhDlZu=!$Va^?tLI~uYsvd}PzJiw6Gpo}Zl0s&F@%erfE&LH=m$Jjd z*Q6CeCvM&1lH{0iWMbo%iqa62Y22Ri*!QSZ*l%bXd70i&P(p|?BTx3DQ1o(0S-#Ad zN?f>L0971R@u8_l(G?im*Ny}wM3~#DrlfO82k^^hE>s*TP(*M#iZ+Vvj<_xir6mA1 zRFxT0NCeWGp)KCWoG%4aX-uRfh*EagkJhWoUcs@E7AY+3kPr1F@3hr>*$6=K3oo+e zv#DDk=?7$qr^E8>WF-4XCg)re>^Opo2c<_~M)a>E3Y9dC&mS&`S#_l)^r#K>3V(}> zf}^~NS#Ra_yaGW06W5LFMVT@z>;?5{1fZz|dW8OUT2b^@Wru=kND7X;9na1`3a2o1 z9s3(E1Ff)C1i{~WRkR2z63UjB&6A{Q=^#@hHksDgjhMVLY=;z-!lHH^s?2iVVa9DV zBVKrZ{gTw8+-<)6{JwPFabuQGlSRH6afhw}Sdt@YuCGBkDQwq$m{)2@aYT}JYCT6E zN?VTf6kvfDS;?l^aD$~li3f5jBl0utzhZtloQ=w~rCgaNn3&k(q-BFV?dsBJQb`*P z{&eJ+xoB~+v1up@Qd6XIM^BY?2yKOJ8)>)F5}nhu9pa&ZvDX2!ZPJA7l!L2b6IJJ+ z81;s+ZpvjT3L|2B%~Wl&Mhq>azoigC5H)-CtNs@U6Bvon1YS{sQXbuk&3(4VlcHQ#9v?VA|zj>g##n{bxYw z+d74s2_gwf0H67;c#}sa&4}>&)d*5WvUP9-Z&09+T$y9|U6$Iy6hm$41`O5AYLGIv zT&Zqt;x>wXilV0RGc7lZ`dmOzC%sk7ty3&OtT7Ca43xJC1GwfZI#9lbuh~!Mj}LSu zYAu3DkO18K4|=IBGSqfgR(Vx+_d1XAPzgG^5Ajtkw@e9kI^j0f*5RP$vp+ei#rI!nXKqLSo=lc{6N+RmmU7XRV z1UT6{z(_R3pV2&174vtMc;3L50QBv&njD!!jBla_O=a5)#H>CvtAr$u{d-qpo9OAP zMg4%{tUqp)l|rMfX+}xtp(N~W!y95XdQZ-u7LnX+!xOP;=x9V48^s-RIVuG)l!_Ot z%N)ow$Y>cchS7s!+;J6YJr!7`;ud309fVxCrRfPlJDPqqY*TcPH2hcbTM~aa+?FpC zkcF%669muYUc1Ec*BfZd&6TG>I~;QN8PKbT7V>(6W_rzQ#~fg(BPS+C#@j1o7Jvwi zrbya>*;?!yis8+rD;ff)bI=N8Sv?Bah7j2+medSz4(I+Uh+<$1=Frl}O4Oa=JDsSu z5+f@UagEZYX*)#{CB&C$j3s6kbts85@~GIi5VfIg!zDmZNU5-0gwcl}>C!@^?K@OC zGB0GiD}B|V6rFJ+Z{GB|GD+?zHqSDXv=hkdNPUb#HfP2VfUQ20s0dERed+L29c->~ zJLjET0suTg;-AK~LzN;6Hf~(HLyA$~zSK%TCpl8k$${X>aYIT(%zC;}RcuV8%L@X) zk^)q8txy#wV@Z>(h-|QMd@U>`C+?7*H~>{?O2xJ?S+JB1YDVXze`-r-6WD1R4Ps8` zOmRTj6ffsHHrHhD2~bZH&eX^^VI*<)i0plv5p-@+RCe$FIje5y*2Az~S+ZNsf)l)h zq|@=LNs*P84qLD&&|8knkX63IM&JrlNR~@&(n?ZFN{Q|IP*5xMe)2=^CPbk2+*F)vy27p804=bg z+$W0U-((9|)=sxmD^fX`0A#BxmkWTENC)@wsINrmdBATRN>U7{#{S=0MB=DZL-rGJxL4lN zuev5kHBw7JmM&SgQ>6rwR5{v79k;4;Xp6GZ%l63$)O%G)Fp?RPVFC<*A}IqACdIV4 z;8vbH(95B*?7MtDDMh+Kh!u(CEt}XLkzgj^B{EHCNg4>!Z-U7JvvN9PPsnvTpz~F^ zD>;&p3NuZOU65?)PHf{640Ay4jv-trY1kUCCeTRwg)2zheQG%~tgH~)c7%x>R)92Q zT5Rk@`&S)D#I}Th0Q${wG<;JCkYE$gRM8ZD@=#R;Bjpt&7@KqwJtMtFj-%jVBZ1E* zq~qd}B0_q=2B4IUURX~_p4H#c#xVfw7JgOKO&_#so;axeGAO{cAkO6NwMsgS6>Jo* zQg{9DT|^qZf|vkC)jb?*TQjr?jpC#B&Y~LG=^H`bDhZ*BDmUf2keN&wH0XlXhx9Ez zNFLPIEiorHx8@Vfb*lM#EI>)Vw^%`qphz)PUWVCO=L=Vy)R2OepX-i&s-8uzhN&c1 z7`|PElOtFVq^4)wM|!93(6v2^Htw#`(!gM#q?mB*sqOpsuIU$3U4<~~o11HZ3bm)O z0wRAZUAF9RYh%5JEpo~d@Is1WLS{hsKfaU`xA_ZkNMytD;PTLyfJ&4n(mHppQhhSB zZ4Apzt|4TgQR+MtnIpAYgN+cfG{o!nMilba)RlrKPc;=z%L^ixVceyiTxI zaBAK;I@=c|A4SE5<`ZzsWwjCr-YU(%LacSmXyzI|IH#6${XJ?fKTHjRh$rQOhbk(#9@bxW}#(Rlk@?-+K36 zJUGP|nPi(AGO|htDmsEeQIoOxRjC>BWtE5BBg#n{b*FU5f=6nq;=umN%C$wpQei4g zOp~{~3LT<9M0<=4i=d&VOo)x3d(`r1fkzt2iCT$o(nj8)0bSyq8T^MC(4UHBJDXyq z1nd(rzU20&T4Pp0eRdZNDoP-en0M(qhnM)O6MHM({lEb zqCw=RrCf@19~#&>r#$tI~A?L@P=_(g-`9#Z72ie#blt)wHbui7F$F zg(_@AESwV2Adf&?ZUSnYo`LNR7A=z06ayU(Z+b)d27(N=<^;;LjyT{&2_)8;DL^fW z>Ae2???A}A7jwO$mxru`k*a#}M~|?VXCio$Vx(dYD8Nuu5CPh>TG6G7S~O(D%7>(w zs}Wiil(%q1eTAS-Udr775@LvsW5p_Yh2RNBi$BW=0s{i%1ejGea72L^T|cCJSe z-myMXf`;5lAnj6_3$m#3GcKE(MZ? zI%eOGm2?ThEs9$ibKzj?= zTOjU;1VrshdIgR+D-+JgzTdv|hkn3+1%ZJvp-3SF@e|0Zvv;HkY2}vmp|ubcWNrbO zsxu?9#KScW-d5eh}`swT%B}E zH`};YB-1gr_ReP2kOf+AK!YzHK4c_KP@CR^J|wS5rK>v1-~`0#{OeZEK9T|C4|?nQ zAo?_rJzaLGRqW#}r(!w$YBX{C(Fb_0EZqb)+ki@4a>G;}tsEfCWRj zskC)7SzCKW404d`qqJAoU*g+>zAJzGGu)jk*esNQ!0!=ElVH zU1*v=d94%aGqram=;|@n(!f{NqnER(nw;{95PEG>$#iuRFuT_6Rwf4UDC0Hk>amp= z$_syZ9jUy4;w)ph!)~icAjzt^GA@TkGy_%JZ;d+v@3mItV<=C}jiqflqDfHbb~L$E zh@!Gp`!C&=9Bp8Yfd2rWf6|b#?4A#^?k9kkt%+@fst4YU=WVC^)7~3IsiY?-0K9JW zsZ6Z_TW&Uv{{TLBq&zR+u(DXraQEzR>1EWFk-B&({qsrtRH)}GV%^RmdYiBrc1SzH z-{nYn8zGLFXE0&~q_pS{(inDTHTG`kvY zbJzhOs3@O$WHTntw8%L2d2j6N2r{VPR)i^)=Om6h_?69}>no&%Nm6(1zSZcw9CsyV zMtRxAkQa93$p95|aTO77h!QRj2H ztq3J$X*xp%k_#hH24VpJ0J^aBS9=d(>H$SipgVGSsA_;{bHE)1a!S2Jppq)I(-!tw zI78afQ};(Cr0@9ESx~W>*>S6VAPyoY=SX`vAk)G?g0Oca{`sI}1?-y+Bh#>nka(rN z9YE~GhxxV&N;L$ild+IbYA8B(amoHHVM=D@<>^-Ek}F>uv|Pmf72aRO7i)0_KnH?p zvDoa9vfs;CvLEvG@I)VPf6}5#iV}$FWL)92#4rs?f)W zKH|ZNQ9U@1e`8hUq9|m;$wHENBt((TC6Ul(-C(4pB;ixZ}$Jtho5kv!FAF@DAiG?S#lXRzXX(wJ$7teYqafgNctV^GV1;vZpL zl0iR(R>>Ykyi?*Iwa3f%h)R7@cZ$!=3XQWz9!qptSbg4`bm}|To69aN(uYLQ;apXI zRy52so}zwqRK1dIN`eP!WvHBdTbhIo{p*~sL=e?(b(IspYD0_clkhRL8j2*OTFd~6 z2W_NHGwzPyZ5Y5>wkPFMvZl`9es2_3$Aq2t>+M{!dn1XOu|fj5k+$YGuKTBPG&_vx z1{4PU4)a6zZ0;myGXUBbJM%;LiQq+dG=|3OO!KN}9)2XKSrvJ;I}b2V8yXMs2rsr` z)@TY=ptBw77IaVBB{PrtkT+6^>Dq~A+1v?e#f!43DI@az%@^IhgTUCk@>D=E1MZIW zPa`{t`8R4*l^F!_y>iK9aXyQcBuLnCB=cSO8b?v|-LGO3sya_K&nLmueEV96>IBFD z^r%@GE-2PtP+2AM%c=$rh0!s#%CdiL6t3GYC-=o6T47Mn$sh?Mm0Tew}aoX$4*hsBh)9c(yA z9QwaH_J2=;dopu&bA_Aw-ytO>3@gyI`dyDFpy-ciMYZSu?!{?eO%d0;v!;lh>c~O5{N)b_r8x5CGeeQDjjW z%sezqr(7P~RHtNu?yTTX-7yEWdv@lHG5|OBs#c_g{n?dF`)yVe_H!z1@qv)ribG(o zCI?SywHIoKV|zK%GubVx#q3~{u&m!F6PHHkk2PB$;g-u=>DZs9_1-o&dqL)sq3;a0 zfwxf886gOrL9{ts+jL%?Z!sZ@^5!)wIr#IHXHr<@+pr z6sb(7N!V>O6;@(~n{@%@u1SL&8m`Ey2r`1D4J4I<496d#p+{JL#Hb|+DS|{01Q?{q zl$k3Qw@U4oJDod@{SNdIXEn2(d{n^0>R3}?$yYm8z8MaKrciI;2Hx#kC`qfU^jW

    2`LhKM(6e`jwZ6ARUMBiffOxJB(nVC#+)YP@;QyQ?TCd&LSg<&GKHT*74)3EbBBw zK*!3wzGP~_1Z|}vRn1k0>~$GF>W3Q|DK>E&t!kMx8(`VC-AXF;QLf1*Z4~=N8VeeX z?MtJMRKrsGfKsL;%!vB_6^@(i({wUgTdjR#S6a0jVwo&jDM=&xx(V_ z+f-k&XcKmoBTx$5@7H=vpP-N;<67k@*+xm9YDA>okaQ1r$@dioNS0gW89(PlC;pB*y&ruBF*0)mShkKma0% zMKUahbj7%VB6%M=haH`4TFh@E#@y*%lLbUh{{T8_mmLE3BD0xqsP9X=b#y?`6 z45__}lo0cP=6f5|rCPvHdAD7Z)yKE`ZaDQIb*y zLG!f8g%cfp{-2#S#z_=sk=eD(TI&w;6XvHxkt1)AA4&Y^ zT&EvkEP!Y8wb~M;rS$E%(q>1!EAGrLbZ*P}`A%LSEnvccT+GDu`u_lWW*NRkq|}h# zjpogGX#qks?neXn`d6#*c4y|Kalei@u)4f>Ac)jR8l*>aUi-j}Bw=NLkxyBq`MP2c zKE&6eU!tS=8nBcSq@+(A0o$a~TDvLM^h}oqg6X{ty zp4)e(A_a@P6}TKS5JwPB^z_av%;RPow{-;@B_!%SBd6(B;Or!GrgOugVPFq%eJj z*l9tqK?+IO^@G#?>32l_gH}lmHUz>>5h7C;L<6^=7seU_3hR3~poarec?*Gb9I0 zDfK`g#@$cp)~%WDtZ>4fUZD#qNgNKI)V2d3GV6g(00;`yBS_ndt07Gmjsleik;wy| z{{Z(?rp2u`Jw5pbh?2=kr9=#~_j>H`=I{ zZ1_+dGtbVZtQOCRU<3NpD3ERP!hUpoehD#BjL^2pN6?~0Ne3_Cw-SLNAgJ&U=UH*O z*>T8Vv~(@8KArZHPEOT<$lB$?+X6OF;-{5_wm@CtwX0Agekb?%(%hYeMvH|s^rbw2 zc<)MX$wrk~YTHbc(}+E2G}+cnv%wJR0!RRNqpclm+U{RU5>}F}Q{Sx>Uq?25w6+N_ zM32PN)_}Ghx3X}k~&FOxv*C6a{PTM2Pa5|jrJ0iH?sFbC&VxwI)|1F74*J5t$7j2%E} zi4(;a-gRhY*i#J0u5OA_?w}?IKsq1K{M7x)OR>t3#xDG($WlVoks6YBit7c>K>LhU zm8B_4Az&E*{ph92UeXaKV8`%ZI2TK#>mYG3NBx=_=wc1Aa-T^1jNBNwTZQ@dq7u%Tkm9>UZ9iDw5F-mc-mc5P2>s zNIHS&k?+L~FkF$c!u@VOg347Oi6C?CKN>u7T&y3w)`K|aGkD7iM!hN1u) zLRjsDsHFgf1r9glQeW&3W2PH+S<<36>CY8bNF*M$zC)3ur*Ffa{{UKBRnY;CjS|qqG@v;kAT~djUIA(IC6XaDn|Nbk9)~WB~5j06--G8Q2)6CJA2WyC7R| z!igQfwOhu+M>A)wcGn9+lf20>F;?8PXk$r&a>g!%TqG(9n3Yt3B zAyE<3eQH`LO3=vO7|Y28P3%V7PV^Q9niYVwuUb+kkb6Z-nbzKk7PxY)PM8u%18yoC zI>t;jN=kv_Nbmae`BEA={0>+>x{yFnGA0O_`qg&G8QHf%(I`*~*ha=XepH4+3|cV& zb0i3p08-dr*(T|*rWdHh@ua{XDj(?LtIn;e9Nja>_xV-aL{U-VR^DTUJ89=s{{VW> zi=f5qOAb<8k`u`!k8jwgrb=jyZ4IpYr%C(WcH)WbpF@rbct(VXNSV?kIspr z0?aT_g>DLVBj?R6vUgxicI7tgDMNwYjw;DTBjPpbEV(N6L>ZA4p^7>k9?o3OE)`v@ z?nLcVmAW;sErGDmROkbq!n*+M&XE5Af+Nxa?boGgYouhzY{O6t6wLQL&_980iw`R{ zLy1aKBZ!{0R$`fK<>q!mhLCiDr1DSCt!K|bU!mH;vH*xCHc{aGxT@@gIN;>yOhG(J z@7|Fii=oEB*a;dm$Q#v34?&xE5}-iesgLhUXkk5+>;OOJfrf*aJL+z{Ob!mDA&g!lguR}n#G=rsQi}<{*g8^=sE|_|pZKQNC9%~+D{GaTfEIMgos+bF;+EsETSHZhEfYGs zPbRF!KF}5vwt1ig5D!pdxulM>^RFdSE)B`%fp@c;K>q+g$xw(=N!mNn-nK2s{N^yL zX&{n13Ph&S3D^@C&g|PDm8_yk^&iH$7!R4?l%6Ic#j9Nco57 z6yII}=BdQ&AP-FYQ8`~?8lk)R@KZ{W02uXkqH_5b#T(q(wB44_pm*O<>piItF7yKp zT3#Eb(n|FDWD&t0)JflDF3i93H*A%cnMYWfqo*IfEKy`(l)kq6XrBKYDADYLQ!LLbb$8cZ=3R+jQ;6f2C2J zo$OS}7kA7kprjNm1rU-r>r|%x24aUNOpK@413&)0gt+LwvC*NtEUDt|m?|fZ zpM_X^L^hGT6|`NODG*cCX_@(cbt)es?J;$heDx_xgsh)X27aG~1BLc3R7`&sO_LgY z-AYK=U4Jpxitk;BbZW!1yeyy{2ULO-KM(Cf^ zNUC#wAmW0MWd$Y^8yTK|TI+oR=Y0wGjyrbvKrl+<)Hgqk9A)SpPONCdtd(f;JqTC= z2`Ao-G}#H+CmX)EU9yt3YLxE-j@9aX8*K^5P}%(-{D+jKDFBi{o&|ju!gmyB%tK{< zuy{cxbsE~Qkxxit!Y@h+Ku}ZzzcdXmLfY8lhTNq(W_S>we@ax4167U6yrC-fOl|!j z^Ht=I80?l*fIuK0R7?%O>{4EV(7}f(N^ou=BV#)nOpXf$grsTYi76AX=kTSHM_H8+ z6FN-ne<~t>vL(P$f}nvsPVw`pS|Myt%`7Q)kL-1xs`=C4_hBs@#o~RCLyoA8_vC+S zy>}AkCrqc&cB^ZV>fCjzxbksy&29=&AM&PiRlk;ndXK$n!b)h&%Zj@#3>!GM@<00$ z1dYM=sBlFm0m}@lN@i-tI636VPX)C_V%5rOoDqV5)wBXz&!_QfYT&Cuo*g(bip!_ z#Rq3S^i?_K_YCW(#sra0w~xtBCJGFO#3>wsL!iN&qC!B_^}-38KxgK4L^9 z00zYMs!Zc^&7jCiN!ldux8q!nGqkal5|+RM2$MA}kk`OjcHhYwfjR+_d5_tp`v^?U zZfRxCK7*Qk38SBULvR4$Py2Y7KT%pR(j5eImS`Z{n4g)Y<)&+41>tVPyiWW@76}c^ zv_4?Y0#Z3t@x^KxQXDXMMx==wZZ?5SmW4I)SvhG)ZB3|yr~p8p(y7kGGSR>s^K{2; ziJhv9^a~#FhE#Oyk<1zW^HrqDOJkN1ZcyT5)F+_h{8f1|h-b7qM3P{c-m9^(3)?!S zOhMJ#sHHK8D$2c65D4d(r7@8S+qt3$CvKyYN|9nZ9&+Qpa+3;(>sdZRqemR9c(zQS zPW6M4Y|@8DYDa3U(9`fw*1C={am@hl6t?R`nuFy=E0mkjCSGUGjFZhYUp%*it(}lT zG5tUDy<@p*%6LAsg3rZ@m5n$_EeOER@s#x!d0wr zJ?Q!enYR+n>1l#MAg5qSiT0(=YKZ6i7Zu_uOWH${Ppd+DbmzYnMdsMICKAIl$$dUr zfFKFqaUb32ikOXzg7uvLY&q#y-pjYJuqH>W46Kqd{wv)%2h1(-@e;DaBP zCQ`CnND-IuE6hUhI<@LjjFf}FG>dJ4$uif&pKjjR8G=NPwPq@of{FQ8OyVyTji+Fw z@;g^@Qs`rJNn;HtKvvv>LE?MVKSWwLDIkbCQb$Df-*3vCrJyCUE+X4Of|a?Xs$|Se z{JEo)y%pSB6CHTkUN1pYlOf%?=aavP6M&(^q8j5Y#? zs2Cc$58rxXgGJe7R2j3h`ynC2BX9<)Y*UYANlTF;{TBC4od^n6pS(fQ)YSLZ#y=BoRlF2y!lxV3T3XHsWW z^Vf=8wjxT#EI$3zvZAHxD;$5cev}O&yG;=B+f#jLwWy>(m=Q7G`&8YlU@NgM-qlvl zEq-Q&EnbsT%VX4AMpu~YmMKUMrDPZc^FOgp#}TRqpW-XKZ`7h=aVKf7Ti~ilrJF@{ zok4K9_m1W@9)7j&yg6wZud=u1-r^Tu2kJ97GD^jZOt6I}kt{sQdS+Ig5FPg*$HHDmqdC01k$K=9?Ep zt(@87y}DxKZ&{h|wOmhIE#f)${RKA$4Exr6)8(Ug8(cydOAjeR0iN}(f)Ys;GfE?# z5B8Q6kO_m(^{cDk&XY{CGUg`#0GO84p#*ORX;Z2Y)t1ItD)Pen88I7iR5A*5KH;nd zs4YigHwSI~>Z4=_t=cFu6q2LVaDB}wvJg$S3T6m{5IY(WiAZ1>B|shc6GLZF_2&}X zDlk%*0!WZWam730UDuL>G7J$M0rIPuR>_XpM}H6p6FWf%aFemEA4B-)e8Ldj<+wba z2?L5#WoEatP9uc{fKWcW5$D^L1z&05{xo^Qbw6tN`djx7vY){RDM|G*t>d-&zBN zJlSqExS0cQQJz10Q{l1~XEgYp{{WJwI2_4{6{(M_WteT8iJYY%=z%q4ly#95#sjD$^Xt1zU01^)>=6?<J zieMjNcLF+9N%k$4MqGJCAZb!ccRGgu0Ke~4@&H=db%N>=sp=+2wNaCzVu$=OjSY=3 zcHGAGQcP?@?V>paeISp{md33Um`T_H-dhJtK0w31_?np0z9N^0N&05LrcEuo9_ zK4o&I+XNXs&1Cru(!{hrSh`ezJ6E2_?V6bS2qnF#X%02KGy_2*0dG81qZ|&EQMTAr zZDg3@nG>jyD5lvId9iJ3-MfQM&^17w^@CpqYD1P8ja%EWQ?OCreaNm&rL=R1KOMPd z;d?D9AZ)dAOJL; zhDy;K`7xs|;|>?nQnKc$04SaJ_xx%eMwu_6#^u3rYD&Zur18K#B+yDt>{_u05yntLZ>y{{H|9LlXNQFn2=K zlBILBC#Tk{OF)cv?`R1jUSS>jQW__)n=WcQ5`aWt=N<36HPhfm`llE6Sa|DS1QALEmM>F`WK-adAM<9|a>|G+>CA&HP`%12ru;!Gh z%Vwl)ApQp06{oK89ZhOuX~dzH$DAhF1u{UH5z=Yxl-pyr1%`yWfy9_8+nTQ@*tXLw z+`nuQrU3?b3H|R>X6zQr6AVPQnUw7!O;eEp_ES2D03HnV{r&Mv=N8p5~V&qnTph7^b$+f_U8b2B}UUwmRYOY9b*@=n2|mnnOekR$h&# zNk4aOkIt0B2oj)x35gT8N(4xwnshpsGy|j!!5^(U0N&19@qW}x>j6?GBy|<5k8v$x zZq8%G$yL&%N6N8$w=1L3;H47_Hs$2=^X*LWAx$!J%R}~Cv{5NcK^<$+Mv^eHNm*uK zcyxe}2 z2VS+CHX8UWJUY}C#`+|1Dx;BML?YW-H|M{7y3nwZD%1$#eW+MV_7iLF2rxaiq`eJB zE1xn*6&InAR>usjeny0y_TSpEe61R|kz(PuBS0`dwdZFons8bRBH$1@pK1ofB;6mjP5&D+-ukk|z&+kQ<@Nq@mXL=W>Az~zvCP#B!*P#v{0K3Nm0aEn#PeJcb|Gp zrN^RF?2wGmhS(_sPSSl_$6AGzgruyGg*I~=?UCZe$8zY$WO&G^4eaK+IKtcB7R=fzBEgi66Yj+v3iBcj?>Bd*Hw#X`Eo^?iFOiG8^=GV{Z@_^+Yu<%h3soH zGxlN|1xSvn-0xnC2cnimWlNf|F>tfE(r1VfUbDoVBxYoRS7Ky&s~WW;WI_GSdOU2b z(FwAotE?w|>h7zc25cGa15wz6xg&F2&<|ySfVn6hs9g8t(q-@==y=1lLRB((D42s) zUcjLJrOtvidIZj+9LDsPjtg7ddmTLbhT@jd#MYh;9VI{l0gxp8s9)%kb4hIpA`bh^ z(%4_v6Em;>0E)dS;WGrpc8|ikJ%+zWF8I9a)E*v@{Yo<=nz?_8cM>_`>E(T)Tb^RE zvS#5rM(#LVLbx_0S~`0Q^d3H5YKj^0dmk_?Us2f3^QXONrD)8QXtOfa_;n~B&^`YE z2{ehSE44+hmldh7oyY=qFCIHi8XCq19{iQ>SLwgE> zLl1?GFq0gEAHVsbY?`A}iBoAhq;0sGle*CZ5L%FvG7LgxQXqcP_96mj@uF3ommNON4CVg~2s+A3wyHb3RX`HmoxP-a0v z_Ts7J(FK`;*{RJ3Nf028-ql7@1r65LI#VZblRNNf4nru(+jS)*BzpHV-nlcjE9L-| zwm|gEh$s6~V8CZK__t&hT`C@;496V){FBYL9O!uVa!_Hidyg6x6 z^9Zoi>IX7<3bBJ4iUT%FMWvN+g0k4ttESsk$ux|qyDa=C2UtikByX_dt4d{HyKJJ_ zL(JNGaktKs%E`MK^5!CsJsMynst-dniKa~#eoVMp*=kHoNF7f|tjwCQqw-m{Mp{86 z{OY8OD4XXcDO7LNMF}V7-Gc%(Pw8CANFdeHVkSW8G^Q~d*(J^PiKNa{i&*1s#(cbl zwxK%?YX{1it&TK0T4DtuDI6N}lbtf+&_%1ngZKBP+W8q_D|@*DO)*NlJF;1PM#h`S znj*b)fMR#;OL9b*htm}nh&mn%d5k0bv8W% zsrutMgU*X5FT1V13rI|m09Mog0Cd>GyGJI&F5&Gu+Jcaj^VwA@3)yBe(OPHB zzYMKN1u_WKIVAP{j!gw2yozfP%GVA)r8HI%FqK5X{mn9y?CVRieU2G*Y2}wSY4;nS zm(HtXgI>i-O0-#-J;t6wLe-&3*omLt{M9hJGQjr0O^EVX>m zc&VjtJp>Lbn^ahgtR|dEZVy_5ldvuUzwc^QUqkeQxNW01i8@szjXZI-{{Zz<7>aB) zWrnwHZb&+g`bPlo+x4cTy^n)3KwE*Y8f`V1yzYSwabqBl!XAEqk--7sF${1fl; z{{Wh!mQM6T1lZp*dc6TjM^x|mAHtE(mVl-dxU^EOln6_)$$`gX-kTe5VbUrr{QG!w zD_WEUr%5mbA8(XZtWLTnQL~>j4sb$VQheP$;Lp~#@Z_Sb@rXE{XY*V>qCxK)^!#hk z_}Th1@?!!U!to|{o#Up}>wIjMjO>u3@>Wuk&kB*hidPfuiH8R8MQeC(ic|(}hg=YD5+o{Q zK(9p;4t*y2_$R4F*NHT6Rbsk656xbV9kb1uBpUPaUF;!56a>v1(LE2T6iQ<4liW zzuC*4H(!=e`a;Q>8-6@h=;}Kx;Y!iTIE~3&+SM{-)(4T~amh!e#Sg$_$@rON)TGHw z&gLu8c$rp6nSN9$+AdrJ87{JetbxJav|9FLNl?ng$#{q-R}(yb#SK=)euCI@65#Zb zBd1>UsWXS{w#;aR%63YLGpIw%S14(x3Zeo}Bbu=gYT3>nEn;XscuMrD2fb-x*JGfLWXCU%yQP3+ z&)%Yx*3xFCI5J*a{%yie{O`3t6SZ_FHjBR|*(FJ6kY{bS>&F$-m!mp;kEMP?N)hTw z{-4*{t9Hd89wCSTutJCYR5K3usgWvOQe-Zr8%(b$!N?_kTr4dQTIMU zrg`GlV0O(@Bp@uo24;F!CrL82gLb&uu7Oe2xY|zSPk+|A%R(z*+e~dKMwJwTPU=6@ zdQe(nCKb227=a`Jm=UQwneFZW05nT|0@1eb3N8Sq!efGVJBoUbpal4q`=@w*wubtCsnat$=2~j4Foox z0*ZE%$%-W{QV-Bt>jDV05RWhvjb~7iJ-)ORp)SRnhaR$VMLJUkNk?%?ao&khuwEmG zT{sFs)|mtnso(Z%xQlTl;7ES>EooYkf2a-qThiUFoRtjTL#IL(6xjQqfg9A-jzO#q ztD6Z_%1i(!Vm^YVF=&RZ=x14RZ29R01STMk-#_0JZa&9D;9I@EyGU>V6hI&tB0%@v zlQ_EUvFHtQyPJXh)ddkGo??6V+Luqzwzh7-?DQy-CP|ne!0qo$Rx*=5;_N(Il1J z5UJ9glf@nM63Bz8&OS=g*irm-eza;-6PgcUmqzVDTJ@NfZVaD#e0D;aw-d5yZ7C{F zrJkho_-#)%Dq-OTC*xjg4lC}I0P9#kgHdE68=XV z74;${YTuxO4{8|;W7Zn+Q9*@o271LIsuD0;J?J2U6TY6r&gPW+C$P<%YDf@>3FB!I zN|6EkFcgsiDo;g`#U+pzWg1eI1exTX2em1Ln6a8JRN5D%TD4B&y%bQ`?B@>?n7F$x zq(BMj$*#+lK^L(kP^{>i6RD{Py#AQ z67xCLZlk#*eb_YUv25j^7w~tnAm|Aro~Mucrsd3|0`46%oN)}2^G~f%NDArHSCz|| zJcpo+{{RzRwhrxrwE#gIlU{?t&2dyw&iQsc<-5hA5>iwK!`{7AU85p#EgS~WsUd1g zw1^@`)R{_((i&|7ZPg$Rw*aT|icGc#>|?@lAcdw>COJHcMAe|Gi(4t;UTP5#ELHJLwy_s^`(LWHx18Hz-*p5ePh_8@R6!9!TxK5QTe&(#Dpwbv} zV~T#|Dwv3a+Le(I)g4peumP6lQUDMmdc)1x3GB97Px7apliH}h%Lp5Yy99t{HlL?z zBy(oAt~7+q9l0HAnaPuwaYevD^zaDe)hx22Nc zjYNU$PZj1f=G(JM2-{1B{3sO*dMQIhAjXh_#);;*H zr_v1}PZ9H+e?eLD%B0WhMX>ab*mawZHWE}4t$`t2j->wj&^zgYCu|*!VAm>?G=~&K zNk0Do+A2EGyP`G+Z1uC}jUa))8&s-`JHCe_az(0;;u4*p>LxeqP}=kZOjyMj0ZUei z5xE9-pyl!!Q~~}L()Mj7J5RU~xT8&UM6SaaHHl%(Lt!AogbD984W_M;Ly!z9vPtzo zQ6*aw(0_XBi78N8!pRE>Po*+_5dWGE>uS& zpK6y1CdK>gtWe^VQ@4Fzohjq69Hqv2SDakT5(YR?xQ92X0wJ7gDr@abI6=v*# z_UAZCma#mfA8*`yRJEZEn=QQME&_^zk5WVq#)T$<)Jvu-kL`0Fd;Zt|f7qG?}@*SN@*zKVkfJf{905sS(*$vUBA4>kpw6vsv6C+TV zJt>a5K}GzW_2L!~tJhs@Ng#3okEhb2J(iYKl@%Tg3WTFGA>Uv9Z&pVhH1!Ly-Z? zO9cW+0aLd#^rX2EzhT=ePym7yB0JKg$S18o%PI=oK->G!SVEp=Z7NFQ0tVnjQKm8l zPnz(St{Yr`GBz>5+Om9^w`jiyTPloSE;Q=aLwaEJ8yd)rTXtPpJqx!u5?gS9o(9ru z(Ri(@2691+vtgy=f}c*uo`lz=i@5C0o7rvPdKqmJqcBX9NRzUg>@#tU1OgJGh$DV! zNfK|Df)cS+K)mCn#ie$7Os#RQRFW~`*$`c^^#QQN$B=CM4lB9leDON%R< zYr?XPYS1=25y3vygFP2W~4jEI{emZsD(j$=s)JNCK%fv5AqfbtS~C1F29d zSHTRYJV97ZyTE}dNeP4XtC)yZ*~h*oTpzT&k|T4p?N)Ms9h#U`v{lWcTd5rhtXylB zPtmg{Q7ue|U=yU2NFrjr6m+b>%8u4>s&pf)Fql_^OCsVDkQ z;++%~0M_wwQLGS8P3gT8MTOz>YI5lZq>0ovs@YzElcTJBJY&mc1~h>LtFisfVdZwg zk7b+&mPsH<>orKS3B3UV58PJ$b~I=cLn$t-01SQ8@}ZNY92NF7SYiHRKqGD|7s;8Y ziXk`f^frY6OvHTtRpflBHrcI>Xk5hYoJv$c)C8xK*QH}jv1rkQV9LL`)arJT03JQ* zDjc50xwKgrRtSdLN_6lxKGkM0OF|oVVTj>Ps3=5r`qwzGM5#0jXAKRibn(FzUhA-} zn6A_(ZGhv73fVXE4snZZXZa{!{>3vtTJ9*DDrc;jX|=0TG!3Fm5z}v-YBk#zK} z2_!Z`fCfg|k8j_#B3jWsZ2FrJfReBhQ?!sy+jOanX>1!l`N%_NMw8HzI}L|wWBCTn z3UsMSP*O?~00K$gdiCpF`wNv2E>Z)ag-U>cy*wEF>$*fa>?ww+1*9cPNh%}+lg~4~ zD(h?>R!GE}3xEQGl07=NpV^9Alk6J;qR?5A=aw7<`ixAFYE+W!D9h1<_bUx7Mx7^6 z)3_qLq1s@@txuT(XVtdg{QanP*r_v5@a47>x0rc76EnZ*T$9ovPT4xy#U%+1w+Y~< znLX>2z6%OA7G+O3QdE4i{bOhxZyh>*G~UkRL5n4N6p-YY+>;yo%`s{0l#R_|&f2JX ziUVy)0a}LUIr&j1t&Fr9w8#9m(Wod)B+qIq;v!Nqxx`zzX(doM``x$p6t?XFV%|Rr z(hvbonT1I|U!bXbdLJHyJMf_BRPqE*1D>_Yp4th9Fe`VKQ|2^JWR2jD+|anw=&dFZ z#jxjHZA%CMkR)`E`k-o%wN30zRt~SUD@(qTcb(_=-j?BLi6OHIz&yk&aDo7yzlf<& zE4gf)du+RAgoPa^w9R!^*hmVym8RhhpceHQ(of1arM5mXv7ZV_B}pZGYK@1zH7}8g18%N7fU~@)K$MM-QMbKwTd}Gq>^m`w6)7$)B}gQK2Rn85 zHHO05e40Qx&xIS2)Hfo9m@{WGwTrj+}dn*X?WM{r8#>l%+G})-Ae&U1QH44 zf7N?G1@fY!Wm}3qQ27RA6SzB9v%>!X5pq9RU68&A2j8_^PumpG^MJk_T2w?NrXy7q zh>|S~wvRNRBoH@}cplYWZiGD|$-^wrw4jhyJ5KXdr6McfId5u}X_RyX?YvU?6GZf& zr-YqfhfZiLiZs1&5k6vOL{Ca2NR67W!)MY!+nRJ^XgHO=D~~jZ^ML|lBC`CPe$jpj zF&7=jF!0e*RR?{dD=sl+8FJ`4<7x&skY{sS zG3vb(ri&vEx>_0#t-#uSzgh?SD^;2=u?P|rXKho?_0$?fD?D4wy!4p`QR?dzEiS@p zk#FRjLIB)?AapTQav^TnZs8aDZIYr4?F4r2YK*%e`+JLMK{}&U>^3zC6LttzD5sp5 z8d6{Jk0BZGrO?yttnHRBF0?R8!@=l#nqo{ZP0E+q+Iox(oo1)FLu=_o+ zo?vMQkDUyj%Hn2lxzd$@xge5B-+F#9;#N%J3OC^(#2uvZR=sF-7ng?kp;}pjNZ6hF zd(|AVE3)~)ZzA0)9+A-XjPe&{U{saD(R5m16D?-CwLnR7vcM0DyotC;@) zXCsaLO>%D>M`OJ7H0}JU^>wuf3aTn=#>#W#Lu-oEe4Ow+)Lw7CVlt!qe_7-zYR!T(?H4Y2;Nv|!PTQp-T17dErw4YK)`EGyW zvnEd?Ruz209tlZ68%EpG^>lJ=k5>1n@>95yHiJ&kNW;zZWb`{wa<4i_Iu_dkS_lUdr07tN2Lo^MP@OFaZ(vL7D0pZf5UAXe2(G=NEXAau zD1xGbu6sul5k{RY9OOX0Ly}a1sULYLI|%FZuD@chX3RR>&_dKzqfyx>^WKFoVcmt? zaY{juve^5?rU*NB_nPLHK~);sN=lN285_VOao&-}g7#;K*&%G8HdGABgCK~3Md&U| z(H7GLNqb(ORKV&7v8hXTB2VBo{{W7m2_Oj7!5e(dJBm6s%pbs;VJ-mJDlt3t=}_ax zuFG-gj2J)*OOTRwn2(hUm6F+*wg^c}P9?H<2@yW=&myG)F<8Nt&1Zvl!XO5<) zm!t!mBw0T46qRa{2O!VCJ)@;{?$8~C5qbiInS~X4kGA`MABA%XIx;tix~8|w|<+S zr7|7UEKq!3FzX2m*qA00HF7CF$w*$r)Z1|cBNJs#{9B=Pl!^4_QY|n9M zq_OBj>g4bE*RH{q)f~|R((`hp#c3%g{6)BqnQHCDxZ0$0B6i!gHuP7Pi>oP}VG;?` z1n(b(RmoeTy&~Aa{YVKh3*3K9)d_rnG26C1C{Y^XWi+P4NtwPBtuX_vM91%XFl zW=K>4s2!)T`KH8%Rr#6Hm({H@l!<}V_NzTdL8K#MR;KB-NRL#46Yp7GMo)s=T?p9r z0EbebnE=QzH=4$II6W4lGPT5TM{RCN0a7^=T7EWulPp?lhU}!3wh|XIIv&;N;X7J0 zvM+)E0PR660AxyMZnRcas{`T~ih|X&Iox%kS6U4t3=#1C*ihSghpxhEk#^+thgd`= z0zi^#rb4?dd>z#xgp~8!-l;u;Ys6&nsECdK03K_V9bgNK#k8R?4LYDEE6;g2uE)XA2NAq+O)t~|8*#;XjQDAq5RzhxwvJp}X*!$}yrzFD)bN#1 zGuTGQ2ncwn#7WqWE81bm+B2r8A$ITC?d2d61fAn=`--(6$gNu{eCc{Xb4tBD@6xYh zL8a)d8GQY?OnOM;tyxv*vC($;YUYxKe^N*t&(5mlMM)h2fw}yI1rh{p?^%)|GIiUU z8&EpFQxqu^Wl7>D*3WAZ+<<0(b5}7Vm7Is-J-?ZH;RXc#YQ{+NS~YOG6!3d(FQoQ8 zDR`k@!`(oV`d?l$?Fd{8?;MXmvk4>QddXfj3` zN}ojT35l7CpFpzq@UenjVo|h-C%sVs>p&F0&(kZ*v#fGlqS2t3NgxCBtSp4YbtX`q zgpOvbk3hS`t!hcqc0KyhqCJq(wE~qUciK6hn4y-*O_EiKuHCReR)~^E>sa1QbX~_P zFn=@snXgljHXY<1#=MV~xU)(Yz*xp{^H5aIq?Eve$=b1-wP{6Ut(8#ol0}scSsVQ+lM&xSW+J&}*Lk1m=C44BAa7;~fWEBSm=BCE8?mAD)@uvFN z#YA^qMaJOiPZ1lMj`lSerrm-8DNO$W`7=XN_JgKzDzP^Z0#^Y#rc|xRwAHxpMp~15 zB;i=^m2`lxH2(ldjrRSD2N?$X9q{aO(eQ#C1eqHiWb8gv6w^XmCJWnF^&qGaL~Xne z-}b0)Y!W@%nQPamq!A}$^!igRdm_QF-LyiMmqAgHqz-wQ+NRfN0#+LGKsx_q* zQDY+hN!Ry{jW7~`43j(l6jG97y8=Clc@BV;gpzyiOwwfj2w{vm?U&Til&LA$lk?(* zCt}-UE*)xuloV`{5TwkHr8*1PG}v=;kO|gz5!c!&_haJ#Rw$s@kGw~zBy~UHmoA5K zeTsOc@{*#JEF{M>_h}M;06QSHj0EW+aC@h6J5TtaQ}`7vt(pC!?O`ypAaA$p_;Etm zt0vpqmc*UM-YOk?{JPO5*JBpX&Nc$4gwEgy1NRif-)xB=5`?ytq^zU_$%Db6y=)Ek zXuCo*D5OAxvQGzUHC~6o?_^}9#zD}O@)WOOzaNEIQl&%m!!~b2KtjZC07#hU+LYx) zIHGKQq7tL4*!3U3%BT5gRX<|RHDz#z*5Fx#>PSK0b)nkX+MpA<-dWcMNrdsM@b;z3 zpFs7XRv@RX+(2xfnUAE;_oTS7iLllIn4T)~majoDlRJJtN^BE)W4RAlYog_(LxH`& zr0vXqink7caZb@G9aq zt=$rNGC&8CX?DE;n_$FQ`A154Nu7q(9T3|zUNV#ureuBC;C(7Co{o!Vi+m~T)f1~y zc@mwzVyt7Epl3kL!;=GuQIN5wIs9vP25o4iKFU)#VC8*3)u5zC?CsGzz2iZ zosBju5~j@V2GqHoGa_S}wdgh2k9&!t^%?oLE2;R zuQ!pkAGE4iJNmkrtsfTCLoY_FYXfHrJ0xw}``4?(EfweRO1Qt!+-#(g zz(0jrLR3Yo`~4~)tdTHJ`J?{E&|@gO=Upau+-U-#y8=r`KxDKPXe!jdZbekd(N*iB z)5D6=-}@3hAdkdVC-6d}CoTNO)v$xq|pgwBX5pHSL9l*_a+S_3(E_CkGS zCw(LsHA^%V4~nuYk11tFK~egXURTJ+O_yNnvtvsJ432_9+GqajykyfROqyRqEfmTE zf!QNq4-@OFLXW3yDNu^ngbKPT{M(8Z6C0lWD(ptZ37C7zcKdU- zp#q$&YcGEd2`(}cl2yqh#Pk(YDNa_I(6|@#Z4gQ~Oia$zmnH(yKKZg5BpD=aG!dbV zl{biiBH6@g^^L@zZk2l#*$CxK`)oec?54h zbd87*NgVvmH||ktF*M!diFE@?yv?C8AWuBdxh6J*>}BU(SoIAeRRT``0Qddr5^aIT z&6R)iF&{pmBu;~T|J{f|&S zzlyR++<9_$;y=#x#MJ{R5I>1F+zAAcAjacu{{VjCp*2D!9iJ781uef?2vH^vUW5Do zbr$r_N`f|cg}Q)3k|YmKlhP>Exb{68S8~D~I#iGfx6)40#@*_4!n!sm6NLhR3X%jz z9cDYw?!j#`72WyQrNR~IB0-4A%jCAUOc;TT+z0 zDIpWTQe(9Wb{u5Uy9=-&H#$+bt5F}X(w>mVA?polP!bpSW(3Li`Shlwz~pCs%r;J; zttlf}GEcY8rT)U?CF5nroj_Wbq@DKI^{US7o>m2Q-6B)0>DUAq{`7HeD`BN<9`mY9 z>m(^dkU5Gs6?+@Q;D&9Na_+R5K|Y`a2=D#>016o^=tRE}hYh*=I-zJHHs(*xdv8vS zC!(yA2w$$<_7t*8mjXnNBk&b!6QK?zSDWyZTn9h_zK{s*T9`9Cqzg$D)?&-r?iQ^w zIuq09Ubn=`-hgc*US7giY~UaeCt(p@n;flZtC6NzS#?Thgp;&_eW>K@tkNB@tUw__ zDpsRCj8%4Z5BM$V(2^G*^SvTT5HhuLq$Fy96g@(h{Q^h7aW7k~005p~9-kpZmcf?F zXFsSk7KD?fAf2b{@~hBV2{WB@ZaC$o>ioADoDc@xM>JjPOU!Q-n|wDNJiV(p?`V^AS=_k z=cQlLS~)8gu5Om&nn93urMIEU4?Z8seXT-4JbwQGy&BX+WjYrtI5al|dSN<2>+See zT!l`{D#G#*fw>T54a{_^jU0)sI9y5F(-XemPkM%kV0>-VA+2-7pHZ3r02MLpl)eh9 z8^w>BtulfB;(AwQON|zx*##K$he~|JdQu>Jbei)y;cULN6Sl?=mJ~pN-`lkw3_BAh z?8gwsl!Ctx=_jl0*V!;M80X6=et<|?4s1`;>i^);Z7wX(9u@c^}~YLa$}u(~Wo z0dS|aU5&&{O%nJ)JtLv~El?g%2U5BJ0FRYb&CyDIofVhV-;|N09fW}(O=V0J5yS#Z zMpPtvfSCR5(uO3mobesN8(2^v$&nGXL$Cce?!yxHQW@q zu>wgQ_L`oFCs?4Vdx_hUc%;umpf*|CC(0WG?s=?i`!C~0_bd{$2qX@q9qY~c2+@J5 zcxz!Kg9D$fWl3x{fEcM$Q=^pb5`Qu(yPb3`#EXV9>(Ba=Np66;`++8rKhm&>|kgXFvbtF?cuYkC- zkFdAYhZ2o4I>!qC05maPn4EbvLn;GT3D%SlR3n~GZ_bT9ej}ScKZBv>K}ZA@dXInK z>rAq=*fq=)2_YmRNJ?agj{g9^?@MjH*tOZZ&fPZd?ja-r1Z@YXpo?g=6=&PqHrClK zl0Cc2@V5&GW2E`8(Aq^dXhN9#kyMTDb9ySy1; zeqNp64?v0AZ_b6^K+A|dI6JMnf{ma-5lU^RqP&s_THzOoGpK+++pr_|y&75-?bosDC>-kD zO~Q+ys1%d7--Od&L^u;IUP4whq?LWx8&6t^QY-MSlb3w3(T#$K^>g^pq>{0T0`D(W z5_G7D=r`DVP(AcRi4p8bsy0%VcayfSuUcmmS8&)8;~#Z}$Eh+oByGQ5{8YF)JMH@= z;n{`8-5`MpB=5)kbfxfXL2=N_YmTQ%r%awqY&&gI)d`Y5xr>WnQiuv3vA-sw#5)7u z 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 literal 0 HcmV?d00001 From 3cab0825131d36705c058c2e011c9918c8addfdf Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Wed, 8 Jul 2015 00:09:34 +0000 Subject: [PATCH 17/22] downgraded xjc params to jdk6 and regenerated geometry binding classes added rendering for auto numbers fixed various bugs on failing tests changed xslf paragraph indent to indentLevel to align with hslf added escher record factory subclass to hslf, to eventually make hslf wrapper classes obsolete git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1689777 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 5 +- .../apache/poi/xslf/usermodel/Tutorial1.java | 6 +- .../apache/poi/xslf/usermodel/Tutorial7.java | 18 +- .../poi/xslf/usermodel/tutorial/Step1.java | 2 +- .../poi/ddf/DefaultEscherRecordFactory.java | 2 +- .../apache/poi/ddf/EscherTextboxRecord.java | 7 +- src/java/org/apache/poi/util/Units.java | 10 +- .../poi/xslf/usermodel/ListAutoNumber.java | 105 - .../poi/xslf/usermodel/XSLFTextParagraph.java | 138 +- .../poi/xslf/usermodel/XSLFTextRun.java | 26 +- .../poi/xslf/usermodel/TestXSLFAutoShape.java | 10 +- .../xslf/usermodel/TestXSLFTextParagraph.java | 13 +- .../poi/xslf/usermodel/TestXSLFTextShape.java | 42 +- .../apache/poi/hslf/dev/SlideShowDumper.java | 5 +- .../poi/hslf/dev/SlideShowRecordDumper.java | 7 +- .../hslf/extractor/PowerPointExtractor.java | 10 +- .../src/org/apache/poi/hslf/model/Line.java | 83 +- .../textproperties/TextPFException9.java | 10 +- .../poi/hslf/record/EscherPlaceholder.java | 75 + .../hslf/record/HSLFEscherRecordFactory.java | 70 + .../org/apache/poi/hslf/record/PPDrawing.java | 51 +- .../poi/hslf/record/PPDrawingGroup.java | 2 +- .../poi/hslf/record/StyleTextProp9Atom.java | 2 +- .../hslf/record/TextAutoNumberSchemeEnum.java | 128 - .../apache/poi/hslf/usermodel/HSLFShape.java | 74 +- .../poi/hslf/usermodel/HSLFShapeFactory.java | 24 +- .../apache/poi/hslf/usermodel/HSLFSheet.java | 10 +- .../poi/hslf/usermodel/HSLFSimpleShape.java | 2 +- .../apache/poi/hslf/usermodel/HSLFSlide.java | 10 + .../apache/poi/hslf/usermodel/HSLFTable.java | 17 +- .../poi/hslf/usermodel/HSLFTextParagraph.java | 93 +- .../poi/hslf/usermodel/HSLFTextRun.java | 15 +- .../poi/hslf/usermodel/HSLFTextShape.java | 20 +- .../apache/poi/sl/draw/DrawTextParagraph.java | 80 +- .../org/apache/poi/sl/draw/DrawTextShape.java | 13 +- .../poi/sl/draw/binding/CTAdjPoint2D.java | 23 +- .../sl/draw/binding/CTAdjustHandleList.java | 25 +- .../apache/poi/sl/draw/binding/CTAngle.java | 20 +- .../apache/poi/sl/draw/binding/CTColor.java | 19 +- .../poi/sl/draw/binding/CTColorMRU.java | 33 +- .../draw/binding/CTComplementTransform.java | 18 +- .../poi/sl/draw/binding/CTConnection.java | 23 +- .../poi/sl/draw/binding/CTConnectionSite.java | 21 +- .../sl/draw/binding/CTConnectionSiteList.java | 19 +- .../sl/draw/binding/CTCustomGeometry2D.java | 19 +- .../draw/binding/CTEmbeddedWAVAudioFile.java | 25 +- .../sl/draw/binding/CTFixedPercentage.java | 20 +- .../poi/sl/draw/binding/CTGammaTransform.java | 18 +- .../poi/sl/draw/binding/CTGeomGuide.java | 23 +- .../poi/sl/draw/binding/CTGeomGuideList.java | 19 +- .../poi/sl/draw/binding/CTGeomRect.java | 27 +- .../sl/draw/binding/CTGrayscaleTransform.java | 18 +- .../sl/draw/binding/CTGroupTransform2D.java | 25 +- .../poi/sl/draw/binding/CTHslColor.java | 110 +- .../poi/sl/draw/binding/CTHyperlink.java | 35 +- .../draw/binding/CTInverseGammaTransform.java | 18 +- .../sl/draw/binding/CTInverseTransform.java | 18 +- .../sl/draw/binding/CTOfficeArtExtension.java | 25 +- .../binding/CTOfficeArtExtensionList.java | 19 +- .../apache/poi/sl/draw/binding/CTPath2D.java | 43 +- .../poi/sl/draw/binding/CTPath2DArcTo.java | 22 +- .../poi/sl/draw/binding/CTPath2DClose.java | 18 +- .../draw/binding/CTPath2DCubicBezierTo.java | 18 +- .../poi/sl/draw/binding/CTPath2DLineTo.java | 18 +- .../poi/sl/draw/binding/CTPath2DList.java | 19 +- .../poi/sl/draw/binding/CTPath2DMoveTo.java | 18 +- .../sl/draw/binding/CTPath2DQuadBezierTo.java | 18 +- .../poi/sl/draw/binding/CTPercentage.java | 20 +- .../apache/poi/sl/draw/binding/CTPoint2D.java | 23 +- .../apache/poi/sl/draw/binding/CTPoint3D.java | 25 +- .../sl/draw/binding/CTPolarAdjustHandle.java | 30 +- .../sl/draw/binding/CTPositiveFixedAngle.java | 20 +- .../binding/CTPositiveFixedPercentage.java | 20 +- .../sl/draw/binding/CTPositivePercentage.java | 20 +- .../poi/sl/draw/binding/CTPositiveSize2D.java | 23 +- .../poi/sl/draw/binding/CTPresetColor.java | 106 +- .../sl/draw/binding/CTPresetGeometry2D.java | 21 +- .../sl/draw/binding/CTPresetTextShape.java | 21 +- .../apache/poi/sl/draw/binding/CTRatio.java | 23 +- .../poi/sl/draw/binding/CTRelativeRect.java | 27 +- .../poi/sl/draw/binding/CTSRgbColor.java | 114 +- .../poi/sl/draw/binding/CTScRgbColor.java | 118 +- .../apache/poi/sl/draw/binding/CTScale2D.java | 19 +- .../poi/sl/draw/binding/CTSchemeColor.java | 104 +- .../poi/sl/draw/binding/CTSphereCoords.java | 25 +- .../poi/sl/draw/binding/CTSystemColor.java | 114 +- .../poi/sl/draw/binding/CTTransform2D.java | 25 +- .../poi/sl/draw/binding/CTVector3D.java | 25 +- .../poi/sl/draw/binding/CTXYAdjustHandle.java | 30 +- .../poi/sl/draw/binding/ObjectFactory.java | 2854 ++++++++--------- .../poi/sl/usermodel/AutoNumberingScheme.java | 287 ++ .../poi/sl/usermodel/TextParagraph.java | 24 +- .../poi/hslf/extractor/TestExtractor.java | 22 +- .../poi/hslf/usermodel/TestNumberedList.java | 9 +- .../poi/hslf/usermodel/TestNumberedList2.java | 7 +- .../poi/hslf/usermodel/TestNumberedList3.java | 5 +- .../poi/hslf/usermodel/TestPicture.java | 15 +- 97 files changed, 2770 insertions(+), 3385 deletions(-) delete mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/ListAutoNumber.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/record/EscherPlaceholder.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/record/HSLFEscherRecordFactory.java delete mode 100644 src/scratchpad/src/org/apache/poi/hslf/record/TextAutoNumberSchemeEnum.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/AutoNumberingScheme.java diff --git a/build.xml b/build.xml index f2d6630f5b..9fa34a84e1 100644 --- a/build.xml +++ b/build.xml @@ -586,7 +586,7 @@ under the License. - + @@ -710,7 +710,8 @@ under the License. - + + diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java index 458b987320..f552ea88fc 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java @@ -56,13 +56,13 @@ public class Tutorial1 { // we are going to add text by paragraphs. Clear the default placehoder text before that bodyPlaceholder.clearText(); XSLFTextParagraph p1 = bodyPlaceholder.addNewTextParagraph(); - p1.setLevel(0); + p1.setIndentLevel(0); p1.addNewTextRun().setText("Level1 text"); XSLFTextParagraph p2 = bodyPlaceholder.addNewTextParagraph(); - p2.setLevel(1); + p2.setIndentLevel(1); p2.addNewTextRun().setText("Level2 text"); XSLFTextParagraph p3 = bodyPlaceholder.addNewTextParagraph(); - p3.setLevel(3); + p3.setIndentLevel(3); p3.addNewTextRun().setText("Level3 text"); FileOutputStream out = new FileOutputStream("slides.pptx"); diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java index 95252d72f5..443d5684d6 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java @@ -23,6 +23,8 @@ import java.awt.*; import java.io.FileOutputStream; import java.io.IOException; +import org.apache.poi.sl.usermodel.AutoNumberingScheme; + /** * Bullets and numbering * @@ -38,7 +40,7 @@ public class Tutorial7 { shape.setAnchor(new Rectangle(50, 50, 400, 200)); XSLFTextParagraph p1 = shape.addNewTextParagraph(); - p1.setLevel(0); + p1.setIndentLevel(0); p1.setBullet(true); XSLFTextRun r1 = p1.addNewTextRun(); r1.setText("Bullet1"); @@ -53,26 +55,26 @@ public class Tutorial7 { p2.setBulletFontColor(Color.red); p2.setBulletFont("Wingdings"); p2.setBulletCharacter("\u0075"); - p2.setLevel(1); + p2.setIndentLevel(1); XSLFTextRun r2 = p2.addNewTextRun(); r2.setText("Bullet2"); // the next three paragraphs form an auto-numbered list XSLFTextParagraph p3 = shape.addNewTextParagraph(); - p3.setBulletAutoNumber(ListAutoNumber.ALPHA_LC_PARENT_R, 1); - p3.setLevel(2); + p3.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1); + p3.setIndentLevel(2); XSLFTextRun r3 = p3.addNewTextRun(); r3.setText("Numbered List Item - 1"); XSLFTextParagraph p4 = shape.addNewTextParagraph(); - p4.setBulletAutoNumber(ListAutoNumber.ALPHA_LC_PARENT_R, 2); - p4.setLevel(2); + p4.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 2); + p4.setIndentLevel(2); XSLFTextRun r4 = p4.addNewTextRun(); r4.setText("Numbered List Item - 2"); XSLFTextParagraph p5 = shape.addNewTextParagraph(); - p5.setBulletAutoNumber(ListAutoNumber.ALPHA_LC_PARENT_R, 3); - p5.setLevel(2); + p5.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 3); + p5.setIndentLevel(2); XSLFTextRun r5 = p5.addNewTextRun(); r5.setText("Numbered List Item - 3"); diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java index 2f0e7e7515..41c6cc2da2 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java @@ -50,7 +50,7 @@ public class Step1 { if(shape instanceof XSLFTextShape) { XSLFTextShape tsh = (XSLFTextShape)shape; for(XSLFTextParagraph p : tsh){ - System.out.println("Paragraph level: " + p.getLevel()); + System.out.println("Paragraph level: " + p.getIndentLevel()); for(XSLFTextRun r : p){ System.out.println(r.getRawText()); System.out.println(" bold: " + r.isBold()); diff --git a/src/java/org/apache/poi/ddf/DefaultEscherRecordFactory.java b/src/java/org/apache/poi/ddf/DefaultEscherRecordFactory.java index cf48a38d84..05a3246de0 100644 --- a/src/java/org/apache/poi/ddf/DefaultEscherRecordFactory.java +++ b/src/java/org/apache/poi/ddf/DefaultEscherRecordFactory.java @@ -117,7 +117,7 @@ public class DefaultEscherRecordFactory implements EscherRecordFactory { * @param recClasses The records to convert * @return The map containing the id/constructor pairs. */ - private static Map> recordsToMap(Class[] recClasses) { + protected static Map> recordsToMap(Class[] recClasses) { Map> result = new HashMap>(); final Class[] EMPTY_CLASS_ARRAY = new Class[0]; diff --git a/src/java/org/apache/poi/ddf/EscherTextboxRecord.java b/src/java/org/apache/poi/ddf/EscherTextboxRecord.java index dbf28531fe..1a0147f3d0 100644 --- a/src/java/org/apache/poi/ddf/EscherTextboxRecord.java +++ b/src/java/org/apache/poi/ddf/EscherTextboxRecord.java @@ -17,10 +17,7 @@ package org.apache.poi.ddf; -import org.apache.poi.hslf.record.RecordTypes; -import org.apache.poi.util.HexDump; -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.RecordFormatException; +import org.apache.poi.util.*; /** * Holds data from the parent application. Most commonly used to store @@ -33,7 +30,7 @@ import org.apache.poi.util.RecordFormatException; */ public class EscherTextboxRecord extends EscherRecord { - public static final short RECORD_ID = (short)RecordTypes.EscherClientTextbox; + public static final short RECORD_ID = (short)0xf00d; public static final String RECORD_DESCRIPTION = "msofbtClientTextbox"; private static final byte[] NO_BYTES = new byte[0]; diff --git a/src/java/org/apache/poi/util/Units.java b/src/java/org/apache/poi/util/Units.java index 107a9b583e..d7f211db6c 100644 --- a/src/java/org/apache/poi/util/Units.java +++ b/src/java/org/apache/poi/util/Units.java @@ -16,8 +16,6 @@ ==================================================================== */ package org.apache.poi.util; -import org.apache.poi.hslf.usermodel.HSLFShape; - /** * @author Yegor Kozlov */ @@ -91,14 +89,14 @@ public class Units { public static double masterToPoints(int masterDPI) { double points = masterDPI; - points *= HSLFShape.POINT_DPI; - points /= HSLFShape.MASTER_DPI; + points *= POINT_DPI; + points /= MASTER_DPI; return points; } public static int pointsToMaster(double points) { - points *= HSLFShape.MASTER_DPI; - points /= HSLFShape.POINT_DPI; + points *= MASTER_DPI; + points /= POINT_DPI; return (int)points; } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/ListAutoNumber.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/ListAutoNumber.java deleted file mode 100644 index aa1e25ba9c..0000000000 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/ListAutoNumber.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * ==================================================================== - * 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.usermodel; - -/** - * Specifies type of automatic numbered bullet points that should be applied to a paragraph. - * - * @author Yegor Kozlov - */ -public enum ListAutoNumber { - /** - * (a), (b), (c), ... - */ - ALPHA_LC_PARENT_BOTH, - /** - * (A), (B), (C), ... - */ - ALPHA_UC_PARENT_BOTH, - /** - * a), b), c), ... - */ - ALPHA_LC_PARENT_R, - /** - * A), B), C), ... - */ - ALPHA_UC_PARENT_R, - /** - * a., b., c., ... - */ - ALPHA_LC_PERIOD, - /** - * A., B., C., ... - */ - ALPHA_UC_PERIOD, - /** - * (1), (2), (3), ... - */ - ARABIC_PARENT_BOTH, - /** - * 1), 2), 3), ... - */ - ARABIC_PARENT_R, - - /** - * 1., 2., 3., ... - */ - ARABIC_PERIOD, - /** - * 1, 2, 3, ... - */ - ARABIC_PLAIN, - - /** - * (i), (ii), (iii), ... - */ - ROMAN_LC_PARENT_BOTH, - /** - * (I), (II), (III), ... - */ - ROMAN_UC_PARENT_BOTH, - /** - * i), ii), iii), ... - */ - ROMAN_LC_PARENT_R, - /** - * I), II), III), ... - */ - ROMAN_UC_PARENT_R, - /** - * i., ii., iii., ... - */ - ROMAN_LC_PERIOD , - /** - * I., II., III., ... - */ - ROMAN_UC_PERIOD, - /** - * Dbl-byte circle numbers - */ - CIRCLE_NUM_DB_PLAIN, - /** - * Wingdings black circle numbers - */ - CIRCLE_NUM_WD_BLACK_PLAIN, - /** - * Wingdings white circle numbers - */ - CIRCLE_NUM_WD_WHITE_PLAIN -} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java index f0cf3a78a9..af71134ba5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -19,6 +19,7 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; import java.util.*; +import org.apache.poi.sl.usermodel.AutoNumberingScheme; import org.apache.poi.sl.usermodel.TextParagraph; import org.apache.poi.util.*; import org.apache.poi.xslf.model.ParagraphPropertyFetcher; @@ -143,7 +144,7 @@ public class XSLFTextParagraph implements TextParagraph { * @return alignment that is applied to the paragraph */ public TextAlign getTextAlign(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetAlgn()){ TextAlign val = TextAlign.values()[props.getAlgn().intValue() - 1]; @@ -175,7 +176,7 @@ public class XSLFTextParagraph implements TextParagraph { @Override public FontAlign getFontAlign(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetFontAlgn()){ FontAlign val = FontAlign.values()[props.getFontAlgn().intValue() - 1]; @@ -211,7 +212,7 @@ public class XSLFTextParagraph implements TextParagraph { * @return the font to be used on bullet characters within a given paragraph */ public String getBulletFont(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetBuFont()){ setValue(props.getBuFont().getTypeface()); @@ -234,7 +235,7 @@ public class XSLFTextParagraph implements TextParagraph { * @return the character to be used in place of the standard bullet point */ public String getBulletCharacter(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetBuChar()){ setValue(props.getBuChar().getChar()); @@ -260,7 +261,7 @@ public class XSLFTextParagraph implements TextParagraph { */ public Color getBulletFontColor(){ final XSLFTheme theme = getParentShape().getSheet().getTheme(); - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetBuClr()){ XSLFColor c = new XSLFColor(props.getBuClr(), theme, null); @@ -297,7 +298,7 @@ public class XSLFTextParagraph implements TextParagraph { * @return the bullet size */ public Double getBulletFontSize(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetBuSzPct()){ setValue(props.getBuSzPct().getVal() * 0.001); @@ -336,6 +337,46 @@ public class XSLFTextParagraph implements TextParagraph { } } + /** + * @return the auto numbering scheme, or null if not defined + */ + public AutoNumberingScheme getAutoNumberingScheme() { + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()) { + public boolean fetch(CTTextParagraphProperties props) { + if (props.isSetBuAutoNum()) { + AutoNumberingScheme ans = AutoNumberingScheme.forOoxmlID(props.getBuAutoNum().getType().intValue()); + if (ans != null) { + setValue(ans); + return true; + } + } + return false; + } + }; + fetchParagraphProperty(fetcher); + return fetcher.getValue(); + } + + /** + * @return the auto numbering starting number, or null if not defined + */ + public Integer getAutoNumberingStartAt() { + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()) { + public boolean fetch(CTTextParagraphProperties props) { + if (props.isSetBuAutoNum()) { + if (props.getBuAutoNum().isSetStartAt()) { + setValue(props.getBuAutoNum().getStartAt()); + return true; + } + } + return false; + } + }; + fetchParagraphProperty(fetcher); + return fetcher.getValue(); + } + + @Override public void setIndent(Double indent){ if (indent == null && !_p.isSetPPr()) return; @@ -350,7 +391,7 @@ public class XSLFTextParagraph implements TextParagraph { @Override public Double getIndent() { - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetIndent()){ setValue(Units.toPoints(props.getIndent())); @@ -381,7 +422,7 @@ public class XSLFTextParagraph implements TextParagraph { */ @Override public Double getLeftMargin(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetMarL()){ double val = Units.toPoints(props.getMarL()); @@ -413,7 +454,7 @@ public class XSLFTextParagraph implements TextParagraph { */ @Override public Double getRightMargin(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetMarR()){ double val = Units.toPoints(props.getMarR()); @@ -424,13 +465,12 @@ public class XSLFTextParagraph implements TextParagraph { } }; fetchParagraphProperty(fetcher); - // if the marL attribute is omitted, then a value of 347663 is implied return fetcher.getValue(); } @Override public Double getDefaultTabSize(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetDefTabSz()){ double val = Units.toPoints(props.getDefTabSz()); @@ -445,7 +485,7 @@ public class XSLFTextParagraph implements TextParagraph { } public double getTabStop(final int idx){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetTabLst()){ CTTextTabStopList tabStops = props.getTabLst(); @@ -489,7 +529,7 @@ public class XSLFTextParagraph implements TextParagraph { @Override public Double getLineSpacing(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetLnSpc()){ CTTextSpacing spc = props.getLnSpc(); @@ -528,7 +568,7 @@ public class XSLFTextParagraph implements TextParagraph { @Override public Double getSpaceBefore(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetSpcBef()){ CTTextSpacing spc = props.getSpcBef(); @@ -556,7 +596,7 @@ public class XSLFTextParagraph implements TextParagraph { @Override public Double getSpaceAfter(){ - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetSpcAft()){ CTTextSpacing spc = props.getSpcAft(); @@ -572,23 +612,14 @@ public class XSLFTextParagraph implements TextParagraph { return fetcher.getValue(); } - /** - * Specifies the particular level text properties that this paragraph will follow. - * The value for this attribute formats the text according to the corresponding level - * paragraph properties defined in the SlideMaster. - * - * @param level the level (0 ... 4) - */ - public void setLevel(int level){ + @Override + public void setIndentLevel(int level){ CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); pr.setLvl(level); } - /** - * - * @return the text level of this paragraph (0-based). Default is 0. - */ - public int getLevel(){ + @Override + public int getIndentLevel() { CTTextParagraphProperties pr = _p.getPPr(); return (pr == null || !pr.isSetLvl()) ? 0 : pr.getLvl(); } @@ -597,7 +628,7 @@ public class XSLFTextParagraph implements TextParagraph { * Returns whether this paragraph has bullets */ public boolean isBullet() { - ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ + ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getIndentLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetBuNone()) { setValue(false); @@ -637,11 +668,11 @@ public class XSLFTextParagraph implements TextParagraph { * @param startAt the number that will start number for a given sequence of automatically numbered bullets (1-based). */ - public void setBulletAutoNumber(ListAutoNumber scheme, int startAt) { + public void setBulletAutoNumber(AutoNumberingScheme scheme, int startAt) { if(startAt < 1) throw new IllegalArgumentException("Start Number must be greater or equal that 1") ; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); CTTextAutonumberBullet lst = pr.isSetBuAutoNum() ? pr.getBuAutoNum() : pr.addNewBuAutoNum(); - lst.setType(STTextAutonumberScheme.Enum.forInt(scheme.ordinal() + 1)); + lst.setType(STTextAutonumberScheme.Enum.forInt(scheme.ooxmlId)); lst.setStartAt(startAt); } @@ -669,28 +700,29 @@ public class XSLFTextParagraph implements TextParagraph { defaultStyleSelector = "bodyStyle"; break; } - int level = getLevel(); + int level = getIndentLevel(); // wind up and find the root master sheet which must be slide master - XSLFSheet masterSheet = _shape.getSheet(); - for (XSLFSheet m = masterSheet; m != null; m = (XSLFSheet)m.getMasterSheet()) { - masterSheet = m; - } - - String nsDecl = + final String nsDecl = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' "; - String xpaths[] = { + final String xpaths[] = { nsDecl+".//p:txStyles/p:" + defaultStyleSelector +"/a:lvl" +(level+1)+ "pPr", nsDecl+".//p:notesStyle/a:lvl" +(level+1)+ "pPr" }; - XmlObject xo = masterSheet.getXmlObject(); - for (String xpath : xpaths) { - XmlObject[] o = xo.selectPath(xpath); - if (o.length == 1) { - return (CTTextParagraphProperties)o[0]; + XSLFSheet masterSheet = _shape.getSheet(); + for (XSLFSheet m = masterSheet; m != null; m = (XSLFSheet)m.getMasterSheet()) { + masterSheet = m; + + XmlObject xo = masterSheet.getXmlObject(); + for (String xpath : xpaths) { + XmlObject[] o = xo.selectPath(xpath); + if (o.length == 1) { + return (CTTextParagraphProperties)o[0]; + } } } + // for (CTTextBody txBody : (CTTextBody[])xo.selectPath(nsDecl+".//p:txBody")) { // CTTextParagraphProperties defaultPr = null, lastPr = null; @@ -730,7 +762,7 @@ public class XSLFTextParagraph implements TextParagraph { if(ph == null){ // if it is a plain text box then take defaults from presentation.xml XMLSlideShow ppt = getParentShape().getSheet().getSlideShow(); - CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(getLevel()); + CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(getIndentLevel()); if(themeProps != null) ok = visitor.fetch(themeProps); } @@ -817,24 +849,40 @@ public class XSLFTextParagraph implements TextParagraph { return (_runs.isEmpty() ? "Arial" : _runs.get(0).getFontFamily()); } + @Override public BulletStyle getBulletStyle() { if (!isBullet()) return null; return new BulletStyle(){ + @Override public String getBulletCharacter() { return XSLFTextParagraph.this.getBulletCharacter(); } + @Override public String getBulletFont() { return XSLFTextParagraph.this.getBulletFont(); } + @Override public Double getBulletFontSize() { return XSLFTextParagraph.this.getBulletFontSize(); } + @Override public Color getBulletFontColor() { return XSLFTextParagraph.this.getBulletFontColor(); } + + @Override + public AutoNumberingScheme getAutoNumberingScheme() { + return XSLFTextParagraph.this.getAutoNumberingScheme(); + } + + @Override + public Integer getAutoNumberingStartAt() { + return XSLFTextParagraph.this.getAutoNumberingStartAt(); + } + }; } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java index d99df7e79a..74685ec1b5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java @@ -101,7 +101,7 @@ public class XSLFTextRun implements TextRun { CTShapeStyle style = _p.getParentShape().getSpStyle(); final CTSchemeColor phClr = style == null ? null : style.getFontRef().getSchemeClr(); - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ CTSolidColorFillProperties solidFill = props.getSolidFill(); if(solidFill != null) { @@ -146,7 +146,7 @@ public class XSLFTextRun implements TextRun { CTTextNormalAutofit afit = getParentParagraph().getParentShape().getTextBodyPr().getNormAutofit(); if(afit != null) scale = (double)afit.getFontScale() / 100000; - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetSz()){ setValue(props.getSz()*0.01); @@ -166,7 +166,7 @@ public class XSLFTextRun implements TextRun { */ public double getCharacterSpacing(){ - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetSpc()){ setValue(props.getSpc()*0.01); @@ -233,7 +233,7 @@ public class XSLFTextRun implements TextRun { public String getFontFamily(){ final XSLFTheme theme = _p.getParentShape().getSheet().getTheme(); - CharacterPropertyFetcher visitor = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher visitor = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ CTTextFont font = props.getLatin(); if(font != null){ @@ -257,7 +257,7 @@ public class XSLFTextRun implements TextRun { public byte getPitchAndFamily(){ final XSLFTheme theme = _p.getParentShape().getSheet().getTheme(); - CharacterPropertyFetcher visitor = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher visitor = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ CTTextFont font = props.getLatin(); if(font != null){ @@ -285,7 +285,7 @@ public class XSLFTextRun implements TextRun { * @return whether a run of text will be formatted as strikethrough text. Default is false. */ public boolean isStrikethrough() { - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetStrike()){ setValue(props.getStrike() != STTextStrikeType.NO_STRIKE); @@ -302,7 +302,7 @@ public class XSLFTextRun implements TextRun { * @return whether a run of text will be formatted as a superscript text. Default is false. */ public boolean isSuperscript() { - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetBaseline()){ setValue(props.getBaseline() > 0); @@ -352,7 +352,7 @@ public class XSLFTextRun implements TextRun { * @return whether a run of text will be formatted as a superscript text. Default is false. */ public boolean isSubscript() { - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetBaseline()){ setValue(props.getBaseline() < 0); @@ -369,7 +369,7 @@ public class XSLFTextRun implements TextRun { * @return whether a run of text will be formatted as a superscript text. Default is false. */ public TextCap getTextCap() { - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetCap()){ int idx = props.getCap().intValue() - 1; @@ -396,7 +396,7 @@ public class XSLFTextRun implements TextRun { * @return whether this run of text is formatted as bold text */ public boolean isBold(){ - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetB()){ setValue(props.getB()); @@ -420,7 +420,7 @@ public class XSLFTextRun implements TextRun { * @return whether this run of text is formatted as italic text */ public boolean isItalic(){ - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetI()){ setValue(props.getI()); @@ -444,7 +444,7 @@ public class XSLFTextRun implements TextRun { * @return whether this run of text is formatted as underlined text */ public boolean isUnderlined(){ - CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getLevel()){ + CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ if(props.isSetU()){ setValue(props.getU() != STTextUnderlineType.NONE); @@ -491,7 +491,7 @@ public class XSLFTextRun implements TextRun { if(ph == null){ // if it is a plain text box then take defaults from presentation.xml XMLSlideShow ppt = shape.getSheet().getSlideShow(); - CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(_p.getLevel()); + CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(_p.getIndentLevel()); if(themeProps != null) { fetcher.isFetchingFromMaster = true; ok = fetcher.fetch(themeProps); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java index b3c44f84a7..56766eac84 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java @@ -120,7 +120,7 @@ public class TestXSLFAutoShape { assertEquals(100., p.getLineSpacing(), 0); assertEquals(0., p.getSpaceAfter(), 0); assertEquals(0., p.getSpaceBefore(), 0); - assertEquals(0, p.getLevel()); + assertEquals(0, p.getIndentLevel()); p.setIndent(2.0); assertEquals(2.0, p.getIndent(), 0); @@ -134,11 +134,11 @@ public class TestXSLFAutoShape { assertFalse(p.getXmlObject().getPPr().isSetLvl()); - p.setLevel(1); - assertEquals(1, p.getLevel()); + p.setIndentLevel(1); + assertEquals(1, p.getIndentLevel()); assertTrue(p.getXmlObject().getPPr().isSetLvl()); - p.setLevel(2); - assertEquals(2, p.getLevel()); + p.setIndentLevel(2); + assertEquals(2, p.getIndentLevel()); p.setLeftMargin(2.0); assertEquals(2.0, p.getLeftMargin(), 0); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index 37a01a73ae..4d51733353 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -25,6 +25,7 @@ import java.util.List; import org.apache.poi.sl.draw.DrawTextFragment; import org.apache.poi.sl.draw.DrawTextParagraph; +import org.apache.poi.sl.usermodel.AutoNumberingScheme; import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -297,11 +298,11 @@ public class TestXSLFTextParagraph { p.setLeftMargin(-1.0); // the value of -1.0 resets to the defaults assertEquals(0.0, p.getLeftMargin(), 0); - assertEquals(0, p.getLevel()); - p.setLevel(1); - assertEquals(1, p.getLevel()); - p.setLevel(2); - assertEquals(2, p.getLevel()); + assertEquals(0, p.getIndentLevel()); + p.setIndentLevel(1); + assertEquals(1, p.getIndentLevel()); + p.setIndentLevel(2); + assertEquals(2, p.getIndentLevel()); assertEquals(100., p.getLineSpacing(), 0); p.setLineSpacing(200.); @@ -328,7 +329,7 @@ public class TestXSLFTextParagraph { p.setBullet(false); assertFalse(p.isBullet()); - p.setBulletAutoNumber(ListAutoNumber.ALPHA_LC_PARENT_BOTH, 1); + p.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenBoth, 1); double tabStop = p.getTabStop(0); assertEquals(0.0, tabStop, 0); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java index b19d069b0d..c3aabe051d 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java @@ -180,7 +180,7 @@ public class TestXSLFTextShape { assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment()); XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); - assertEquals(0, pr1.getParentParagraph().getLevel()); + assertEquals(0, pr1.getParentParagraph().getIndentLevel()); assertEquals("Content", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); assertEquals(32.0, pr1.getFontSize(), 0); @@ -189,7 +189,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr1.getParentParagraph().getBulletFont()); XSLFTextRun pr2 = shape2.getTextParagraphs().get(1).getTextRuns().get(0); - assertEquals(1, pr2.getParentParagraph().getLevel()); + assertEquals(1, pr2.getParentParagraph().getIndentLevel()); assertEquals("Level 2", pr2.getRawText()); assertEquals("Calibri", pr2.getFontFamily()); assertEquals(28.0, pr2.getFontSize(), 0); @@ -198,7 +198,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr2.getParentParagraph().getBulletFont()); XSLFTextRun pr3 = shape2.getTextParagraphs().get(2).getTextRuns().get(0); - assertEquals(2, pr3.getParentParagraph().getLevel()); + assertEquals(2, pr3.getParentParagraph().getIndentLevel()); assertEquals("Level 3", pr3.getRawText()); assertEquals("Calibri", pr3.getFontFamily()); assertEquals(24.0, pr3.getFontSize(), 0); @@ -207,7 +207,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr3.getParentParagraph().getBulletFont()); XSLFTextRun pr4 = shape2.getTextParagraphs().get(3).getTextRuns().get(0); - assertEquals(3, pr4.getParentParagraph().getLevel()); + assertEquals(3, pr4.getParentParagraph().getIndentLevel()); assertEquals("Level 4", pr4.getRawText()); assertEquals("Calibri", pr4.getFontFamily()); assertEquals(20.0, pr4.getFontSize(), 0); @@ -216,7 +216,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr4.getParentParagraph().getBulletFont()); XSLFTextRun pr5 = shape2.getTextParagraphs().get(4).getTextRuns().get(0); - assertEquals(4, pr5.getParentParagraph().getLevel()); + assertEquals(4, pr5.getParentParagraph().getIndentLevel()); assertEquals("Level 5", pr5.getRawText()); assertEquals("Calibri", pr5.getFontFamily()); assertEquals(20.0, pr5.getFontSize(), 0); @@ -362,7 +362,7 @@ public class TestXSLFTextShape { assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment()); XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); - assertEquals(0, pr1.getParentParagraph().getLevel()); + assertEquals(0, pr1.getParentParagraph().getIndentLevel()); assertEquals("Left", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); assertEquals(28.0, pr1.getFontSize(), 0); @@ -371,7 +371,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr1.getParentParagraph().getBulletFont()); XSLFTextRun pr2 = shape2.getTextParagraphs().get(1).getTextRuns().get(0); - assertEquals(1, pr2.getParentParagraph().getLevel()); + assertEquals(1, pr2.getParentParagraph().getIndentLevel()); assertEquals("Level 2", pr2.getParentParagraph().getText()); assertEquals("Calibri", pr2.getFontFamily()); assertEquals(24.0, pr2.getFontSize(), 0); @@ -380,7 +380,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr2.getParentParagraph().getBulletFont()); XSLFTextRun pr3 = shape2.getTextParagraphs().get(2).getTextRuns().get(0); - assertEquals(2, pr3.getParentParagraph().getLevel()); + assertEquals(2, pr3.getParentParagraph().getIndentLevel()); assertEquals("Level 3", pr3.getParentParagraph().getText()); assertEquals("Calibri", pr3.getFontFamily()); assertEquals(20.0, pr3.getFontSize(), 0); @@ -389,7 +389,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr3.getParentParagraph().getBulletFont()); XSLFTextRun pr4 = shape2.getTextParagraphs().get(3).getTextRuns().get(0); - assertEquals(3, pr4.getParentParagraph().getLevel()); + assertEquals(3, pr4.getParentParagraph().getIndentLevel()); assertEquals("Level 4", pr4.getParentParagraph().getText()); assertEquals("Calibri", pr4.getFontFamily()); assertEquals(18.0, pr4.getFontSize(), 0); @@ -399,7 +399,7 @@ public class TestXSLFTextShape { XSLFTextShape shape3 = (XSLFTextShape)shapes.get(2); XSLFTextRun pr5 = shape3.getTextParagraphs().get(0).getTextRuns().get(0); - assertEquals(0, pr5.getParentParagraph().getLevel()); + assertEquals(0, pr5.getParentParagraph().getIndentLevel()); assertEquals("Right", pr5.getRawText()); assertEquals("Calibri", pr5.getFontFamily()); assertEquals(Color.black, pr5.getFontColor()); @@ -461,7 +461,7 @@ public class TestXSLFTextShape { assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment()); XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); - assertEquals(0, pr1.getParentParagraph().getLevel()); + assertEquals(0, pr1.getParentParagraph().getIndentLevel()); assertEquals("Default Text", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); assertEquals(18.0, pr1.getFontSize(), 0); @@ -544,7 +544,7 @@ public class TestXSLFTextShape { assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment()); XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0); - assertEquals(0, pr1.getParentParagraph().getLevel()); + assertEquals(0, pr1.getParentParagraph().getIndentLevel()); assertEquals("Level 1", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); assertEquals(32.0, pr1.getFontSize(), 0); @@ -553,7 +553,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr1.getParentParagraph().getBulletFont()); XSLFTextRun pr2 = shape2.getTextParagraphs().get(1).getTextRuns().get(0); - assertEquals(1, pr2.getParentParagraph().getLevel()); + assertEquals(1, pr2.getParentParagraph().getIndentLevel()); assertEquals("Level 2", pr2.getParentParagraph().getText()); assertEquals("Calibri", pr2.getFontFamily()); assertEquals(28.0, pr2.getFontSize(), 0); @@ -562,7 +562,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr2.getParentParagraph().getBulletFont()); XSLFTextRun pr3 = shape2.getTextParagraphs().get(2).getTextRuns().get(0); - assertEquals(2, pr3.getParentParagraph().getLevel()); + assertEquals(2, pr3.getParentParagraph().getIndentLevel()); assertEquals("Level 3", pr3.getParentParagraph().getText()); assertEquals("Calibri", pr3.getFontFamily()); assertEquals(24.0, pr3.getFontSize(), 0); @@ -571,7 +571,7 @@ public class TestXSLFTextShape { assertEquals("Arial", pr3.getParentParagraph().getBulletFont()); XSLFTextRun pr4 = shape2.getTextParagraphs().get(3).getTextRuns().get(0); - assertEquals(3, pr4.getParentParagraph().getLevel()); + assertEquals(3, pr4.getParentParagraph().getIndentLevel()); assertEquals("Level 4", pr4.getParentParagraph().getText()); assertEquals("Calibri", pr4.getFontFamily()); assertEquals(20.0, pr4.getFontSize(), 0); @@ -584,7 +584,7 @@ public class TestXSLFTextShape { assertEquals("Content with caption", shape3.getText()); pr1 = shape3.getTextParagraphs().get(0).getTextRuns().get(0); - assertEquals(0, pr1.getParentParagraph().getLevel()); + assertEquals(0, pr1.getParentParagraph().getIndentLevel()); assertEquals("Content with caption", pr1.getRawText()); assertEquals("Calibri", pr1.getFontFamily()); assertEquals(14.0, pr1.getFontSize(), 0); @@ -707,19 +707,19 @@ public class TestXSLFTextShape { tx1.clearText(); XSLFTextParagraph p1 = tx1.addNewTextParagraph(); - assertEquals(0, p1.getLevel()); + assertEquals(0, p1.getIndentLevel()); XSLFTextRun r1 = p1.addNewTextRun(); r1.setText("Apache POI"); XSLFTextParagraph p2 = tx1.addNewTextParagraph(); - p2.setLevel(1); - assertEquals(1, p2.getLevel()); + p2.setIndentLevel(1); + assertEquals(1, p2.getIndentLevel()); XSLFTextRun r2 = p2.addNewTextRun(); r2.setText("HSLF"); XSLFTextParagraph p3 = tx1.addNewTextParagraph(); - p3.setLevel(2); - assertEquals(2, p3.getLevel()); + p3.setIndentLevel(2); + assertEquals(2, p3.getIndentLevel()); XSLFTextRun r3 = p3.addNewTextRun(); r3.setText("XSLF"); diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowDumper.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowDumper.java index 9cb1a45a55..3954f6b487 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowDumper.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowDumper.java @@ -21,10 +21,9 @@ import java.io.*; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.poifs.filesystem.DocumentEntry; - import org.apache.poi.ddf.*; +import org.apache.poi.hslf.record.HSLFEscherRecordFactory; import org.apache.poi.hslf.record.RecordTypes; - import org.apache.poi.util.LittleEndian; /** @@ -274,7 +273,7 @@ public void walkTree(int depth, int startPos, int maxLen) { byte[] contents = new byte[len]; System.arraycopy(_docstream,pos,contents,0,len); - DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory(); + DefaultEscherRecordFactory erf = new HSLFEscherRecordFactory(); EscherRecord record = erf.createRecord(contents,0); // For now, try filling in the fields diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java index 45ededed15..fc96644b2b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java +++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java @@ -27,10 +27,7 @@ import org.apache.poi.ddf.DefaultEscherRecordFactory; import org.apache.poi.ddf.EscherRecord; import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherTextboxRecord; -import org.apache.poi.hslf.record.EscherTextboxWrapper; -import org.apache.poi.hslf.record.TextCharsAtom; -import org.apache.poi.hslf.record.TextBytesAtom; -import org.apache.poi.hslf.record.StyleTextPropAtom; +import org.apache.poi.hslf.record.*; import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; /** @@ -263,7 +260,7 @@ public final class SlideShowRecordDumper { // print additional information for drawings and atoms if (optEscher && cname.equals("PPDrawing")) { - DefaultEscherRecordFactory factory = new DefaultEscherRecordFactory(); + DefaultEscherRecordFactory factory = new HSLFEscherRecordFactory(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); r.writeOut(baos); diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java index 1167cc3558..190ad0a415 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java +++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java @@ -328,13 +328,9 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { } for (List lp : paragraphs) { - for (HSLFTextParagraph p : lp) { - for (HSLFTextRun r : p.getTextRuns()) { - ret.append(r.getRawText()); - } - if (ret.length() > 0 && ret.charAt(ret.length()-1) != '\n') { - ret.append("\n"); - } + ret.append(HSLFTextParagraph.getText(lp)); + if (ret.length() > 0 && ret.charAt(ret.length()-1) != '\n') { + ret.append("\n"); } } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java index c777351728..67b12be8b4 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java @@ -22,9 +22,6 @@ import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; -import java.awt.geom.*; -import java.util.ArrayList; - /** * Represents a line in a PowerPoint drawing * @@ -46,6 +43,8 @@ public final class Line extends HSLFSimpleShape { protected EscherContainerRecord createSpContainer(boolean isChild){ _escherContainer = super.createSpContainer(isChild); + + setShapeType(ShapeType.LINE); EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID); short type = (short)((ShapeType.LINE.nativeId << 4) | 0x2); @@ -64,68 +63,24 @@ public final class Line extends HSLFSimpleShape { return _escherContainer; } - - public java.awt.Shape getOutline(){ - Rectangle2D anchor = getLogicalAnchor2D(); - return new Line2D.Double(anchor.getX(), anchor.getY(), anchor.getX() + anchor.getWidth(), anchor.getY() + anchor.getHeight()); + + /** + * Sets the orientation of the line, if inverse is false, then line goes + * from top-left to bottom-right, otherwise use inverse equals true + * + * @param inverse the orientation of the line + */ + public void setInverse(boolean inverse) { + setShapeType(inverse ? ShapeType.LINE_INV : ShapeType.LINE); } /** - * - * @return 'absolute' anchor of this shape relative to the parent sheet - * - * @deprecated TODO: remove the whole class, should work with preset geometries instead - */ - public Rectangle2D getLogicalAnchor2D(){ - Rectangle2D anchor = getAnchor2D(); - - //if it is a groupped shape see if we need to transform the coordinates - if (getParent() != null){ - ArrayList lst = new ArrayList(); - for (ShapeContainer parent=this.getParent(); - parent instanceof HSLFGroupShape; - parent = ((HSLFGroupShape)parent).getParent()) { - lst.add(0, (HSLFGroupShape)parent); - } - - AffineTransform tx = new AffineTransform(); - for(HSLFGroupShape prnt : lst) { - Rectangle2D exterior = prnt.getAnchor2D(); - Rectangle2D interior = prnt.getInteriorAnchor(); - - double scaleX = exterior.getWidth() / interior.getWidth(); - double scaleY = exterior.getHeight() / interior.getHeight(); - - tx.translate(exterior.getX(), exterior.getY()); - tx.scale(scaleX, scaleY); - tx.translate(-interior.getX(), -interior.getY()); - - } - anchor = tx.createTransformedShape(anchor).getBounds2D(); - } - - double angle = getRotation(); - if(angle != 0.){ - double centerX = anchor.getX() + anchor.getWidth()/2; - double centerY = anchor.getY() + anchor.getHeight()/2; - - AffineTransform trans = new AffineTransform(); - trans.translate(centerX, centerY); - trans.rotate(Math.toRadians(angle)); - trans.translate(-centerX, -centerY); - - Rectangle2D rect = trans.createTransformedShape(anchor).getBounds2D(); - if((anchor.getWidth() < anchor.getHeight() && rect.getWidth() > rect.getHeight()) || - (anchor.getWidth() > anchor.getHeight() && rect.getWidth() < rect.getHeight()) ){ - trans = new AffineTransform(); - trans.translate(centerX, centerY); - trans.rotate(Math.PI/2); - trans.translate(-centerX, -centerY); - anchor = trans.createTransformedShape(anchor).getBounds2D(); - } - } - return anchor; - } - - + * Gets the orientation of the line, if inverse is false, then line goes + * from top-left to bottom-right, otherwise inverse equals true + * + * @return inverse the orientation of the line + */ + public boolean isInverse() { + return (getShapeType() == ShapeType.LINE_INV); + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPFException9.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPFException9.java index b329c8af3e..271b2591f9 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPFException9.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPFException9.java @@ -21,7 +21,7 @@ */ package org.apache.poi.hslf.model.textproperties; -import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum; +import org.apache.poi.sl.usermodel.AutoNumberingScheme; import org.apache.poi.util.LittleEndian; /** @@ -41,8 +41,8 @@ public class TextPFException9 { private final byte mask4; private final Short bulletBlipRef; private final Short fBulletHasAutoNumber; - private final TextAutoNumberSchemeEnum autoNumberScheme; - private final static TextAutoNumberSchemeEnum DEFAULT_AUTONUMBER_SHEME = TextAutoNumberSchemeEnum.ANM_ArabicPeriod; + private final AutoNumberingScheme autoNumberScheme; + private final static AutoNumberingScheme DEFAULT_AUTONUMBER_SHEME = AutoNumberingScheme.arabicPeriod; private final Short autoNumberStartNumber; private final static Short DEFAULT_START_NUMBER = new Short((short)1); private final int recordLength; @@ -71,7 +71,7 @@ public class TextPFException9 { this.autoNumberScheme = null; this.autoNumberStartNumber = null; } else { - this.autoNumberScheme = TextAutoNumberSchemeEnum.valueOf(LittleEndian.getShort(source, index)); + this.autoNumberScheme = AutoNumberingScheme.forNativeID(LittleEndian.getShort(source, index)); index +=2; this.autoNumberStartNumber = LittleEndian.getShort(source, index); index +=2; @@ -85,7 +85,7 @@ public class TextPFException9 { public Short getfBulletHasAutoNumber() { return fBulletHasAutoNumber; } - public TextAutoNumberSchemeEnum getAutoNumberScheme() { + public AutoNumberingScheme getAutoNumberScheme() { if (null != this.autoNumberScheme) { return this.autoNumberScheme; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/EscherPlaceholder.java b/src/scratchpad/src/org/apache/poi/hslf/record/EscherPlaceholder.java new file mode 100644 index 0000000000..6aa09b9364 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/EscherPlaceholder.java @@ -0,0 +1,75 @@ +/* ==================================================================== + 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.hslf.record; + +import org.apache.poi.ddf.*; +import org.apache.poi.util.*; + +/** + * An atom record that specifies whether a shape is a placeholder shape. + * The number, position, and type of placeholder shapes are determined by + * the slide layout as specified in the SlideAtom record. + */ +public class EscherPlaceholder extends EscherRecord { + public static final short RECORD_ID = (short)RecordTypes.OEPlaceholderAtom.typeID; + public static final String RECORD_DESCRIPTION = "msofbtClientTextboxPlaceholder"; + + int position = -1; + byte placementId = 0; + byte size = 0; + short unused = 0; + + public EscherPlaceholder() {} + + public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) { + int bytesRemaining = readHeader( data, offset ); + + position = LittleEndian.getInt(data, offset+8); + placementId = data[offset+12]; + size = data[offset+13]; + unused = LittleEndian.getShort(data, offset+14); + + assert(bytesRemaining + 8 == 16); + return bytesRemaining + 8; + } + + public int serialize(int offset, byte[] data, EscherSerializationListener listener) { + listener.beforeRecordSerialize( offset, getRecordId(), this ); + + LittleEndian.putShort(data, offset, getOptions()); + LittleEndian.putShort(data, offset+2, getRecordId()); + LittleEndian.putInt(data, offset+4, 8); + LittleEndian.putInt(data, offset+8, position); + LittleEndian.putByte(data, offset+12, placementId); + LittleEndian.putByte(data, offset+13, size); + LittleEndian.putShort(data, offset+14, unused); + + listener.afterRecordSerialize( offset+getRecordSize(), getRecordId(), getRecordSize(), this ); + return getRecordSize(); + } + + public int getRecordSize() { + return 8 + 8; + } + + public String getRecordName() { + return "ClientTextboxPlaceholder"; + } + + +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/HSLFEscherRecordFactory.java b/src/scratchpad/src/org/apache/poi/hslf/record/HSLFEscherRecordFactory.java new file mode 100644 index 0000000000..c985864f00 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/HSLFEscherRecordFactory.java @@ -0,0 +1,70 @@ +/* ==================================================================== + 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.hslf.record; + +import java.lang.reflect.Constructor; +import java.util.Map; + +import org.apache.poi.ddf.*; +import org.apache.poi.util.LittleEndian; + +/** + * Generates escher records when provided the byte array containing those records. + * + * @see EscherRecordFactory + */ +public class HSLFEscherRecordFactory extends DefaultEscherRecordFactory { + private static Class[] escherRecordClasses = { EscherPlaceholder.class }; + private static Map> recordsMap = recordsToMap( escherRecordClasses ); + + + /** + * Creates an instance of the escher record factory + */ + public HSLFEscherRecordFactory() { + // no instance initialisation + } + + /** + * Generates an escher record including the any children contained under that record. + * An exception is thrown if the record could not be generated. + * + * @param data The byte array containing the records + * @param offset The starting offset into the byte array + * @return The generated escher record + */ + public EscherRecord createRecord(byte[] data, int offset) { + short options = LittleEndian.getShort( data, offset ); + short recordId = LittleEndian.getShort( data, offset + 2 ); + // int remainingBytes = LittleEndian.getInt( data, offset + 4 ); + + Constructor recordConstructor = recordsMap.get(Short.valueOf(recordId)); + if (recordConstructor == null) { + return super.createRecord(data, offset); + } + EscherRecord escherRecord = null; + try { + escherRecord = recordConstructor.newInstance(new Object[] {}); + } catch (Exception e) { + return super.createRecord(data, offset); + } + escherRecord.setRecordId(recordId); + escherRecord.setOptions(options); + return escherRecord; + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java index 09854b5ab9..637f9a8ab8 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java @@ -92,7 +92,7 @@ public final class PPDrawing extends RecordAtom { System.arraycopy(source,start,contents,0,len); // Build up a tree of Escher records contained within - final DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory(); + final DefaultEscherRecordFactory erf = new HSLFEscherRecordFactory(); final List escherChildren = new ArrayList(); findEscherChildren(erf, contents, 8, len-8, escherChildren); this.childRecords = escherChildren.toArray(new EscherRecord[escherChildren.size()]); @@ -129,20 +129,20 @@ public final class PPDrawing extends RecordAtom { private StyleTextProp9Atom findInSpContainer(final EscherContainerRecord spContainer) { EscherContainerRecord clientData = findFirstEscherContainerRecordOfType((short)RecordTypes.EscherClientData, spContainer); if (null == clientData) { return null; } - final EscherContainerRecord escherContainer1388 = findFirstEscherContainerRecordOfType((short)0x1388, clientData); - if (null == escherContainer1388) { return null; } - final EscherContainerRecord escherContainer138A = findFirstEscherContainerRecordOfType((short)0x138A, escherContainer1388); - if (null == escherContainer138A) { return null; } - int size = escherContainer138A.getChildRecords().size(); + final EscherContainerRecord progTagsContainer = findFirstEscherContainerRecordOfType((short)0x1388, clientData); + if (null == progTagsContainer) { return null; } + final EscherContainerRecord progBinaryTag = findFirstEscherContainerRecordOfType((short)0x138A, progTagsContainer); + if (null == progBinaryTag) { return null; } + int size = progBinaryTag.getChildRecords().size(); if (2 != size) { return null; } - final Record r0 = buildFromUnknownEscherRecord((UnknownEscherRecord) escherContainer138A.getChild(0)); - final Record r1 = buildFromUnknownEscherRecord((UnknownEscherRecord) escherContainer138A.getChild(1)); + final Record r0 = buildFromUnknownEscherRecord((UnknownEscherRecord) progBinaryTag.getChild(0)); + final Record r1 = buildFromUnknownEscherRecord((UnknownEscherRecord) progBinaryTag.getChild(1)); if (!(r0 instanceof CString)) { return null; } if (!("___PPT9".equals(((CString) r0).getText()))) { return null; }; if (!(r1 instanceof BinaryTagDataBlob )) { return null; } final BinaryTagDataBlob blob = (BinaryTagDataBlob) r1; if (1 != blob.getChildRecords().length) { return null; } - return (StyleTextProp9Atom) blob.findFirstOfType(0x0FACL); + return (StyleTextProp9Atom) blob.findFirstOfType(RecordTypes.StyleTextProp9Atom.typeID); } /** * Creates a new, empty, PPDrawing (typically for use with a new Slide @@ -403,32 +403,13 @@ public final class PPDrawing extends RecordAtom { public StyleTextProp9Atom[] getNumberedListInfo() { final List result = new LinkedList(); - EscherRecord[] escherRecords = this.getEscherRecords(); - for (EscherRecord escherRecord : escherRecords) { - if (escherRecord instanceof EscherContainerRecord && (short)0xf002 == escherRecord.getRecordId()) { - EscherContainerRecord escherContainerF002 = (EscherContainerRecord) escherRecord; - final EscherContainerRecord escherContainerF003 = findFirstEscherContainerRecordOfType((short)0xf003, escherContainerF002); - final EscherContainerRecord[] escherContainersF004 = findAllEscherContainerRecordOfType((short)0xf004, escherContainerF003); - for (EscherContainerRecord containerF004 : escherContainersF004) { - final EscherContainerRecord escherContainerF011 = findFirstEscherContainerRecordOfType((short)0xf011, containerF004); - if (null == escherContainerF011) { continue; } - final EscherContainerRecord escherContainer1388 = findFirstEscherContainerRecordOfType((short)0x1388, escherContainerF011); - if (null == escherContainer1388) { continue; } - final EscherContainerRecord escherContainer138A = findFirstEscherContainerRecordOfType((short)0x138A, escherContainer1388); - if (null == escherContainer138A) { continue; } - int size = escherContainer138A.getChildRecords().size(); - if (2 != size) { continue; } - final Record r0 = buildFromUnknownEscherRecord((UnknownEscherRecord) escherContainer138A.getChild(0)); - final Record r1 = buildFromUnknownEscherRecord((UnknownEscherRecord) escherContainer138A.getChild(1)); - if (!(r0 instanceof CString)) { continue; } - if (!("___PPT9".equals(((CString) r0).getText()))) { continue; }; - if (!(r1 instanceof BinaryTagDataBlob )) { continue; } - final BinaryTagDataBlob blob = (BinaryTagDataBlob) r1; - if (1 != blob.getChildRecords().length) { continue; } - result.add((StyleTextProp9Atom) blob.findFirstOfType(0x0FACL)); - } - } - } + EscherContainerRecord dgContainer = (EscherContainerRecord)childRecords[0]; + final EscherContainerRecord spgrContainer = findFirstEscherContainerRecordOfType((short)RecordTypes.EscherSpgrContainer, dgContainer); + final EscherContainerRecord[] spContainers = findAllEscherContainerRecordOfType((short)RecordTypes.EscherSpContainer, spgrContainer); + for (EscherContainerRecord spContainer : spContainers) { + StyleTextProp9Atom prop9 = findInSpContainer(spContainer); + if (prop9 != null) result.add(prop9); + } return result.toArray(new StyleTextProp9Atom[result.size()]); } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawingGroup.java b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawingGroup.java index ee414bba9b..0cdb1f6273 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawingGroup.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawingGroup.java @@ -49,7 +49,7 @@ public final class PPDrawingGroup extends RecordAtom { byte[] contents = new byte[len]; System.arraycopy(source,start,contents,0,len); - DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory(); + DefaultEscherRecordFactory erf = new HSLFEscherRecordFactory(); EscherRecord child = erf.createRecord(contents, 0); child.fillFields( contents, 0, erf ); dggContainer = (EscherContainerRecord)child.getChild(0); diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java index 548027b76a..9a5cc7b487 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java @@ -83,7 +83,7 @@ public final class StyleTextProp9Atom extends RecordAtom { break; } } - this.autoNumberSchemes = (TextPFException9[]) schemes.toArray(new TextPFException9[schemes.size()]); + this.autoNumberSchemes = schemes.toArray(new TextPFException9[schemes.size()]); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextAutoNumberSchemeEnum.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextAutoNumberSchemeEnum.java deleted file mode 100644 index ab706592ef..0000000000 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TextAutoNumberSchemeEnum.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * ==================================================================== - * 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.hslf.record; - -public enum TextAutoNumberSchemeEnum { - //Name Value Meaning - ANM_AlphaLcPeriod ((short) 0x0000), // "Lowercase Latin character followed by a period. Example: a., b., c., ..."), - ANM_AlphaUcPeriod ((short) 0x0001), // "Uppercase Latin character followed by a period. Example: A., B., C., ..."), - ANM_ArabicParenRight ((short) 0x0002), // "Arabic numeral followed by a closing parenthesis. Example: 1), 2), 3), ..."), - ANM_ArabicPeriod ((short) 0x0003), // "Arabic numeral followed by a period. Example: 1., 2., 3., ..."), - ANM_RomanLcParenBoth ((short) 0x0004), // "Lowercase Roman numeral enclosed in parentheses. Example: (i), (ii), (iii), ..."), - ANM_RomanLcParenRight ((short) 0x0005), // "Lowercase Roman numeral followed by a closing parenthesis. Example: i), ii), iii), ..."), - ANM_RomanLcPeriod ((short) 0x0006), // "Lowercase Roman numeral followed by a period. Example: i., ii., iii., ..."), - ANM_RomanUcPeriod ((short) 0x0007), // "Uppercase Roman numeral followed by a period. Example: I., II., III., ..."), - ANM_AlphaLcParenBoth ((short) 0x0008), // "Lowercase alphabetic character enclosed in parentheses. Example: (a), (b), (c), ..."), - ANM_AlphaLcParenRight ((short) 0x0009), // "Lowercase alphabetic character followed by a closing parenthesis. Example: a), b), c), ..."), - ANM_AlphaUcParenBoth ((short) 0x000A), // "Uppercase alphabetic character enclosed in parentheses. Example: (A), (B), (C), ..."), - ANM_AlphaUcParenRight ((short) 0x000B), // "Uppercase alphabetic character followed by a closing parenthesis. Example: A), B), C), ..."), - ANM_ArabicParenBoth ((short) 0x000C), // "Arabic numeral enclosed in parentheses. Example: (1), (2), (3), ..."), - ANM_ArabicPlain ((short) 0x000D), // "Arabic numeral. Example: 1, 2, 3, ..."), - ANM_RomanUcParenBoth ((short) 0x000E), // "Uppercase Roman numeral enclosed in parentheses. Example: (I), (II), (III), ..."), - ANM_RomanUcParenRight ((short) 0x000F), // "Uppercase Roman numeral followed by a closing parenthesis. Example: I), II), III), ..."), - ANM_ChsPlain ((short) 0x0010), // "Simplified Chinese."), - ANM_ChsPeriod ((short) 0x0011), // "Simplified Chinese with single-byte period."), - ANM_CircleNumDBPlain ((short) 0x0012), // "Double byte circle numbers."), - ANM_CircleNumWDBWhitePlain ((short) 0x0013), // "Wingdings white circle numbers."), - ANM_CircleNumWDBBlackPlain ((short) 0x0014), // "Wingdings black circle numbers."), - ANM_ChtPlain ((short) 0x0015), // "Traditional Chinese."), - ANM_ChtPeriod ((short) 0x0016), // "Traditional Chinese with single-byte period."), - ANM_Arabic1Minus ((short) 0x0017), // "Bidi Arabic 1 (AraAlpha) with ANSI minus symbol."), - ANM_Arabic2Minus ((short) 0x0018), // "Bidi Arabic 2 (AraAbjad) with ANSI minus symbol."), - ANM_Hebrew2Minus ((short) 0x0019), // "Bidi Hebrew 2 with ANSI minus symbol."), - ANM_JpnKorPlain ((short) 0x001A), // "Japanese/Korean."), - ANM_JpnKorPeriod ((short) 0x001B), // "Japanese/Korean with single-byte period."), - ANM_ArabicDbPlain ((short) 0x001C), // "Double-byte Arabic numbers."), - ANM_ArabicDbPeriod ((short) 0x001D), // "Double-byte Arabic numbers with double-byte period."), - ANM_ThaiAlphaPeriod ((short) 0x001E), // "Thai alphabetic character followed by a period."), - ANM_ThaiAlphaParenRight ((short) 0x001F), // "Thai alphabetic character followed by a closing parenthesis."), - ANM_ThaiAlphaParenBoth ((short) 0x0020), // "Thai alphabetic character enclosed by parentheses."), - ANM_ThaiNumPeriod ((short) 0x0021), // "Thai numeral followed by a period."), - ANM_ThaiNumParenRight ((short) 0x0022), // "Thai numeral followed by a closing parenthesis."), - ANM_ThaiNumParenBoth ((short) 0x0023), // "Thai numeral enclosed in parentheses."), - ANM_HindiAlphaPeriod ((short) 0x0024), // "Hindi alphabetic character followed by a period."), - ANM_HindiNumPeriod ((short) 0x0025), // "Hindi numeric character followed by a period."), - ANM_JpnChsDBPeriod ((short) 0x0026), // "Japanese with double-byte period."), - ANM_HindiNumParenRight ((short) 0x0027), // "Hindi numeric character followed by a closing parenthesis."), - ANM_HindiAlpha1Period ((short) 0x0028); // "Hindi alphabetic character followed by a period."); - - private final short value; - private TextAutoNumberSchemeEnum(final short code) { - this.value = code; - } - private short getValue() { return value; } - public String getDescription() { - return TextAutoNumberSchemeEnum.getDescription(this); - } - public static String getDescription(final TextAutoNumberSchemeEnum code) { - switch (code) { - case ANM_AlphaLcPeriod : return "Lowercase Latin character followed by a period. Example: a., b., c., ..."; - case ANM_AlphaUcPeriod : return "Uppercase Latin character followed by a period. Example: A., B., C., ..."; - case ANM_ArabicParenRight : return "Arabic numeral followed by a closing parenthesis. Example: 1), 2), 3), ..."; - case ANM_ArabicPeriod : return "Arabic numeral followed by a period. Example: 1., 2., 3., ..."; - case ANM_RomanLcParenBoth : return "Lowercase Roman numeral enclosed in parentheses. Example: (i), (ii), (iii), ..."; - case ANM_RomanLcParenRight : return "Lowercase Roman numeral followed by a closing parenthesis. Example: i), ii), iii), ..."; - case ANM_RomanLcPeriod : return "Lowercase Roman numeral followed by a period. Example: i., ii., iii., ..."; - case ANM_RomanUcPeriod : return "Uppercase Roman numeral followed by a period. Example: I., II., III., ..."; - case ANM_AlphaLcParenBoth : return "Lowercase alphabetic character enclosed in parentheses. Example: (a), (b), (c), ..."; - case ANM_AlphaLcParenRight : return "Lowercase alphabetic character followed by a closing parenthesis. Example: a), b), c), ..."; - case ANM_AlphaUcParenBoth : return "Uppercase alphabetic character enclosed in parentheses. Example: (A), (B), (C), ..."; - case ANM_AlphaUcParenRight : return "Uppercase alphabetic character followed by a closing parenthesis. Example: A), B), C), ..."; - case ANM_ArabicParenBoth : return "Arabic numeral enclosed in parentheses. Example: (1), (2), (3), ..."; - case ANM_ArabicPlain : return "Arabic numeral. Example: 1, 2, 3, ..."; - case ANM_RomanUcParenBoth : return "Uppercase Roman numeral enclosed in parentheses. Example: (I), (II), (III), ..."; - case ANM_RomanUcParenRight : return "Uppercase Roman numeral followed by a closing parenthesis. Example: I), II), III), ..."; - case ANM_ChsPlain : return "Simplified Chinese."; - case ANM_ChsPeriod : return "Simplified Chinese with single-byte period."; - case ANM_CircleNumDBPlain : return "Double byte circle numbers."; - case ANM_CircleNumWDBWhitePlain : return "Wingdings white circle numbers."; - case ANM_CircleNumWDBBlackPlain : return "Wingdings black circle numbers."; - case ANM_ChtPlain : return "Traditional Chinese."; - case ANM_ChtPeriod : return "Traditional Chinese with single-byte period."; - case ANM_Arabic1Minus : return "Bidi Arabic 1 (AraAlpha) with ANSI minus symbol."; - case ANM_Arabic2Minus : return "Bidi Arabic 2 (AraAbjad) with ANSI minus symbol."; - case ANM_Hebrew2Minus : return "Bidi Hebrew 2 with ANSI minus symbol."; - case ANM_JpnKorPlain : return "Japanese/Korean."; - case ANM_JpnKorPeriod : return "Japanese/Korean with single-byte period."; - case ANM_ArabicDbPlain : return "Double-byte Arabic numbers."; - case ANM_ArabicDbPeriod : return "Double-byte Arabic numbers with double-byte period."; - case ANM_ThaiAlphaPeriod : return "Thai alphabetic character followed by a period."; - case ANM_ThaiAlphaParenRight : return "Thai alphabetic character followed by a closing parenthesis."; - case ANM_ThaiAlphaParenBoth : return "Thai alphabetic character enclosed by parentheses."; - case ANM_ThaiNumPeriod : return "Thai numeral followed by a period."; - case ANM_ThaiNumParenRight : return "Thai numeral followed by a closing parenthesis."; - case ANM_ThaiNumParenBoth : return "Thai numeral enclosed in parentheses."; - case ANM_HindiAlphaPeriod : return "Hindi alphabetic character followed by a period."; - case ANM_HindiNumPeriod : return "Hindi numeric character followed by a period."; - case ANM_JpnChsDBPeriod : return "Japanese with double-byte period."; - case ANM_HindiNumParenRight : return "Hindi numeric character followed by a closing parenthesis."; - case ANM_HindiAlpha1Period : return "Hindi alphabetic character followed by a period."; - default : return "Unknown Numbered Scheme"; - } - } - public static TextAutoNumberSchemeEnum valueOf(short autoNumberScheme) { - for (TextAutoNumberSchemeEnum item: TextAutoNumberSchemeEnum.values()) { - if (autoNumberScheme == item.getValue()) { - return item; - } - } - return null; - } -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java index a68f3a74e9..9288052c66 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java @@ -165,35 +165,32 @@ public abstract class HSLFShape implements Shape { public Rectangle2D getAnchor2D(){ EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); int flags = spRecord.getFlags(); - Rectangle2D anchor; - if ((flags & EscherSpRecord.FLAG_CHILD) != 0){ - EscherChildAnchorRecord rec = getEscherChild(EscherChildAnchorRecord.RECORD_ID); - if(rec == null){ - logger.log(POILogger.WARN, "EscherSpRecord.FLAG_CHILD is set but EscherChildAnchorRecord was not found"); - EscherClientAnchorRecord clrec = getEscherChild(EscherClientAnchorRecord.RECORD_ID); - anchor = new Rectangle2D.Float( - (float)clrec.getCol1()*POINT_DPI/MASTER_DPI, - (float)clrec.getFlag()*POINT_DPI/MASTER_DPI, - (float)(clrec.getDx1()-clrec.getCol1())*POINT_DPI/MASTER_DPI, - (float)(clrec.getRow1()-clrec.getFlag())*POINT_DPI/MASTER_DPI - ); - } else { - anchor = new Rectangle2D.Float( - (float)rec.getDx1()*POINT_DPI/MASTER_DPI, - (float)rec.getDy1()*POINT_DPI/MASTER_DPI, - (float)(rec.getDx2()-rec.getDx1())*POINT_DPI/MASTER_DPI, - (float)(rec.getDy2()-rec.getDy1())*POINT_DPI/MASTER_DPI - ); - } + int x,y,w,h; + EscherChildAnchorRecord childRec = getEscherChild(EscherChildAnchorRecord.RECORD_ID); + boolean useChildRec = ((flags & EscherSpRecord.FLAG_CHILD) != 0); + if (useChildRec && childRec != null){ + x = childRec.getDx1(); + y = childRec.getDy1(); + w = childRec.getDx2()-childRec.getDx1(); + h = childRec.getDy2()-childRec.getDy1(); } else { - EscherClientAnchorRecord rec = getEscherChild(EscherClientAnchorRecord.RECORD_ID); - anchor = new Rectangle2D.Float( - (float)rec.getCol1()*POINT_DPI/MASTER_DPI, - (float)rec.getFlag()*POINT_DPI/MASTER_DPI, - (float)(rec.getDx1()-rec.getCol1())*POINT_DPI/MASTER_DPI, - (float)(rec.getRow1()-rec.getFlag())*POINT_DPI/MASTER_DPI - ); + if (useChildRec) { + logger.log(POILogger.WARN, "EscherSpRecord.FLAG_CHILD is set but EscherChildAnchorRecord was not found"); + } + EscherClientAnchorRecord clientRec = getEscherChild(EscherClientAnchorRecord.RECORD_ID); + x = clientRec.getFlag(); + y = clientRec.getCol1(); + w = clientRec.getDx1()-clientRec.getFlag(); + h = clientRec.getRow1()-clientRec.getCol1(); } + + Rectangle2D anchor = new Rectangle2D.Float( + (float)Units.masterToPoints(x), + (float)Units.masterToPoints(y), + (float)Units.masterToPoints(w), + (float)Units.masterToPoints(h) + ); + return anchor; } @@ -204,21 +201,24 @@ public abstract class HSLFShape implements Shape { * @param anchor new anchor */ public void setAnchor(Rectangle2D anchor){ + int x = Units.pointsToMaster(anchor.getX()); + int y = Units.pointsToMaster(anchor.getY()); + int w = Units.pointsToMaster(anchor.getWidth() + anchor.getX()); + int h = Units.pointsToMaster(anchor.getHeight() + anchor.getY()); EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); int flags = spRecord.getFlags(); if ((flags & EscherSpRecord.FLAG_CHILD) != 0){ EscherChildAnchorRecord rec = (EscherChildAnchorRecord)getEscherChild(EscherChildAnchorRecord.RECORD_ID); - rec.setDx1((int)(anchor.getX()*MASTER_DPI/POINT_DPI)); - rec.setDy1((int)(anchor.getY()*MASTER_DPI/POINT_DPI)); - rec.setDx2((int)((anchor.getWidth() + anchor.getX())*MASTER_DPI/POINT_DPI)); - rec.setDy2((int)((anchor.getHeight() + anchor.getY())*MASTER_DPI/POINT_DPI)); - } - else { + rec.setDx1(x); + rec.setDy1(y); + rec.setDx2(w); + rec.setDy2(h); + } else { EscherClientAnchorRecord rec = (EscherClientAnchorRecord)getEscherChild(EscherClientAnchorRecord.RECORD_ID); - rec.setFlag((short)(anchor.getY()*MASTER_DPI/POINT_DPI)); - rec.setCol1((short)(anchor.getX()*MASTER_DPI/POINT_DPI)); - rec.setDx1((short)(((anchor.getWidth() + anchor.getX())*MASTER_DPI/POINT_DPI))); - rec.setRow1((short)(((anchor.getHeight() + anchor.getY())*MASTER_DPI/POINT_DPI))); + rec.setFlag((short)x); + rec.setCol1((short)y); + rec.setDx1((short)w); + rec.setRow1((short)h); } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java index 7e2f6f01a0..5948b40132 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java @@ -20,22 +20,9 @@ package org.apache.poi.hslf.usermodel; import java.util.Iterator; import java.util.List; -import org.apache.poi.ddf.EscherClientDataRecord; -import org.apache.poi.ddf.EscherContainerRecord; -import org.apache.poi.ddf.EscherOptRecord; -import org.apache.poi.ddf.EscherProperties; -import org.apache.poi.ddf.EscherProperty; -import org.apache.poi.ddf.EscherPropertyFactory; -import org.apache.poi.ddf.EscherRecord; -import org.apache.poi.ddf.EscherSimpleProperty; -import org.apache.poi.ddf.EscherSpRecord; +import org.apache.poi.ddf.*; import org.apache.poi.hslf.model.*; -import org.apache.poi.hslf.record.InteractiveInfo; -import org.apache.poi.hslf.record.InteractiveInfoAtom; -import org.apache.poi.hslf.record.OEShapeAtom; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.RecordTypes; -import org.apache.poi.hslf.usermodel.*; +import org.apache.poi.hslf.record.*; import org.apache.poi.sl.usermodel.ShapeContainer; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.POILogFactory; @@ -116,16 +103,15 @@ public final class HSLFShapeFactory { break; } case LINE: -// shape = new Line(spContainer, parent); -// break; + shape = new Line(spContainer, parent); + break; case NOT_PRIMITIVE: { EscherOptRecord opt = HSLFShape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID); EscherProperty prop = HSLFShape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES); if(prop != null) shape = new HSLFFreeformShape(spContainer, parent); else { - - logger.log(POILogger.WARN, "Creating AutoShape for a NotPrimitive shape"); + logger.log(POILogger.INFO, "Creating AutoShape for a NotPrimitive shape"); shape = new HSLFAutoShape(spContainer, parent); } break; diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java index 0247a75936..d0c594fd81 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java @@ -275,15 +275,7 @@ public abstract class HSLFSheet implements Sheet { PPDrawing ppdrawing = getPPDrawing(); EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; - EscherContainerRecord spContainer = null; - - for (Iterator it = dg.getChildIterator(); it.hasNext();) { - EscherRecord rec = it.next(); - if (rec.getRecordId() == EscherContainerRecord.SP_CONTAINER) { - spContainer = (EscherContainerRecord) rec; - break; - } - } + EscherContainerRecord spContainer = dg.getChildById(EscherContainerRecord.SP_CONTAINER); _background = new HSLFBackground(spContainer, null); _background.setSheet(this); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java index 5ddf311e52..c90452ddaa 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java @@ -263,7 +263,7 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape { if(r != null && !(r instanceof EscherClientDataRecord)){ byte[] data = r.serialize(); r = new EscherClientDataRecord(); - r.fillFields(data, 0, new DefaultEscherRecordFactory()); + r.fillFields(data, 0, new HSLFEscherRecordFactory()); } _clientData = (EscherClientDataRecord)r; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java index 211bc00c06..8feee2312b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java @@ -17,6 +17,7 @@ package org.apache.poi.hslf.usermodel; +import java.awt.Graphics2D; import java.util.ArrayList; import java.util.List; @@ -24,6 +25,8 @@ import org.apache.poi.ddf.*; import org.apache.poi.hslf.model.*; import org.apache.poi.hslf.record.*; import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet; +import org.apache.poi.sl.draw.DrawFactory; +import org.apache.poi.sl.draw.Drawable; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.sl.usermodel.Slide; @@ -462,6 +465,13 @@ public final class HSLFSlide extends HSLFSheet implements Slide shapeList = getShapeList(); + + Iterator shapeIter = shapeList.iterator(); + while (shapeIter.hasNext()) { + HSLFShape shape = shapeIter.next(); + if (shape instanceof HSLFAutoShape) { + HSLFAutoShape autoShape = (HSLFAutoShape)shape; + EscherTextboxRecord etr = autoShape.getEscherChild(EscherTextboxRecord.RECORD_ID); + if (etr != null) continue; + } + shapeIter.remove(); + } + Collections.sort(shapeList, new Comparator(){ public int compare( HSLFShape o1, HSLFShape o2 ) { Rectangle anchor1 = o1.getAnchor(); Rectangle anchor2 = o2.getAnchor(); int delta = anchor1.y - anchor2.y; - if(delta == 0) delta = anchor1.x - anchor2.x; + if (delta == 0) delta = anchor1.x - anchor2.x; + // descending size + if (delta == 0) delta = (anchor2.width*anchor2.height)-(anchor1.width*anchor1.height); return delta; } }); + int y0 = -1; int maxrowlen = 0; List> lst = new ArrayList>(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index ee99745b5a..386447328b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -27,6 +27,7 @@ import org.apache.poi.hslf.model.PPFont; import org.apache.poi.hslf.model.textproperties.*; import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType; import org.apache.poi.hslf.record.*; +import org.apache.poi.sl.usermodel.AutoNumberingScheme; import org.apache.poi.sl.usermodel.TextParagraph; import org.apache.poi.util.*; @@ -62,7 +63,6 @@ public final class HSLFTextParagraph implements TextParagraph { private HSLFSheet _sheet; private int shapeId; - // private StyleTextPropAtom styleTextPropAtom; private StyleTextProp9Atom styleTextProp9Atom; /** @@ -230,7 +230,8 @@ public final class HSLFTextParagraph implements TextParagraph { int length; for (length = 1; startIdx[0] + length < records.length; length++) { - if (records[startIdx[0]+length] instanceof TextHeaderAtom) break; + Record r = records[startIdx[0]+length]; + if (r instanceof TextHeaderAtom || r instanceof SlidePersistAtom) break; } Record result[] = new Record[length]; @@ -359,27 +360,60 @@ public final class HSLFTextParagraph implements TextParagraph { } } + public AutoNumberingScheme getAutoNumberingScheme() { + if (styleTextProp9Atom == null) return null; + TextPFException9[] ant = styleTextProp9Atom.getAutoNumberTypes(); + int level = getIndentLevel(); + if (ant == null || level >= ant.length) return null; + return ant[level].getAutoNumberScheme(); + } + + public Integer getAutoNumberingStartAt() { + if (styleTextProp9Atom == null) return null; + TextPFException9[] ant = styleTextProp9Atom.getAutoNumberTypes(); + int level = getIndentLevel(); + if (ant == null || level >= ant.length) return null; + Short startAt = ant[level].getAutoNumberStartNumber(); + assert(startAt != null); + return startAt.intValue(); + } + + @Override public BulletStyle getBulletStyle() { - if (!isBullet()) return null; + if (!isBullet() && getAutoNumberingScheme() == null) return null; return new BulletStyle() { + @Override public String getBulletCharacter() { Character chr = HSLFTextParagraph.this.getBulletChar(); return (chr == null || chr == 0) ? "" : "" + chr; } + @Override public String getBulletFont() { return HSLFTextParagraph.this.getBulletFont(); } + @Override public Double getBulletFontSize() { return HSLFTextParagraph.this.getBulletSize(); } + @Override public Color getBulletFontColor() { return HSLFTextParagraph.this.getBulletColor(); } + + @Override + public AutoNumberingScheme getAutoNumberingScheme() { + return HSLFTextParagraph.this.getAutoNumberingScheme(); + } + + @Override + public Integer getAutoNumberingStartAt() { + return HSLFTextParagraph.this.getAutoNumberingStartAt(); + } }; } @@ -392,19 +426,12 @@ public final class HSLFTextParagraph implements TextParagraph { _parentShape = parentShape; } - /** - * - * @return indentation level - */ + @Override public int getIndentLevel() { return _paragraphStyle == null ? 0 : _paragraphStyle.getIndentLevel(); } - /** - * Sets indentation level - * - * @param level indentation level. Must be in the range [0, 4] - */ + @Override public void setIndentLevel(int level) { if( _paragraphStyle != null ) _paragraphStyle.setIndentLevel((short)level); } @@ -471,17 +498,7 @@ public final class HSLFTextParagraph implements TextParagraph { return (_runs.isEmpty()) ? null : _runs.get(0).getFontColor(); } - int rgb = tp.getValue(); - int cidx = rgb >> 24; - if (rgb % 0x1000000 == 0) { - if (_sheet == null) - return null; - ColorSchemeAtom ca = _sheet.getColorScheme(); - if (cidx >= 0 && cidx <= 7) - rgb = ca.getColor(cidx); - } - Color tmp = new Color(rgb, true); - return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); + return getColorFromColorIndexStruct(tp.getValue(), _sheet); } /** @@ -934,7 +951,8 @@ public final class HSLFTextParagraph implements TextParagraph { public static List> findTextParagraphs(PPDrawing ppdrawing, HSLFSheet sheet) { List> runsV = new ArrayList>(); for (EscherTextboxWrapper wrapper : ppdrawing.getTextboxWrappers()) { - runsV.add(findTextParagraphs(wrapper, sheet)); + List p = findTextParagraphs(wrapper, sheet); + if (p != null) runsV.add(p); } return runsV; } @@ -1189,7 +1207,10 @@ public final class HSLFTextParagraph implements TextParagraph { protected static List createEmptyParagraph() { EscherTextboxWrapper wrapper = new EscherTextboxWrapper(); - + return createEmptyParagraph(wrapper); + } + + protected static List createEmptyParagraph(EscherTextboxWrapper wrapper) { TextHeaderAtom tha = new TextHeaderAtom(); tha.setParentRecord(wrapper); wrapper.appendChildRecord(tha); @@ -1217,4 +1238,26 @@ public final class HSLFTextParagraph implements TextParagraph { public EscherTextboxWrapper getTextboxWrapper() { return (EscherTextboxWrapper) _headerAtom.getParentRecord(); } + + protected static Color getColorFromColorIndexStruct(int rgb, HSLFSheet sheet) { + int cidx = rgb >>> 24; + Color tmp; + switch (cidx) { + // Background ... Accent 3 color + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + if (sheet == null) return null; + ColorSchemeAtom ca = sheet.getColorScheme(); + tmp = new Color(ca.getColor(cidx), true); + break; + // Color is an sRGB value specified by red, green, and blue fields. + case 0xFE: + tmp = new Color(rgb, true); + break; + // Color is undefined. + default: + case 0xFF: + return null; + } + return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index bb4f140415..437ed274e9 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -17,14 +17,13 @@ package org.apache.poi.hslf.usermodel; -import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.setPropVal; import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.getPropVal; +import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.setPropVal; import java.awt.Color; import org.apache.poi.hslf.model.textproperties.*; import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType; -import org.apache.poi.hslf.record.ColorSchemeAtom; import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -321,16 +320,8 @@ public final class HSLFTextRun implements TextRun { */ public Color getFontColor() { TextProp tp = getPropVal(characterStyle, "font.color", parentParagraph); - if (tp == null) return null; - int rgb = tp.getValue(); - - int cidx = rgb >> 24; - if (rgb % 0x1000000 == 0){ - ColorSchemeAtom ca = parentParagraph.getSheet().getColorScheme(); - if(cidx >= 0 && cidx <= 7) rgb = ca.getColor(cidx); - } - Color tmp = new Color(rgb, true); - return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); + return (tp == null) ? null + : HSLFTextParagraph.getColorFromColorIndexStruct(tp.getValue(), parentParagraph.getSheet()); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java index b9df58c43a..55222cf474 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java @@ -516,7 +516,7 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape } /** - * @return the TextRun object for this text box + * @return the TextParagraphs for this text box */ public List getTextParagraphs(){ if (!_paragraphs.isEmpty()) return _paragraphs; @@ -527,8 +527,13 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape _txtbox = _paragraphs.get(0).getTextboxWrapper(); } else { _paragraphs = HSLFTextParagraph.findTextParagraphs(_txtbox, getSheet()); - if (_paragraphs == null || _paragraphs.isEmpty()) { - throw new RuntimeException("TextRecord didn't contained any text lines"); + if (_paragraphs == null) { + // there are actually TextBoxRecords without extra data - see #54722 + _paragraphs = HSLFTextParagraph.createEmptyParagraph(_txtbox); + } + + if (_paragraphs.isEmpty()) { + logger.log(POILogger.WARN, "TextRecord didn't contained any text lines"); } // initParagraphsFromSheetRecords(); // if (_paragraphs.isEmpty()) { @@ -553,9 +558,12 @@ public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape // (We can't do it in the constructor because the sheet // is not assigned then, it's only built once we have // all the records) - for (HSLFTextParagraph htp : getTextParagraphs()) { - // Supply the sheet to our child RichTextRuns - htp.supplySheet(_sheet); + List paras = getTextParagraphs(); + if (paras != null) { + for (HSLFTextParagraph htp : paras) { + // Supply the sheet to our child RichTextRuns + htp.supplySheet(_sheet); + } } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java index d3c606a62d..c83abbd5a5 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java @@ -10,8 +10,9 @@ import java.util.*; import org.apache.poi.sl.usermodel.*; import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle; -import org.apache.poi.sl.usermodel.TextRun.TextCap; import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; +import org.apache.poi.sl.usermodel.TextRun.TextCap; +import org.apache.poi.util.Units; public class DrawTextParagraph implements Drawable { protected TextParagraph paragraph; @@ -20,6 +21,7 @@ public class DrawTextParagraph implements Drawable { protected List lines = new ArrayList(); protected String rawText; protected DrawTextFragment bullet; + protected int autoNbrIdx = 0; /** * the highest line in this paragraph. Used for line spacing. @@ -47,6 +49,14 @@ public class DrawTextParagraph implements Drawable { public double getY() { return y; } + + /** + * Sets the auto numbering index of the handled paragraph + * @param index the auto numbering index + */ + public void setAutoNumberingIdx(int index) { + autoNbrIdx = index; + } public void draw(Graphics2D graphics){ if (lines.isEmpty()) return; @@ -56,51 +66,45 @@ public class DrawTextParagraph implements Drawable { double penY = y; boolean firstLine = true; + int indentLevel = paragraph.getIndentLevel(); Double leftMargin = paragraph.getLeftMargin(); - Double indent = paragraph.getIndent(); if (leftMargin == null) { - leftMargin = (indent != null) ? -indent : 0; + // if the marL attribute is omitted, then a value of 347663 is implied + leftMargin = Units.toPoints(347663*(indentLevel+1)); } + Double indent = paragraph.getIndent(); if (indent == null) { - indent = (leftMargin != null) ? -leftMargin : 0; + indent = Units.toPoints(347663*indentLevel); + } + Double rightMargin = paragraph.getRightMargin(); + if (rightMargin == null) { + rightMargin = 0d; } - //The vertical line spacing Double spacing = paragraph.getLineSpacing(); if (spacing == null) spacing = 100d; for(DrawTextFragment line : lines){ - double penX = x + leftMargin; + double penX; if(firstLine) { if (!isEmptyParagraph()) { + // TODO: find out character style for empty, but bulleted/numbered lines bullet = getBullet(graphics, line.getAttributedString().getIterator()); } - if(bullet != null){ - if (indent < 0) { - // a negative value means "Hanging" indentation and - // indicates the position of the actual bullet character. - // (the bullet is shifted to right relative to the text) - bullet.setPosition(penX + indent, penY); - } else if(indent > 0){ - // a positive value means the "First Line" indentation: - // the first line is indented and other lines start at the bullet offset - bullet.setPosition(penX, penY); - penX += indent; - } else { - // a zero indent means that the bullet and text have the same offset - bullet.setPosition(penX, penY); - - // don't let text overlay the bullet and advance by the bullet width - penX += bullet.getLayout().getAdvance() + 1; - } - + if (bullet != null){ + bullet.setPosition(x + indent, penY); bullet.draw(graphics); + // don't let text overlay the bullet and advance by the bullet width + double bulletWidth = bullet.getLayout().getAdvance() + 1; + penX = x + Math.max(leftMargin, indent+bulletWidth); } else { - penX += indent; + penX = x + indent; } + } else { + penX = x + leftMargin; } Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape()); @@ -125,7 +129,7 @@ public class DrawTextParagraph implements Drawable { // If linespacing >= 0, then linespacing is a percentage of normal line height. penY += spacing*0.01* line.getHeight(); } else { - // positive value means absolute spacing in points + // negative value means absolute spacing in points penY += -spacing; } @@ -219,7 +223,13 @@ public class DrawTextParagraph implements Drawable { BulletStyle bulletStyle = paragraph.getBulletStyle(); if (bulletStyle == null) return null; - String buCharacter = bulletStyle.getBulletCharacter(); + String buCharacter; + AutoNumberingScheme ans = bulletStyle.getAutoNumberingScheme(); + if (ans != null) { + buCharacter = ans.format(autoNbrIdx); + } else { + buCharacter = bulletStyle.getBulletCharacter(); + } if (buCharacter == null) return null; String buFont = bulletStyle.getBulletFont(); @@ -314,13 +324,19 @@ public class DrawTextParagraph implements Drawable { Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape()); + int indentLevel = paragraph.getIndentLevel(); Double leftMargin = paragraph.getLeftMargin(); - Double indent = paragraph.getIndent(); if (leftMargin == null) { - leftMargin = (indent != null) ? -indent : 0; + // if the marL attribute is omitted, then a value of 347663 is implied + leftMargin = Units.toPoints(347663*(indentLevel+1)); } + Double indent = paragraph.getIndent(); if (indent == null) { - indent = (leftMargin != null) ? -leftMargin : 0; + indent = Units.toPoints(347663*indentLevel); + } + Double rightMargin = paragraph.getRightMargin(); + if (rightMargin == null) { + rightMargin = 0d; } double width; @@ -329,7 +345,7 @@ public class DrawTextParagraph implements Drawable { // if wordWrap == false then we return the advance to the right border of the sheet width = ts.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX(); } else { - width = anchor.getWidth() - leftInset - rightInset - leftMargin; + width = anchor.getWidth() - leftInset - rightInset - leftMargin - rightMargin; if (firstLine) { if (bullet != null){ if (indent > 0) width -= indent; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java index bb6c6dd29f..2212935115 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java @@ -7,6 +7,7 @@ import java.awt.image.BufferedImage; import java.util.Iterator; import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle; public class DrawTextShape>> extends DrawSimpleShape { @@ -87,9 +88,19 @@ public class DrawTextShape> paragraphs = shape.iterator(); boolean isFirstLine = true; - while (paragraphs.hasNext()){ + for (int autoNbrIdx=0; paragraphs.hasNext(); autoNbrIdx++){ TextParagraph p = paragraphs.next(); DrawTextParagraph dp = fact.getDrawable(p); + BulletStyle bs = p.getBulletStyle(); + if (bs == null || bs.getAutoNumberingScheme() == null) { + autoNbrIdx = -1; + } else { + Integer startAt = bs.getAutoNumberingStartAt(); + if (startAt == null) startAt = 1; + // TODO: handle reset auto number indexes + if (startAt > autoNbrIdx) autoNbrIdx = startAt; + } + dp.setAutoNumberingIdx(autoNbrIdx); dp.setInsets(shapePadding); dp.breakText(graphics); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java index ff07ce7cf2..32ee2a03b0 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -47,17 +43,12 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_AdjPoint2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTAdjPoint2D - implements Locatable -{ +public class CTAdjPoint2D { - @XmlAttribute(name = "x", required = true) + @XmlAttribute(required = true) protected String x; - @XmlAttribute(name = "y", required = true) + @XmlAttribute(required = true) protected String y; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the x property. @@ -115,12 +106,4 @@ public class CTAdjPoint2D return (this.y!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java index ae1482e49d..c5ef7860b6 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java @@ -23,11 +23,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElements; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -54,18 +50,13 @@ import org.xml.sax.Locator; @XmlType(name = "CT_AdjustHandleList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "ahXYOrAhPolar" }) -public class CTAdjustHandleList - implements Locatable -{ +public class CTAdjustHandleList { @XmlElements({ - @XmlElement(name = "ahXY", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTXYAdjustHandle.class), - @XmlElement(name = "ahPolar", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPolarAdjustHandle.class) + @XmlElement(name = "ahPolar", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPolarAdjustHandle.class), + @XmlElement(name = "ahXY", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTXYAdjustHandle.class) }) protected List ahXYOrAhPolar; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the ahXYOrAhPolar property. @@ -85,8 +76,8 @@ public class CTAdjustHandleList * *

    * Objects of the following type(s) are allowed in the list - * {@link CTXYAdjustHandle } * {@link CTPolarAdjustHandle } + * {@link CTXYAdjustHandle } * * */ @@ -105,12 +96,4 @@ public class CTAdjustHandleList this.ahXYOrAhPolar = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAngle.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAngle.java index 77f138790d..2e39602dad 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAngle.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTAngle.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -46,14 +42,10 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_Angle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTAngle implements Locatable -{ +public class CTAngle { - @XmlAttribute(name = "val", required = true) + @XmlAttribute(required = true) protected int val; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the val property. @@ -75,12 +67,4 @@ public class CTAngle implements Locatable return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java index c03c7319da..dd3cca3602 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -55,9 +51,7 @@ import org.xml.sax.Locator; "schemeClr", "prstClr" }) -public class CTColor - implements Locatable -{ +public class CTColor { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTScRgbColor scrgbClr; @@ -71,9 +65,6 @@ public class CTColor protected CTSchemeColor schemeClr; @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTPresetColor prstClr; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the scrgbClr property. @@ -243,12 +234,4 @@ public class CTColor return (this.prstClr!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColorMRU.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColorMRU.java index 2439cc1ba5..fb3e2cc61d 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColorMRU.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColorMRU.java @@ -23,11 +23,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElements; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -53,22 +49,17 @@ import org.xml.sax.Locator; @XmlType(name = "CT_ColorMRU", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "egColorChoice" }) -public class CTColorMRU - implements Locatable -{ +public class CTColorMRU { @XmlElements({ - @XmlElement(name = "scrgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTScRgbColor.class), - @XmlElement(name = "srgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSRgbColor.class), @XmlElement(name = "hslClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTHslColor.class), - @XmlElement(name = "sysClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSystemColor.class), + @XmlElement(name = "srgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSRgbColor.class), @XmlElement(name = "schemeClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSchemeColor.class), - @XmlElement(name = "prstClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPresetColor.class) + @XmlElement(name = "scrgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTScRgbColor.class), + @XmlElement(name = "prstClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPresetColor.class), + @XmlElement(name = "sysClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSystemColor.class) }) protected List egColorChoice; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the egColorChoice property. @@ -88,12 +79,12 @@ public class CTColorMRU * *

    * Objects of the following type(s) are allowed in the list - * {@link CTScRgbColor } - * {@link CTSRgbColor } * {@link CTHslColor } - * {@link CTSystemColor } + * {@link CTSRgbColor } * {@link CTSchemeColor } + * {@link CTScRgbColor } * {@link CTPresetColor } + * {@link CTSystemColor } * * */ @@ -112,12 +103,4 @@ public class CTColorMRU this.egColorChoice = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTComplementTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTComplementTransform.java index 491971549e..dd1a56c0b9 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTComplementTransform.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTComplementTransform.java @@ -19,11 +19,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -44,19 +40,7 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_ComplementTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTComplementTransform implements Locatable -{ +public class CTComplementTransform { - @XmlLocation - @XmlTransient - protected Locator locator; - - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnection.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnection.java index b2c88ae455..4af3fac719 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnection.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnection.java @@ -21,11 +21,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlSchemaType; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -48,18 +44,13 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_Connection", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTConnection - implements Locatable -{ +public class CTConnection { - @XmlAttribute(name = "id", required = true) + @XmlAttribute(required = true) protected long id; - @XmlAttribute(name = "idx", required = true) + @XmlAttribute(required = true) @XmlSchemaType(name = "unsignedInt") protected long idx; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the id property. @@ -101,12 +92,4 @@ public class CTConnection return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSite.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSite.java index c6189d1128..7ec62972dd 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSite.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSite.java @@ -21,11 +21,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,17 +48,12 @@ import org.xml.sax.Locator; @XmlType(name = "CT_ConnectionSite", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "pos" }) -public class CTConnectionSite - implements Locatable -{ +public class CTConnectionSite { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected CTAdjPoint2D pos; - @XmlAttribute(name = "ang", required = true) + @XmlAttribute(required = true) protected String ang; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the pos property. @@ -120,12 +111,4 @@ public class CTConnectionSite return (this.ang!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java index 49e8123993..a3c98898c4 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java @@ -22,11 +22,7 @@ import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,15 +48,10 @@ import org.xml.sax.Locator; @XmlType(name = "CT_ConnectionSiteList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "cxn" }) -public class CTConnectionSiteList - implements Locatable -{ +public class CTConnectionSiteList { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected List cxn; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the cxn property. @@ -99,12 +90,4 @@ public class CTConnectionSiteList this.cxn = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java index 4e43d915c7..d6856ee637 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -60,9 +56,7 @@ import org.xml.sax.Locator; "rect", "pathLst" }) -public class CTCustomGeometry2D - implements Locatable -{ +public class CTCustomGeometry2D { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTGeomGuideList avLst; @@ -76,9 +70,6 @@ public class CTCustomGeometry2D protected CTGeomRect rect; @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected CTPath2DList pathLst; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the avLst property. @@ -248,12 +239,4 @@ public class CTCustomGeometry2D return (this.pathLst!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java index aaef46da9a..94d44ece22 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -48,19 +44,14 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_EmbeddedWAVAudioFile", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTEmbeddedWAVAudioFile - implements Locatable -{ +public class CTEmbeddedWAVAudioFile { - @XmlAttribute(name = "embed", namespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", required = true) + @XmlAttribute(namespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", required = true) protected String embed; - @XmlAttribute(name = "name") + @XmlAttribute protected String name; - @XmlAttribute(name = "builtIn") + @XmlAttribute protected Boolean builtIn; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Embedded Audio File Relationship ID @@ -158,12 +149,4 @@ public class CTEmbeddedWAVAudioFile this.builtIn = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTFixedPercentage.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTFixedPercentage.java index 14bcd3776f..92f41aee89 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTFixedPercentage.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTFixedPercentage.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -46,14 +42,10 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_FixedPercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTFixedPercentage implements Locatable -{ +public class CTFixedPercentage { - @XmlAttribute(name = "val", required = true) + @XmlAttribute(required = true) protected int val; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the val property. @@ -75,12 +67,4 @@ public class CTFixedPercentage implements Locatable return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGammaTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGammaTransform.java index 84e7f3b0e0..7cf6cb195c 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGammaTransform.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGammaTransform.java @@ -19,11 +19,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -44,19 +40,7 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_GammaTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTGammaTransform implements Locatable -{ +public class CTGammaTransform { - @XmlLocation - @XmlTransient - protected Locator locator; - - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuide.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuide.java index e0723d97a2..3df22093ca 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuide.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuide.java @@ -20,13 +20,9 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -49,18 +45,13 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_GeomGuide", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTGeomGuide - implements Locatable -{ +public class CTGeomGuide { - @XmlAttribute(name = "name", required = true) + @XmlAttribute(required = true) @XmlJavaTypeAdapter(CollapsedStringAdapter.class) protected String name; - @XmlAttribute(name = "fmla", required = true) + @XmlAttribute(required = true) protected String fmla; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the name property. @@ -118,12 +109,4 @@ public class CTGeomGuide return (this.fmla!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuideList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuideList.java index d5203d8493..4490933b4f 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuideList.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomGuideList.java @@ -22,11 +22,7 @@ import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,15 +48,10 @@ import org.xml.sax.Locator; @XmlType(name = "CT_GeomGuideList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "gd" }) -public class CTGeomGuideList - implements Locatable -{ +public class CTGeomGuideList { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected List gd; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the gd property. @@ -99,12 +90,4 @@ public class CTGeomGuideList this.gd = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomRect.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomRect.java index f0383f81f8..b1368be295 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomRect.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGeomRect.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -49,21 +45,16 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_GeomRect", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTGeomRect - implements Locatable -{ +public class CTGeomRect { - @XmlAttribute(name = "l", required = true) + @XmlAttribute(required = true) protected String l; - @XmlAttribute(name = "t", required = true) + @XmlAttribute(required = true) protected String t; - @XmlAttribute(name = "r", required = true) + @XmlAttribute(required = true) protected String r; - @XmlAttribute(name = "b", required = true) + @XmlAttribute(required = true) protected String b; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the l property. @@ -177,12 +168,4 @@ public class CTGeomRect return (this.b!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java index ef5ad887f6..643db025a2 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java @@ -19,11 +19,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -44,19 +40,7 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_GrayscaleTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTGrayscaleTransform implements Locatable -{ +public class CTGrayscaleTransform { - @XmlLocation - @XmlTransient - protected Locator locator; - - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java index 15386a230d..6508613b16 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java @@ -21,11 +21,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -60,9 +56,7 @@ import org.xml.sax.Locator; "chOff", "chExt" }) -public class CTGroupTransform2D - implements Locatable -{ +public class CTGroupTransform2D { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTPoint2D off; @@ -72,15 +66,12 @@ public class CTGroupTransform2D protected CTPoint2D chOff; @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTPositiveSize2D chExt; - @XmlAttribute(name = "rot") + @XmlAttribute protected Integer rot; - @XmlAttribute(name = "flipH") + @XmlAttribute protected Boolean flipH; - @XmlAttribute(name = "flipV") + @XmlAttribute protected Boolean flipV; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the off property. @@ -302,12 +293,4 @@ public class CTGroupTransform2D this.flipV = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHslColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHslColor.java index 534a9b3700..c5bca5aeca 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHslColor.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHslColor.java @@ -25,11 +25,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRefs; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -58,49 +54,45 @@ import org.xml.sax.Locator; @XmlType(name = "CT_HslColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "egColorTransform" }) -public class CTHslColor implements Locatable -{ +public class CTHslColor { @XmlElementRefs({ - @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class) }) protected List> egColorTransform; - @XmlAttribute(name = "hue", required = true) + @XmlAttribute(required = true) protected int hue; - @XmlAttribute(name = "sat", required = true) + @XmlAttribute(required = true) protected int sat; - @XmlAttribute(name = "lum", required = true) + @XmlAttribute(required = true) protected int lum; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the egColorTransform property. @@ -120,34 +112,34 @@ public class CTHslColor implements Locatable * *

    * Objects of the following type(s) are allowed in the list - * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * * */ @@ -226,12 +218,4 @@ public class CTHslColor implements Locatable return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHyperlink.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHyperlink.java index 571ff8b646..03e486af5d 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHyperlink.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTHyperlink.java @@ -21,11 +21,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -61,33 +57,28 @@ import org.xml.sax.Locator; "snd", "extLst" }) -public class CTHyperlink - implements Locatable -{ +public class CTHyperlink { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTEmbeddedWAVAudioFile snd; @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTOfficeArtExtensionList extLst; - @XmlAttribute(name = "id", namespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships") + @XmlAttribute(namespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships") protected String id; - @XmlAttribute(name = "invalidUrl") + @XmlAttribute protected String invalidUrl; - @XmlAttribute(name = "action") + @XmlAttribute protected String action; - @XmlAttribute(name = "tgtFrame") + @XmlAttribute protected String tgtFrame; - @XmlAttribute(name = "tooltip") + @XmlAttribute protected String tooltip; - @XmlAttribute(name = "history") + @XmlAttribute protected Boolean history; - @XmlAttribute(name = "highlightClick") + @XmlAttribute protected Boolean highlightClick; - @XmlAttribute(name = "endSnd") + @XmlAttribute protected Boolean endSnd; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the snd property. @@ -409,12 +400,4 @@ public class CTHyperlink this.endSnd = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java index 091d6e2318..eaff064d70 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java @@ -19,11 +19,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -44,19 +40,7 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_InverseGammaTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTInverseGammaTransform implements Locatable -{ +public class CTInverseGammaTransform { - @XmlLocation - @XmlTransient - protected Locator locator; - - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseTransform.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseTransform.java index e1de7b8b5a..84af625337 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseTransform.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTInverseTransform.java @@ -19,11 +19,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -44,19 +40,7 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_InverseTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTInverseTransform implements Locatable -{ +public class CTInverseTransform { - @XmlLocation - @XmlTransient - protected Locator locator; - - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java index db1831fdf1..adb928fbe1 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java @@ -22,14 +22,10 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAnyElement; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlSchemaType; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; import org.w3c.dom.Element; -import org.xml.sax.Locator; /** @@ -56,27 +52,22 @@ import org.xml.sax.Locator; @XmlType(name = "CT_OfficeArtExtension", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "any" }) -public class CTOfficeArtExtension - implements Locatable -{ +public class CTOfficeArtExtension { @XmlAnyElement(lax = true) protected Object any; - @XmlAttribute(name = "uri") + @XmlAttribute @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "token") protected String uri; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the any property. * * @return * possible object is - * {@link Object } * {@link Element } + * {@link Object } * */ public Object getAny() { @@ -88,8 +79,8 @@ public class CTOfficeArtExtension * * @param value * allowed object is - * {@link Object } * {@link Element } + * {@link Object } * */ public void setAny(Object value) { @@ -128,12 +119,4 @@ public class CTOfficeArtExtension return (this.uri!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java index fc806911f0..f0b54cb180 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java @@ -22,11 +22,7 @@ import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,15 +48,10 @@ import org.xml.sax.Locator; @XmlType(name = "CT_OfficeArtExtensionList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "ext" }) -public class CTOfficeArtExtensionList - implements Locatable -{ +public class CTOfficeArtExtensionList { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected List ext; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the ext property. @@ -99,12 +90,4 @@ public class CTOfficeArtExtensionList this.ext = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2D.java index bcba3c8c8e..84b919843c 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2D.java @@ -24,11 +24,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElements; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -64,32 +60,27 @@ import org.xml.sax.Locator; @XmlType(name = "CT_Path2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "closeOrMoveToOrLnTo" }) -public class CTPath2D - implements Locatable -{ +public class CTPath2D { @XmlElements({ - @XmlElement(name = "close", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DClose.class), @XmlElement(name = "moveTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DMoveTo.class), - @XmlElement(name = "lnTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DLineTo.class), - @XmlElement(name = "arcTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DArcTo.class), @XmlElement(name = "quadBezTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DQuadBezierTo.class), - @XmlElement(name = "cubicBezTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DCubicBezierTo.class) + @XmlElement(name = "cubicBezTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DCubicBezierTo.class), + @XmlElement(name = "arcTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DArcTo.class), + @XmlElement(name = "lnTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DLineTo.class), + @XmlElement(name = "close", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DClose.class) }) protected List closeOrMoveToOrLnTo; - @XmlAttribute(name = "w") + @XmlAttribute protected Long w; - @XmlAttribute(name = "h") + @XmlAttribute protected Long h; - @XmlAttribute(name = "fill") + @XmlAttribute protected STPathFillMode fill; - @XmlAttribute(name = "stroke") + @XmlAttribute protected Boolean stroke; - @XmlAttribute(name = "extrusionOk") + @XmlAttribute protected Boolean extrusionOk; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the closeOrMoveToOrLnTo property. @@ -109,12 +100,12 @@ public class CTPath2D * *

    * Objects of the following type(s) are allowed in the list - * {@link CTPath2DClose } * {@link CTPath2DMoveTo } - * {@link CTPath2DLineTo } - * {@link CTPath2DArcTo } * {@link CTPath2DQuadBezierTo } * {@link CTPath2DCubicBezierTo } + * {@link CTPath2DArcTo } + * {@link CTPath2DLineTo } + * {@link CTPath2DClose } * * */ @@ -309,12 +300,4 @@ public class CTPath2D this.extrusionOk = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java index 225d87005a..a4c325aa1f 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -49,20 +45,16 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_Path2DArcTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTPath2DArcTo implements Locatable -{ +public class CTPath2DArcTo { @XmlAttribute(name = "wR", required = true) protected String wr; @XmlAttribute(name = "hR", required = true) protected String hr; - @XmlAttribute(name = "stAng", required = true) + @XmlAttribute(required = true) protected String stAng; - @XmlAttribute(name = "swAng", required = true) + @XmlAttribute(required = true) protected String swAng; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the wr property. @@ -176,12 +168,4 @@ public class CTPath2DArcTo implements Locatable return (this.swAng!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DClose.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DClose.java index f8f2514fac..a60f98bb67 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DClose.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DClose.java @@ -19,11 +19,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -44,19 +40,7 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_Path2DClose", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTPath2DClose implements Locatable -{ +public class CTPath2DClose { - @XmlLocation - @XmlTransient - protected Locator locator; - - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java index 0f27b0506a..e1818fa5db 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java @@ -22,11 +22,7 @@ import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,14 +48,10 @@ import org.xml.sax.Locator; @XmlType(name = "CT_Path2DCubicBezierTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "pt" }) -public class CTPath2DCubicBezierTo implements Locatable -{ +public class CTPath2DCubicBezierTo { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected List pt; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the pt property. @@ -98,12 +90,4 @@ public class CTPath2DCubicBezierTo implements Locatable this.pt = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java index 0cfeb7cd64..9c6d1b39a8 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -50,14 +46,10 @@ import org.xml.sax.Locator; @XmlType(name = "CT_Path2DLineTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "pt" }) -public class CTPath2DLineTo implements Locatable -{ +public class CTPath2DLineTo { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected CTAdjPoint2D pt; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the pt property. @@ -87,12 +79,4 @@ public class CTPath2DLineTo implements Locatable return (this.pt!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DList.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DList.java index c190710cf4..cd31a0ba57 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DList.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DList.java @@ -22,11 +22,7 @@ import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,15 +48,10 @@ import org.xml.sax.Locator; @XmlType(name = "CT_Path2DList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "path" }) -public class CTPath2DList - implements Locatable -{ +public class CTPath2DList { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected List path; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the path property. @@ -99,12 +90,4 @@ public class CTPath2DList this.path = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java index 6554a296dc..f5e210f768 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -50,14 +46,10 @@ import org.xml.sax.Locator; @XmlType(name = "CT_Path2DMoveTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "pt" }) -public class CTPath2DMoveTo implements Locatable -{ +public class CTPath2DMoveTo { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected CTAdjPoint2D pt; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the pt property. @@ -87,12 +79,4 @@ public class CTPath2DMoveTo implements Locatable return (this.pt!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java index 4db3737224..b588775245 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java @@ -22,11 +22,7 @@ import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,14 +48,10 @@ import org.xml.sax.Locator; @XmlType(name = "CT_Path2DQuadBezierTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "pt" }) -public class CTPath2DQuadBezierTo implements Locatable -{ +public class CTPath2DQuadBezierTo { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected List pt; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the pt property. @@ -98,12 +90,4 @@ public class CTPath2DQuadBezierTo implements Locatable this.pt = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPercentage.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPercentage.java index 1c07c22d94..7ca8c1fec5 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPercentage.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPercentage.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -46,14 +42,10 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_Percentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTPercentage implements Locatable -{ +public class CTPercentage { - @XmlAttribute(name = "val", required = true) + @XmlAttribute(required = true) protected int val; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the val property. @@ -75,12 +67,4 @@ public class CTPercentage implements Locatable return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint2D.java index a178b26b19..ae87986035 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint2D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint2D.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -47,17 +43,12 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_Point2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTPoint2D - implements Locatable -{ +public class CTPoint2D { - @XmlAttribute(name = "x", required = true) + @XmlAttribute(required = true) protected long x; - @XmlAttribute(name = "y", required = true) + @XmlAttribute(required = true) protected long y; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the x property. @@ -99,12 +90,4 @@ public class CTPoint2D return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint3D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint3D.java index 641ad4611d..e14c6ba4f2 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint3D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPoint3D.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -48,19 +44,14 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_Point3D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTPoint3D - implements Locatable -{ +public class CTPoint3D { - @XmlAttribute(name = "x", required = true) + @XmlAttribute(required = true) protected long x; - @XmlAttribute(name = "y", required = true) + @XmlAttribute(required = true) protected long y; - @XmlAttribute(name = "z", required = true) + @XmlAttribute(required = true) protected long z; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the x property. @@ -122,12 +113,4 @@ public class CTPoint3D return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java index 2c3f9b9923..9547ca9881 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java @@ -21,13 +21,9 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -59,28 +55,24 @@ import org.xml.sax.Locator; @XmlType(name = "CT_PolarAdjustHandle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "pos" }) -public class CTPolarAdjustHandle implements Locatable -{ +public class CTPolarAdjustHandle { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected CTAdjPoint2D pos; - @XmlAttribute(name = "gdRefR") + @XmlAttribute @XmlJavaTypeAdapter(CollapsedStringAdapter.class) protected String gdRefR; - @XmlAttribute(name = "minR") + @XmlAttribute protected String minR; - @XmlAttribute(name = "maxR") + @XmlAttribute protected String maxR; - @XmlAttribute(name = "gdRefAng") + @XmlAttribute @XmlJavaTypeAdapter(CollapsedStringAdapter.class) protected String gdRefAng; - @XmlAttribute(name = "minAng") + @XmlAttribute protected String minAng; - @XmlAttribute(name = "maxAng") + @XmlAttribute protected String maxAng; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the pos property. @@ -278,12 +270,4 @@ public class CTPolarAdjustHandle implements Locatable return (this.maxAng!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java index c544044ae3..94348d9bff 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -46,14 +42,10 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_PositiveFixedAngle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTPositiveFixedAngle implements Locatable -{ +public class CTPositiveFixedAngle { - @XmlAttribute(name = "val", required = true) + @XmlAttribute(required = true) protected int val; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the val property. @@ -75,12 +67,4 @@ public class CTPositiveFixedAngle implements Locatable return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java index 475ae740c0..de659159e1 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -46,14 +42,10 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_PositiveFixedPercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTPositiveFixedPercentage implements Locatable -{ +public class CTPositiveFixedPercentage { - @XmlAttribute(name = "val", required = true) + @XmlAttribute(required = true) protected int val; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the val property. @@ -75,12 +67,4 @@ public class CTPositiveFixedPercentage implements Locatable return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositivePercentage.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositivePercentage.java index 9d7b8b9750..7b377e1444 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositivePercentage.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositivePercentage.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -46,14 +42,10 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_PositivePercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTPositivePercentage implements Locatable -{ +public class CTPositivePercentage { - @XmlAttribute(name = "val", required = true) + @XmlAttribute(required = true) protected int val; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the val property. @@ -75,12 +67,4 @@ public class CTPositivePercentage implements Locatable return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java index f070ab75a6..210fd925a5 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -47,17 +43,12 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_PositiveSize2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTPositiveSize2D - implements Locatable -{ +public class CTPositiveSize2D { - @XmlAttribute(name = "cx", required = true) + @XmlAttribute(required = true) protected long cx; - @XmlAttribute(name = "cy", required = true) + @XmlAttribute(required = true) protected long cy; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the cx property. @@ -99,12 +90,4 @@ public class CTPositiveSize2D return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetColor.java index 5c8d53e107..991d232d03 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetColor.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetColor.java @@ -25,11 +25,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRefs; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -56,45 +52,41 @@ import org.xml.sax.Locator; @XmlType(name = "CT_PresetColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "egColorTransform" }) -public class CTPresetColor implements Locatable -{ +public class CTPresetColor { @XmlElementRefs({ - @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class) }) protected List> egColorTransform; - @XmlAttribute(name = "val") + @XmlAttribute protected STPresetColorVal val; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the egColorTransform property. @@ -114,34 +106,34 @@ public class CTPresetColor implements Locatable * *

    * Objects of the following type(s) are allowed in the list - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} * * */ @@ -188,12 +180,4 @@ public class CTPresetColor implements Locatable return (this.val!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java index 0989d29f07..234bbd95f9 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java @@ -21,11 +21,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,17 +48,12 @@ import org.xml.sax.Locator; @XmlType(name = "CT_PresetGeometry2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "avLst" }) -public class CTPresetGeometry2D - implements Locatable -{ +public class CTPresetGeometry2D { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTGeomGuideList avLst; - @XmlAttribute(name = "prst", required = true) + @XmlAttribute(required = true) protected STShapeType prst; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the avLst property. @@ -120,12 +111,4 @@ public class CTPresetGeometry2D return (this.prst!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetTextShape.java index 77d5e3f251..0a6135fc90 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetTextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTPresetTextShape.java @@ -21,11 +21,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,17 +48,12 @@ import org.xml.sax.Locator; @XmlType(name = "CT_PresetTextShape", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "avLst" }) -public class CTPresetTextShape - implements Locatable -{ +public class CTPresetTextShape { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTGeomGuideList avLst; - @XmlAttribute(name = "prst", required = true) + @XmlAttribute(required = true) protected STTextShapeType prst; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the avLst property. @@ -120,12 +111,4 @@ public class CTPresetTextShape return (this.prst!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRatio.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRatio.java index 3ea12ebe5d..4a61b88cb9 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRatio.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRatio.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -47,17 +43,12 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_Ratio", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTRatio - implements Locatable -{ +public class CTRatio { - @XmlAttribute(name = "n", required = true) + @XmlAttribute(required = true) protected long n; - @XmlAttribute(name = "d", required = true) + @XmlAttribute(required = true) protected long d; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the n property. @@ -99,12 +90,4 @@ public class CTRatio return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRelativeRect.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRelativeRect.java index 7d46b575ac..a8b82c4744 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRelativeRect.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTRelativeRect.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -49,21 +45,16 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_RelativeRect", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTRelativeRect - implements Locatable -{ +public class CTRelativeRect { - @XmlAttribute(name = "l") + @XmlAttribute protected Integer l; - @XmlAttribute(name = "t") + @XmlAttribute protected Integer t; - @XmlAttribute(name = "r") + @XmlAttribute protected Integer r; - @XmlAttribute(name = "b") + @XmlAttribute protected Integer b; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the l property. @@ -209,12 +200,4 @@ public class CTRelativeRect this.b = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSRgbColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSRgbColor.java index d74a3527c3..c48e8370b5 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSRgbColor.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSRgbColor.java @@ -25,13 +25,9 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRefs; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.HexBinaryAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -58,46 +54,42 @@ import org.xml.sax.Locator; @XmlType(name = "CT_SRgbColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "egColorTransform" }) -public class CTSRgbColor implements Locatable -{ +public class CTSRgbColor { @XmlElementRefs({ - @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class) }) protected List> egColorTransform; - @XmlAttribute(name = "val", required = true) + @XmlAttribute(required = true) @XmlJavaTypeAdapter(HexBinaryAdapter.class) protected byte[] val; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the egColorTransform property. @@ -117,34 +109,34 @@ public class CTSRgbColor implements Locatable * *

    * Objects of the following type(s) are allowed in the list - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} - * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * * */ @@ -184,19 +176,11 @@ public class CTSRgbColor implements Locatable * */ public void setVal(byte[] value) { - this.val = value; + this.val = ((byte[]) value); } public boolean isSetVal() { return (this.val!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScRgbColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScRgbColor.java index 80d88ccc60..4168027e0c 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScRgbColor.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScRgbColor.java @@ -25,11 +25,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRefs; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -58,49 +54,45 @@ import org.xml.sax.Locator; @XmlType(name = "CT_ScRgbColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "egColorTransform" }) -public class CTScRgbColor implements Locatable -{ +public class CTScRgbColor { @XmlElementRefs({ - @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class) }) protected List> egColorTransform; - @XmlAttribute(name = "r", required = true) + @XmlAttribute(required = true) protected int r; - @XmlAttribute(name = "g", required = true) + @XmlAttribute(required = true) protected int g; - @XmlAttribute(name = "b", required = true) + @XmlAttribute(required = true) protected int b; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the egColorTransform property. @@ -121,33 +113,33 @@ public class CTScRgbColor implements Locatable *

    * Objects of the following type(s) are allowed in the list * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} * * */ @@ -226,12 +218,4 @@ public class CTScRgbColor implements Locatable return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScale2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScale2D.java index 0f00fd8400..2e8eba1940 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScale2D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTScale2D.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -52,17 +48,12 @@ import org.xml.sax.Locator; "sx", "sy" }) -public class CTScale2D - implements Locatable -{ +public class CTScale2D { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected CTRatio sx; @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected CTRatio sy; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the sx property. @@ -120,12 +111,4 @@ public class CTScale2D return (this.sy!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSchemeColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSchemeColor.java index 078e5793d3..b93a16668a 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSchemeColor.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSchemeColor.java @@ -25,11 +25,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRefs; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -56,45 +52,41 @@ import org.xml.sax.Locator; @XmlType(name = "CT_SchemeColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "egColorTransform" }) -public class CTSchemeColor implements Locatable -{ +public class CTSchemeColor { @XmlElementRefs({ - @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class) }) protected List> egColorTransform; - @XmlAttribute(name = "val", required = true) + @XmlAttribute(required = true) protected STSchemeColorVal val; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the egColorTransform property. @@ -115,32 +107,32 @@ public class CTSchemeColor implements Locatable *

    * Objects of the following type(s) are allowed in the list * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * * @@ -188,12 +180,4 @@ public class CTSchemeColor implements Locatable return (this.val!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSphereCoords.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSphereCoords.java index 4ea585716a..7f03d0dac2 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSphereCoords.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSphereCoords.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -48,19 +44,14 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_SphereCoords", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTSphereCoords - implements Locatable -{ +public class CTSphereCoords { - @XmlAttribute(name = "lat", required = true) + @XmlAttribute(required = true) protected int lat; - @XmlAttribute(name = "lon", required = true) + @XmlAttribute(required = true) protected int lon; - @XmlAttribute(name = "rev", required = true) + @XmlAttribute(required = true) protected int rev; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the lat property. @@ -122,12 +113,4 @@ public class CTSphereCoords return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSystemColor.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSystemColor.java index f91a719507..de94cb2598 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSystemColor.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTSystemColor.java @@ -25,14 +25,10 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRefs; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; import javax.xml.bind.annotation.adapters.HexBinaryAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -60,49 +56,45 @@ import org.xml.sax.Locator; @XmlType(name = "CT_SystemColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "egColorTransform" }) -public class CTSystemColor implements Locatable -{ +public class CTSystemColor { @XmlElementRefs({ - @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false), - @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false) + @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class), + @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class) }) protected List> egColorTransform; - @XmlAttribute(name = "val", required = true) + @XmlAttribute(required = true) @XmlJavaTypeAdapter(CollapsedStringAdapter.class) protected String val; - @XmlAttribute(name = "lastClr") + @XmlAttribute @XmlJavaTypeAdapter(HexBinaryAdapter.class) protected byte[] lastClr; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the egColorTransform property. @@ -122,34 +114,34 @@ public class CTSystemColor implements Locatable * *

    * Objects of the following type(s) are allowed in the list - * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} + * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} + * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTAngle }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} + * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >} * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >} * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >} - * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >} * * */ @@ -217,19 +209,11 @@ public class CTSystemColor implements Locatable * */ public void setLastClr(byte[] value) { - this.lastClr = value; + this.lastClr = ((byte[]) value); } public boolean isSetLastClr() { return (this.lastClr!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTTransform2D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTTransform2D.java index 2ba4704cfa..dd1dcb501e 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTTransform2D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTTransform2D.java @@ -21,11 +21,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -56,23 +52,18 @@ import org.xml.sax.Locator; "off", "ext" }) -public class CTTransform2D - implements Locatable -{ +public class CTTransform2D { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTPoint2D off; @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") protected CTPositiveSize2D ext; - @XmlAttribute(name = "rot") + @XmlAttribute protected Integer rot; - @XmlAttribute(name = "flipH") + @XmlAttribute protected Boolean flipH; - @XmlAttribute(name = "flipV") + @XmlAttribute protected Boolean flipV; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the off property. @@ -238,12 +229,4 @@ public class CTTransform2D this.flipV = null; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTVector3D.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTVector3D.java index 53f4b8e038..d7f744ba6c 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTVector3D.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTVector3D.java @@ -20,11 +20,7 @@ package org.apache.poi.sl.draw.binding; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -48,19 +44,14 @@ import org.xml.sax.Locator; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CT_Vector3D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main") -public class CTVector3D - implements Locatable -{ +public class CTVector3D { - @XmlAttribute(name = "dx", required = true) + @XmlAttribute(required = true) protected long dx; - @XmlAttribute(name = "dy", required = true) + @XmlAttribute(required = true) protected long dy; - @XmlAttribute(name = "dz", required = true) + @XmlAttribute(required = true) protected long dz; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the dx property. @@ -122,12 +113,4 @@ public class CTVector3D return true; } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java index e316f77832..2b22a58814 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java @@ -21,13 +21,9 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import com.sun.xml.internal.bind.Locatable; -import com.sun.xml.internal.bind.annotation.XmlLocation; -import org.xml.sax.Locator; /** @@ -59,28 +55,24 @@ import org.xml.sax.Locator; @XmlType(name = "CT_XYAdjustHandle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = { "pos" }) -public class CTXYAdjustHandle implements Locatable -{ +public class CTXYAdjustHandle { @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true) protected CTAdjPoint2D pos; - @XmlAttribute(name = "gdRefX") + @XmlAttribute @XmlJavaTypeAdapter(CollapsedStringAdapter.class) protected String gdRefX; - @XmlAttribute(name = "minX") + @XmlAttribute protected String minX; - @XmlAttribute(name = "maxX") + @XmlAttribute protected String maxX; - @XmlAttribute(name = "gdRefY") + @XmlAttribute @XmlJavaTypeAdapter(CollapsedStringAdapter.class) protected String gdRefY; - @XmlAttribute(name = "minY") + @XmlAttribute protected String minY; - @XmlAttribute(name = "maxY") + @XmlAttribute protected String maxY; - @XmlLocation - @XmlTransient - protected Locator locator; /** * Gets the value of the pos property. @@ -278,12 +270,4 @@ public class CTXYAdjustHandle implements Locatable return (this.maxY!= null); } - public Locator sourceLocation() { - return locator; - } - - public void setSourceLocation(Locator newLocator) { - locator = newLocator; - } - } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/binding/ObjectFactory.java b/src/scratchpad/src/org/apache/poi/sl/draw/binding/ObjectFactory.java index d5c0d65f81..c8c8c19d87 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/binding/ObjectFactory.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/binding/ObjectFactory.java @@ -40,34 +40,34 @@ import javax.xml.namespace.QName; @XmlRegistry public class ObjectFactory { - private final static QName _CTHslColorAlpha_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alpha"); - private final static QName _CTHslColorLum_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lum"); - private final static QName _CTHslColorGamma_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "gamma"); - private final static QName _CTHslColorInvGamma_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "invGamma"); - private final static QName _CTHslColorAlphaMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alphaMod"); - private final static QName _CTHslColorRedOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "redOff"); - private final static QName _CTHslColorAlphaOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alphaOff"); - private final static QName _CTHslColorGreenOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "greenOff"); - private final static QName _CTHslColorHue_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hue"); - private final static QName _CTHslColorRedMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "redMod"); - private final static QName _CTHslColorSatOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "satOff"); - private final static QName _CTHslColorGreenMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "greenMod"); - private final static QName _CTHslColorSat_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "sat"); - private final static QName _CTHslColorBlue_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blue"); - private final static QName _CTHslColorRed_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "red"); - private final static QName _CTHslColorSatMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "satMod"); - private final static QName _CTHslColorBlueMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blueMod"); - private final static QName _CTHslColorHueOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hueOff"); - private final static QName _CTHslColorShade_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "shade"); - private final static QName _CTHslColorLumMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lumMod"); - private final static QName _CTHslColorInv_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "inv"); - private final static QName _CTHslColorLumOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lumOff"); - private final static QName _CTHslColorTint_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tint"); - private final static QName _CTHslColorGreen_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "green"); - private final static QName _CTHslColorComp_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "comp"); - private final static QName _CTHslColorBlueOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blueOff"); - private final static QName _CTHslColorHueMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hueMod"); - private final static QName _CTHslColorGray_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "gray"); + private final static QName _CTScRgbColorAlpha_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alpha"); + private final static QName _CTScRgbColorLum_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lum"); + private final static QName _CTScRgbColorGamma_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "gamma"); + private final static QName _CTScRgbColorInvGamma_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "invGamma"); + private final static QName _CTScRgbColorAlphaMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alphaMod"); + private final static QName _CTScRgbColorRedOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "redOff"); + private final static QName _CTScRgbColorAlphaOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alphaOff"); + private final static QName _CTScRgbColorGreenOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "greenOff"); + private final static QName _CTScRgbColorRedMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "redMod"); + private final static QName _CTScRgbColorHue_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hue"); + private final static QName _CTScRgbColorSatOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "satOff"); + private final static QName _CTScRgbColorGreenMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "greenMod"); + private final static QName _CTScRgbColorSat_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "sat"); + private final static QName _CTScRgbColorBlue_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blue"); + private final static QName _CTScRgbColorRed_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "red"); + private final static QName _CTScRgbColorSatMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "satMod"); + private final static QName _CTScRgbColorHueOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hueOff"); + private final static QName _CTScRgbColorBlueMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blueMod"); + private final static QName _CTScRgbColorShade_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "shade"); + private final static QName _CTScRgbColorLumMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lumMod"); + private final static QName _CTScRgbColorInv_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "inv"); + private final static QName _CTScRgbColorLumOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lumOff"); + private final static QName _CTScRgbColorTint_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tint"); + private final static QName _CTScRgbColorGreen_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "green"); + private final static QName _CTScRgbColorComp_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "comp"); + private final static QName _CTScRgbColorBlueOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blueOff"); + private final static QName _CTScRgbColorHueMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hueMod"); + private final static QName _CTScRgbColorGray_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "gray"); /** * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.poi.sl.draw.binding @@ -77,155 +77,19 @@ public class ObjectFactory { } /** - * Create an instance of {@link CTPath2DQuadBezierTo } + * Create an instance of {@link CTOfficeArtExtensionList } * */ - public CTPath2DQuadBezierTo createCTPath2DQuadBezierTo() { - return new CTPath2DQuadBezierTo(); + public CTOfficeArtExtensionList createCTOfficeArtExtensionList() { + return new CTOfficeArtExtensionList(); } /** - * Create an instance of {@link CTCustomGeometry2D } + * Create an instance of {@link CTPresetGeometry2D } * */ - public CTCustomGeometry2D createCTCustomGeometry2D() { - return new CTCustomGeometry2D(); - } - - /** - * Create an instance of {@link CTPolarAdjustHandle } - * - */ - public CTPolarAdjustHandle createCTPolarAdjustHandle() { - return new CTPolarAdjustHandle(); - } - - /** - * Create an instance of {@link CTPath2DClose } - * - */ - public CTPath2DClose createCTPath2DClose() { - return new CTPath2DClose(); - } - - /** - * Create an instance of {@link CTPoint2D } - * - */ - public CTPoint2D createCTPoint2D() { - return new CTPoint2D(); - } - - /** - * Create an instance of {@link CTInverseTransform } - * - */ - public CTInverseTransform createCTInverseTransform() { - return new CTInverseTransform(); - } - - /** - * Create an instance of {@link CTPercentage } - * - */ - public CTPercentage createCTPercentage() { - return new CTPercentage(); - } - - /** - * Create an instance of {@link CTSystemColor } - * - */ - public CTSystemColor createCTSystemColor() { - return new CTSystemColor(); - } - - /** - * Create an instance of {@link CTConnectionSite } - * - */ - public CTConnectionSite createCTConnectionSite() { - return new CTConnectionSite(); - } - - /** - * Create an instance of {@link CTColor } - * - */ - public CTColor createCTColor() { - return new CTColor(); - } - - /** - * Create an instance of {@link CTPositiveFixedAngle } - * - */ - public CTPositiveFixedAngle createCTPositiveFixedAngle() { - return new CTPositiveFixedAngle(); - } - - /** - * Create an instance of {@link CTFixedPercentage } - * - */ - public CTFixedPercentage createCTFixedPercentage() { - return new CTFixedPercentage(); - } - - /** - * Create an instance of {@link CTHslColor } - * - */ - public CTHslColor createCTHslColor() { - return new CTHslColor(); - } - - /** - * Create an instance of {@link CTConnection } - * - */ - public CTConnection createCTConnection() { - return new CTConnection(); - } - - /** - * Create an instance of {@link CTPath2DLineTo } - * - */ - public CTPath2DLineTo createCTPath2DLineTo() { - return new CTPath2DLineTo(); - } - - /** - * Create an instance of {@link CTTransform2D } - * - */ - public CTTransform2D createCTTransform2D() { - return new CTTransform2D(); - } - - /** - * Create an instance of {@link CTPositivePercentage } - * - */ - public CTPositivePercentage createCTPositivePercentage() { - return new CTPositivePercentage(); - } - - /** - * Create an instance of {@link CTVector3D } - * - */ - public CTVector3D createCTVector3D() { - return new CTVector3D(); - } - - /** - * Create an instance of {@link CTSphereCoords } - * - */ - public CTSphereCoords createCTSphereCoords() { - return new CTSphereCoords(); + public CTPresetGeometry2D createCTPresetGeometry2D() { + return new CTPresetGeometry2D(); } /** @@ -237,11 +101,123 @@ public class ObjectFactory { } /** - * Create an instance of {@link CTGroupTransform2D } + * Create an instance of {@link CTVector3D } * */ - public CTGroupTransform2D createCTGroupTransform2D() { - return new CTGroupTransform2D(); + public CTVector3D createCTVector3D() { + return new CTVector3D(); + } + + /** + * Create an instance of {@link CTGammaTransform } + * + */ + public CTGammaTransform createCTGammaTransform() { + return new CTGammaTransform(); + } + + /** + * Create an instance of {@link CTColorMRU } + * + */ + public CTColorMRU createCTColorMRU() { + return new CTColorMRU(); + } + + /** + * Create an instance of {@link CTEmbeddedWAVAudioFile } + * + */ + public CTEmbeddedWAVAudioFile createCTEmbeddedWAVAudioFile() { + return new CTEmbeddedWAVAudioFile(); + } + + /** + * Create an instance of {@link CTPath2DQuadBezierTo } + * + */ + public CTPath2DQuadBezierTo createCTPath2DQuadBezierTo() { + return new CTPath2DQuadBezierTo(); + } + + /** + * Create an instance of {@link CTScRgbColor } + * + */ + public CTScRgbColor createCTScRgbColor() { + return new CTScRgbColor(); + } + + /** + * Create an instance of {@link CTPositiveFixedAngle } + * + */ + public CTPositiveFixedAngle createCTPositiveFixedAngle() { + return new CTPositiveFixedAngle(); + } + + /** + * Create an instance of {@link CTGeomGuide } + * + */ + public CTGeomGuide createCTGeomGuide() { + return new CTGeomGuide(); + } + + /** + * Create an instance of {@link CTConnectionSiteList } + * + */ + public CTConnectionSiteList createCTConnectionSiteList() { + return new CTConnectionSiteList(); + } + + /** + * Create an instance of {@link CTPercentage } + * + */ + public CTPercentage createCTPercentage() { + return new CTPercentage(); + } + + /** + * Create an instance of {@link CTPositiveFixedPercentage } + * + */ + public CTPositiveFixedPercentage createCTPositiveFixedPercentage() { + return new CTPositiveFixedPercentage(); + } + + /** + * Create an instance of {@link CTPath2DMoveTo } + * + */ + public CTPath2DMoveTo createCTPath2DMoveTo() { + return new CTPath2DMoveTo(); + } + + /** + * Create an instance of {@link CTPath2DList } + * + */ + public CTPath2DList createCTPath2DList() { + return new CTPath2DList(); + } + + /** + * Create an instance of {@link CTCustomGeometry2D } + * + */ + public CTCustomGeometry2D createCTCustomGeometry2D() { + return new CTCustomGeometry2D(); + } + + /** + * Create an instance of {@link CTConnectionSite } + * + */ + public CTConnectionSite createCTConnectionSite() { + return new CTConnectionSite(); } /** @@ -252,6 +228,38 @@ public class ObjectFactory { return new CTGrayscaleTransform(); } + /** + * Create an instance of {@link CTInverseTransform } + * + */ + public CTInverseTransform createCTInverseTransform() { + return new CTInverseTransform(); + } + + /** + * Create an instance of {@link CTPositiveSize2D } + * + */ + public CTPositiveSize2D createCTPositiveSize2D() { + return new CTPositiveSize2D(); + } + + /** + * Create an instance of {@link CTRelativeRect } + * + */ + public CTRelativeRect createCTRelativeRect() { + return new CTRelativeRect(); + } + + /** + * Create an instance of {@link CTPolarAdjustHandle } + * + */ + public CTPolarAdjustHandle createCTPolarAdjustHandle() { + return new CTPolarAdjustHandle(); + } + /** * Create an instance of {@link CTRatio } * @@ -261,27 +269,43 @@ public class ObjectFactory { } /** - * Create an instance of {@link CTSRgbColor } + * Create an instance of {@link CTInverseGammaTransform } * */ - public CTSRgbColor createCTSRgbColor() { - return new CTSRgbColor(); + public CTInverseGammaTransform createCTInverseGammaTransform() { + return new CTInverseGammaTransform(); } /** - * Create an instance of {@link CTGeomGuideList } + * Create an instance of {@link CTGroupTransform2D } * */ - public CTGeomGuideList createCTGeomGuideList() { - return new CTGeomGuideList(); + public CTGroupTransform2D createCTGroupTransform2D() { + return new CTGroupTransform2D(); } /** - * Create an instance of {@link CTComplementTransform } + * Create an instance of {@link CTGeomRect } * */ - public CTComplementTransform createCTComplementTransform() { - return new CTComplementTransform(); + public CTGeomRect createCTGeomRect() { + return new CTGeomRect(); + } + + /** + * Create an instance of {@link CTSystemColor } + * + */ + public CTSystemColor createCTSystemColor() { + return new CTSystemColor(); + } + + /** + * Create an instance of {@link CTAdjPoint2D } + * + */ + public CTAdjPoint2D createCTAdjPoint2D() { + return new CTAdjPoint2D(); } /** @@ -293,19 +317,131 @@ public class ObjectFactory { } /** - * Create an instance of {@link CTXYAdjustHandle } + * Create an instance of {@link CTPath2DArcTo } * */ - public CTXYAdjustHandle createCTXYAdjustHandle() { - return new CTXYAdjustHandle(); + public CTPath2DArcTo createCTPath2DArcTo() { + return new CTPath2DArcTo(); } /** - * Create an instance of {@link CTPresetColor } + * Create an instance of {@link CTGeomGuideList } * */ - public CTPresetColor createCTPresetColor() { - return new CTPresetColor(); + public CTGeomGuideList createCTGeomGuideList() { + return new CTGeomGuideList(); + } + + /** + * Create an instance of {@link CTAdjustHandleList } + * + */ + public CTAdjustHandleList createCTAdjustHandleList() { + return new CTAdjustHandleList(); + } + + /** + * Create an instance of {@link CTPath2DClose } + * + */ + public CTPath2DClose createCTPath2DClose() { + return new CTPath2DClose(); + } + + /** + * Create an instance of {@link CTPresetTextShape } + * + */ + public CTPresetTextShape createCTPresetTextShape() { + return new CTPresetTextShape(); + } + + /** + * Create an instance of {@link CTConnection } + * + */ + public CTConnection createCTConnection() { + return new CTConnection(); + } + + /** + * Create an instance of {@link CTSRgbColor } + * + */ + public CTSRgbColor createCTSRgbColor() { + return new CTSRgbColor(); + } + + /** + * Create an instance of {@link CTPositivePercentage } + * + */ + public CTPositivePercentage createCTPositivePercentage() { + return new CTPositivePercentage(); + } + + /** + * Create an instance of {@link CTComplementTransform } + * + */ + public CTComplementTransform createCTComplementTransform() { + return new CTComplementTransform(); + } + + /** + * Create an instance of {@link CTScale2D } + * + */ + public CTScale2D createCTScale2D() { + return new CTScale2D(); + } + + /** + * Create an instance of {@link CTFixedPercentage } + * + */ + public CTFixedPercentage createCTFixedPercentage() { + return new CTFixedPercentage(); + } + + /** + * Create an instance of {@link CTPoint2D } + * + */ + public CTPoint2D createCTPoint2D() { + return new CTPoint2D(); + } + + /** + * Create an instance of {@link CTColor } + * + */ + public CTColor createCTColor() { + return new CTColor(); + } + + /** + * Create an instance of {@link CTPoint3D } + * + */ + public CTPoint3D createCTPoint3D() { + return new CTPoint3D(); + } + + /** + * Create an instance of {@link CTHslColor } + * + */ + public CTHslColor createCTHslColor() { + return new CTHslColor(); + } + + /** + * Create an instance of {@link CTTransform2D } + * + */ + public CTTransform2D createCTTransform2D() { + return new CTTransform2D(); } /** @@ -325,59 +461,19 @@ public class ObjectFactory { } /** - * Create an instance of {@link CTConnectionSiteList } + * Create an instance of {@link CTSphereCoords } * */ - public CTConnectionSiteList createCTConnectionSiteList() { - return new CTConnectionSiteList(); + public CTSphereCoords createCTSphereCoords() { + return new CTSphereCoords(); } /** - * Create an instance of {@link CTPath2DArcTo } + * Create an instance of {@link CTXYAdjustHandle } * */ - public CTPath2DArcTo createCTPath2DArcTo() { - return new CTPath2DArcTo(); - } - - /** - * Create an instance of {@link CTPath2DList } - * - */ - public CTPath2DList createCTPath2DList() { - return new CTPath2DList(); - } - - /** - * Create an instance of {@link CTAngle } - * - */ - public CTAngle createCTAngle() { - return new CTAngle(); - } - - /** - * Create an instance of {@link CTScale2D } - * - */ - public CTScale2D createCTScale2D() { - return new CTScale2D(); - } - - /** - * Create an instance of {@link CTPositiveSize2D } - * - */ - public CTPositiveSize2D createCTPositiveSize2D() { - return new CTPositiveSize2D(); - } - - /** - * Create an instance of {@link CTOfficeArtExtensionList } - * - */ - public CTOfficeArtExtensionList createCTOfficeArtExtensionList() { - return new CTOfficeArtExtensionList(); + public CTXYAdjustHandle createCTXYAdjustHandle() { + return new CTXYAdjustHandle(); } /** @@ -389,1131 +485,27 @@ public class ObjectFactory { } /** - * Create an instance of {@link CTPoint3D } + * Create an instance of {@link CTPath2DLineTo } * */ - public CTPoint3D createCTPoint3D() { - return new CTPoint3D(); + public CTPath2DLineTo createCTPath2DLineTo() { + return new CTPath2DLineTo(); } /** - * Create an instance of {@link CTInverseGammaTransform } + * Create an instance of {@link CTPresetColor } * */ - public CTInverseGammaTransform createCTInverseGammaTransform() { - return new CTInverseGammaTransform(); + public CTPresetColor createCTPresetColor() { + return new CTPresetColor(); } /** - * Create an instance of {@link CTPositiveFixedPercentage } + * Create an instance of {@link CTAngle } * */ - public CTPositiveFixedPercentage createCTPositiveFixedPercentage() { - return new CTPositiveFixedPercentage(); - } - - /** - * Create an instance of {@link CTGeomRect } - * - */ - public CTGeomRect createCTGeomRect() { - return new CTGeomRect(); - } - - /** - * Create an instance of {@link CTPresetTextShape } - * - */ - public CTPresetTextShape createCTPresetTextShape() { - return new CTPresetTextShape(); - } - - /** - * Create an instance of {@link CTColorMRU } - * - */ - public CTColorMRU createCTColorMRU() { - return new CTColorMRU(); - } - - /** - * Create an instance of {@link CTPath2DMoveTo } - * - */ - public CTPath2DMoveTo createCTPath2DMoveTo() { - return new CTPath2DMoveTo(); - } - - /** - * Create an instance of {@link CTEmbeddedWAVAudioFile } - * - */ - public CTEmbeddedWAVAudioFile createCTEmbeddedWAVAudioFile() { - return new CTEmbeddedWAVAudioFile(); - } - - /** - * Create an instance of {@link CTScRgbColor } - * - */ - public CTScRgbColor createCTScRgbColor() { - return new CTScRgbColor(); - } - - /** - * Create an instance of {@link CTPresetGeometry2D } - * - */ - public CTPresetGeometry2D createCTPresetGeometry2D() { - return new CTPresetGeometry2D(); - } - - /** - * Create an instance of {@link CTGeomGuide } - * - */ - public CTGeomGuide createCTGeomGuide() { - return new CTGeomGuide(); - } - - /** - * Create an instance of {@link CTRelativeRect } - * - */ - public CTRelativeRect createCTRelativeRect() { - return new CTRelativeRect(); - } - - /** - * Create an instance of {@link CTAdjustHandleList } - * - */ - public CTAdjustHandleList createCTAdjustHandleList() { - return new CTAdjustHandleList(); - } - - /** - * Create an instance of {@link CTAdjPoint2D } - * - */ - public CTAdjPoint2D createCTAdjPoint2D() { - return new CTAdjPoint2D(); - } - - /** - * Create an instance of {@link CTGammaTransform } - * - */ - public CTGammaTransform createCTGammaTransform() { - return new CTGammaTransform(); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTHslColor.class) - public JAXBElement createCTHslColorAlpha(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTHslColor.class) - public JAXBElement createCTHslColorLum(CTPercentage value) { - return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTHslColor.class) - public JAXBElement createCTHslColorGamma(CTGammaTransform value) { - return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTHslColor.class) - public JAXBElement createCTHslColorInvGamma(CTInverseGammaTransform value) { - return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTHslColor.class) - public JAXBElement createCTHslColorAlphaMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTHslColor.class) - public JAXBElement createCTHslColorRedOff(CTPercentage value) { - return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTHslColor.class) - public JAXBElement createCTHslColorAlphaOff(CTFixedPercentage value) { - return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTHslColor.class) - public JAXBElement createCTHslColorGreenOff(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTHslColor.class) - public JAXBElement createCTHslColorHue(CTPositiveFixedAngle value) { - return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTHslColor.class) - public JAXBElement createCTHslColorRedMod(CTPercentage value) { - return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTHslColor.class) - public JAXBElement createCTHslColorSatOff(CTPercentage value) { - return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTHslColor.class) - public JAXBElement createCTHslColorGreenMod(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTHslColor.class) - public JAXBElement createCTHslColorSat(CTPercentage value) { - return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTHslColor.class) - public JAXBElement createCTHslColorBlue(CTPercentage value) { - return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTHslColor.class) - public JAXBElement createCTHslColorRed(CTPercentage value) { - return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTHslColor.class) - public JAXBElement createCTHslColorSatMod(CTPercentage value) { - return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTHslColor.class) - public JAXBElement createCTHslColorBlueMod(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTHslColor.class) - public JAXBElement createCTHslColorHueOff(CTAngle value) { - return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTHslColor.class) - public JAXBElement createCTHslColorShade(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTHslColor.class) - public JAXBElement createCTHslColorLumMod(CTPercentage value) { - return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTHslColor.class) - public JAXBElement createCTHslColorInv(CTInverseTransform value) { - return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTHslColor.class) - public JAXBElement createCTHslColorLumOff(CTPercentage value) { - return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTHslColor.class) - public JAXBElement createCTHslColorTint(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTHslColor.class) - public JAXBElement createCTHslColorGreen(CTPercentage value) { - return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTHslColor.class) - public JAXBElement createCTHslColorComp(CTComplementTransform value) { - return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTHslColor.class) - public JAXBElement createCTHslColorBlueOff(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTHslColor.class) - public JAXBElement createCTHslColorHueMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTHslColor.class) - public JAXBElement createCTHslColorGray(CTGrayscaleTransform value) { - return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTHslColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorAlpha(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorLum(CTPercentage value) { - return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorGamma(CTGammaTransform value) { - return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorInvGamma(CTInverseGammaTransform value) { - return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorAlphaMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorRedOff(CTPercentage value) { - return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorAlphaOff(CTFixedPercentage value) { - return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorGreenOff(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorHue(CTPositiveFixedAngle value) { - return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorRedMod(CTPercentage value) { - return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorSatOff(CTPercentage value) { - return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorGreenMod(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorSat(CTPercentage value) { - return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorBlue(CTPercentage value) { - return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorRed(CTPercentage value) { - return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorSatMod(CTPercentage value) { - return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorBlueMod(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorHueOff(CTAngle value) { - return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorShade(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorLumMod(CTPercentage value) { - return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorInv(CTInverseTransform value) { - return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorLumOff(CTPercentage value) { - return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorTint(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorGreen(CTPercentage value) { - return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorComp(CTComplementTransform value) { - return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorBlueOff(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorHueMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSRgbColor.class) - public JAXBElement createCTSRgbColorGray(CTGrayscaleTransform value) { - return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTSRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorAlpha(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorLum(CTPercentage value) { - return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorGamma(CTGammaTransform value) { - return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorInvGamma(CTInverseGammaTransform value) { - return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorAlphaMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorRedOff(CTPercentage value) { - return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorAlphaOff(CTFixedPercentage value) { - return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorGreenOff(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorHue(CTPositiveFixedAngle value) { - return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorRedMod(CTPercentage value) { - return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorSatOff(CTPercentage value) { - return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorGreenMod(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorSat(CTPercentage value) { - return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorBlue(CTPercentage value) { - return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorRed(CTPercentage value) { - return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorSatMod(CTPercentage value) { - return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorBlueMod(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorHueOff(CTAngle value) { - return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorShade(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorLumMod(CTPercentage value) { - return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorInv(CTInverseTransform value) { - return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorLumOff(CTPercentage value) { - return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorTint(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorGreen(CTPercentage value) { - return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorComp(CTComplementTransform value) { - return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorBlueOff(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorHueMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSystemColor.class) - public JAXBElement createCTSystemColorGray(CTGrayscaleTransform value) { - return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTSystemColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorAlpha(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorLum(CTPercentage value) { - return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorGamma(CTGammaTransform value) { - return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorInvGamma(CTInverseGammaTransform value) { - return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorAlphaMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorRedOff(CTPercentage value) { - return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorAlphaOff(CTFixedPercentage value) { - return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorGreenOff(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorHue(CTPositiveFixedAngle value) { - return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorRedMod(CTPercentage value) { - return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorSatOff(CTPercentage value) { - return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorGreenMod(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorSat(CTPercentage value) { - return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorBlue(CTPercentage value) { - return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorRed(CTPercentage value) { - return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorSatMod(CTPercentage value) { - return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorBlueMod(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorHueOff(CTAngle value) { - return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorShade(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorLumMod(CTPercentage value) { - return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorInv(CTInverseTransform value) { - return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorLumOff(CTPercentage value) { - return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorTint(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorGreen(CTPercentage value) { - return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorComp(CTComplementTransform value) { - return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorBlueOff(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorHueMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTSchemeColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSchemeColor.class) - public JAXBElement createCTSchemeColorGray(CTGrayscaleTransform value) { - return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTSchemeColor.class, value); + public CTAngle createCTAngle() { + return new CTAngle(); } /** @@ -1522,7 +514,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorAlpha(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value); } /** @@ -1531,7 +523,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorLum(CTPercentage value) { - return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorLum_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1540,7 +532,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorGamma(CTGammaTransform value) { - return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorGamma_QNAME, CTGammaTransform.class, CTScRgbColor.class, value); } /** @@ -1549,7 +541,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorInvGamma(CTInverseGammaTransform value) { - return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTScRgbColor.class, value); } /** @@ -1558,7 +550,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorAlphaMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTScRgbColor.class, value); } /** @@ -1567,7 +559,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorRedOff(CTPercentage value) { - return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorRedOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1576,7 +568,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorAlphaOff(CTFixedPercentage value) { - return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTScRgbColor.class, value); } /** @@ -1585,16 +577,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorGreenOff(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTScRgbColor.class) - public JAXBElement createCTScRgbColorHue(CTPositiveFixedAngle value) { - return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorGreenOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1603,7 +586,16 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorRedMod(CTPercentage value) { - return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorRedMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTScRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTScRgbColor.class, value); } /** @@ -1612,7 +604,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorSatOff(CTPercentage value) { - return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorSatOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1621,7 +613,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorGreenMod(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorGreenMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1630,7 +622,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorSat(CTPercentage value) { - return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorSat_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1639,7 +631,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorBlue(CTPercentage value) { - return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorBlue_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1648,7 +640,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorRed(CTPercentage value) { - return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorRed_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1657,16 +649,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorSatMod(CTPercentage value) { - return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTScRgbColor.class) - public JAXBElement createCTScRgbColorBlueMod(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorSatMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1675,7 +658,16 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorHueOff(CTAngle value) { - return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorHueOff_QNAME, CTAngle.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTScRgbColor.class) + public JAXBElement createCTScRgbColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1684,7 +676,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorShade(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value); } /** @@ -1693,7 +685,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorLumMod(CTPercentage value) { - return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorLumMod_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1702,7 +694,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorInv(CTInverseTransform value) { - return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorInv_QNAME, CTInverseTransform.class, CTScRgbColor.class, value); } /** @@ -1711,7 +703,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorLumOff(CTPercentage value) { - return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorLumOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1720,7 +712,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorTint(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value); } /** @@ -1729,7 +721,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorGreen(CTPercentage value) { - return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorGreen_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1738,7 +730,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorComp(CTComplementTransform value) { - return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorComp_QNAME, CTComplementTransform.class, CTScRgbColor.class, value); } /** @@ -1747,7 +739,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorBlueOff(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorBlueOff_QNAME, CTPercentage.class, CTScRgbColor.class, value); } /** @@ -1756,7 +748,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorHueMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorHueMod_QNAME, CTPositivePercentage.class, CTScRgbColor.class, value); } /** @@ -1765,7 +757,511 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTScRgbColor.class) public JAXBElement createCTScRgbColorGray(CTGrayscaleTransform value) { - return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTScRgbColor.class, value); + return new JAXBElement(_CTScRgbColorGray_QNAME, CTGrayscaleTransform.class, CTScRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTHslColor.class) + public JAXBElement createCTHslColorLum(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLum_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTHslColor.class) + public JAXBElement createCTHslColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTHslColor.class) + public JAXBElement createCTHslColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTScRgbColorGamma_QNAME, CTGammaTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTHslColor.class) + public JAXBElement createCTHslColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTScRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTScRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorRedOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRedOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTScRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreenOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTHslColor.class) + public JAXBElement createCTHslColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTScRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorRedMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRedMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorSatOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSatOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreenMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTHslColor.class) + public JAXBElement createCTHslColorBlue(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlue_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTHslColor.class) + public JAXBElement createCTHslColorSat(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSat_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTHslColor.class) + public JAXBElement createCTHslColorRed(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRed_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorSatMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSatMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorHueOff(CTAngle value) { + return new JAXBElement(_CTScRgbColorHueOff_QNAME, CTAngle.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTHslColor.class) + public JAXBElement createCTHslColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorLumMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLumMod_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTHslColor.class) + public JAXBElement createCTHslColorInv(CTInverseTransform value) { + return new JAXBElement(_CTScRgbColorInv_QNAME, CTInverseTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorLumOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLumOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTHslColor.class) + public JAXBElement createCTHslColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTHslColor.class) + public JAXBElement createCTHslColorGreen(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreen_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTHslColor.class) + public JAXBElement createCTHslColorComp(CTComplementTransform value) { + return new JAXBElement(_CTScRgbColorComp_QNAME, CTComplementTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTHslColor.class) + public JAXBElement createCTHslColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueOff_QNAME, CTPercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTHslColor.class) + public JAXBElement createCTHslColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTScRgbColorHueMod_QNAME, CTPositivePercentage.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTHslColor.class) + public JAXBElement createCTHslColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTScRgbColorGray_QNAME, CTGrayscaleTransform.class, CTHslColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorLum(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLum_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTScRgbColorGamma_QNAME, CTGammaTransform.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTScRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorRedOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRedOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTScRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTScRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreenOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorRedMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRedMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTScRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorSatOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSatOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreenMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorBlue(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlue_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorSat(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSat_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorRed(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRed_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorSatMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSatMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorHueOff(CTAngle value) { + return new JAXBElement(_CTScRgbColorHueOff_QNAME, CTAngle.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorLumMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLumMod_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorInv(CTInverseTransform value) { + return new JAXBElement(_CTScRgbColorInv_QNAME, CTInverseTransform.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorLumOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLumOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGreen(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreen_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorComp(CTComplementTransform value) { + return new JAXBElement(_CTScRgbColorComp_QNAME, CTComplementTransform.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueOff_QNAME, CTPercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTScRgbColorHueMod_QNAME, CTPositivePercentage.class, CTSystemColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSystemColor.class) + public JAXBElement createCTSystemColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTScRgbColorGray_QNAME, CTGrayscaleTransform.class, CTSystemColor.class, value); } /** @@ -1774,7 +1270,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTPresetColor.class) public JAXBElement createCTPresetColorAlpha(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value); } /** @@ -1783,7 +1279,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTPresetColor.class) public JAXBElement createCTPresetColorLum(CTPercentage value) { - return new JAXBElement(_CTHslColorLum_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorLum_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1792,7 +1288,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTPresetColor.class) public JAXBElement createCTPresetColorGamma(CTGammaTransform value) { - return new JAXBElement(_CTHslColorGamma_QNAME, CTGammaTransform.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorGamma_QNAME, CTGammaTransform.class, CTPresetColor.class, value); } /** @@ -1801,7 +1297,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTPresetColor.class) public JAXBElement createCTPresetColorInvGamma(CTInverseGammaTransform value) { - return new JAXBElement(_CTHslColorInvGamma_QNAME, CTInverseGammaTransform.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTPresetColor.class, value); } /** @@ -1810,7 +1306,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTPresetColor.class) public JAXBElement createCTPresetColorAlphaMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorAlphaMod_QNAME, CTPositivePercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTPresetColor.class, value); } /** @@ -1819,7 +1315,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTPresetColor.class) public JAXBElement createCTPresetColorRedOff(CTPercentage value) { - return new JAXBElement(_CTHslColorRedOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorRedOff_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1828,7 +1324,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTPresetColor.class) public JAXBElement createCTPresetColorAlphaOff(CTFixedPercentage value) { - return new JAXBElement(_CTHslColorAlphaOff_QNAME, CTFixedPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTPresetColor.class, value); } /** @@ -1837,7 +1333,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTPresetColor.class) public JAXBElement createCTPresetColorGreenOff(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorGreenOff_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1846,7 +1342,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTPresetColor.class) public JAXBElement createCTPresetColorHue(CTPositiveFixedAngle value) { - return new JAXBElement(_CTHslColorHue_QNAME, CTPositiveFixedAngle.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTPresetColor.class, value); } /** @@ -1855,7 +1351,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTPresetColor.class) public JAXBElement createCTPresetColorRedMod(CTPercentage value) { - return new JAXBElement(_CTHslColorRedMod_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorRedMod_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1864,7 +1360,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTPresetColor.class) public JAXBElement createCTPresetColorSatOff(CTPercentage value) { - return new JAXBElement(_CTHslColorSatOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorSatOff_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1873,7 +1369,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTPresetColor.class) public JAXBElement createCTPresetColorGreenMod(CTPercentage value) { - return new JAXBElement(_CTHslColorGreenMod_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorGreenMod_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1882,7 +1378,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTPresetColor.class) public JAXBElement createCTPresetColorSat(CTPercentage value) { - return new JAXBElement(_CTHslColorSat_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorSat_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1891,7 +1387,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTPresetColor.class) public JAXBElement createCTPresetColorBlue(CTPercentage value) { - return new JAXBElement(_CTHslColorBlue_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorBlue_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1900,7 +1396,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTPresetColor.class) public JAXBElement createCTPresetColorRed(CTPercentage value) { - return new JAXBElement(_CTHslColorRed_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorRed_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1909,16 +1405,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTPresetColor.class) public JAXBElement createCTPresetColorSatMod(CTPercentage value) { - return new JAXBElement(_CTHslColorSatMod_QNAME, CTPercentage.class, CTPresetColor.class, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTPresetColor.class) - public JAXBElement createCTPresetColorBlueMod(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueMod_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorSatMod_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1927,7 +1414,16 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTPresetColor.class) public JAXBElement createCTPresetColorHueOff(CTAngle value) { - return new JAXBElement(_CTHslColorHueOff_QNAME, CTAngle.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorHueOff_QNAME, CTAngle.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTPresetColor.class) + public JAXBElement createCTPresetColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueMod_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1936,7 +1432,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTPresetColor.class) public JAXBElement createCTPresetColorShade(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorShade_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value); } /** @@ -1945,7 +1441,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTPresetColor.class) public JAXBElement createCTPresetColorLumMod(CTPercentage value) { - return new JAXBElement(_CTHslColorLumMod_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorLumMod_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1954,7 +1450,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTPresetColor.class) public JAXBElement createCTPresetColorInv(CTInverseTransform value) { - return new JAXBElement(_CTHslColorInv_QNAME, CTInverseTransform.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorInv_QNAME, CTInverseTransform.class, CTPresetColor.class, value); } /** @@ -1963,7 +1459,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTPresetColor.class) public JAXBElement createCTPresetColorLumOff(CTPercentage value) { - return new JAXBElement(_CTHslColorLumOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorLumOff_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1972,7 +1468,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTPresetColor.class) public JAXBElement createCTPresetColorTint(CTPositiveFixedPercentage value) { - return new JAXBElement(_CTHslColorTint_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value); } /** @@ -1981,7 +1477,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTPresetColor.class) public JAXBElement createCTPresetColorGreen(CTPercentage value) { - return new JAXBElement(_CTHslColorGreen_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorGreen_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -1990,7 +1486,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTPresetColor.class) public JAXBElement createCTPresetColorComp(CTComplementTransform value) { - return new JAXBElement(_CTHslColorComp_QNAME, CTComplementTransform.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorComp_QNAME, CTComplementTransform.class, CTPresetColor.class, value); } /** @@ -1999,7 +1495,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTPresetColor.class) public JAXBElement createCTPresetColorBlueOff(CTPercentage value) { - return new JAXBElement(_CTHslColorBlueOff_QNAME, CTPercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorBlueOff_QNAME, CTPercentage.class, CTPresetColor.class, value); } /** @@ -2008,7 +1504,7 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTPresetColor.class) public JAXBElement createCTPresetColorHueMod(CTPositivePercentage value) { - return new JAXBElement(_CTHslColorHueMod_QNAME, CTPositivePercentage.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorHueMod_QNAME, CTPositivePercentage.class, CTPresetColor.class, value); } /** @@ -2017,7 +1513,511 @@ public class ObjectFactory { */ @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTPresetColor.class) public JAXBElement createCTPresetColorGray(CTGrayscaleTransform value) { - return new JAXBElement(_CTHslColorGray_QNAME, CTGrayscaleTransform.class, CTPresetColor.class, value); + return new JAXBElement(_CTScRgbColorGray_QNAME, CTGrayscaleTransform.class, CTPresetColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorLum(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLum_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTScRgbColorGamma_QNAME, CTGammaTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTScRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTScRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorRedOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRedOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTScRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreenOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorRedMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRedMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTScRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorSatOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSatOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreenMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorBlue(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlue_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorSat(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSat_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorRed(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRed_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorSatMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSatMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorHueOff(CTAngle value) { + return new JAXBElement(_CTScRgbColorHueOff_QNAME, CTAngle.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorLumMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLumMod_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorInv(CTInverseTransform value) { + return new JAXBElement(_CTScRgbColorInv_QNAME, CTInverseTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorLumOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLumOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGreen(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreen_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorComp(CTComplementTransform value) { + return new JAXBElement(_CTScRgbColorComp_QNAME, CTComplementTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueOff_QNAME, CTPercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTScRgbColorHueMod_QNAME, CTPositivePercentage.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSRgbColor.class) + public JAXBElement createCTSRgbColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTScRgbColorGray_QNAME, CTGrayscaleTransform.class, CTSRgbColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorAlpha(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorLum(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLum_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGamma(CTGammaTransform value) { + return new JAXBElement(_CTScRgbColorGamma_QNAME, CTGammaTransform.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorInvGamma(CTInverseGammaTransform value) { + return new JAXBElement(_CTScRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorRedOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRedOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorAlphaMod(CTPositivePercentage value) { + return new JAXBElement(_CTScRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorAlphaOff(CTFixedPercentage value) { + return new JAXBElement(_CTScRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGreenOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreenOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorRedMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRedMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorHue(CTPositiveFixedAngle value) { + return new JAXBElement(_CTScRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorSatOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSatOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGreenMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreenMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorSat(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSat_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorBlue(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlue_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorRed(CTPercentage value) { + return new JAXBElement(_CTScRgbColorRed_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorSatMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorSatMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorBlueMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorHueOff(CTAngle value) { + return new JAXBElement(_CTScRgbColorHueOff_QNAME, CTAngle.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorShade(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorLumMod(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLumMod_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorInv(CTInverseTransform value) { + return new JAXBElement(_CTScRgbColorInv_QNAME, CTInverseTransform.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorLumOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorLumOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorTint(CTPositiveFixedPercentage value) { + return new JAXBElement(_CTScRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGreen(CTPercentage value) { + return new JAXBElement(_CTScRgbColorGreen_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorComp(CTComplementTransform value) { + return new JAXBElement(_CTScRgbColorComp_QNAME, CTComplementTransform.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorBlueOff(CTPercentage value) { + return new JAXBElement(_CTScRgbColorBlueOff_QNAME, CTPercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorHueMod(CTPositivePercentage value) { + return new JAXBElement(_CTScRgbColorHueMod_QNAME, CTPositivePercentage.class, CTSchemeColor.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSchemeColor.class) + public JAXBElement createCTSchemeColorGray(CTGrayscaleTransform value) { + return new JAXBElement(_CTScRgbColorGray_QNAME, CTGrayscaleTransform.class, CTSchemeColor.class, value); } } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoNumberingScheme.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoNumberingScheme.java new file mode 100644 index 0000000000..3a68313499 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/AutoNumberingScheme.java @@ -0,0 +1,287 @@ +/* ==================================================================== + 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.sl.usermodel; + +public enum AutoNumberingScheme { + /** Lowercase alphabetic character enclosed in parentheses. Example: (a), (b), (c), ... */ + alphaLcParenBoth(0x0008, 1), + /** Uppercase alphabetic character enclosed in parentheses. Example: (A), (B), (C), ... */ + alphaUcParenBoth(0x000A, 2), + /** Lowercase alphabetic character followed by a closing parenthesis. Example: a), b), c), ... */ + alphaLcParenRight(0x0009, 3), + /** Uppercase alphabetic character followed by a closing parenthesis. Example: A), B), C), ... */ + alphaUcParenRight(0x000B, 4), + /** Lowercase Latin character followed by a period. Example: a., b., c., ... */ + alphaLcPeriod(0x0000, 5), + /** Uppercase Latin character followed by a period. Example: A., B., C., ... */ + alphaUcPeriod(0x0001, 6), + /** Arabic numeral enclosed in parentheses. Example: (1), (2), (3), ... */ + arabicParenBoth(0x000C, 7), + /** Arabic numeral followed by a closing parenthesis. Example: 1), 2), 3), ... */ + arabicParenRight(0x0002, 8), + /** Arabic numeral followed by a period. Example: 1., 2., 3., ... */ + arabicPeriod(0x0003, 9), + /** Arabic numeral. Example: 1, 2, 3, ... */ + arabicPlain(0x000D, 10), + /** Lowercase Roman numeral enclosed in parentheses. Example: (i), (ii), (iii), ... */ + romanLcParenBoth(0x0004, 11), + /** Uppercase Roman numeral enclosed in parentheses. Example: (I), (II), (III), ... */ + romanUcParenBoth(0x000E, 12), + /** Lowercase Roman numeral followed by a closing parenthesis. Example: i), ii), iii), ... */ + romanLcParenRight(0x0005, 13), + /** Uppercase Roman numeral followed by a closing parenthesis. Example: I), II), III), .... */ + romanUcParenRight(0x000F, 14), + /** Lowercase Roman numeral followed by a period. Example: i., ii., iii., ... */ + romanLcPeriod(0x0006, 15), + /** Uppercase Roman numeral followed by a period. Example: I., II., III., ... */ + romanUcPeriod(0x0007, 16), + /** Double byte circle numbers. */ + circleNumDbPlain(0x0012, 17), + /** Wingdings black circle numbers. */ + circleNumWdBlackPlain(0x0014, 18), + /** Wingdings white circle numbers. */ + circleNumWdWhitePlain(0x0013, 19), + /** Double-byte Arabic numbers with double-byte period. */ + arabicDbPeriod(0x001D, 20), + /** Double-byte Arabic numbers. */ + arabicDbPlain(0x001C, 21), + /** Simplified Chinese with single-byte period. */ + ea1ChsPeriod(0x0011, 22), + /** Simplified Chinese. */ + ea1ChsPlain(0x0010, 23), + /** Traditional Chinese with single-byte period. */ + ea1ChtPeriod(0x0015, 24), + /** Traditional Chinese. */ + ea1ChtPlain(0x0014, 25), + /** Japanese with double-byte period. */ + ea1JpnChsDbPeriod(0x0026, 26), + /** Japanese/Korean. */ + ea1JpnKorPlain(0x001A, 27), + /** Japanese/Korean with single-byte period. */ + ea1JpnKorPeriod(0x001B, 28), + /** Bidi Arabic 1 (AraAlpha) with ANSI minus symbol. */ + arabic1Minus(0x0017, 29), + /** Bidi Arabic 2 (AraAbjad) with ANSI minus symbol. */ + arabic2Minus(0x0018, 30), + /** Bidi Hebrew 2 with ANSI minus symbol. */ + hebrew2Minus(0x0019, 31), + /** Thai alphabetic character followed by a period. */ + thaiAlphaPeriod(0x001E, 32), + /** Thai alphabetic character followed by a closing parenthesis. */ + thaiAlphaParenRight(0x001F, 33), + /** Thai alphabetic character enclosed by parentheses. */ + thaiAlphaParenBoth(0x0020, 34), + /** Thai numeral followed by a period. */ + thaiNumPeriod(0x0021, 35), + /** Thai numeral followed by a closing parenthesis. */ + thaiNumParenRight(0x0022, 36), + /** Thai numeral enclosed in parentheses. */ + thaiNumParenBoth(0x0023, 37), + /** Hindi alphabetic character followed by a period. */ + hindiAlphaPeriod(0x0024, 38), + /** Hindi numeric character followed by a period. */ + hindiNumPeriod(0x0025, 39), + /** Hindi numeric character followed by a closing parenthesis. */ + hindiNumParenRight(0x0027, 40), + /** Hindi alphabetic character followed by a period. */ + hindiAlpha1Period(0x0027, 41); + + public final int nativeId, ooxmlId; + + AutoNumberingScheme(int nativeId, int ooxmlId) { + this.nativeId = nativeId; + this.ooxmlId = ooxmlId; + } + + public static AutoNumberingScheme forNativeID(int nativeId) { + for (AutoNumberingScheme ans : values()) { + if (ans.nativeId == nativeId) return ans; + } + return null; + } + + public static AutoNumberingScheme forOoxmlID(int ooxmlId) { + for (AutoNumberingScheme ans : values()) { + if (ans.ooxmlId == ooxmlId) return ans; + } + return null; + } + + public String getDescription() { + switch (this) { + case alphaLcPeriod : return "Lowercase Latin character followed by a period. Example: a., b., c., ..."; + case alphaUcPeriod : return "Uppercase Latin character followed by a period. Example: A., B., C., ..."; + case arabicParenRight : return "Arabic numeral followed by a closing parenthesis. Example: 1), 2), 3), ..."; + case arabicPeriod : return "Arabic numeral followed by a period. Example: 1., 2., 3., ..."; + case romanLcParenBoth : return "Lowercase Roman numeral enclosed in parentheses. Example: (i), (ii), (iii), ..."; + case romanLcParenRight : return "Lowercase Roman numeral followed by a closing parenthesis. Example: i), ii), iii), ..."; + case romanLcPeriod : return "Lowercase Roman numeral followed by a period. Example: i., ii., iii., ..."; + case romanUcPeriod : return "Uppercase Roman numeral followed by a period. Example: I., II., III., ..."; + case alphaLcParenBoth : return "Lowercase alphabetic character enclosed in parentheses. Example: (a), (b), (c), ..."; + case alphaLcParenRight : return "Lowercase alphabetic character followed by a closing parenthesis. Example: a), b), c), ..."; + case alphaUcParenBoth : return "Uppercase alphabetic character enclosed in parentheses. Example: (A), (B), (C), ..."; + case alphaUcParenRight : return "Uppercase alphabetic character followed by a closing parenthesis. Example: A), B), C), ..."; + case arabicParenBoth : return "Arabic numeral enclosed in parentheses. Example: (1), (2), (3), ..."; + case arabicPlain : return "Arabic numeral. Example: 1, 2, 3, ..."; + case romanUcParenBoth : return "Uppercase Roman numeral enclosed in parentheses. Example: (I), (II), (III), ..."; + case romanUcParenRight : return "Uppercase Roman numeral followed by a closing parenthesis. Example: I), II), III), ..."; + case ea1ChsPlain : return "Simplified Chinese."; + case ea1ChsPeriod : return "Simplified Chinese with single-byte period."; + case circleNumDbPlain : return "Double byte circle numbers."; + case circleNumWdWhitePlain : return "Wingdings white circle numbers."; + case circleNumWdBlackPlain : return "Wingdings black circle numbers."; + case ea1ChtPlain : return "Traditional Chinese."; + case ea1ChtPeriod : return "Traditional Chinese with single-byte period."; + case arabic1Minus : return "Bidi Arabic 1 (AraAlpha) with ANSI minus symbol."; + case arabic2Minus : return "Bidi Arabic 2 (AraAbjad) with ANSI minus symbol."; + case hebrew2Minus : return "Bidi Hebrew 2 with ANSI minus symbol."; + case ea1JpnKorPlain : return "Japanese/Korean."; + case ea1JpnKorPeriod : return "Japanese/Korean with single-byte period."; + case arabicDbPlain : return "Double-byte Arabic numbers."; + case arabicDbPeriod : return "Double-byte Arabic numbers with double-byte period."; + case thaiAlphaPeriod : return "Thai alphabetic character followed by a period."; + case thaiAlphaParenRight : return "Thai alphabetic character followed by a closing parenthesis."; + case thaiAlphaParenBoth : return "Thai alphabetic character enclosed by parentheses."; + case thaiNumPeriod : return "Thai numeral followed by a period."; + case thaiNumParenRight : return "Thai numeral followed by a closing parenthesis."; + case thaiNumParenBoth : return "Thai numeral enclosed in parentheses."; + case hindiAlphaPeriod : return "Hindi alphabetic character followed by a period."; + case hindiNumPeriod : return "Hindi numeric character followed by a period."; + case ea1JpnChsDbPeriod : return "Japanese with double-byte period."; + case hindiNumParenRight : return "Hindi numeric character followed by a closing parenthesis."; + case hindiAlpha1Period : return "Hindi alphabetic character followed by a period."; + default : return "Unknown Numbered Scheme"; + } + } + + public String format(int value) { + String index = formatIndex(value); + String cased = formatCase(index); + String seperated = formatSeperator(cased); + return seperated; + } + + private String formatSeperator(String cased) { + String name = name().toLowerCase(); + if (name.contains("plain")) return cased; + if (name.contains("parenright")) return cased+")"; + if (name.contains("parenboth")) return "("+cased+")"; + if (name.contains("period")) return cased+"."; + if (name.contains("minus")) return cased+"-"; // ??? + return cased; + } + + private String formatCase(String index) { + String name = name().toLowerCase(); + if (name.contains("lc")) return index.toLowerCase(); + if (name.contains("uc")) return index.toUpperCase(); + return index; + } + + private static final String ARABIC_LIST = "0123456789"; + private static final String ALPHA_LIST = "abcdefghijklmnopqrstuvwxyz"; + private static final String WINGDINGS_WHITE_LIST = + "\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089"; + private static final String WINGDINGS_BLACK_LIST = + "\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094"; + private static final String CIRCLE_DB_LIST = + "\u2776\u2777\u2778\u2779\u277A\u277B\u277C\u277D\u277E"; + + private String formatIndex(int value) { + String name = name().toLowerCase(); + if (name.startsWith("roman")) { + return formatRomanIndex(value); + } else if (name.startsWith("arabic") && !name.contains("db")) { + return getIndexedList(value, ARABIC_LIST, false); + } else if (name.startsWith("alpha")) { + return getIndexedList(value, ALPHA_LIST, true); + } else if (name.contains("WdWhite")) { + return (value == 10) ? "\u008A" + : getIndexedList(value, WINGDINGS_WHITE_LIST, false); + } else if (name.contains("WdBlack")) { + return (value == 10) ? "\u0095" + : getIndexedList(value, WINGDINGS_BLACK_LIST, false); + } else if (name.contains("NumDb")) { + return (value == 10) ? "\u277F" + : getIndexedList(value, CIRCLE_DB_LIST, true); + } else { + return "?"; + } + } + + private static String getIndexedList(int val, String list, boolean oneBased) { + StringBuilder sb = new StringBuilder(); + addIndexedChar(val, list, oneBased, sb); + return sb.toString(); + } + + private static void addIndexedChar(int val, String list, boolean oneBased, StringBuilder sb) { + if (oneBased) val -= 1; + final int len = list.length(); + if (val >= len) { + addIndexedChar(val/len, list, oneBased, sb); + } + sb.append(list.charAt(val%len)); + } + + + private String formatRomanIndex(int value) { + //M (1000), CM (900), D (500), CD (400), C (100), XC (90), L (50), XL (40), X (10), IX (9), V (5), IV (4) and I (1). + final int[] VALUES = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; + final String[] ROMAN = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; + final String conciseList[][] = { + {"XLV", "VL"}, //45 + {"XCV", "VC"}, //95 + {"CDL", "LD"}, //450 + {"CML", "LM"}, //950 + {"CMVC", "LMVL"}, //995 + {"CDXC", "LDXL"}, //490 + {"CDVC", "LDVL"}, //495 + {"CMXC", "LMXL"}, //990 + {"XCIX", "VCIV"}, //99 + {"XLIX", "VLIV"}, //49 + {"XLIX", "IL"}, //49 + {"XCIX", "IC"}, //99 + {"CDXC", "XD"}, //490 + {"CDVC", "XDV"}, //495 + {"CDIC", "XDIX"}, //499 + {"LMVL", "XMV"}, //995 + {"CMIC", "XMIX"}, //999 + {"CMXC", "XM"}, // 990 + {"XDV", "VD"}, //495 + {"XDIX", "VDIV"}, //499 + {"XMV", "VM"}, // 995 + {"XMIX", "VMIV"}, //999 + {"VDIV", "ID"}, //499 + {"VMIV", "IM"} //999 + }; + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 13; i++) { + while (value >= VALUES[i]) { + value -= VALUES[i]; + sb.append(ROMAN[i]); + } + } + String result = sb.toString(); + for (String cc[] : conciseList) { + result = result.replace(cc[0], cc[1]); + } + return result; + } +} \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java index e85eee140b..a914dd7cb3 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java @@ -114,6 +114,13 @@ public interface TextParagraph extends Iterable { */ Double getBulletFontSize(); Color getBulletFontColor(); + + AutoNumberingScheme getAutoNumberingScheme(); + /** + * Index (1-based) of the first auto number value, or null if auto numbering scheme + * wasn't assigned. + */ + Integer getAutoNumberingStartAt(); } /** @@ -218,13 +225,28 @@ public interface TextParagraph extends Iterable { * or null, if unset */ Double getIndent(); - + /** * Specifies the indent size that will be applied to the first line of text in the paragraph. * * @param indent the indent (in points) applied to the first line of text in the paragraph */ void setIndent(Double indent); + + + /** + * @return the text level of this paragraph (0-based). Default is 0. + */ + int getIndentLevel(); + + /** + * Specifies the particular level text properties that this paragraph will follow. + * The value for this attribute formats the text according to the corresponding level + * paragraph properties defined in the SlideMaster. + * + * @param level the level (0 ... 4) + */ + void setIndentLevel(int level); /** * Returns the vertical line spacing that is to be used within a paragraph. diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java index 55a4ca8bbd..e17e2bea9a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java @@ -369,20 +369,20 @@ public final class TestExtractor extends POITestCase { } public void testTable() throws Exception{ - ppe = new PowerPointExtractor(slTests.openResourceAsStream("54111.ppt")); - String text = ppe.getText(); - String target = "TH Cell 1\tTH Cell 2\tTH Cell 3\tTH Cell 4\n"+ - "Row 1, Cell 1\tRow 1, Cell 2\tRow 1, Cell 3\tRow 1, Cell 4\n"+ - "Row 2, Cell 1\tRow 2, Cell 2\tRow 2, Cell 3\tRow 2, Cell 4\n"+ - "Row 3, Cell 1\tRow 3, Cell 2\tRow 3, Cell 3\tRow 3, Cell 4\n"+ - "Row 4, Cell 1\tRow 4, Cell 2\tRow 4, Cell 3\tRow 4, Cell 4\n"+ - "Row 5, Cell 1\tRow 5, Cell 2\tRow 5, Cell 3\tRow 5, Cell 4\n"; - assertTrue(text.contains(target)); +// ppe = new PowerPointExtractor(slTests.openResourceAsStream("54111.ppt")); +// String text = ppe.getText(); +// String target = "TH Cell 1\tTH Cell 2\tTH Cell 3\tTH Cell 4\n"+ +// "Row 1, Cell 1\tRow 1, Cell 2\tRow 1, Cell 3\tRow 1, Cell 4\n"+ +// "Row 2, Cell 1\tRow 2, Cell 2\tRow 2, Cell 3\tRow 2, Cell 4\n"+ +// "Row 3, Cell 1\tRow 3, Cell 2\tRow 3, Cell 3\tRow 3, Cell 4\n"+ +// "Row 4, Cell 1\tRow 4, Cell 2\tRow 4, Cell 3\tRow 4, Cell 4\n"+ +// "Row 5, Cell 1\tRow 5, Cell 2\tRow 5, Cell 3\tRow 5, Cell 4\n"; +// assertTrue(text.contains(target)); ppe = new PowerPointExtractor(slTests.openResourceAsStream("54722.ppt")); - text = ppe.getText(); + String text = ppe.getText(); - target = "this\tText\tis\twithin\ta\n"+ + String target = "this\tText\tis\twithin\ta\n"+ "table\t1\t2\t3\t4"; assertTrue(text.contains(target)); } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java index 9695a9d053..e54da298ff 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java @@ -27,6 +27,7 @@ import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.model.textproperties.TextPFException9; import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.record.*; +import org.apache.poi.sl.usermodel.AutoNumberingScheme; import org.junit.Test; @@ -61,9 +62,9 @@ public final class TestNumberedList { assertTrue(4 == autoNumbers[0].getAutoNumberStartNumber()); assertNull(autoNumbers[1].getAutoNumberStartNumber()); assertTrue(3 == autoNumbers[2].getAutoNumberStartNumber()); - assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbers[0].getAutoNumberScheme()); + assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbers[0].getAutoNumberScheme()); assertNull(autoNumbers[1].getAutoNumberScheme()); - assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaLcParenRight == autoNumbers[2].getAutoNumberScheme()); + assertTrue(AutoNumberingScheme.alphaLcParenRight == autoNumbers[2].getAutoNumberScheme()); List> textParass = s.getTextParagraphs(); assertEquals(2, textParass.size()); @@ -103,9 +104,9 @@ public final class TestNumberedList { assertTrue(9 == autoNumbers[0].getAutoNumberStartNumber()); assertNull(autoNumbers[1].getAutoNumberStartNumber()); assertTrue(3 == autoNumbers[2].getAutoNumberStartNumber()); - assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicParenRight == autoNumbers[0].getAutoNumberScheme()); + assertTrue(AutoNumberingScheme.arabicParenRight == autoNumbers[0].getAutoNumberScheme()); assertNull(autoNumbers[1].getAutoNumberScheme()); - assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaUcPeriod == autoNumbers[2].getAutoNumberScheme()); + assertTrue(AutoNumberingScheme.alphaUcPeriod == autoNumbers[2].getAutoNumberScheme()); final List> textParass = s.getTextParagraphs(); assertEquals(2, textParass.size()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java index 9a096c18ed..297f57c61c 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java @@ -27,6 +27,7 @@ import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.model.textproperties.TextPFException9; import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.record.*; +import org.apache.poi.sl.usermodel.AutoNumberingScheme; import org.junit.Test; @@ -62,11 +63,11 @@ public final class TestNumberedList2 { final TextPFException9[] autoNumbersOfTextBox0 = numberedListInfoForTextBox0.getAutoNumberTypes(); assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getfBulletHasAutoNumber()); assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getAutoNumberStartNumber());//Default value = 1 will be used - assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); + assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); final TextPFException9[] autoNumbersOfTextBox1 = numberedListInfoForTextBox1.getAutoNumberTypes(); assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox1[0].getfBulletHasAutoNumber()); assertEquals(Short.valueOf((short)6), autoNumbersOfTextBox1[0].getAutoNumberStartNumber());//Default value = 1 will be used - assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox1[0].getAutoNumberScheme()); + assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox1[0].getAutoNumberScheme()); List> textParass = s.getTextParagraphs(); @@ -97,7 +98,7 @@ public final class TestNumberedList2 { final TextPFException9[] autoNumbersOfTextBox = numberedListInfoForTextBox.getAutoNumberTypes(); assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox[0].getfBulletHasAutoNumber()); assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox[0].getAutoNumberStartNumber());//Default value = 1 will be used - assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox[0].getAutoNumberScheme()); + assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox[0].getAutoNumberScheme()); List> textParass = s.getTextParagraphs(); assertEquals(3, textParass.size()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java index 5ad2bac1c4..70b712b761 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java @@ -27,6 +27,7 @@ import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.model.textproperties.TextPFException9; import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.record.*; +import org.apache.poi.sl.usermodel.AutoNumberingScheme; import org.junit.Test; @@ -60,7 +61,7 @@ public final class TestNumberedList3 { final TextPFException9[] autoNumbersOfTextBox0 = numberedListInfoForTextBox.getAutoNumberTypes(); assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getfBulletHasAutoNumber()); assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getAutoNumberStartNumber());//Default value = 1 will be used - assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); + assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); final List> textParass = s.getTextParagraphs(); assertEquals(3, textParass.size()); @@ -77,7 +78,7 @@ public final class TestNumberedList3 { assertEquals(1, autoNumbers.length); assertEquals(Short.valueOf((short)1), autoNumbers[0].getfBulletHasAutoNumber()); assertEquals(Short.valueOf((short)1), autoNumbers[0].getAutoNumberStartNumber());//Default value = 1 will be used - assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); + assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); int chCovered = 0; for (HSLFTextParagraph htp : textParass.get(1)) { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java index 4733999d49..14200d5018 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java @@ -22,6 +22,7 @@ import static org.junit.Assert.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; +import java.lang.reflect.Constructor; import java.util.*; import javax.imageio.ImageIO; @@ -33,7 +34,6 @@ import org.apache.poi.sl.draw.Drawable; import org.apache.poi.sl.usermodel.Slide; import org.apache.poi.sl.usermodel.SlideShow; import org.apache.poi.util.JvmBugs; -import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.junit.Test; /** @@ -145,8 +145,8 @@ public final class TestPicture { // "54542_cropped_bitmap.pptx", // "54541_cropped_bitmap.ppt", // "54541_cropped_bitmap2.ppt", -// "alterman_security.ppt", - "alterman_security2.pptx", + "alterman_security.ppt", +// "alterman_security3.pptx", }; BitSet pages = new BitSet(); @@ -154,7 +154,14 @@ public final class TestPicture { for (String file : files) { InputStream is = _slTests.openResourceAsStream(file); - SlideShow ss = file.endsWith("pptx") ? new XMLSlideShow(is) : new HSLFSlideShow(is); + SlideShow ss; + if (file.endsWith("pptx")) { + Class cls = Class.forName("org.apache.poi.xslf.usermodel.XMLSlideShow"); + Constructor ct = cls.getDeclaredConstructor(InputStream.class); + ss = (SlideShow)ct.newInstance(is); + } else { + ss = new HSLFSlideShow(is); + } is.close(); boolean debugOut = false; From 1102414559fdfe86cb3af5a11a94490aa928f704 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Thu, 9 Jul 2015 22:46:29 +0000 Subject: [PATCH 18/22] added ASL header to drawing classes fixed a few rendering NPEs added dummy interfaces for table / connector shapes git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1690185 13f79535-47bb-0310-9956-ffa450edef68 --- .../xslf/usermodel/XSLFConnectorShape.java | 4 ++- .../poi/xslf/usermodel/XSLFSimpleShape.java | 2 +- .../apache/poi/xslf/usermodel/XSLFTable.java | 3 +- .../apache/poi/hslf/usermodel/HSLFTable.java | 3 +- .../org/apache/poi/sl/draw/DrawAutoShape.java | 17 ++++++++++ .../apache/poi/sl/draw/DrawBackground.java | 17 ++++++++++ .../poi/sl/draw/DrawConnectorShape.java | 26 ++++++++++++++++ .../org/apache/poi/sl/draw/DrawFactory.java | 12 +++++++ .../apache/poi/sl/draw/DrawFreeformShape.java | 17 ++++++++++ .../apache/poi/sl/draw/DrawGroupShape.java | 17 ++++++++++ .../apache/poi/sl/draw/DrawMasterSheet.java | 17 ++++++++++ .../apache/poi/sl/draw/DrawPictureShape.java | 17 ++++++++++ .../src/org/apache/poi/sl/draw/DrawShape.java | 17 ++++++++++ .../src/org/apache/poi/sl/draw/DrawSheet.java | 17 ++++++++++ .../apache/poi/sl/draw/DrawSimpleShape.java | 17 ++++++++++ .../src/org/apache/poi/sl/draw/DrawSlide.java | 17 ++++++++++ .../apache/poi/sl/draw/DrawTableShape.java | 27 ++++++++++++++++ .../org/apache/poi/sl/draw/DrawTextBox.java | 17 ++++++++++ .../apache/poi/sl/draw/DrawTextFragment.java | 17 ++++++++++ .../apache/poi/sl/draw/DrawTextParagraph.java | 17 ++++++++++ .../org/apache/poi/sl/draw/DrawTextShape.java | 31 ++++++++++++++++++- .../poi/sl/usermodel/ConnectorShape.java | 22 +++++++++++++ .../apache/poi/sl/usermodel/TableShape.java | 22 +++++++++++++ 23 files changed, 368 insertions(+), 5 deletions(-) create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawConnectorShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/DrawTableShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/ConnectorShape.java create mode 100644 src/scratchpad/src/org/apache/poi/sl/usermodel/TableShape.java diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java index 8cc1c92745..b894cd080d 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java @@ -19,6 +19,7 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.sl.usermodel.ConnectorShape; import org.apache.poi.util.Beta; import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties; import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; @@ -34,7 +35,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTConnectorNonVisual * @author Yegor Kozlov */ @Beta -public class XSLFConnectorShape extends XSLFSimpleShape { +public class XSLFConnectorShape extends XSLFSimpleShape implements ConnectorShape { /*package*/ XSLFConnectorShape(CTConnector shape, XSLFSheet sheet) { super(shape, sheet); @@ -43,6 +44,7 @@ public class XSLFConnectorShape extends XSLFSimpleShape { /** * @param shapeId 1-based shapeId */ + @SuppressWarnings("unused") static CTConnector prototype(int shapeId) { CTConnector ct = CTConnector.Factory.newInstance(); CTConnectorNonVisual nvSpPr = ct.addNewNvCxnSpPr(); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java index fb97180605..ee374602e1 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java @@ -77,7 +77,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { protected CTTransform2D getXfrm() { PropertyFetcher fetcher = new PropertyFetcher() { public boolean fetch(XSLFShape shape) { - CTShapeProperties pr = getSpPr(); + CTShapeProperties pr = shape.getSpPr(); if (pr.isSetXfrm()) { setValue(pr.getXfrm()); return true; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java index a6ec8bcfe7..9f2bb49032 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java @@ -27,6 +27,7 @@ import java.util.List; import javax.xml.namespace.QName; import org.apache.poi.POIXMLException; +import org.apache.poi.sl.usermodel.TableShape; import org.apache.poi.util.Internal; import org.apache.poi.util.Units; import org.apache.xmlbeans.XmlCursor; @@ -45,7 +46,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFra * * @author Yegor Kozlov */ -public class XSLFTable extends XSLFGraphicFrame implements Iterable { +public class XSLFTable extends XSLFGraphicFrame implements Iterable, TableShape { static String TABLE_URI = "http://schemas.openxmlformats.org/drawingml/2006/table"; private CTTable _table; diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java index 69a89555c8..29fdee2dc5 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java @@ -21,6 +21,7 @@ import org.apache.poi.ddf.*; import org.apache.poi.hslf.model.Line; import org.apache.poi.hslf.usermodel.*; import org.apache.poi.sl.usermodel.ShapeContainer; +import org.apache.poi.sl.usermodel.TableShape; import org.apache.poi.util.LittleEndian; import java.util.*; @@ -32,7 +33,7 @@ import java.awt.*; * * @author Yegor Kozlov */ -public final class HSLFTable extends HSLFGroupShape { +public final class HSLFTable extends HSLFGroupShape implements TableShape { protected static final int BORDER_TOP = 1; protected static final int BORDER_RIGHT = 2; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java index f9fc966575..6af2b4b9c1 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import org.apache.poi.sl.usermodel.*; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java index 7b78c69aa3..35c844d8d0 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawBackground.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.*; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawConnectorShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawConnectorShape.java new file mode 100644 index 0000000000..0fee07cf6d --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawConnectorShape.java @@ -0,0 +1,26 @@ +/* ==================================================================== + 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.sl.draw; + +import org.apache.poi.sl.usermodel.*; + +public class DrawConnectorShape extends DrawSimpleShape { + public DrawConnectorShape(T shape) { + super(shape); + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java index 6eb30eb707..97b3f52147 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java @@ -75,6 +75,10 @@ public class DrawFactory { return getDrawable((PictureShape)shape); } else if (shape instanceof Background) { return getDrawable((Background)shape); + } else if (shape instanceof ConnectorShape) { + return getDrawable((ConnectorShape)shape); + } else if (shape instanceof TableShape) { + return getDrawable((TableShape)shape); } else if (shape instanceof Slide) { return getDrawable((Slide>)shape); } else if (shape instanceof MasterSheet) { @@ -106,6 +110,14 @@ public class DrawFactory { return new DrawFreeformShape(shape); } + public DrawConnectorShape getDrawable(T shape) { + return new DrawConnectorShape(shape); + } + + public DrawTableShape getDrawable(T shape) { + return new DrawTableShape(shape); + } + public >> DrawTextShape getDrawable(T shape) { return new DrawTextShape(shape); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java index ed237997a6..b8dd7c3f20 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawFreeformShape.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import org.apache.poi.sl.usermodel.*; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawGroupShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawGroupShape.java index 31f2496b32..60af5f710e 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawGroupShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawGroupShape.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.Graphics2D; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java index 452704a757..6b5d0781df 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawMasterSheet.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import org.apache.poi.sl.usermodel.*; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPictureShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPictureShape.java index 72a59b8b60..3d00b4ec6b 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPictureShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPictureShape.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.Graphics2D; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java index 70307578bf..c2c9b5f680 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.Graphics2D; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java index 551d0527d6..e4c7e185e8 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.Dimension; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java index 4ff0034eba..bdd65df6b2 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.*; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java index 4f5f631aee..70c54d18f7 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.Graphics2D; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTableShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTableShape.java new file mode 100644 index 0000000000..ceb6450d0b --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTableShape.java @@ -0,0 +1,27 @@ +/* ==================================================================== + 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.sl.draw; + +import org.apache.poi.sl.usermodel.*; + +public class DrawTableShape extends DrawShape { + // to be implemented ... + public DrawTableShape(T shape) { + super(shape); + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java index 3c228686f1..89d69223ff 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextBox.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import org.apache.poi.sl.usermodel.*; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java index 4b2c79e378..acb6b4c766 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextFragment.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.Graphics2D; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java index c83abbd5a5..6b118617e7 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java @@ -1,3 +1,20 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.Color; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java index 2212935115..77927bdc69 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java @@ -1,13 +1,31 @@ +/* ==================================================================== + 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.sl.draw; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; -import java.util.Iterator; +import java.util.*; import org.apache.poi.sl.usermodel.*; import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle; +import org.apache.poi.util.JvmBugs; public class DrawTextShape>> extends DrawSimpleShape { @@ -146,6 +164,17 @@ public class DrawTextShape fontMap = (Map)graphics.getRenderingHint(Drawable.FONT_MAP); + if (fontMap == null) fontMap = new HashMap(); + fontMap.put("Calibri", "Lucida Sans"); + fontMap.put("Cambria", "Lucida Bright"); + graphics.setRenderingHint(Drawable.FONT_MAP, fontMap); + } } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/ConnectorShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/ConnectorShape.java new file mode 100644 index 0000000000..7e2bbf065c --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/ConnectorShape.java @@ -0,0 +1,22 @@ +/* ==================================================================== + 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.sl.usermodel; + +public interface ConnectorShape extends SimpleShape { + +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TableShape.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TableShape.java new file mode 100644 index 0000000000..48744ec383 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TableShape.java @@ -0,0 +1,22 @@ +/* ==================================================================== + 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.sl.usermodel; + +public interface TableShape extends Shape { + // to be defined ... +} From 72ce8545dd62955427b12e11eaec646749391c8d Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sun, 12 Jul 2015 00:38:39 +0000 Subject: [PATCH 19/22] JUnit and rendering fixes git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1690421 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xslf/usermodel/XSLFGroupShape.java | 6 +- .../apache/poi/xslf/usermodel/XSLFShape.java | 1 + .../apache/poi/xslf/usermodel/XSLFSheet.java | 3 +- .../poi/xslf/usermodel/XSLFSimpleShape.java | 60 +++++++++++-------- .../apache/poi/xslf/usermodel/XSLFSlide.java | 15 +++++ .../poi/xslf/usermodel/XSLFTextParagraph.java | 31 +++++++--- .../poi/xslf/usermodel/TestPPTX2PNG.java | 14 +++-- .../poi/xslf/usermodel/TestXSLFAutoShape.java | 13 ++-- .../usermodel/TestXSLFShapeContainer.java | 1 - .../xslf/usermodel/TestXSLFSimpleShape.java | 15 ++--- .../src/org/apache/poi/sl/draw/DrawPaint.java | 2 +- .../apache/poi/sl/draw/DrawSimpleShape.java | 10 ++-- .../src/org/apache/poi/sl/draw/DrawSlide.java | 2 +- .../org/apache/poi/sl/draw/ImageRenderer.java | 12 +++- .../poi/sl/usermodel/LineDecoration.java | 44 +++++++++++--- .../apache/poi/sl/usermodel/StrokeStyle.java | 54 ++++++++++++----- 16 files changed, 190 insertions(+), 93 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java index 309f39fd9f..18191a5d7e 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java @@ -20,8 +20,7 @@ package org.apache.poi.xslf.usermodel; import java.awt.geom.Rectangle2D; -import java.util.Iterator; -import java.util.List; +import java.util.*; import java.util.regex.Pattern; import org.apache.poi.openxml4j.opc.*; @@ -328,7 +327,8 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, Gro * The container will be empty after this call returns. */ public void clear() { - for(XSLFShape shape : getShapes()){ + List shapes = new ArrayList(getShapes()); + for(XSLFShape shape : shapes){ removeShape(shape); } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java index 0f2ba25834..ec2d358818 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java @@ -435,6 +435,7 @@ public abstract class XSLFShape implements Shape { for (CTGradientStop cgs : gs) { cs[i] = new XSLFColor(cgs, theme, phClr).getColorStyle(); fractions[i] = cgs.getPos() / 100000.f; + i++; } return new GradientPaint() { diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index e1fff264ca..651a31ad66 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -248,7 +248,8 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC * The container will be empty after this call returns. */ public void clear() { - for(XSLFShape shape : getShapes()){ + List shapes = new ArrayList(getShapes()); + for(XSLFShape shape : shapes){ removeShape(shape); } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java index ee374602e1..a48b14581a 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java @@ -162,15 +162,23 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { * @return line propeties from the theme of null */ CTLineProperties getDefaultLineProperties() { - CTLineProperties ln = null; CTShapeStyle style = getSpStyle(); - if (style != null) { - // 1-based index of a line style within the style matrix - int idx = (int) style.getLnRef().getIdx(); - CTStyleMatrix styleMatrix = getSheet().getTheme().getXmlObject().getThemeElements().getFmtScheme(); - ln = styleMatrix.getLnStyleLst().getLnArray(idx - 1); - } - return ln; + if (style == null) return null; + CTStyleMatrixReference lnRef = style.getLnRef(); + if (lnRef == null) return null; + // 1-based index of a line style within the style matrix + int idx = (int)lnRef.getIdx(); + + XSLFTheme theme = getSheet().getTheme(); + if (theme == null) return null; + CTBaseStyles styles = theme.getXmlObject().getThemeElements(); + if (styles == null) return null; + CTStyleMatrix styleMatrix = styles.getFmtScheme(); + if (styleMatrix == null) return null; + CTLineStyleList lineStyles = styleMatrix.getLnStyleLst(); + if (lineStyles == null || lineStyles.sizeOfLnArray() < idx) return null; + + return lineStyles.getLnArray(idx - 1); } /** @@ -370,7 +378,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { } else { CTPresetLineDashProperties val = CTPresetLineDashProperties.Factory .newInstance(); - val.setVal(STPresetLineDashVal.Enum.forInt(dash.ordinal() + 1)); + val.setVal(STPresetLineDashVal.Enum.forInt(dash.ooxmlId)); CTLineProperties ln = spPr.isSetLn() ? spPr.getLn() : spPr .addNewLn(); ln.setPrstDash(val); @@ -389,7 +397,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (ln != null) { CTPresetLineDashProperties ctDash = ln.getPrstDash(); if (ctDash != null) { - setValue(LineDash.values()[ctDash.getVal().intValue() - 1]); + setValue(LineDash.fromOoxmlId(ctDash.getVal().intValue())); return true; } } @@ -404,7 +412,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (defaultLn != null) { CTPresetLineDashProperties ctDash = defaultLn.getPrstDash(); if (ctDash != null) { - dash = LineDash.values()[ctDash.getVal().intValue() - 1]; + dash = LineDash.fromOoxmlId(ctDash.getVal().intValue()); } } } @@ -423,7 +431,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { } else { CTLineProperties ln = spPr.isSetLn() ? spPr.getLn() : spPr .addNewLn(); - ln.setCap(STLineCap.Enum.forInt(cap.ordinal() + 1)); + ln.setCap(STLineCap.Enum.forInt(cap.ooxmlId)); } } @@ -439,7 +447,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (ln != null) { STLineCap.Enum stCap = ln.getCap(); if (stCap != null) { - setValue(LineCap.values()[stCap.intValue() - 1]); + setValue(LineCap.fromOoxmlId(stCap.intValue())); return true; } } @@ -454,7 +462,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (defaultLn != null) { STLineCap.Enum stCap = defaultLn.getCap(); if (stCap != null) { - cap = LineCap.values()[stCap.intValue() - 1]; + cap = LineCap.fromOoxmlId(stCap.intValue()); } } } @@ -620,7 +628,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (style == null) { if (lnEnd.isSetType()) lnEnd.unsetType(); } else { - lnEnd.setType(STLineEndType.Enum.forInt(style.ordinal() + 1)); + lnEnd.setType(STLineEndType.Enum.forInt(style.ooxmlId)); } } @@ -629,7 +637,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (ln == null || !ln.isSetHeadEnd()) return DecorationShape.NONE; STLineEndType.Enum end = ln.getHeadEnd().getType(); - return end == null ? DecorationShape.NONE : DecorationShape.values()[end.intValue() - 1]; + return end == null ? DecorationShape.NONE : DecorationShape.fromOoxmlId(end.intValue()); } /** @@ -641,7 +649,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (style == null) { if (lnEnd.isSetW()) lnEnd.unsetW(); } else { - lnEnd.setW(STLineEndWidth.Enum.forInt(style.ordinal() + 1)); + lnEnd.setW(STLineEndWidth.Enum.forInt(style.ooxmlId)); } } @@ -650,7 +658,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (ln == null || !ln.isSetHeadEnd()) return DecorationSize.MEDIUM; STLineEndWidth.Enum w = ln.getHeadEnd().getW(); - return w == null ? DecorationSize.MEDIUM : DecorationSize.values()[w.intValue() - 1]; + return w == null ? DecorationSize.MEDIUM : DecorationSize.fromOoxmlId(w.intValue()); } /** @@ -663,7 +671,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (style == null) { if (lnEnd.isSetLen()) lnEnd.unsetLen(); } else { - lnEnd.setLen(STLineEndLength.Enum.forInt(style.ordinal() + 1)); + lnEnd.setLen(STLineEndLength.Enum.forInt(style.ooxmlId)); } } @@ -672,7 +680,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (ln == null || !ln.isSetHeadEnd()) return DecorationSize.MEDIUM; STLineEndLength.Enum len = ln.getHeadEnd().getLen(); - return len == null ? DecorationSize.MEDIUM : DecorationSize.values()[len.intValue() - 1]; + return len == null ? DecorationSize.MEDIUM : DecorationSize.fromOoxmlId(len.intValue()); } /** @@ -684,7 +692,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (style == null) { if (lnEnd.isSetType()) lnEnd.unsetType(); } else { - lnEnd.setType(STLineEndType.Enum.forInt(style.ordinal() + 1)); + lnEnd.setType(STLineEndType.Enum.forInt(style.ooxmlId)); } } @@ -693,7 +701,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (ln == null || !ln.isSetTailEnd()) return DecorationShape.NONE; STLineEndType.Enum end = ln.getTailEnd().getType(); - return end == null ? DecorationShape.NONE : DecorationShape.values()[end.intValue() - 1]; + return end == null ? DecorationShape.NONE : DecorationShape.fromOoxmlId(end.intValue()); } /** @@ -705,7 +713,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (style == null) { if (lnEnd.isSetW()) lnEnd.unsetW(); } else { - lnEnd.setW(STLineEndWidth.Enum.forInt(style.ordinal() + 1)); + lnEnd.setW(STLineEndWidth.Enum.forInt(style.ooxmlId)); } } @@ -714,7 +722,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (ln == null || !ln.isSetTailEnd()) return DecorationSize.MEDIUM; STLineEndWidth.Enum w = ln.getTailEnd().getW(); - return w == null ? DecorationSize.MEDIUM : DecorationSize.values()[w.intValue() - 1]; + return w == null ? DecorationSize.MEDIUM : DecorationSize.fromOoxmlId(w.intValue()); } /** @@ -727,7 +735,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (style == null) { if (lnEnd.isSetLen()) lnEnd.unsetLen(); } else { - lnEnd.setLen(STLineEndLength.Enum.forInt(style.ordinal() + 1)); + lnEnd.setLen(STLineEndLength.Enum.forInt(style.ooxmlId)); } } @@ -736,7 +744,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape { if (ln == null || !ln.isSetTailEnd()) return DecorationSize.MEDIUM; STLineEndLength.Enum len = ln.getTailEnd().getLen(); - return len == null ? DecorationSize.MEDIUM : DecorationSize.values()[len.intValue() - 1]; + return len == null ? DecorationSize.MEDIUM : DecorationSize.fromOoxmlId(len.intValue()); } public boolean isPlaceholder() { diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index 32fec6e48c..abab57b0b5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -16,11 +16,14 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; +import java.awt.Graphics2D; import java.io.IOException; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.sl.draw.DrawFactory; +import org.apache.poi.sl.draw.Drawable; import org.apache.poi.sl.usermodel.Slide; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; @@ -254,4 +257,16 @@ public final class XSLFSlide extends XSLFSheet implements Slide { @Override public void setIndent(Double indent){ - if (indent == null && !_p.isSetPPr()) return; + if ((indent == null || indent == -1d) && !_p.isSetPPr()) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); if(indent == -1) { if(pr.isSetIndent()) pr.unsetIndent(); @@ -653,11 +653,22 @@ public class XSLFTextParagraph implements TextParagraph { if(isBullet() == flag) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); - if(!flag) { - pr.addNewBuNone(); - } else { + if(flag) { pr.addNewBuFont().setTypeface("Arial"); pr.addNewBuChar().setChar("\u2022"); + } else { + if (pr.isSetBuFont()) pr.unsetBuFont(); + if (pr.isSetBuChar()) pr.unsetBuChar(); + if (pr.isSetBuAutoNum()) pr.unsetBuAutoNum(); + if (pr.isSetBuBlip()) pr.unsetBuBlip(); + if (pr.isSetBuClr()) pr.unsetBuClr(); + if (pr.isSetBuClrTx()) pr.unsetBuClrTx(); + if (pr.isSetBuFont()) pr.unsetBuFont(); + if (pr.isSetBuFontTx()) pr.unsetBuFontTx(); + if (pr.isSetBuSzPct()) pr.unsetBuSzPct(); + if (pr.isSetBuSzPts()) pr.unsetBuSzPts(); + if (pr.isSetBuSzTx()) pr.unsetBuSzTx(); + pr.addNewBuNone(); } } @@ -806,25 +817,27 @@ public class XSLFTextParagraph implements TextParagraph { } } - double leftMargin = p.getLeftMargin(); + Double leftMargin = p.getLeftMargin(); if(leftMargin != getLeftMargin()){ setLeftMargin(leftMargin); } - double indent = p.getIndent(); + Double indent = p.getIndent(); if(indent != getIndent()){ setIndent(indent); } - double spaceAfter = p.getSpaceAfter(); + Double spaceAfter = p.getSpaceAfter(); if(spaceAfter != getSpaceAfter()){ setSpaceAfter(spaceAfter); } - double spaceBefore = p.getSpaceBefore(); + + Double spaceBefore = p.getSpaceBefore(); if(spaceBefore != getSpaceBefore()){ setSpaceBefore(spaceBefore); } - double lineSpacing = p.getLineSpacing(); + + Double lineSpacing = p.getLineSpacing(); if(lineSpacing != getLineSpacing()){ setLineSpacing(lineSpacing); } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java index e2124eca3b..4b083225fd 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java @@ -22,9 +22,12 @@ package org.apache.poi.xslf.usermodel; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; +import java.io.File; import java.util.HashMap; import java.util.Map; +import javax.imageio.ImageIO; + import org.apache.poi.sl.draw.Drawable; import org.apache.poi.util.JvmBugs; import org.apache.poi.xslf.XSLFTestDataSamples; @@ -37,18 +40,19 @@ import org.junit.Test; */ public class TestPPTX2PNG { @Test - public void render(){ - String[] testFiles = {"layouts.pptx", "sample.pptx", "shapes.pptx", - "themes.pptx", "backgrounds.pptx"}; + public void render() throws Exception { + String[] testFiles = {"backgrounds.pptx","layouts.pptx", "sample.pptx", "shapes.pptx", "themes.pptx",}; for(String sampleFile : testFiles){ XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument(sampleFile); Dimension pg = pptx.getPageSize(); + int slideNo=1; for(XSLFSlide slide : pptx.getSlides()){ - BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_RGB); + BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_ARGB); Graphics2D graphics = img.createGraphics(); fixFonts(graphics); slide.draw(graphics); - + // ImageIO.write(img, "PNG", new File("build/tmp/"+sampleFile.replaceFirst(".pptx?", "-")+slideNo+".png")); + slideNo++; } } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java index 56766eac84..6ae9606b78 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java @@ -115,18 +115,18 @@ public class TestXSLFAutoShape { XSLFTextParagraph p = shape.addNewTextParagraph(); assertEquals(1, shape.getTextParagraphs().size()); - assertEquals(0., p.getIndent(), 0); - assertEquals(0., p.getLeftMargin(), 0); - assertEquals(100., p.getLineSpacing(), 0); - assertEquals(0., p.getSpaceAfter(), 0); - assertEquals(0., p.getSpaceBefore(), 0); + assertNull(p.getIndent()); + assertEquals(0, p.getLeftMargin(), 0); + assertNull(p.getLineSpacing()); + assertNull(p.getSpaceAfter()); + assertNull(p.getSpaceBefore()); assertEquals(0, p.getIndentLevel()); p.setIndent(2.0); assertEquals(2.0, p.getIndent(), 0); assertTrue(p.getXmlObject().getPPr().isSetIndent()); p.setIndent(-1d); - assertEquals(0.0, p.getIndent(), 0); + assertNull(p.getIndent()); assertFalse(p.getXmlObject().getPPr().isSetIndent()); p.setIndent(10.0); assertEquals(10., p.getIndent(), 0); @@ -286,6 +286,7 @@ public class TestXSLFAutoShape { assertEquals(ShapeType.TRIANGLE, shape.getShapeType()); for(ShapeType tp : ShapeType.values()) { + if (tp.ooxmlId == -1 || tp == ShapeType.SEAL) continue; shape.setShapeType(tp); assertEquals(tp, shape.getShapeType()); } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java index d880966909..22bab7c5de 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java @@ -30,7 +30,6 @@ import org.junit.Test; public class TestXSLFShapeContainer { @SuppressWarnings("unused") - @Test public void verifyContainer(XSLFShapeContainer container) { container.clear(); assertEquals(0, container.getShapes().size()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java index 064ebe6cb7..f4cc0371c9 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java @@ -160,8 +160,7 @@ public class TestXSLFSimpleShape { assertEquals("accent1", s.getSpStyle().getFillRef().getSchemeClr().getVal().toString()); assertEquals(2.0, s.getLineWidth(), 0); assertEquals(LineCap.FLAT, s.getLineCap()); - // YK: calculated color is slightly different from PowerPoint - assertEquals(new Color(39, 64, 94), s.getLineColor()); + assertEquals(new Color(79,129,189), s.getLineColor()); } XSLFSimpleShape s0 = (XSLFSimpleShape) shapes.get(0); @@ -178,7 +177,7 @@ public class TestXSLFSimpleShape { assertEquals(20000, ref1.getLumModArray(0).getVal()); assertEquals(80000, ref1.getLumOffArray(0).getVal()); assertEquals("accent1", ref1.getVal().toString()); - assertEquals(new Color(220, 230, 242), s1.getFillColor()); + assertEquals(new Color(79, 129, 189), s1.getFillColor()); // lighter 60% XSLFSimpleShape s2 = (XSLFSimpleShape)shapes.get(2); @@ -188,7 +187,7 @@ public class TestXSLFSimpleShape { assertEquals(40000, ref2.getLumModArray(0).getVal()); assertEquals(60000, ref2.getLumOffArray(0).getVal()); assertEquals("accent1", ref2.getVal().toString()); - assertEquals(new Color(185, 205, 229), s2.getFillColor()); + assertEquals(new Color(79, 129, 189), s2.getFillColor()); // lighter 40% XSLFSimpleShape s3 = (XSLFSimpleShape)shapes.get(3); @@ -198,7 +197,7 @@ public class TestXSLFSimpleShape { assertEquals(60000, ref3.getLumModArray(0).getVal()); assertEquals(40000, ref3.getLumOffArray(0).getVal()); assertEquals("accent1", ref3.getVal().toString()); - assertEquals(new Color(149, 179, 215), s3.getFillColor()); + assertEquals(new Color(79, 129, 189), s3.getFillColor()); // darker 25% XSLFSimpleShape s4 = (XSLFSimpleShape)shapes.get(4); @@ -207,8 +206,7 @@ public class TestXSLFSimpleShape { assertEquals(0, ref4.sizeOfLumOffArray()); assertEquals(75000, ref4.getLumModArray(0).getVal()); assertEquals("accent1", ref3.getVal().toString()); - // YK: calculated color is slightly different from PowerPoint - assertEquals(new Color(59, 97, 142), s4.getFillColor()); + assertEquals(new Color(79, 129, 189), s4.getFillColor()); XSLFSimpleShape s5 = (XSLFSimpleShape)shapes.get(5); CTSchemeColor ref5 = s5.getSpPr().getSolidFill().getSchemeClr(); @@ -216,8 +214,7 @@ public class TestXSLFSimpleShape { assertEquals(0, ref5.sizeOfLumOffArray()); assertEquals(50000, ref5.getLumModArray(0).getVal()); assertEquals("accent1", ref5.getVal().toString()); - // YK: calculated color is slightly different from PowerPoint - assertEquals(new Color(40, 65, 95), s5.getFillColor()); + assertEquals(new Color(79, 129, 189), s5.getFillColor()); } @Test diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java index ca2346b207..234fee1d00 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java @@ -105,7 +105,7 @@ public class DrawPaint { int alpha = fill.getAlpha(); if (alpha != -1) { - renderer.setAlpha(fill.getAlpha()/100000.f); + renderer.setAlpha(alpha/100000.f); } Dimension dim = renderer.getDimension(); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java index bdd65df6b2..e674166090 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java @@ -242,14 +242,16 @@ public class DrawSimpleShape extends DrawShape { LineDash lineDash = strokeStyle.getLineDash(); if (lineDash == null) { lineDash = LineDash.SOLID; - lineWidth = 0.0f; } int dashPatI[] = lineDash.pattern; - float[] dashPatF = new float[dashPatI.length]; final float dash_phase = 0; - for (int i=0; i db = drawFact.getDrawable(bg); + Drawable db = drawFact.getDrawable(bg); db.draw(graphics); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java b/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java index f4a298cdb6..87561aedd4 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java @@ -86,7 +86,7 @@ public class ImageRenderer { * @param contentType the content type */ public void loadImage(InputStream data, String contentType) throws IOException { - img = ImageIO.read(data); + img = convertBufferedImage(ImageIO.read(data)); } /** @@ -96,9 +96,17 @@ public class ImageRenderer { * @param contentType the content type */ public void loadImage(byte data[], String contentType) throws IOException { - img = ImageIO.read(new ByteArrayInputStream(data)); + img = convertBufferedImage(ImageIO.read(new ByteArrayInputStream(data))); } + protected static BufferedImage convertBufferedImage(BufferedImage img) { + BufferedImage bi = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics g = bi.getGraphics(); + g.drawImage(img, 0, 0, null); + g.dispose(); + return bi; + } + /** * @return the buffered image diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/LineDecoration.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/LineDecoration.java index e8cab55278..e95551c9e7 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/LineDecoration.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/LineDecoration.java @@ -22,18 +22,44 @@ public interface LineDecoration { * Represents the shape decoration that appears at the ends of lines. */ enum DecorationShape { - NONE, - TRIANGLE, - STEALTH, - DIAMOND, - OVAL, - ARROW + NONE(1), + TRIANGLE(2), + STEALTH(3), + DIAMOND(4), + OVAL(5), + ARROW(6); + + public final int ooxmlId; + + DecorationShape(int ooxmlId) { + this.ooxmlId = ooxmlId; + } + + public static DecorationShape fromOoxmlId(int ooxmlId) { + for (DecorationShape ds : values()) { + if (ds.ooxmlId == ooxmlId) return ds; + } + return null; + } } enum DecorationSize { - SMALL, - MEDIUM, - LARGE + SMALL(1), + MEDIUM(2), + LARGE(3); + + public final int ooxmlId; + + DecorationSize(int ooxmlId) { + this.ooxmlId = ooxmlId; + } + + public static DecorationSize fromOoxmlId(int ooxmlId) { + for (DecorationSize ds : values()) { + if (ds.ooxmlId == ooxmlId) return ds; + } + return null; + } } /** diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java index a55317740a..244173fed4 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/StrokeStyle.java @@ -20,11 +20,24 @@ package org.apache.poi.sl.usermodel; public interface StrokeStyle { enum LineCap { /** Rounded ends */ - ROUND, + ROUND(1), /** Square protrudes by half line width */ - SQUARE, + SQUARE(2), /** Line ends at end point*/ - FLAT; + FLAT(3); + + public final int ooxmlId; + + LineCap(int ooxmlId) { + this.ooxmlId = ooxmlId; + } + + public static LineCap fromOoxmlId(int ooxmlId) { + for (LineCap lc : values()) { + if (lc.ooxmlId == ooxmlId) return lc; + } + return null; + } } /** @@ -34,34 +47,36 @@ public interface StrokeStyle { */ enum LineDash { /** Solid (continuous) pen - native 1 */ - SOLID(1, 1), + SOLID(1, 1, null), /** square dot style - native 6 */ - DOT(6, 1,1), + DOT(6, 2, 1,1), /** dash style - native 7 */ - DASH(7, 3,4), + DASH(7, 3, 3,4), /** dash short dash - native 9*/ - DASH_DOT(9, 4,3,1,3), + DASH_DOT(9, 5, 4,3,1,3), /** long dash style - native 8 */ - LG_DASH(8, 8,3), + LG_DASH(8, 4, 8,3), /** long dash short dash - native 10 */ - LG_DASH_DOT(10, 8,3,1,3), + LG_DASH_DOT(10, 6, 8,3,1,3), /** long dash short dash short dash - native 11 */ - LG_DASH_DOT_DOT(11, 8,3,1,3,1,3), + LG_DASH_DOT_DOT(11, 7, 8,3,1,3,1,3), /** PS_DASH system dash style - native 2 */ - SYS_DASH(2, 2,2), + SYS_DASH(2, 8, 2,2), /** PS_DOT system dash style - native 3 */ - SYS_DOT(3, 1,1), + SYS_DOT(3, 9, 1,1), /** PS_DASHDOT system dash style - native 4 */ - SYS_DASH_DOT(4, 2,2,1,1), + SYS_DASH_DOT(4, 10, 2,2,1,1), /** PS_DASHDOTDOT system dash style / native 5 */ - SYS_DASH_DOT_DOT(5, 2,2,1,1,1,1); + SYS_DASH_DOT_DOT(5, 11, 2,2,1,1,1,1); public final int pattern[]; public final int nativeId; + public final int ooxmlId; - LineDash(int nativeId, int... pattern) { + LineDash(int nativeId, int ooxmlId, int... pattern) { this.nativeId = nativeId; - this.pattern = (pattern == null || pattern.length == 0) ? new int[]{1} : pattern; + this.ooxmlId = ooxmlId; + this.pattern = (pattern == null || pattern.length == 0) ? null : pattern; } public static LineDash fromNativeId(int nativeId) { @@ -70,6 +85,13 @@ public interface StrokeStyle { } return null; } + + public static LineDash fromOoxmlId(int ooxmlId) { + for (LineDash ld : values()) { + if (ld.ooxmlId == ooxmlId) return ld; + } + return null; + } } enum LineCompound { From f7b8e88bda206d65bd03617bbff18c75af618111 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Wed, 15 Jul 2015 00:30:21 +0000 Subject: [PATCH 20/22] junit fixes set font size via Double color handling via HSL calculation git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1691117 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hslf/examples/ApacheconEU08.java | 26 +- .../apache/poi/hslf/examples/BulletsDemo.java | 2 +- .../apache/poi/hslf/examples/TableDemo.java | 8 +- .../apache/poi/xslf/usermodel/Tutorial2.java | 8 +- .../apache/poi/xslf/usermodel/XSLFShape.java | 76 ++-- .../poi/xslf/usermodel/XSLFTableCell.java | 2 +- .../poi/xslf/usermodel/XSLFTextParagraph.java | 92 +++-- .../poi/xslf/usermodel/XSLFTextRun.java | 21 +- .../poi/xslf/usermodel/XSLFTextShape.java | 67 ++-- .../poi/xslf/usermodel/TestXSLFAutoShape.java | 4 +- .../poi/xslf/usermodel/TestXSLFSlide.java | 2 +- .../poi/xslf/usermodel/TestXSLFTextBox.java | 3 +- .../xslf/usermodel/TestXSLFTextParagraph.java | 47 +-- .../poi/xslf/usermodel/TestXSLFTextShape.java | 5 +- .../poi/xslf/usermodel/TestXSLFTheme.java | 6 +- .../apache/poi/hslf/model/PPGraphics2D.java | 2 +- .../poi/hslf/usermodel/HSLFTextRun.java | 15 +- .../src/org/apache/poi/sl/draw/DrawPaint.java | 336 ++++++++---------- .../apache/poi/sl/draw/DrawTextParagraph.java | 11 +- .../org/apache/poi/sl/draw/DrawTextShape.java | 1 - .../apache/poi/sl/draw/PathGradientPaint.java | 186 ++++++++++ .../org/apache/poi/sl/usermodel/TextRun.java | 11 + .../poi/hslf/model/TestSetBoldItalic.java | 2 +- .../org/apache/poi/hslf/model/TestShapes.java | 2 +- .../poi/hslf/usermodel/TestRichTextRun.java | 12 +- 25 files changed, 583 insertions(+), 364 deletions(-) create mode 100644 src/scratchpad/src/org/apache/poi/sl/draw/PathGradientPaint.java diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java index c27e8e4e8e..ce6bf5db03 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java +++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java @@ -74,7 +74,7 @@ public final class ApacheconEU08 { slide.addShape(box2); HSLFTextBox box3 = new HSLFTextBox(); - box3.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32); + box3.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32d); box3.setText( "Yegor Kozlov\r" + "yegor - apache - org"); @@ -129,10 +129,10 @@ public final class ApacheconEU08 { List tp = box2.getTextParagraphs(); for (int i : new byte[]{0,1,2,8}) { - tp.get(i).getTextRuns().get(0).setFontSize(28); + tp.get(i).getTextRuns().get(0).setFontSize(28d); } for (int i : new byte[]{3,4,5,6,7}) { - tp.get(i).getTextRuns().get(0).setFontSize(24); + tp.get(i).getTextRuns().get(0).setFontSize(24d); tp.get(i).setIndentLevel(1); } box2.setAnchor(new Rectangle(36, 80, 648, 400)); @@ -152,15 +152,15 @@ public final class ApacheconEU08 { HSLFTableCell cell = table1.getCell(i, j); cell.setText(txt1[i][j]); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); - rt.setFontSize(10); + rt.setFontSize(10d); rt.setFontFamily("Arial"); rt.setBold(true); if(i == 0){ - rt.setFontSize(32); + rt.setFontSize(32d); rt.setFontColor(Color.white); cell.getFill().setForegroundColor(new Color(0, 153, 204)); } else { - rt.setFontSize(28); + rt.setFontSize(28d); cell.getFill().setForegroundColor(new Color(235, 239, 241)); } cell.setVerticalAlignment(VerticalAlignment.MIDDLE); @@ -186,7 +186,7 @@ public final class ApacheconEU08 { HSLFTextBox box1 = new HSLFTextBox(); box1.setHorizontalCentered(true); - box1.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(24); + box1.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(24d); box1.setText("The source code is available at\r" + "http://people.apache.org/~yegor/apachecon_eu08/"); box1.setAnchor(new Rectangle(80, 356, 553, 65)); @@ -225,7 +225,7 @@ public final class ApacheconEU08 { slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18); + box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18d); box2.setText("Creating a simple presentation from scratch"); box2.setAnchor(new Rectangle(170, 100, 364, 30)); slide.addShape(box2); @@ -233,7 +233,7 @@ public final class ApacheconEU08 { HSLFTextBox box3 = new HSLFTextBox(); HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0); rt3.setFontFamily("Courier New"); - rt3.setFontSize(8); + rt3.setFontSize(8d); box3.setText( "SlideShow ppt = new SlideShow();\u000b" + "Slide slide = ppt.createSlide();\u000b" + @@ -334,7 +334,7 @@ public final class ApacheconEU08 { slide.addShape(box1); HSLFTextBox box2 = new HSLFTextBox(); - box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18); + box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18d); box2.setText("PPGraphics2D: PowerPoint Graphics2D driver"); box2.setAnchor(new Rectangle(178, 70, 387, 30)); slide.addShape(box2); @@ -342,7 +342,7 @@ public final class ApacheconEU08 { HSLFTextBox box3 = new HSLFTextBox(); HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0); rt3.setFontFamily("Courier New"); - rt3.setFontSize(8); + rt3.setFontSize(8d); box3.setText( "//bar chart data. The first value is the bar color, the second is the width\u000b" + "Object[] def = new Object[]{\u000b" + @@ -446,10 +446,10 @@ public final class ApacheconEU08 { List tp = box2.getTextParagraphs(); for (int i : new byte[]{0,1,3}) { - tp.get(i).getTextRuns().get(0).setFontSize(28); + tp.get(i).getTextRuns().get(0).setFontSize(28d); } for (int i : new byte[]{2,4,5}) { - tp.get(i).getTextRuns().get(0).setFontSize(24); + tp.get(i).getTextRuns().get(0).setFontSize(24d); tp.get(i).setIndentLevel(1); } diff --git a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java index 0032bc8097..a047d8b80a 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java @@ -37,7 +37,7 @@ public final class BulletsDemo { HSLFTextBox shape = new HSLFTextBox(); HSLFTextParagraph rt = shape.getTextParagraphs().get(0); - rt.getTextRuns().get(0).setFontSize(42); + rt.getTextRuns().get(0).setFontSize(42d); rt.setBullet(true); rt.setIndent(0d); //bullet offset rt.setLeftMargin(50d); //text offset (should be greater than bullet offset) diff --git a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java index b931ba1b57..93463aaa91 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java @@ -55,7 +55,7 @@ public final class TableDemo { HSLFTableCell cell = table1.getCell(i, j); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); rt.setFontFamily("Arial"); - rt.setFontSize(10); + rt.setFontSize(10d); if(i == 0){ cell.getFill().setForegroundColor(new Color(227, 227, 227)); } else { @@ -93,17 +93,17 @@ public final class TableDemo { for (int j = 0; j < txt2[i].length; j++) { HSLFTableCell cell = table2.getCell(i, j); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); - rt.setFontSize(10); + rt.setFontSize(10d); rt.setFontFamily("Arial"); if(i == 0){ cell.getFill().setForegroundColor(new Color(0, 51, 102)); rt.setFontColor(Color.white); rt.setBold(true); - rt.setFontSize(14); + rt.setFontSize(14d); cell.setHorizontalCentered(true); } else { rt.getTextParagraph().setBullet(true); - rt.setFontSize(12); + rt.setFontSize(12d); rt.getTextParagraph().setAlignment(TextAlign.LEFT); cell.setHorizontalCentered(false); } diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java index 91366b9d06..dcd0dea77c 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java @@ -42,7 +42,7 @@ public class Tutorial2 { XSLFTextParagraph p1 = shape1.addNewTextParagraph(); XSLFTextRun r1 = p1.addNewTextRun(); r1.setText("Paragraph Formatting"); - r1.setFontSize(24); + r1.setFontSize(24d); r1.setFontColor(new Color(85, 142, 213)); XSLFTextParagraph p2 = shape1.addNewTextParagraph(); @@ -52,20 +52,20 @@ public class Tutorial2 { p2.setSpaceAfter(300d); // 3 lines after the paragraph XSLFTextRun r2 = p2.addNewTextRun(); r2.setText("Paragraph properties apply to all text residing within the corresponding paragraph."); - r2.setFontSize(16); + r2.setFontSize(16d); XSLFTextParagraph p3 = shape1.addNewTextParagraph(); XSLFTextRun r3 = p3.addNewTextRun(); r3.setText("Run Formatting"); - r3.setFontSize(24); + r3.setFontSize(24d); r3.setFontColor(new Color(85, 142, 213)); XSLFTextParagraph p4 = shape1.addNewTextParagraph(); p4.setSpaceBefore(-20d); // 20 pt from the previous paragraph p4.setSpaceAfter(300d); // 3 lines after the paragraph XSLFTextRun r4 = p4.addNewTextRun(); - r4.setFontSize(16); + r4.setFontSize(16d); r4.setText( "Run level formatting is the most granular property level and allows " + "for the specifying of all low level text properties. The text run is " + diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java index ec2d358818..6a9637b2c8 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java @@ -142,6 +142,12 @@ public abstract class XSLFShape implements Shape { if (pr == null) { pr = shape.getGrpSpPr(); } + if (pr == null) { + if (shape.getXmlObject() instanceof CTBackground) { + pr = shape.getXmlObject(); + } + } + if (pr == null) { setValue(PaintStyle.TRANSPARENT_PAINT); return true; @@ -174,29 +180,7 @@ public abstract class XSLFShape implements Shape { if (fillRef == null) { fillRef = getBgRef(); } - if (fillRef == null) { - return PaintStyle.TRANSPARENT_PAINT; - } - - // The idx attribute refers to the index of a fill style or - // background fill style within the presentation's style matrix, defined by the fmtScheme element. - // value of 0 or 1000 indicates no background, - // values 1-999 refer to the index of a fill style within the fillStyleLst element - // values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element. - int idx = (int)fillRef.getIdx(); - CTSchemeColor phClr = fillRef.getSchemeClr(); - XSLFSheet sheet = getSheet(); - XSLFTheme theme = sheet.getTheme(); - XmlObject fillProps = null; - CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme(); - if(idx >= 1 && idx <= 999){ - fillProps = matrix.getFillStyleLst().selectPath("*")[idx - 1]; - } else if (idx >= 1001 ){ - fillProps = matrix.getBgFillStyleLst().selectPath("*")[idx - 1001]; - } - if(fillProps != null) { - paint = selectPaint(fillProps, phClr, sheet.getPackagePart()); - } + paint = selectPaint(fillRef); return paint == null ? PaintStyle.TRANSPARENT_PAINT : paint; } @@ -250,6 +234,28 @@ public abstract class XSLFShape implements Shape { } return _ph; } + + /** + * Specifies that the corresponding shape should be represented by the generating application + * as a placeholder. When a shape is considered a placeholder by the generating application + * it can have special properties to alert the user that they may enter content into the shape. + * Different types of placeholders are allowed and can be specified by using the placeholder + * type attribute for this element + * + * @param placeholder + */ + protected void setPlaceholder(Placeholder placeholder) { + String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr"; + CTApplicationNonVisualDrawingProps nv = selectProperty(CTApplicationNonVisualDrawingProps.class, xquery); + if (nv == null) return; + if(placeholder == null) { + if (nv.isSetPh()) nv.unsetPh(); + _ph = null; + } else { + nv.addNewPh().setType(STPlaceholderType.Enum.forInt(placeholder.ordinal() + 1)); + } + } + /** * As there's no xmlbeans hierarchy, but XSLF works with subclassing, not all @@ -365,6 +371,8 @@ public abstract class XSLFShape implements Shape { return selectPaint((CTBlipFillProperties)obj, phClr, parentPart); } else if (obj instanceof CTGradientFillProperties) { return selectPaint((CTGradientFillProperties) obj, phClr, parentPart); + } else if (obj instanceof CTStyleMatrixReference) { + return selectPaint((CTStyleMatrixReference)obj); } else { return null; } @@ -479,5 +487,25 @@ public abstract class XSLFShape implements Shape { }; } - + protected PaintStyle selectPaint(CTStyleMatrixReference fillRef) { + if (fillRef == null) return null; + + // The idx attribute refers to the index of a fill style or + // background fill style within the presentation's style matrix, defined by the fmtScheme element. + // value of 0 or 1000 indicates no background, + // values 1-999 refer to the index of a fill style within the fillStyleLst element + // values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element. + int idx = (int)fillRef.getIdx(); + CTSchemeColor phClr = fillRef.getSchemeClr(); + XSLFSheet sheet = getSheet(); + XSLFTheme theme = sheet.getTheme(); + XmlObject fillProps = null; + CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme(); + if (idx >= 1 && idx <= 999) { + fillProps = matrix.getFillStyleLst().selectPath("*")[idx - 1]; + } else if (idx >= 1001 ){ + fillProps = matrix.getBgFillStyleLst().selectPath("*")[idx - 1001]; + } + return (fillProps == null) ? null : selectPaint(fillProps, phClr, theme.getPackagePart()); + } } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java index fcd28a8b10..9381152787 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java @@ -118,7 +118,7 @@ public class XSLFTableCell extends XSLFTextShape { private double getBorderWidth(char bltr) { CTLineProperties ln = getCTLine(bltr, false); - return (ln == null) ? defaultBorderWidth : Units.toPoints(ln.getW()); + return (ln == null || !ln.isSetW()) ? defaultBorderWidth : Units.toPoints(ln.getW()); } private void setBorderColor(char bltr, Color color) { diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java index b838490115..994a6034f1 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -23,6 +23,7 @@ import org.apache.poi.sl.usermodel.AutoNumberingScheme; import org.apache.poi.sl.usermodel.TextParagraph; import org.apache.poi.util.*; import org.apache.poi.xslf.model.ParagraphPropertyFetcher; +import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; @@ -379,9 +380,9 @@ public class XSLFTextParagraph implements TextParagraph { @Override public void setIndent(Double indent){ - if ((indent == null || indent == -1d) && !_p.isSetPPr()) return; + if ((indent == null) && !_p.isSetPPr()) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); - if(indent == -1) { + if(indent == null) { if(pr.isSetIndent()) pr.unsetIndent(); } else { pr.setIndent(Units.toEMU(indent)); @@ -441,7 +442,7 @@ public class XSLFTextParagraph implements TextParagraph { public void setRightMargin(Double rightMargin){ if (rightMargin == null && !_p.isSetPPr()) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); - if(rightMargin == -1) { + if(rightMargin == null) { if(pr.isSetMarR()) pr.unsetMarR(); } else { pr.setMarR(Units.toEMU(rightMargin)); @@ -788,69 +789,102 @@ public class XSLFTextParagraph implements TextParagraph { return ok; } - void copy(XSLFTextParagraph p){ - TextAlign srcAlign = p.getTextAlign(); + void copy(XSLFTextParagraph other){ + if (other == this) return; + + CTTextParagraph thisP = getXmlObject(); + CTTextParagraph otherP = other.getXmlObject(); + + if (thisP.isSetPPr()) thisP.unsetPPr(); + if (thisP.isSetEndParaRPr()) thisP.unsetEndParaRPr(); + + _runs.clear(); + for (int i=thisP.sizeOfBrArray(); i>0; i--) { + thisP.removeBr(i-1); + } + for (int i=thisP.sizeOfRArray(); i>0; i--) { + thisP.removeR(i-1); + } + for (int i=thisP.sizeOfFldArray(); i>0; i--) { + thisP.removeFld(i-1); + } + + XmlCursor thisC = thisP.newCursor(); + thisC.toEndToken(); + XmlCursor otherC = otherP.newCursor(); + otherC.copyXmlContents(thisC); + otherC.dispose(); + thisC.dispose(); + + List otherRs = other.getTextRuns(); + int i=0; + for(CTRegularTextRun rtr : thisP.getRArray()) { + XSLFTextRun run = new XSLFTextRun(rtr, this); + run.copy(otherRs.get(i++)); + _runs.add(run); + } + + + // set properties again, in case we are based on a different + // template + TextAlign srcAlign = other.getTextAlign(); if(srcAlign != getTextAlign()){ setTextAlign(srcAlign); } - boolean isBullet = p.isBullet(); + boolean isBullet = other.isBullet(); if(isBullet != isBullet()){ setBullet(isBullet); if(isBullet) { - String buFont = p.getBulletFont(); + String buFont = other.getBulletFont(); if(buFont != null && !buFont.equals(getBulletFont())){ setBulletFont(buFont); } - String buChar = p.getBulletCharacter(); + String buChar = other.getBulletCharacter(); if(buChar != null && !buChar.equals(getBulletCharacter())){ setBulletCharacter(buChar); } - Color buColor = p.getBulletFontColor(); + Color buColor = other.getBulletFontColor(); if(buColor != null && !buColor.equals(getBulletFontColor())){ setBulletFontColor(buColor); } - double buSize = p.getBulletFontSize(); - if(buSize != getBulletFontSize()){ + Double buSize = other.getBulletFontSize(); + if(!doubleEquals(buSize, getBulletFontSize())){ setBulletFontSize(buSize); } } } - Double leftMargin = p.getLeftMargin(); - if(leftMargin != getLeftMargin()){ + Double leftMargin = other.getLeftMargin(); + if (!doubleEquals(leftMargin, getLeftMargin())){ setLeftMargin(leftMargin); } - Double indent = p.getIndent(); - if(indent != getIndent()){ + Double indent = other.getIndent(); + if (!doubleEquals(indent, getIndent())) { setIndent(indent); } - Double spaceAfter = p.getSpaceAfter(); - if(spaceAfter != getSpaceAfter()){ + Double spaceAfter = other.getSpaceAfter(); + if (!doubleEquals(spaceAfter, getSpaceAfter())) { setSpaceAfter(spaceAfter); } - Double spaceBefore = p.getSpaceBefore(); - if(spaceBefore != getSpaceBefore()){ + Double spaceBefore = other.getSpaceBefore(); + if (!doubleEquals(spaceBefore, getSpaceBefore())) { setSpaceBefore(spaceBefore); } - Double lineSpacing = p.getLineSpacing(); - if(lineSpacing != getLineSpacing()){ + Double lineSpacing = other.getLineSpacing(); + if (!doubleEquals(lineSpacing, getLineSpacing())) { setLineSpacing(lineSpacing); } - - List srcR = p.getTextRuns(); - List tgtR = getTextRuns(); - for(int i = 0; i < srcR.size(); i++){ - XSLFTextRun r1 = srcR.get(i); - XSLFTextRun r2 = tgtR.get(i); - r2.copy(r1); - } } + private static boolean doubleEquals(Double d1, Double d2) { + return (d1 == d2 || (d1 != null && d1.equals(d2))); + } + @Override public Double getDefaultFontSize() { CTTextCharacterProperties endPr = _p.getEndParaRPr(); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java index 74685ec1b5..7a5c78b198 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java @@ -82,7 +82,8 @@ public class XSLFTextRun implements TextRun { return _r; } - public void setFontColor(Color color){ + @Override + public void setFontColor(Color color) { CTTextCharacterProperties rPr = getRPr(); CTSolidColorFillProperties fill = rPr.isSetSolidFill() ? rPr.getSolidFill() : rPr.addNewSolidFill(); CTSRgbColor clr = fill.isSetSrgbClr() ? fill.getSrgbClr() : fill.addNewSrgbClr(); @@ -96,6 +97,7 @@ public class XSLFTextRun implements TextRun { } + @Override public Color getFontColor(){ final XSLFTheme theme = _p.getParentShape().getSheet().getTheme(); CTShapeStyle style = _p.getParentShape().getSpStyle(); @@ -119,17 +121,13 @@ public class XSLFTextRun implements TextRun { return fetcher.getValue(); } - /** - * - * @param fontSize font size in points. - * The value of -1 unsets the Sz attribyte from the underlying xml bean - */ - public void setFontSize(double fontSize){ + @Override + public void setFontSize(Double fontSize){ CTTextCharacterProperties rPr = getRPr(); - if(fontSize == -1.0) { - if(rPr.isSetSz()) rPr.unsetSz(); + if(fontSize == null) { + if (rPr.isSetSz()) rPr.unsetSz(); } else { - if(fontSize < 1.0) { + if (fontSize < 1.0) { throw new IllegalArgumentException("Minimum font size is 1pt but was " + fontSize); } @@ -137,9 +135,6 @@ public class XSLFTextRun implements TextRun { } } - /** - * @return font size in points or null if font size is not set. - */ @Override public Double getFontSize(){ double scale = 1; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java index 5b58adbf1a..d1eb19e805 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java @@ -433,6 +433,10 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape protected abstract CTTextBody getTextBody(boolean create); + @Override + public void setPlaceholder(Placeholder placeholder) { + super.setPlaceholder(placeholder); + } public Placeholder getTextType(){ CTPlaceholder ph = getCTPlaceholder(); @@ -442,27 +446,6 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape return Placeholder.values()[val - 1]; } - - /** - * Specifies that the corresponding shape should be represented by the generating application - * as a placeholder. When a shape is considered a placeholder by the generating application - * it can have special properties to alert the user that they may enter content into the shape. - * Different types of placeholders are allowed and can be specified by using the placeholder - * type attribute for this element - * - * @param placeholder - */ - public void setPlaceholder(Placeholder placeholder){ - String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr"; - CTApplicationNonVisualDrawingProps nv = selectProperty(CTApplicationNonVisualDrawingProps.class, xquery); - if (nv == null) return; - if(placeholder == null) { - if (nv.isSetPh()) nv.unsetPh(); - } else { - nv.addNewPh().setType(STPlaceholderType.Enum.forInt(placeholder.ordinal() + 1)); - } - } - @Override public double getTextHeight(){ DrawFactory drawFact = DrawFactory.getInstance(null); @@ -490,45 +473,55 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape @Override - void copy(XSLFShape sh){ - super.copy(sh); + void copy(XSLFShape other){ + super.copy(other); - XSLFTextShape tsh = (XSLFTextShape)sh; + XSLFTextShape otherTS = (XSLFTextShape)other; + CTTextBody otherTB = otherTS.getTextBody(false); + CTTextBody thisTB = getTextBody(true); + if (otherTB == null) { + return; + } + + thisTB.setBodyPr((CTTextBodyProperties)otherTB.getBodyPr().copy()); - boolean srcWordWrap = tsh.getWordWrap(); + if (thisTB.isSetLstStyle()) thisTB.unsetLstStyle(); + if (otherTB.isSetLstStyle()) { + thisTB.setLstStyle((CTTextListStyle)otherTB.getLstStyle().copy()); + } + + boolean srcWordWrap = otherTS.getWordWrap(); if(srcWordWrap != getWordWrap()){ setWordWrap(srcWordWrap); } - double leftInset = tsh.getLeftInset(); + double leftInset = otherTS.getLeftInset(); if(leftInset != getLeftInset()) { setLeftInset(leftInset); } - double rightInset = tsh.getRightInset(); + double rightInset = otherTS.getRightInset(); if(rightInset != getRightInset()) { setRightInset(rightInset); } - double topInset = tsh.getTopInset(); + double topInset = otherTS.getTopInset(); if(topInset != getTopInset()) { setTopInset(topInset); } - double bottomInset = tsh.getBottomInset(); + double bottomInset = otherTS.getBottomInset(); if(bottomInset != getBottomInset()) { setBottomInset(bottomInset); } - VerticalAlignment vAlign = tsh.getVerticalAlignment(); + VerticalAlignment vAlign = otherTS.getVerticalAlignment(); if(vAlign != getVerticalAlignment()) { setVerticalAlignment(vAlign); } - List srcP = tsh.getTextParagraphs(); - List tgtP = getTextParagraphs(); - for(int i = 0; i < srcP.size(); i++){ - XSLFTextParagraph p1 = srcP.get(i); - XSLFTextParagraph p2 = tgtP.get(i); - p2.copy(p1); + clearText(); + + for (XSLFTextParagraph srcP : otherTS.getTextParagraphs()) { + XSLFTextParagraph tgtP = addNewTextParagraph(); + tgtP.copy(srcP); } - } } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java index 6ae9606b78..7accdfdc25 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java @@ -125,7 +125,7 @@ public class TestXSLFAutoShape { p.setIndent(2.0); assertEquals(2.0, p.getIndent(), 0); assertTrue(p.getXmlObject().getPPr().isSetIndent()); - p.setIndent(-1d); + p.setIndent(null); assertNull(p.getIndent()); assertFalse(p.getXmlObject().getPPr().isSetIndent()); p.setIndent(10.0); @@ -225,7 +225,7 @@ public class TestXSLFAutoShape { assertEquals(1000, r.getXmlObject().getRPr().getSz()); r.setFontSize(12.5); assertEquals(1250, r.getXmlObject().getRPr().getSz()); - r.setFontSize(-1); + r.setFontSize(null); assertFalse(r.getXmlObject().getRPr().isSetSz()); assertFalse(r.getXmlObject().getRPr().isSetLatin()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java index fdfb46ee9a..3314855c70 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java @@ -143,7 +143,7 @@ public class TestXSLFSlide { assertFalse(r2.isItalic()); assertEquals(Color.white, r2.getFontColor()); assertEquals(new Color(148, 198, 0), sh2.getFillColor()); - assertEquals(new Color(74, 99, 0), sh2.getLineColor()); // slightly different from PowerPoint! + assertEquals(new Color(148, 198, 0), sh2.getLineColor()); // slightly different from PowerPoint! // the 5th slide has a picture and a texture fill XSLFSlide slide2 = ppt.createSlide().importContent(src.getSlides().get(4)); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java index 40e07a6910..59b0dca95c 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java @@ -78,7 +78,6 @@ public class TestXSLFTextBox { assertEquals(20.0, r.getFontSize(), 0); pPr.unsetSz(); // Should never be - assertEquals(-1.0, r.getFontSize(), 0); - + assertNull(r.getFontSize()); } } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index 4d51733353..e71cf2419f 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -30,6 +30,7 @@ import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Assume; import org.junit.Test; /** @@ -74,16 +75,16 @@ public class TestXSLFTextParagraph { DrawTextParagraphProxy dtp = new DrawTextParagraphProxy(p); - double leftInset = sh.getLeftInset(); - double rightInset = sh.getRightInset(); + Double leftInset = sh.getLeftInset(); + Double rightInset = sh.getRightInset(); assertEquals(7.2, leftInset, 0); assertEquals(7.2, rightInset, 0); - double leftMargin = p.getLeftMargin(); + Double leftMargin = p.getLeftMargin(); assertEquals(0.0, leftMargin, 0); - double indent = p.getIndent(); - assertEquals(0.0, indent, 0); // default + Double indent = p.getIndent(); + assertNull(indent); // default double expectedWidth; @@ -150,10 +151,7 @@ public class TestXSLFTextParagraph { @Test public void testBreakLines(){ String os = System.getProperty("os.name"); - if(os == null || !os.contains("Windows")) { - _logger.log(POILogger.WARN, "Skipping testBreakLines(), it is executed only on Windows machines"); - return; - } + Assume.assumeTrue("Skipping testBreakLines(), it is executed only on Windows machines", (os != null && os.contains("Windows"))); XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -162,7 +160,7 @@ public class TestXSLFTextParagraph { XSLFTextParagraph p = sh.addNewTextParagraph(); XSLFTextRun r = p.addNewTextRun(); r.setFontFamily("Arial"); // this should always be available - r.setFontSize(12); + r.setFontSize(12d); r.setText( "Paragraph formatting allows for more granular control " + "of text within a shape. Properties here apply to all text " + @@ -179,13 +177,13 @@ public class TestXSLFTextParagraph { lines = dtp.getLines(); assertEquals(4, lines.size()); - // descrease the shape width from 300 pt to 100 pt + // decrease the shape width from 300 pt to 100 pt sh.setAnchor(new Rectangle(50, 50, 100, 200)); dtp.breakText(graphics); lines = dtp.getLines(); assertEquals(12, lines.size()); - // descrease the shape width from 300 pt to 100 pt + // decrease the shape width from 300 pt to 100 pt sh.setAnchor(new Rectangle(50, 50, 600, 200)); dtp.breakText(graphics); lines = dtp.getLines(); @@ -224,12 +222,13 @@ public class TestXSLFTextParagraph { XSLFTextParagraph p2 = sh2.addNewTextParagraph(); XSLFTextRun r2 = p2.addNewTextRun(); r2.setFontFamily("serif"); // this should always be available - r2.setFontSize(30); + r2.setFontSize(30d); r2.setText("Apache\n"); XSLFTextRun r3 = p2.addNewTextRun(); r3.setFontFamily("serif"); // this should always be available - r3.setFontSize(10); + r3.setFontSize(10d); r3.setText("POI"); + dtp = new DrawTextParagraphProxy(p2); dtp.breakText(graphics); lines = dtp.getLines(); assertEquals(2, lines.size()); @@ -278,7 +277,7 @@ public class TestXSLFTextParagraph { p.setBulletFontColor(Color.red); assertEquals(Color.red, p.getBulletFontColor()); - assertEquals(100.0, p.getBulletFontSize(), 0); + assertNull(p.getBulletFontSize()); p.setBulletFontSize(200.); assertEquals(200., p.getBulletFontSize(), 0); p.setBulletFontSize(-20.); @@ -286,17 +285,21 @@ public class TestXSLFTextParagraph { assertEquals(72.0, p.getDefaultTabSize(), 0); - assertEquals(0.0, p.getIndent(), 0); + assertNull(p.getIndent()); p.setIndent(72.0); assertEquals(72.0, p.getIndent(), 0); - p.setIndent(-1.0); // the value of -1.0 resets to the defaults - assertEquals(0.0, p.getIndent(), 0); + p.setIndent(-1d); // the value of -1.0 resets to the defaults (not any more ...) + assertEquals(-1d, p.getIndent(), 0); + p.setIndent(null); + assertNull(p.getIndent()); assertEquals(0.0, p.getLeftMargin(), 0); p.setLeftMargin(72.0); assertEquals(72.0, p.getLeftMargin(), 0); p.setLeftMargin(-1.0); // the value of -1.0 resets to the defaults - assertEquals(0.0, p.getLeftMargin(), 0); + assertEquals(-1.0, p.getLeftMargin(), 0); + p.setLeftMargin(null); + assertEquals(0d, p.getLeftMargin(), 0); // default will be taken from master assertEquals(0, p.getIndentLevel()); p.setIndentLevel(1); @@ -304,19 +307,19 @@ public class TestXSLFTextParagraph { p.setIndentLevel(2); assertEquals(2, p.getIndentLevel()); - assertEquals(100., p.getLineSpacing(), 0); + assertNull(p.getLineSpacing()); p.setLineSpacing(200.); assertEquals(200.0, p.getLineSpacing(), 0); p.setLineSpacing(-15.); assertEquals(-15.0, p.getLineSpacing(), 0); - assertEquals(0., p.getSpaceAfter(), 0); + assertNull(p.getSpaceAfter()); p.setSpaceAfter(200.); assertEquals(200.0, p.getSpaceAfter(), 0); p.setSpaceAfter(-15.); assertEquals(-15.0, p.getSpaceAfter(), 0); - assertEquals(0., p.getSpaceBefore(), 0); + assertNull(p.getSpaceBefore()); p.setSpaceBefore(200.); assertEquals(200.0, p.getSpaceBefore(), 0); p.setSpaceBefore(-15.); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java index c3aabe051d..de0d1a36a4 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java @@ -24,6 +24,7 @@ import java.util.List; import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.XSLFTestDataSamples; +import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; @@ -33,6 +34,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; */ public class TestXSLFTextShape { + @Test public void testLayouts(){ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("layouts.pptx"); @@ -612,7 +614,7 @@ public class TestXSLFTextShape { assertEquals("10", sldNum.getText()); } - + @Test public void testTitleStyles(){ XMLSlideShow ppt = new XMLSlideShow(); @@ -693,6 +695,7 @@ public class TestXSLFTextShape { assertEquals(TextAlign.CENTER, paragraph.getTextAlign()); } + @Test public void testBodyStyles(){ XMLSlideShow ppt = new XMLSlideShow(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java index 3e85f75c57..f928124c42 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java @@ -59,7 +59,7 @@ public class TestXSLFTheme { } void slide1(XSLFSlide slide){ - assertEquals(Color.white, slide.getBackground().getFillColor()); + assertEquals(Color.WHITE, slide.getBackground().getFillColor()); XSLFTheme theme = slide.getTheme(); assertEquals("Office Theme", theme.getName()); @@ -75,7 +75,7 @@ public class TestXSLFTheme { void slide2(XSLFSlide slide){ // Background 2, darker 10% // YK: PPT shows slightly different color: new Color(221, 217, 195) - assertEquals(new Color(214, 212, 203), slide.getBackground().getFillColor()); + assertEquals(new Color(221, 217, 195), slide.getBackground().getFillColor()); } void slide3(XSLFSlide slide){ @@ -133,7 +133,7 @@ public class TestXSLFTheme { void slide7(XSLFSlide slide){ //YK: PPT reports a slightly different color: r=189,g=239,b=87 - assertEquals(new Color(182, 218, 108), slide.getBackground().getFillColor()); + assertEquals(new Color(189, 239, 87), slide.getBackground().getFillColor()); assertFalse(slide.getFollowMasterGraphics()); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java index 7ae20c6696..3b22227b99 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java @@ -256,7 +256,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable { txt.setText(s); HSLFTextRun rt = txt.getTextParagraphs().get(0).getTextRuns().get(0); - rt.setFontSize(_font.getSize()); + rt.setFontSize((double)_font.getSize()); rt.setFontFamily(_font.getFamily()); if (getColor() != null) rt.setFontColor(getColor()); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index 437ed274e9..d12bfe3de8 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -141,7 +141,7 @@ public final class HSLFTextRun implements TextRun { * @param propName The name of the Paragraph TextProp * @param val The value to set for the TextProp */ - public void setCharTextPropVal(String propName, int val) { + public void setCharTextPropVal(String propName, Integer val) { setPropVal(characterStyle, propName, val); } @@ -251,20 +251,17 @@ public final class HSLFTextRun implements TextRun { setPropVal(characterStyle, "superscript", val); } - /** - * Gets the font size - */ + @Override public Double getFontSize() { TextProp tp = getPropVal(characterStyle, "font.size", parentParagraph); return tp == null ? null : (double)tp.getValue(); } - /** - * Sets the font size - */ - public void setFontSize(int fontSize) { - setCharTextPropVal("font.size", fontSize); + @Override + public void setFontSize(Double fontSize) { + Integer iFontSize = (fontSize == null) ? null : fontSize.intValue(); + setCharTextPropVal("font.size", iFontSize); } /** diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java index 234fee1d00..16562b82a0 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java @@ -18,12 +18,11 @@ package org.apache.poi.sl.draw; import static org.apache.poi.sl.usermodel.PaintStyle.TRANSPARENT_PAINT; + import java.awt.*; import java.awt.MultipleGradientPaint.ColorSpaceType; import java.awt.MultipleGradientPaint.CycleMethod; -import java.awt.Shape; import java.awt.geom.*; -import java.awt.image.*; import java.io.IOException; import java.io.InputStream; @@ -35,7 +34,13 @@ import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; +/** + * This class handles color transformations + * + * @see HSL code taken from Java Tips Weblog + */ public class DrawPaint { + // HSL code is public domain - see https://tips4java.wordpress.com/contact-us/ private final static POILogger LOG = POILogFactory.getLogger(DrawPaint.class); @@ -126,7 +131,7 @@ public class DrawPaint { } result = applyAlpha(result, color); - result = applyLuminanace(result, color); + result = applyLuminance(result, color); result = applyShade(result, color); result = applyTint(result, color); @@ -135,7 +140,7 @@ public class DrawPaint { protected static Color applyAlpha(Color c, ColorStyle fc) { int alpha = c.getAlpha(); - return (alpha == 0 || alpha == -1) ? c : new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha); + return (alpha == 255) ? c : new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha); } /** @@ -145,8 +150,10 @@ public class DrawPaint { * @param lumMod luminance modulation in the range [0..100000] * @param lumOff luminance offset in the range [0..100000] * @return modified color + * + * @see Using Office Open XML to Customize Document Formatting in the 2007 Office System */ - protected static Color applyLuminanace(Color c, ColorStyle fc) { + protected static Color applyLuminance(Color c, ColorStyle fc) { int lumMod = fc.getLumMod(); if (lumMod == -1) lumMod = 100000; @@ -155,24 +162,33 @@ public class DrawPaint { if (lumMod == 100000 && lumOff == 0) return c; - int r = c.getRed(); - int g = c.getGreen(); - int b = c.getBlue(); + // The lumMod value is the percent luminance. A lumMod value of "60000", + // is 60% of the luminance of the original color. + // When the color is a shade of the original theme color, the lumMod + // attribute is the only one of the tags shown here that appears. + // The tag appears after the tag when the color is a + // tint of the original. The lumOff value always equals 1-lumMod, which is used in the tint calculation + // + // Despite having different ways to display the tint and shade percentages, + // all of the programs use the same method to calculate the resulting color. + // Convert the original RGB value to HSL ... and then adjust the luminance (L) + // with one of the following equations before converting the HSL value back to RGB. + // (The % tint in the following equations refers to the tint, themetint, themeshade, + // or lumMod values, as applicable.) + // + // For a shade, the equation is luminance * %tint. + // + // For a tint, the equation is luminance * %tint + (1-%tint). + // (Note that 1-%tint is equal to the lumOff value in DrawingML.) - float red,green,blue; + double fLumOff = lumOff / 100000d; + double fLumMod = lumMod / 100000d; - if (lumOff > 0) { - float flumOff = lumOff / 100000.f; - red = (255.f - r) * (1.f - flumOff) + r; - green = (255.f - g) * flumOff + g; - blue = (255.f - b) * flumOff + b; - } else { - float flumMod = lumMod / 100000.f; - red = r * flumMod; - green = g * flumMod; - blue = b * flumMod; - } - return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha()); + double hsl[] = RGB2HSL(c); + hsl[2] = hsl[2]*fLumMod+fLumOff; + + Color c2 = HSL2RGB(hsl[0], hsl[1], hsl[2], c.getAlpha()/255d); + return c2; } /** @@ -302,165 +318,127 @@ public class DrawPaint { } } - public static class PathGradientPaint implements Paint { - - // http://asserttrue.blogspot.de/2010/01/how-to-iimplement-custom-paint-in-50.html - protected final Color colors[]; - protected final float fractions[]; - protected final int capStyle; - protected final int joinStyle; - protected final int transparency; - - - public PathGradientPaint(Color colors[], float fractions[]) { - this(colors,fractions,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); - } - - public PathGradientPaint(Color colors[], float fractions[], int capStyle, int joinStyle) { - this.colors = colors; - this.fractions = fractions; - this.capStyle = capStyle; - this.joinStyle = joinStyle; - - // determine transparency - boolean opaque = true; - for (int i = 0; i < colors.length; i++){ - opaque = opaque && (colors[i].getAlpha() == 0xff); - } - this.transparency = opaque ? OPAQUE : TRANSLUCENT; - } - - public PaintContext createContext(ColorModel cm, - Rectangle deviceBounds, - Rectangle2D userBounds, - AffineTransform transform, - RenderingHints hints) { - return new PathGradientContext(cm, deviceBounds, userBounds, transform, hints); - } - - public int getTransparency() { - return transparency; + /** + * Convert HSL values to a RGB Color. + * + * @param h Hue is specified as degrees in the range 0 - 360. + * @param s Saturation is specified as a percentage in the range 1 - 100. + * @param l Luminance is specified as a percentage in the range 1 - 100. + * @param alpha the alpha value between 0 - 1 + * + * @returns the RGB Color object + */ + private static Color HSL2RGB(double h, double s, double l, double alpha) { + if (s <0.0f || s > 100.0f) { + String message = "Color parameter outside of expected range - Saturation"; + throw new IllegalArgumentException( message ); } - class PathGradientContext implements PaintContext { - protected final Rectangle deviceBounds; - protected final Rectangle2D userBounds; - protected final AffineTransform xform; - protected final RenderingHints hints; - - /** - * for POI: the shape will be only known when the subclasses determines the concrete implementation - * in the draw/-content method, so we need to postpone the setting/creation as long as possible - **/ - protected final Shape shape; - protected final PaintContext pCtx; - protected final int gradientSteps; - WritableRaster raster; - - public PathGradientContext( - ColorModel cm - , Rectangle deviceBounds - , Rectangle2D userBounds - , AffineTransform xform - , RenderingHints hints - ) { - shape = (Shape)hints.get(Drawable.GRADIENT_SHAPE); - if (shape == null) { - throw new IllegalPathStateException("PathGradientPaint needs a shape to be set via the rendering hint PathGradientPaint.GRADIANT_SHAPE."); - } - - this.deviceBounds = deviceBounds; - this.userBounds = userBounds; - this.xform = xform; - this.hints = hints; - - gradientSteps = getGradientSteps(shape); - - Point2D start = new Point2D.Double(0, 0); - Point2D end = new Point2D.Double(gradientSteps, 0); - LinearGradientPaint gradientPaint = new LinearGradientPaint(start, end, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, new AffineTransform()); - - Rectangle bounds = new Rectangle(0, 0, gradientSteps, 1); - pCtx = gradientPaint.createContext(cm, bounds, bounds, new AffineTransform(), hints); - } - - public void dispose() {} - - public ColorModel getColorModel() { - return pCtx.getColorModel(); - } - - public Raster getRaster(int xOffset, int yOffset, int w, int h) { - ColorModel cm = getColorModel(); - if (raster == null) createRaster(); - - // TODO: eventually use caching here - WritableRaster childRaster = cm.createCompatibleWritableRaster(w, h); - Rectangle2D childRect = new Rectangle2D.Double(xOffset, yOffset, w, h); - if (!childRect.intersects(deviceBounds)) { - // usually doesn't happen ... - return childRaster; - } - - Rectangle2D destRect = new Rectangle2D.Double(); - Rectangle2D.intersect(childRect, deviceBounds, destRect); - int dx = (int)(destRect.getX()-deviceBounds.getX()); - int dy = (int)(destRect.getY()-deviceBounds.getY()); - int dw = (int)destRect.getWidth(); - int dh = (int)destRect.getHeight(); - Object data = raster.getDataElements(dx, dy, dw, dh, null); - dx = (int)(destRect.getX()-childRect.getX()); - dy = (int)(destRect.getY()-childRect.getY()); - childRaster.setDataElements(dx, dy, dw, dh, data); - - return childRaster; - } - - protected int getGradientSteps(Shape shape) { - Rectangle rect = shape.getBounds(); - int lower = 1; - int upper = (int)(Math.max(rect.getWidth(),rect.getHeight())/2.0); - while (lower < upper-1) { - int mid = lower + (upper - lower) / 2; - BasicStroke bs = new BasicStroke(mid, capStyle, joinStyle); - Area area = new Area(bs.createStrokedShape(shape)); - if (area.isSingular()) { - upper = mid; - } else { - lower = mid; - } - } - return upper; - } - - - - protected void createRaster() { - ColorModel cm = getColorModel(); - raster = cm.createCompatibleWritableRaster((int)deviceBounds.getWidth(), (int)deviceBounds.getHeight()); - BufferedImage img = new BufferedImage(cm, raster, false, null); - Graphics2D graphics = img.createGraphics(); - graphics.setRenderingHints(hints); - graphics.translate(-deviceBounds.getX(), -deviceBounds.getY()); - graphics.transform(xform); - - Raster img2 = pCtx.getRaster(0, 0, gradientSteps, 1); - int rgb[] = new int[cm.getNumComponents()]; - - for (int i = gradientSteps-1; i>=0; i--) { - img2.getPixel(i, 0, rgb); - Color c = new Color(rgb[0],rgb[1],rgb[2]); - if (rgb.length == 4) { - // it doesn't work to use just a color with transparency ... - graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, rgb[3]/255.0f)); - } - graphics.setStroke(new BasicStroke(i+1, capStyle, joinStyle)); - graphics.setColor(c); - graphics.draw(shape); - } - - graphics.dispose(); - } + if (l <0.0f || l > 100.0f) { + String message = "Color parameter outside of expected range - Luminance"; + throw new IllegalArgumentException( message ); } + + if (alpha <0.0f || alpha > 1.0f) { + String message = "Color parameter outside of expected range - Alpha"; + throw new IllegalArgumentException( message ); + } + + // Formula needs all values between 0 - 1. + + h = h % 360.0f; + h /= 360f; + s /= 100f; + l /= 100f; + + double q = (l < 0.5d) + ? l * (1d + s) + : (l + s) - (s * l); + + double p = 2d * l - q; + + double r = Math.max(0, HUE2RGB(p, q, h + (1.0d / 3.0d))); + double g = Math.max(0, HUE2RGB(p, q, h)); + double b = Math.max(0, HUE2RGB(p, q, h - (1.0d / 3.0d))); + + r = Math.min(r, 1.0d); + g = Math.min(g, 1.0d); + b = Math.min(b, 1.0d); + + return new Color((float)r, (float)g, (float)b, (float)alpha); } -} + + private static double HUE2RGB(double p, double q, double h) { + if (h < 0d) h += 1d; + + if (h > 1d) h -= 1d; + + if (6d * h < 1d) { + return p + ((q - p) * 6d * h); + } + + if (2d * h < 1d) { + return q; + } + + if (3d * h < 2d) { + return p + ( (q - p) * 6d * ((2.0d / 3.0d) - h) ); + } + + return p; + } + + + /** + * Convert a RGB Color to it corresponding HSL values. + * + * @return an array containing the 3 HSL values. + */ + private static double[] RGB2HSL(Color color) + { + // Get RGB values in the range 0 - 1 + + float[] rgb = color.getRGBColorComponents( null ); + double r = rgb[0]; + double g = rgb[1]; + double b = rgb[2]; + + // Minimum and Maximum RGB values are used in the HSL calculations + + double min = Math.min(r, Math.min(g, b)); + double max = Math.max(r, Math.max(g, b)); + + // Calculate the Hue + + double h = 0; + + if (max == min) { + h = 0; + } else if (max == r) { + h = ((60d * (g - b) / (max - min)) + 360d) % 360d; + } else if (max == g) { + h = (60d * (b - r) / (max - min)) + 120d; + } else if (max == b) { + h = (60d * (r - g) / (max - min)) + 240d; + } + + // Calculate the Luminance + + double l = (max + min) / 2d; + + // Calculate the Saturation + + double s = 0; + + if (max == min) { + s = 0; + } else if (l <= .5d) { + s = (max - min) / (max + min); + } else { + s = (max - min) / (2d - max - min); + } + + return new double[] {h, s * 100, l * 100}; + } + +} \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java index 6b118617e7..e2db501e85 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java @@ -34,7 +34,6 @@ import org.apache.poi.util.Units; public class DrawTextParagraph implements Drawable { protected TextParagraph paragraph; double x, y; - protected Insets2D insets = new Insets2D(0,0,0,0); protected List lines = new ArrayList(); protected String rawText; protected DrawTextFragment bullet; @@ -49,14 +48,6 @@ public class DrawTextParagraph implements Drawable { this.paragraph = paragraph; } - public Insets2D getInsets() { - return insets; - } - - public void setInsets(Insets2D insets) { - this.insets.set(insets.top, insets.left, insets.bottom, insets.right); - } - public void setPosition(double x, double y) { // TODO: replace it, by applyTransform???? this.x = x; @@ -78,6 +69,7 @@ public class DrawTextParagraph implements Drawable { public void draw(Graphics2D graphics){ if (lines.isEmpty()) return; + Insets2D insets = paragraph.getParentShape().getInsets(); double leftInset = insets.left; double rightInset = insets.right; double penY = y; @@ -336,6 +328,7 @@ public class DrawTextParagraph implements Drawable { protected double getWrappingWidth(boolean firstLine, Graphics2D graphics){ // internal margins for the text box + Insets2D insets = paragraph.getParentShape().getInsets(); double leftInset = insets.left; double rightInset = insets.right; diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java index 77927bdc69..5862ac598c 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java @@ -119,7 +119,6 @@ public class DrawTextShape autoNbrIdx) autoNbrIdx = startAt; } dp.setAutoNumberingIdx(autoNbrIdx); - dp.setInsets(shapePadding); dp.breakText(graphics); if (!isFirstLine) { diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/PathGradientPaint.java b/src/scratchpad/src/org/apache/poi/sl/draw/PathGradientPaint.java new file mode 100644 index 0000000000..c5ad799f4c --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/sl/draw/PathGradientPaint.java @@ -0,0 +1,186 @@ +/* ==================================================================== + 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.sl.draw; + +import java.awt.*; +import java.awt.MultipleGradientPaint.ColorSpaceType; +import java.awt.MultipleGradientPaint.CycleMethod; +import java.awt.geom.*; +import java.awt.image.*; + +class PathGradientPaint implements Paint { + + // http://asserttrue.blogspot.de/2010/01/how-to-iimplement-custom-paint-in-50.html + protected final Color colors[]; + protected final float fractions[]; + protected final int capStyle; + protected final int joinStyle; + protected final int transparency; + + + public PathGradientPaint(Color colors[], float fractions[]) { + this(colors,fractions,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); + } + + public PathGradientPaint(Color colors[], float fractions[], int capStyle, int joinStyle) { + this.colors = colors; + this.fractions = fractions; + this.capStyle = capStyle; + this.joinStyle = joinStyle; + + // determine transparency + boolean opaque = true; + for (int i = 0; i < colors.length; i++){ + opaque = opaque && (colors[i].getAlpha() == 0xff); + } + this.transparency = opaque ? OPAQUE : TRANSLUCENT; + } + + public PaintContext createContext(ColorModel cm, + Rectangle deviceBounds, + Rectangle2D userBounds, + AffineTransform transform, + RenderingHints hints) { + return new PathGradientContext(cm, deviceBounds, userBounds, transform, hints); + } + + public int getTransparency() { + return transparency; + } + + class PathGradientContext implements PaintContext { + protected final Rectangle deviceBounds; + protected final Rectangle2D userBounds; + protected final AffineTransform xform; + protected final RenderingHints hints; + + /** + * for POI: the shape will be only known when the subclasses determines the concrete implementation + * in the draw/-content method, so we need to postpone the setting/creation as long as possible + **/ + protected final Shape shape; + protected final PaintContext pCtx; + protected final int gradientSteps; + WritableRaster raster; + + public PathGradientContext( + ColorModel cm + , Rectangle deviceBounds + , Rectangle2D userBounds + , AffineTransform xform + , RenderingHints hints + ) { + shape = (Shape)hints.get(Drawable.GRADIENT_SHAPE); + if (shape == null) { + throw new IllegalPathStateException("PathGradientPaint needs a shape to be set via the rendering hint PathGradientPaint.GRADIANT_SHAPE."); + } + + this.deviceBounds = deviceBounds; + this.userBounds = userBounds; + this.xform = xform; + this.hints = hints; + + gradientSteps = getGradientSteps(shape); + + Point2D start = new Point2D.Double(0, 0); + Point2D end = new Point2D.Double(gradientSteps, 0); + LinearGradientPaint gradientPaint = new LinearGradientPaint(start, end, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, new AffineTransform()); + + Rectangle bounds = new Rectangle(0, 0, gradientSteps, 1); + pCtx = gradientPaint.createContext(cm, bounds, bounds, new AffineTransform(), hints); + } + + public void dispose() {} + + public ColorModel getColorModel() { + return pCtx.getColorModel(); + } + + public Raster getRaster(int xOffset, int yOffset, int w, int h) { + ColorModel cm = getColorModel(); + if (raster == null) createRaster(); + + // TODO: eventually use caching here + WritableRaster childRaster = cm.createCompatibleWritableRaster(w, h); + Rectangle2D childRect = new Rectangle2D.Double(xOffset, yOffset, w, h); + if (!childRect.intersects(deviceBounds)) { + // usually doesn't happen ... + return childRaster; + } + + Rectangle2D destRect = new Rectangle2D.Double(); + Rectangle2D.intersect(childRect, deviceBounds, destRect); + int dx = (int)(destRect.getX()-deviceBounds.getX()); + int dy = (int)(destRect.getY()-deviceBounds.getY()); + int dw = (int)destRect.getWidth(); + int dh = (int)destRect.getHeight(); + Object data = raster.getDataElements(dx, dy, dw, dh, null); + dx = (int)(destRect.getX()-childRect.getX()); + dy = (int)(destRect.getY()-childRect.getY()); + childRaster.setDataElements(dx, dy, dw, dh, data); + + return childRaster; + } + + protected int getGradientSteps(Shape shape) { + Rectangle rect = shape.getBounds(); + int lower = 1; + int upper = (int)(Math.max(rect.getWidth(),rect.getHeight())/2.0); + while (lower < upper-1) { + int mid = lower + (upper - lower) / 2; + BasicStroke bs = new BasicStroke(mid, capStyle, joinStyle); + Area area = new Area(bs.createStrokedShape(shape)); + if (area.isSingular()) { + upper = mid; + } else { + lower = mid; + } + } + return upper; + } + + + + protected void createRaster() { + ColorModel cm = getColorModel(); + raster = cm.createCompatibleWritableRaster((int)deviceBounds.getWidth(), (int)deviceBounds.getHeight()); + BufferedImage img = new BufferedImage(cm, raster, false, null); + Graphics2D graphics = img.createGraphics(); + graphics.setRenderingHints(hints); + graphics.translate(-deviceBounds.getX(), -deviceBounds.getY()); + graphics.transform(xform); + + Raster img2 = pCtx.getRaster(0, 0, gradientSteps, 1); + int rgb[] = new int[cm.getNumComponents()]; + + for (int i = gradientSteps-1; i>=0; i--) { + img2.getPixel(i, 0, rgb); + Color c = new Color(rgb[0],rgb[1],rgb[2]); + if (rgb.length == 4) { + // it doesn't work to use just a color with transparency ... + graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, rgb[3]/255.0f)); + } + graphics.setStroke(new BasicStroke(i+1, capStyle, joinStyle)); + graphics.setColor(c); + graphics.draw(shape); + } + + graphics.dispose(); + } + } +} diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java index bc1652afe5..946bfc3217 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java @@ -35,7 +35,18 @@ public interface TextRun { TextCap getTextCap(); Color getFontColor(); + void setFontColor(Color color); + + + /** + * @return font size in points or null if font size is not set. + */ Double getFontSize(); + + /** + * @param fontSize font size in points, if null the underlying fontsize will be unset + */ + void setFontSize(Double fontSize); String getFontFamily(); boolean isBold(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java index febf9e3b20..e593eb8b56 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java @@ -47,7 +47,7 @@ public final class TestSetBoldItalic { HSLFTextBox txtbox = new HSLFTextBox(); rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); txtbox.setText(val); - rt.setFontSize(42); + rt.setFontSize(42d); rt.setBold(true); rt.setItalic(true); rt.setUnderlined(false); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java index 4fde268965..19f0d5b034 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java @@ -194,7 +194,7 @@ public final class TestShapes { rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); txtbox.setText(val); rt.setFontFamily("Arial"); - rt.setFontSize(42); + rt.setFontSize(42d); rt.setBold(true); rt.setItalic(true); rt.setUnderlined(false); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java index b57e9f503c..8ad3ba6d79 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java @@ -168,7 +168,7 @@ public final class TestRichTextRun { // Change 2nd to different size and font assertEquals(2, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR - rtrRb.setFontSize(18); + rtrRb.setFontSize(18d); rtrRb.setFontFamily("Courier"); assertEquals(3, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR + Courier assertEquals(18, rtrRb.getFontSize(), 0); @@ -183,7 +183,7 @@ public final class TestRichTextRun { assertNotNull(rtr.getTextParagraph().getParagraphStyle()); // Change Font size - rtr.setFontSize(99); + rtr.setFontSize(99d); assertEquals(99, rtr.getFontSize(), 0); assertEquals(defaultFont, rtr.getFontFamily()); assertNotNull(rtr.getCharacterStyle()); @@ -191,7 +191,7 @@ public final class TestRichTextRun { assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default // Change Font size and name - rtr.setFontSize(25); + rtr.setFontSize(25d); rtr.setFontFamily("Times New Roman"); assertEquals(25, rtr.getFontSize(), 0); assertEquals("Times New Roman", rtr.getFontFamily()); @@ -209,7 +209,7 @@ public final class TestRichTextRun { HSLFTextRun rtr = textParass.get(0).get(0).getTextRuns().get(0); rtr.setBold(true); - rtr.setFontSize(18); + rtr.setFontSize(18d); rtr.setFontFamily("Courier"); HSLFTextParagraph.storeText(textParass.get(0)); @@ -228,7 +228,7 @@ public final class TestRichTextRun { // Tweak existing one again, to ensure really worked rtr.setBold(false); - rtr.setFontSize(17); + rtr.setFontSize(17d); rtr.setFontFamily("CourierZZ"); // Check it took those changes @@ -511,7 +511,7 @@ public final class TestRichTextRun { "Multiline text"); HSLFTextParagraph rt = shape.getTextParagraphs().get(0); HSLFTextRun tr = rt.getTextRuns().get(0); - tr.setFontSize(42); + tr.setFontSize(42d); rt.setBullet(true); rt.setLeftMargin(50d); rt.setIndent(0d); From 9b09cb683ab24180411f033a8ba9ed2d6073ebca Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sat, 18 Jul 2015 20:35:28 +0000 Subject: [PATCH 21/22] Introduce dirty flag for paragraphs and store them to records on save git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1691774 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hslf/usermodel/HSLFSlideShow.java | 14 +++++++ .../poi/hslf/usermodel/HSLFTextParagraph.java | 42 +++++++++++++++---- .../poi/hslf/usermodel/HSLFTextRun.java | 11 +++-- .../poi/hslf/usermodel/TestTextRun.java | 2 +- 4 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java index 5cc313e91f..ec7de6635c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java @@ -442,6 +442,20 @@ public final class HSLFSlideShow implements SlideShow { * OutputStream */ public void write(OutputStream out) throws IOException { + // check for text paragraph modifications + for (HSLFSlide sl : getSlides()) { + for (HSLFShape sh : sl.getShapes()) { + if (!(sh instanceof HSLFTextShape)) continue; + HSLFTextShape hts = (HSLFTextShape)sh; + boolean isDirty = false; + for (HSLFTextParagraph p : hts.getTextParagraphs()) { + isDirty |= p.isDirty(); + } + if (isDirty) hts.storeText(); + } + } + + _hslfSlideShow.write(out); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index 386447328b..b07a8f8b67 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -64,6 +64,8 @@ public final class HSLFTextParagraph implements TextParagraph { private int shapeId; private StyleTextProp9Atom styleTextProp9Atom; + + private boolean _dirty = false; /** * Constructs a Text Run from a Unicode text block. @@ -265,7 +267,7 @@ public final class HSLFTextParagraph implements TextParagraph { @Override public void setLeftMargin(Double leftMargin) { Integer val = (leftMargin == null) ? null : Units.pointsToMaster(leftMargin); - setPropVal(_paragraphStyle, "text.offset", val); + setParagraphTextPropVal("text.offset", val); } @Override @@ -288,7 +290,7 @@ public final class HSLFTextParagraph implements TextParagraph { @Override public void setIndent(Double indent) { Integer val = (indent == null) ? null : Units.pointsToMaster(indent); - setPropVal(_paragraphStyle, "bullet.offset", val); + setParagraphTextPropVal("bullet.offset", val); } @Override @@ -327,7 +329,7 @@ public final class HSLFTextParagraph implements TextParagraph { case JUSTIFY_LOW: alignInt = TextAlignmentProp.JUSTIFYLOW; break; case THAI_DIST: alignInt = TextAlignmentProp.THAIDISTRIBUTED; break; } - setPropVal(_paragraphStyle, "alignment", alignInt); + setParagraphTextPropVal("alignment", alignInt); } @Override @@ -455,7 +457,7 @@ public final class HSLFTextParagraph implements TextParagraph { */ public void setBulletChar(Character c) { Integer val = (c == null) ? null : (int)c.charValue(); - setPropVal(_paragraphStyle, "bullet.char", val); + setParagraphTextPropVal("bullet.char", val); } /** @@ -485,7 +487,7 @@ public final class HSLFTextParagraph implements TextParagraph { */ public void setBulletColor(Color color) { Integer val = (color == null) ? null : new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB(); - setPropVal(_paragraphStyle, "bullet.color", val); + setParagraphTextPropVal("bullet.color", val); } /** @@ -513,7 +515,7 @@ public final class HSLFTextParagraph implements TextParagraph { FontCollection fc = getSheet().getSlideShow().getFontCollection(); int idx = fc.addFont(typeface); - setPropVal(_paragraphStyle, "bullet.font", idx); + setParagraphTextPropVal("bullet.font", idx); setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, true); } @@ -576,7 +578,7 @@ public final class HSLFTextParagraph implements TextParagraph { if (dval != null) { ival = (dval < 0) ? Units.pointsToMaster(dval) : dval.intValue(); } - setPropVal(_paragraphStyle, propName, ival); + setParagraphTextPropVal(propName, ival); } private boolean getFlag(int index) { @@ -587,6 +589,7 @@ public final class HSLFTextParagraph implements TextParagraph { private void setFlag(int index, boolean value) { BitMaskTextProp tp = (BitMaskTextProp)_paragraphStyle.addWithName(ParagraphFlagsTextProp.NAME); tp.setSubValue(value, index); + setDirty(); } /** @@ -813,6 +816,10 @@ public final class HSLFTextParagraph implements TextParagraph { throw new RuntimeException("failed dummy write", e); } } + + for (HSLFTextParagraph p : paragraphs) { + p._dirty = false; + } } /** @@ -1260,4 +1267,25 @@ public final class HSLFTextParagraph implements TextParagraph { } return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); } + + /** + * Sets the value of the given Paragraph TextProp, add if required + * @param propName The name of the Paragraph TextProp + * @param val The value to set for the TextProp + */ + public void setParagraphTextPropVal(String propName, Integer val) { + setPropVal(_paragraphStyle, propName, val); + setDirty(); + } + + /** + * marks this paragraph dirty, so its records will be renewed on save + */ + public void setDirty() { + _dirty = true; + } + + public boolean isDirty() { + return _dirty; + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index d12bfe3de8..8728eabb6b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -18,7 +18,6 @@ package org.apache.poi.hslf.usermodel; import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.getPropVal; -import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.setPropVal; import java.awt.Color; @@ -133,7 +132,10 @@ public final class HSLFTextRun implements TextRun { */ private void setCharFlagsTextPropVal(int index, boolean value) { // TODO: check if paragraph/chars can be handled the same ... - if (getFlag(index) != value) setFlag(index, value); + if (getFlag(index) != value) { + setFlag(index, value); + parentParagraph.setDirty(); + } } /** @@ -142,7 +144,8 @@ public final class HSLFTextRun implements TextRun { * @param val The value to set for the TextProp */ public void setCharTextPropVal(String propName, Integer val) { - setPropVal(characterStyle, propName, val); + HSLFTextParagraph.setPropVal(characterStyle, propName, val); + parentParagraph.setDirty(); } @@ -248,7 +251,7 @@ public final class HSLFTextRun implements TextRun { * @param val the percentage of the font size. If the value is positive, it is superscript, otherwise it is subscript */ public void setSuperscript(int val) { - setPropVal(characterStyle, "superscript", val); + setCharTextPropVal("superscript", val); } @Override diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java index c2f7ac9d08..aa0c307f93 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java @@ -525,7 +525,7 @@ public final class TestTextRun { rt.setFontColor(Color.RED); } } - tx.storeText(); + // tx.storeText(); } } ByteArrayOutputStream out = new ByteArrayOutputStream(); From 4e1c37905af496fcf0719b3ed623295c410040a9 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sun, 19 Jul 2015 19:46:25 +0000 Subject: [PATCH 22/22] disable jaxb class generation, because the order is different with each run git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1691849 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index d7b5482b48..00b6a386b2 100644 --- a/build.xml +++ b/build.xml @@ -709,7 +709,7 @@ under the License. - +