Fix for adding multiple slides
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@388929 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4043f63b47
commit
85b8807855
@ -71,7 +71,7 @@ public class Document extends PositionDependentRecordContainer
|
|||||||
|
|
||||||
// Find our children
|
// Find our children
|
||||||
_children = Record.findChildRecords(source,start+8,len-8);
|
_children = Record.findChildRecords(source,start+8,len-8);
|
||||||
|
|
||||||
// Our first one should be a document atom
|
// Our first one should be a document atom
|
||||||
if(! (_children[0] instanceof DocumentAtom)) {
|
if(! (_children[0] instanceof DocumentAtom)) {
|
||||||
throw new IllegalStateException("The first child of a Document must be a DocumentAtom");
|
throw new IllegalStateException("The first child of a Document must be a DocumentAtom");
|
||||||
@ -102,6 +102,28 @@ public class Document extends PositionDependentRecordContainer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new SlideListWithText record, at the appropriate
|
||||||
|
* point
|
||||||
|
*/
|
||||||
|
public void addSlideListWithText(SlideListWithText slwt) {
|
||||||
|
// The new SlideListWithText should go in
|
||||||
|
// just before the EndDocumentRecord
|
||||||
|
Record endDoc = _children[_children.length - 1];
|
||||||
|
if(endDoc.getRecordType() != RecordTypes.EndDocument.typeID) {
|
||||||
|
throw new IllegalStateException("The last child record of a Document should be EndDocument, but it was " + endDoc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add in the record
|
||||||
|
addChildBefore(slwt, endDoc);
|
||||||
|
|
||||||
|
// Updated our cached list of SlideListWithText records
|
||||||
|
SlideListWithText[] nl = new SlideListWithText[slwts.length + 1];
|
||||||
|
System.arraycopy(slwts, 0, nl, 0, slwts.length);
|
||||||
|
nl[nl.length-1] = slwt;
|
||||||
|
slwts = nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -90,11 +90,17 @@ public class PersistPtrHolder extends PositionDependentRecordAtom
|
|||||||
* For now, won't look for the most optimal on disk representation.
|
* For now, won't look for the most optimal on disk representation.
|
||||||
*/
|
*/
|
||||||
public void addSlideLookup(int slideID, int posOnDisk) {
|
public void addSlideLookup(int slideID, int posOnDisk) {
|
||||||
|
// PtrData grows by 8 bytes:
|
||||||
|
// 4 bytes for the new info block
|
||||||
|
// 4 bytes for the slide offset
|
||||||
byte[] newPtrData = new byte[_ptrData.length + 8];
|
byte[] newPtrData = new byte[_ptrData.length + 8];
|
||||||
System.arraycopy(_ptrData,0,newPtrData,0,_ptrData.length);
|
System.arraycopy(_ptrData,0,newPtrData,0,_ptrData.length);
|
||||||
|
|
||||||
// Add to the lookup hash
|
// Add to the slide location lookup hash
|
||||||
_slideLocations.put(new Integer(slideID), new Integer(posOnDisk));
|
_slideLocations.put(new Integer(slideID), new Integer(posOnDisk));
|
||||||
|
// Add to the ptrData offset lookup hash
|
||||||
|
_slideOffsetDataLocation.put(new Integer(slideID),
|
||||||
|
new Integer(_ptrData.length + 4));
|
||||||
|
|
||||||
// Build the info block
|
// Build the info block
|
||||||
// First 20 bits = offset number = slide ID
|
// First 20 bits = offset number = slide ID
|
||||||
@ -111,10 +117,6 @@ public class PersistPtrHolder extends PositionDependentRecordAtom
|
|||||||
|
|
||||||
// Update the atom header
|
// Update the atom header
|
||||||
LittleEndian.putInt(_header,4,newPtrData.length);
|
LittleEndian.putInt(_header,4,newPtrData.length);
|
||||||
|
|
||||||
// Update info (first 4 bytes in ptr data)
|
|
||||||
int info = (slideID << 20 | 1);
|
|
||||||
LittleEndian.putInt(_ptrData, 0, info);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
package org.apache.poi.hslf.record;
|
package org.apache.poi.hslf.record;
|
||||||
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.hslf.model.Sheet;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
@ -106,7 +105,27 @@ public class SlideListWithText extends RecordContainer
|
|||||||
LittleEndian.putUShort(_header, 2, (int)_type);
|
LittleEndian.putUShort(_header, 2, (int)_type);
|
||||||
LittleEndian.putInt(_header, 4, 0);
|
LittleEndian.putInt(_header, 4, 0);
|
||||||
|
|
||||||
|
// We have no children to start with
|
||||||
_children = new Record[0];
|
_children = new Record[0];
|
||||||
|
slideAtomsSets = new SlideAtomsSet[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new SlidePersistAtom, to the end of the current list,
|
||||||
|
* and update the internal list of SlidePersistAtoms
|
||||||
|
* @param spa
|
||||||
|
*/
|
||||||
|
public void addSlidePersistAtom(SlidePersistAtom spa) {
|
||||||
|
// Add the new SlidePersistAtom at the end
|
||||||
|
appendChildRecord(spa);
|
||||||
|
|
||||||
|
SlideAtomsSet newSAS = new SlideAtomsSet(spa, new Record[0]);
|
||||||
|
|
||||||
|
// Update our SlideAtomsSets with this
|
||||||
|
SlideAtomsSet[] sas = new SlideAtomsSet[slideAtomsSets.length+1];
|
||||||
|
System.arraycopy(slideAtomsSets, 0, sas, 0, slideAtomsSets.length);
|
||||||
|
sas[sas.length-1] = newSAS;
|
||||||
|
slideAtomsSets = sas;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -476,24 +476,27 @@ public class SlideShow
|
|||||||
} else {
|
} else {
|
||||||
// Need to add a new one
|
// Need to add a new one
|
||||||
slist = new SlideListWithText();
|
slist = new SlideListWithText();
|
||||||
|
_documentRecord.addSlideListWithText(slist);
|
||||||
// Goes in just before the EndDocumentRecord
|
slwts = _documentRecord.getSlideListWithTexts();
|
||||||
Record[] docChildren = _documentRecord.getChildRecords();
|
|
||||||
Record endDoc = docChildren[docChildren.length - 1];
|
|
||||||
if(endDoc.getRecordType() != RecordTypes.EndDocument.typeID) {
|
|
||||||
throw new IllegalStateException("The last child record of a Document should be EndDocument, but it was " + endDoc);
|
|
||||||
}
|
|
||||||
_documentRecord.addChildBefore(slist, endDoc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grab the last SlidePersistAtom, if there was one
|
// Grab the SlidePersistAtom with the highest Slide Number.
|
||||||
|
// (Will stay as null if no SlidePersistAtom exists yet in
|
||||||
|
// the slide)
|
||||||
SlidePersistAtom prev = null;
|
SlidePersistAtom prev = null;
|
||||||
SlideAtomsSet[] sas = slist.getSlideAtomsSets();
|
for(int i=0; i<slwts.length; i++) {
|
||||||
if(sas != null && sas.length > 0) {
|
SlideAtomsSet[] sas = slwts[i].getSlideAtomsSets();
|
||||||
prev = sas[sas.length - 1].getSlidePersistAtom();
|
for(int j=0; j<sas.length; j++) {
|
||||||
|
SlidePersistAtom spa = sas[j].getSlidePersistAtom();
|
||||||
|
if(prev == null) { prev = spa; }
|
||||||
|
if(prev.getSlideIdentifier() < spa.getSlideIdentifier()) {
|
||||||
|
prev = spa;
|
||||||
|
}
|
||||||
|
System.err.println("Prev is " + prev.getRefID());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a new SlidePersistAtom
|
// Set up a new SlidePersistAtom for this slide
|
||||||
SlidePersistAtom sp = new SlidePersistAtom();
|
SlidePersistAtom sp = new SlidePersistAtom();
|
||||||
|
|
||||||
// Refernce is the 1-based index of the slide container in
|
// Refernce is the 1-based index of the slide container in
|
||||||
@ -505,7 +508,8 @@ public class SlideShow
|
|||||||
sp.setSlideIdentifier(prev == null ? 256 : (prev.getSlideIdentifier() + 1));
|
sp.setSlideIdentifier(prev == null ? 256 : (prev.getSlideIdentifier() + 1));
|
||||||
|
|
||||||
// Add this new SlidePersistAtom to the SlideListWithText
|
// Add this new SlidePersistAtom to the SlideListWithText
|
||||||
slist.appendChildRecord(sp);
|
slist.addSlidePersistAtom(sp);
|
||||||
|
|
||||||
|
|
||||||
// Create a new Slide
|
// Create a new Slide
|
||||||
Slide slide = new Slide();
|
Slide slide = new Slide();
|
||||||
@ -515,9 +519,10 @@ public class SlideShow
|
|||||||
_slides = s;
|
_slides = s;
|
||||||
System.out.println("Added slide " + _slides.length + " with ref " + sp.getRefID() + " and identifier " + sp.getSlideIdentifier());
|
System.out.println("Added slide " + _slides.length + " with ref " + sp.getRefID() + " and identifier " + sp.getSlideIdentifier());
|
||||||
|
|
||||||
// Add in to the core records
|
// Add the core records for this new Slide to the record tree
|
||||||
org.apache.poi.hslf.record.Slide slideRecord = slide.getSlideRecord();
|
org.apache.poi.hslf.record.Slide slideRecord = slide.getSlideRecord();
|
||||||
int slideRecordPos = _hslfSlideShow.appendRootLevelRecord(slideRecord);
|
int slideRecordPos = _hslfSlideShow.appendRootLevelRecord(slideRecord);
|
||||||
|
_records = _hslfSlideShow.getRecords();
|
||||||
|
|
||||||
// Add the new Slide into the PersistPtr stuff
|
// Add the new Slide into the PersistPtr stuff
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
@ -544,15 +549,9 @@ public class SlideShow
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add the new slide into the last PersistPtr
|
// Add the new slide into the last PersistPtr
|
||||||
|
// (Also need to tell it where it is)
|
||||||
slideRecord.setLastOnDiskOffset(slideOffset);
|
slideRecord.setLastOnDiskOffset(slideOffset);
|
||||||
int id = sp.getRefID();
|
ptr.addSlideLookup(sp.getRefID(), slideOffset);
|
||||||
ptr.getSlideOffsetDataLocationsLookup().put(
|
|
||||||
new Integer(id),
|
|
||||||
new Integer((slideRecordPos+1)*4)
|
|
||||||
);
|
|
||||||
ptr.getSlideLocationsLookup().put(
|
|
||||||
new Integer(id), new Integer(slideOffset));
|
|
||||||
ptr.addSlideLookup(id, slideOffset);
|
|
||||||
System.out.println("New slide ended up at " + slideOffset);
|
System.out.println("New slide ended up at " + slideOffset);
|
||||||
|
|
||||||
// Last view is now of the slide
|
// Last view is now of the slide
|
||||||
|
Loading…
Reference in New Issue
Block a user