Properly update the array of Slide's text runs in HSLF when new text shapes are added

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@685064 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yegor Kozlov 2008-08-12 07:15:26 +00:00
parent d92587222d
commit 2e33f41e90
7 changed files with 87 additions and 27 deletions

View File

@ -37,6 +37,7 @@
<!-- Don't forget to update status.xml too! --> <!-- Don't forget to update status.xml too! -->
<release version="3.1.1-alpha1" date="2008-??-??"> <release version="3.1.1-alpha1" date="2008-??-??">
<action dev="POI-DEVELOPERS" type="fix">Properly update the array of Slide's text runs in HSLF when new text shapes are added</action>
<action dev="POI-DEVELOPERS" type="fix">45590 - Fix for Header/footer extraction for .ppt files saved in Office 2007</action> <action dev="POI-DEVELOPERS" type="fix">45590 - Fix for Header/footer extraction for .ppt files saved in Office 2007</action>
<action dev="POI-DEVELOPERS" type="fix">Big improvement in how HWPF handles unicode text, and more sanity checking of text ranges within HWPF</action> <action dev="POI-DEVELOPERS" type="fix">Big improvement in how HWPF handles unicode text, and more sanity checking of text ranges within HWPF</action>
<action dev="POI-DEVELOPERS" type="add">Include headers and footers int he extracted text from HWPF's WordExtractor</action> <action dev="POI-DEVELOPERS" type="add">Include headers and footers int he extracted text from HWPF's WordExtractor</action>

View File

@ -34,6 +34,7 @@
<!-- Don't forget to update changes.xml too! --> <!-- Don't forget to update changes.xml too! -->
<changes> <changes>
<release version="3.1.1-alpha1" date="2008-??-??"> <release version="3.1.1-alpha1" date="2008-??-??">
<action dev="POI-DEVELOPERS" type="fix">Properly update the array of Slide's text runs in HSLF when new text shapes are added</action>
<action dev="POI-DEVELOPERS" type="fix">45590 - Fix for Header/footer extraction for .ppt files saved in Office 2007</action> <action dev="POI-DEVELOPERS" type="fix">45590 - Fix for Header/footer extraction for .ppt files saved in Office 2007</action>
<action dev="POI-DEVELOPERS" type="fix">Big improvement in how HWPF handles unicode text, and more sanity checking of text ranges within HWPF</action> <action dev="POI-DEVELOPERS" type="fix">Big improvement in how HWPF handles unicode text, and more sanity checking of text ranges within HWPF</action>
<action dev="POI-DEVELOPERS" type="add">Include headers and footers int he extracted text from HWPF's WordExtractor</action> <action dev="POI-DEVELOPERS" type="add">Include headers and footers int he extracted text from HWPF's WordExtractor</action>

View File

@ -363,6 +363,16 @@ public abstract class Sheet {
} }
/**
* Subclasses should call this method and update the array of text runs
* when a text shape is added
*
* @param shape
*/
protected void onAddTextShape(TextShape shape) {
}
/** /**
* Return placeholder by text type * Return placeholder by text type
* *
@ -440,5 +450,4 @@ public abstract class Sheet {
} }
} }

View File

@ -460,4 +460,16 @@ public class Slide extends Sheet
return new HeadersFooters(hdd, this, newRecord, ppt2007); return new HeadersFooters(hdd, this, newRecord, ppt2007);
} }
} }
protected void onAddTextShape(TextShape shape) {
TextRun run = shape.getTextRun();
if(_runs == null) _runs = new TextRun[]{run};
else {
TextRun[] tmp = new TextRun[_runs.length + 1];
System.arraycopy(_runs, 0, tmp, 0, _runs.length);
tmp[tmp.length-1] = run;
_runs = tmp;
}
}
} }

View File

@ -129,33 +129,15 @@ public class SlideMaster extends MasterSheet {
} }
} }
/** protected void onAddTextShape(TextShape shape) {
* Checks if the shape is a placeholder. TextRun run = shape.getTextRun();
* (placeholders aren't normal shapes, they are visible only in the Edit Master mode)
*
*
* @return true if the shape is a placeholder
*/
public static boolean isPlaceholder(Shape shape){
if(!(shape instanceof TextShape)) return false;
TextShape tx = (TextShape)shape; if(_runs == null) _runs = new TextRun[]{run};
TextRun run = tx.getTextRun(); else {
if(run == null) return false; TextRun[] tmp = new TextRun[_runs.length + 1];
System.arraycopy(_runs, 0, tmp, 0, _runs.length);
Record[] records = run._records; tmp[tmp.length-1] = run;
for (int i = 0; i < records.length; i++) { _runs = tmp;
int type = (int)records[i].getRecordType(); }
if (type == RecordTypes.OEPlaceholderAtom.typeID ||
type == RecordTypes.SlideNumberMCAtom.typeID ||
type == RecordTypes.DateTimeMCAtom.typeID ||
type == RecordTypes.GenericDateMCAtom.typeID ||
type == RecordTypes.FooterMCAtom.typeID ){
return true;
}
}
return false;
} }
} }

View File

@ -199,6 +199,10 @@ public abstract class TextShape extends SimpleShape {
} }
if(getAnchor().equals(new Rectangle()) && !"".equals(getText())) resizeToFitText(); if(getAnchor().equals(new Rectangle()) && !"".equals(getText())) resizeToFitText();
} }
if(_txtrun != null) {
_txtrun.setShapeId(getShapeId());
sh.onAddTextShape(this);
}
} }
protected EscherTextboxWrapper getEscherTextboxWrapper(){ protected EscherTextboxWrapper getEscherTextboxWrapper(){

View File

@ -445,4 +445,55 @@ public class TestTextRun extends TestCase {
assertEquals("Sdfsdfs\n" + assertEquals("Sdfsdfs\n" +
"Sdfsdf\n", rt[1].getText()); "Sdfsdf\n", rt[1].getText());
} }
/**
* Test creation of TextRun objects.
*/
public void testAddTextRun() throws Exception{
SlideShow ppt = new SlideShow();
Slide slide = ppt.createSlide();
assertNull(slide.getTextRuns());
TextBox shape1 = new TextBox();
TextRun run1 = shape1.getTextRun();
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();
assertNotNull(runs);
assertSame(run1, runs[0]);
TextBox shape2 = new TextBox();
TextRun run2 = shape2.getTextRun();
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()
Shape[] 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());
//test Table - a complex group of shapes containing text objects
Slide slide2 = ppt.createSlide();
assertNull(slide2.getTextRuns());
Table table = new Table(2, 2);
slide2.addShape(table);
runs = slide2.getTextRuns();
assertNotNull(runs);
assertEquals(4, runs.length);
}
} }