Author: fanningpj
Date: Tue May 27 18:48:31 2025
New Revision: 1925872
URL: http://svn.apache.org/viewvc?rev=1925872&view=rev
Log:
[bug-69669] try to share some code between the old code that I brought back and
the newer code that caused the problems
Modified:
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapePlaceholderDetails.java
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
poi/trunk/poi-scratchpad/src/test/java/org/apache/poi/hslf/model/TestLine.java
Modified:
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapePlaceholderDetails.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapePlaceholderDetails.java?rev=1925872&r1=1925871&r2=1925872&view=diff
==============================================================================
---
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapePlaceholderDetails.java
(original)
+++
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapePlaceholderDetails.java
Tue May 27 18:48:31 2025
@@ -47,6 +47,68 @@ import org.apache.poi.util.LocaleUtil;
* @since POI 4.0.0
*/
public class HSLFShapePlaceholderDetails extends HSLFPlaceholderDetails {
+
+ static void updateSPRecord(final HSLFSimpleShape shape, final Placeholder
placeholder) {
+ final EscherSpRecord spRecord =
shape.getEscherChild(EscherSpRecord.RECORD_ID);
+ int flags = spRecord.getFlags();
+ if (placeholder == null) {
+ flags ^= EscherSpRecord.FLAG_HAVEMASTER;
+ } else {
+ flags |= EscherSpRecord.FLAG_HAVEANCHOR |
EscherSpRecord.FLAG_HAVEMASTER;
+ }
+ spRecord.setFlags(flags);
+
+ // Placeholders can't be grouped
+
shape.setEscherProperty(EscherPropertyTypes.PROTECTION__LOCKAGAINSTGROUPING,
(placeholder == null ? -1 : 262144));
+ }
+
+ static void removePlaceholder(final HSLFSimpleShape shape) {
+ final HSLFEscherClientDataRecord clientData =
shape.getClientData(false);
+ if (clientData != null) {
+ clientData.removeChild(OEPlaceholderAtom.class);
+ clientData.removeChild(RoundTripHFPlaceholder12.class);
+ // remove client data if the placeholder was the only child to be
carried
+ if (clientData.getChildRecords().isEmpty()) {
+ shape.getSpContainer().removeChildRecord(clientData);
+ }
+ }
+ }
+
+ static OEPlaceholderAtom createOEPlaceholderAtom(final
HSLFEscherClientDataRecord clientData) {
+ return createOEPlaceholderAtom(clientData, (byte) 0);
+ }
+
+ static OEPlaceholderAtom createOEPlaceholderAtom(final
HSLFEscherClientDataRecord clientData,
+ final byte placeholderId)
{
+ OEPlaceholderAtom oePlaceholderAtom = new OEPlaceholderAtom();
+
oePlaceholderAtom.setPlaceholderSize((byte)OEPlaceholderAtom.PLACEHOLDER_FULLSIZE);
+ // TODO: placement id only "SHOULD" be unique ... check other
placeholders on sheet for unique id
+ oePlaceholderAtom.setPlacementId(-1);
+ oePlaceholderAtom.setPlaceholderId(placeholderId);
+ clientData.addChild(oePlaceholderAtom);
+ return oePlaceholderAtom;
+ }
+
+ static byte getPlaceholderId(final HSLFSheet sheet, final Placeholder
placeholder) {
+ if (placeholder == null) {
+ return 0;
+ }
+ byte phId;
+ // TODO: implement/switch NotesMaster
+ if (sheet instanceof HSLFSlideMaster) {
+ phId = (byte) placeholder.nativeSlideMasterId;
+ } else if (sheet instanceof HSLFNotes) {
+ phId = (byte) placeholder.nativeNotesId;
+ } else {
+ phId = (byte) placeholder.nativeSlideId;
+ }
+
+ if (phId == -2) {
+ throw new HSLFException("Placeholder " + placeholder.name() + "
not supported for this sheet type (" + sheet.getClass() + ")");
+ }
+ return phId;
+ }
+
private enum PlaceholderContainer {
slide, master, notes, notesMaster
}
@@ -78,7 +140,7 @@ public class HSLFShapePlaceholderDetails
@Override
public Placeholder getPlaceholder() {
- updatePlaceholderAtom(false);
+ updatePlaceholderAtom(null, false);
final int phId;
if (oePlaceholderAtom != null) {
phId = oePlaceholderAtom.getPlaceholderId();
@@ -105,17 +167,7 @@ public class HSLFShapePlaceholderDetails
@Override
public void setPlaceholder(final Placeholder placeholder) {
- final EscherSpRecord spRecord =
shape.getEscherChild(EscherSpRecord.RECORD_ID);
- int flags = spRecord.getFlags();
- if (placeholder == null) {
- flags ^= EscherSpRecord.FLAG_HAVEMASTER;
- } else {
- flags |= EscherSpRecord.FLAG_HAVEANCHOR |
EscherSpRecord.FLAG_HAVEMASTER;
- }
- spRecord.setFlags(flags);
-
- // Placeholders can't be grouped
-
shape.setEscherProperty(EscherPropertyTypes.PROTECTION__LOCKAGAINSTGROUPING,
(placeholder == null ? -1 : 262144));
+ updateSPRecord(shape, placeholder);
if (placeholder == null) {
removePlaceholder();
@@ -123,7 +175,7 @@ public class HSLFShapePlaceholderDetails
}
// init client data
- updatePlaceholderAtom(true);
+ updatePlaceholderAtom(placeholder, true);
final byte phId = getPlaceholderId(placeholder);
oePlaceholderAtom.setPlaceholderId(phId);
@@ -158,7 +210,7 @@ public class HSLFShapePlaceholderDetails
if (ph == null || size == null) {
return;
}
- updatePlaceholderAtom(true);
+ updatePlaceholderAtom(ph, true);
final byte ph_size;
switch (size) {
@@ -209,20 +261,12 @@ public class HSLFShapePlaceholderDetails
}
private void removePlaceholder() {
- final HSLFEscherClientDataRecord clientData =
shape.getClientData(false);
- if (clientData != null) {
- clientData.removeChild(OEPlaceholderAtom.class);
- clientData.removeChild(RoundTripHFPlaceholder12.class);
- // remove client data if the placeholder was the only child to be
carried
- if (clientData.getChildRecords().isEmpty()) {
- shape.getSpContainer().removeChildRecord(clientData);
- }
- }
+ removePlaceholder(shape);
oePlaceholderAtom = null;
roundTripHFPlaceholder12 = null;
}
- private void updatePlaceholderAtom(final boolean create) {
+ private void updatePlaceholderAtom(final Placeholder placeholder, final
boolean create) {
localDateTime = null;
if (shape instanceof HSLFTextBox) {
EscherTextboxWrapper txtBox =
((HSLFTextBox)shape).getEscherTextboxWrapper();
@@ -255,11 +299,8 @@ public class HSLFShapePlaceholderDetails
}
if (oePlaceholderAtom == null) {
- oePlaceholderAtom = new OEPlaceholderAtom();
-
oePlaceholderAtom.setPlaceholderSize((byte)OEPlaceholderAtom.PLACEHOLDER_FULLSIZE);
- // TODO: placement id only "SHOULD" be unique ... check other
placeholders on sheet for unique id
- oePlaceholderAtom.setPlacementId(-1);
- clientData.addChild(oePlaceholderAtom);
+ final byte phId = getPlaceholderId(shape.getSheet(), placeholder);
+ oePlaceholderAtom = createOEPlaceholderAtom(clientData, phId);
}
if (roundTripHFPlaceholder12 == null) {
roundTripHFPlaceholder12 = new RoundTripHFPlaceholder12();
Modified:
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java?rev=1925872&r1=1925871&r2=1925872&view=diff
==============================================================================
---
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
(original)
+++
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
Tue May 27 18:48:31 2025
@@ -56,6 +56,11 @@ import org.apache.poi.sl.usermodel.Strok
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.Units;
+import static
org.apache.poi.hslf.usermodel.HSLFShapePlaceholderDetails.createOEPlaceholderAtom;
+import static
org.apache.poi.hslf.usermodel.HSLFShapePlaceholderDetails.getPlaceholderId;
+import static
org.apache.poi.hslf.usermodel.HSLFShapePlaceholderDetails.removePlaceholder;
+import static
org.apache.poi.hslf.usermodel.HSLFShapePlaceholderDetails.updateSPRecord;
+
/**
* An abstract simple (non-group) shape.
* This is the parent class for all primitive shapes like Line, Rectangle,
etc.
@@ -582,45 +587,25 @@ public abstract class HSLFSimpleShape ex
@Override
public void setPlaceholder(Placeholder placeholder) {
- EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
- int flags = spRecord.getFlags();
- if (placeholder == null) {
- flags ^= EscherSpRecord.FLAG_HAVEMASTER;
- } else {
- flags |= EscherSpRecord.FLAG_HAVEANCHOR |
EscherSpRecord.FLAG_HAVEMASTER;
- }
- spRecord.setFlags(flags);
+ updateSPRecord(this, placeholder);
- // Placeholders can't be grouped
- setEscherProperty(EscherPropertyTypes.PROTECTION__LOCKAGAINSTGROUPING,
(placeholder == null ? -1 : 262144));
-
- HSLFEscherClientDataRecord clientData = getClientData(false);
if (placeholder == null) {
- if (clientData != null) {
- clientData.removeChild(OEPlaceholderAtom.class);
- clientData.removeChild(RoundTripHFPlaceholder12.class);
- // remove client data if the placeholder was the only child to
be carried
- if (clientData.getChildRecords().isEmpty()) {
- getSpContainer().removeChildRecord(clientData);
- }
- }
+ removePlaceholder(this);
return;
}
- if (clientData == null) {
- clientData = getClientData(true);
- }
+ HSLFEscherClientDataRecord clientData = getClientData(true);
// OEPlaceholderAtom tells powerpoint that this shape is a placeholder
OEPlaceholderAtom oep = null;
RoundTripHFPlaceholder12 rtp = null;
for (org.apache.poi.hslf.record.Record r :
clientData.getHSLFChildRecords()) {
if (r instanceof OEPlaceholderAtom) {
- oep = (OEPlaceholderAtom)r;
+ oep = (OEPlaceholderAtom) r;
break;
}
if (r instanceof RoundTripHFPlaceholder12) {
- rtp = (RoundTripHFPlaceholder12)r;
+ rtp = (RoundTripHFPlaceholder12) r;
break;
}
}
@@ -632,20 +617,7 @@ public abstract class HSLFSimpleShape ex
* This occurs when the user has moved the placeholder from its
original position.
* In this case the placeholder ID is -1.
*/
- byte phId;
- HSLFSheet sheet = getSheet();
- // TODO: implement/switch NotesMaster
- if (sheet instanceof HSLFSlideMaster) {
- phId = (byte)placeholder.nativeSlideMasterId;
- } else if (sheet instanceof HSLFNotes) {
- phId = (byte)placeholder.nativeNotesId;
- } else {
- phId = (byte)placeholder.nativeSlideId;
- }
-
- if (phId == -2) {
- throw new HSLFException("Placeholder "+placeholder.name()+" not
supported for this sheet type ("+sheet.getClass()+")");
- }
+ final byte phId = getPlaceholderId(getSheet(), placeholder);
switch (placeholder) {
case HEADER:
@@ -664,19 +636,16 @@ public abstract class HSLFSimpleShape ex
clientData.removeChild(RoundTripHFPlaceholder12.class);
}
if (oep == null) {
- oep = new OEPlaceholderAtom();
-
oep.setPlaceholderSize((byte)OEPlaceholderAtom.PLACEHOLDER_FULLSIZE);
- // TODO: placement id only "SHOULD" be unique ... check
other placeholders on sheet for unique id
- oep.setPlacementId(-1);
- oep.setPlaceholderId(phId);
- clientData.addChild(oep);
+ oep = createOEPlaceholderAtom(clientData, phId);
}
break;
}
// reverted this call because of
https://bz.apache.org/bugzilla/show_bug.cgi?id=69669
//getPlaceholderDetails().setPlaceholder(placeholder);
- }
+ // reset the placeholder details so that the next call to
getPlaceholderDetails() will reinitialize it
+ _placeholderDetails = null;
+ }
@Override
public void setStrokeStyle(Object... styles) {
Modified:
poi/trunk/poi-scratchpad/src/test/java/org/apache/poi/hslf/model/TestLine.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/test/java/org/apache/poi/hslf/model/TestLine.java?rev=1925872&r1=1925871&r2=1925872&view=diff
==============================================================================
---
poi/trunk/poi-scratchpad/src/test/java/org/apache/poi/hslf/model/TestLine.java
(original)
+++
poi/trunk/poi-scratchpad/src/test/java/org/apache/poi/hslf/model/TestLine.java
Tue May 27 18:48:31 2025
@@ -18,6 +18,8 @@
package org.apache.poi.hslf.model;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.awt.Color;
import java.awt.Rectangle;
@@ -27,9 +29,11 @@ import java.util.Arrays;
import org.apache.poi.hslf.HSLFTestDataSamples;
import org.apache.poi.hslf.usermodel.HSLFLine;
+import org.apache.poi.hslf.usermodel.HSLFPlaceholder;
import org.apache.poi.hslf.usermodel.HSLFShape;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFTextBox;
import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
import org.junit.jupiter.api.Test;
@@ -65,7 +69,11 @@ public final class TestLine {
final String title = "Lines tester";
try (HSLFSlideShow ppt1 = new HSLFSlideShow()) {
HSLFSlide slide1 = ppt1.createSlide();
- slide1.addTitle().setText(title);
+ HSLFTextBox titleBox = slide1.addTitle();
+ titleBox.setText(title);
+ assertInstanceOf(HSLFPlaceholder.class, titleBox);
+ HSLFPlaceholder pl = (HSLFPlaceholder) titleBox;
+ assertNotNull(pl.getPlaceholder());
for (Object[] line : lines) {
HSLFLine hslfLine = new HSLFLine();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]