Start to do more useful/sensible things with Slide IDs

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@388941 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2006-03-26 19:07:52 +00:00
parent 903bbb2ba6
commit 446971f3f4
7 changed files with 69 additions and 30 deletions

View File

@ -19,11 +19,7 @@
package org.apache.poi.hslf.model;
import java.util.*;
import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.record.SlideListWithText.*;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hslf.record.PPDrawing;
/**
* This class represents a slide's notes in a PowerPoint Document. It
@ -35,8 +31,8 @@ import org.apache.poi.util.LittleEndian;
public class Notes extends Sheet
{
private int _sheetNo;
private int _slideNo;
private org.apache.poi.hslf.record.Notes _notes;
private TextRun[] _runs;
@ -48,9 +44,12 @@ public class Notes extends Sheet
*/
public Notes (org.apache.poi.hslf.record.Notes notes) {
_notes = notes;
// Grab our internal sheet ID
_sheetNo = notes.getSheetId();
// Grab the sheet number, via the NotesAtom
_sheetNo = _notes.getNotesAtom().getSlideID();
// Grab the number of the slide we're for, via the NotesAtom
_slideNo = _notes.getNotesAtom().getSlideID();
// Now, build up TextRuns from pairs of TextHeaderAtom and
// one of TextBytesAtom or TextCharsAtom, found inside
@ -67,8 +66,13 @@ public class Notes extends Sheet
public TextRun[] getTextRuns() { return _runs; }
/**
* Returns the sheet number
* Returns the (internal, RefId based) sheet number (RefId)
*/
public int getSheetNumber() { return _sheetNo; }
/**
* Returns the (internal, identifer based) number of the slide we're attached to
*/
public int getSlideInternalNumber() { return _slideNo; }
protected PPDrawing getPPDrawing() { return _notes.getPPDrawing(); }}

View File

@ -44,7 +44,8 @@ public abstract class Sheet
public abstract TextRun[] getTextRuns();
/**
* Returns the sheet number
* Returns the (internal, RefID based) sheet number, as used
* to reference this sheet from other records.
*/
public abstract int getSheetNumber();

View File

@ -19,11 +19,11 @@
package org.apache.poi.hslf.model;
import java.util.*;
import java.util.Vector;
import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.record.SlideListWithText.*;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hslf.record.PPDrawing;
import org.apache.poi.hslf.record.SlideAtom;
import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
/**
* This class represents a slide in a PowerPoint Document. It allows
@ -37,6 +37,7 @@ public class Slide extends Sheet
{
private int _sheetNo;
private int _slideNo;
private org.apache.poi.hslf.record.Slide _slide;
private SlideAtomsSet _atomSet;
private TextRun[] _runs;
@ -52,14 +53,12 @@ public 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) {
public Slide(org.apache.poi.hslf.record.Slide slide, Notes notes, SlideAtomsSet atomSet, int slideNumber) {
_slide = slide;
_notes = notes;
_atomSet = atomSet;
// Grab the sheet number
//_sheetNo = _slide.getSlideAtom().getSheetNumber();
_sheetNo = -1;
_sheetNo = slide.getSheetId();
_slideNo = slideNumber;
// Grab the TextRuns from the PPDrawing
_otherRuns = findTextRuns(_slide.getPPDrawing());
@ -89,9 +88,13 @@ public class Slide extends Sheet
/**
* Create a new Slide instance
* @param sheetNumber The internal number of the sheet, as used by PersistPtrHolder
* @param slideNumber The user facing number of the sheet
*/
public Slide(){
_slide = new org.apache.poi.hslf.record.Slide();
public Slide(int sheetNumber, int slideNumber){
_slide = new org.apache.poi.hslf.record.Slide();
_sheetNo = sheetNumber;
_slideNo = slideNumber;
}
/**
@ -122,10 +125,16 @@ public class Slide extends Sheet
public TextRun[] getTextRuns() { return _runs; }
/**
* Returns the sheet number
* Returns the (internal, RefId based) sheet number
* @see getSlideNumber()
*/
public int getSheetNumber() { return _sheetNo; }
/**
* Returns the (public facing) page number of this slide
*/
public int getSlideNumber() { return _slideNo; }
/**
* Returns the underlying slide record
*/

View File

@ -41,7 +41,7 @@ public class PersistPtrHolder extends PositionDependentRecordAtom
private byte[] _header;
private byte[] _ptrData; // Will need to update this once we allow updates to _slideLocations
private long _type;
/**
* Holds the lookup for slides to their position on disk.
* You always need to check the most recent PersistPtrHolder

View File

@ -29,6 +29,20 @@ import java.util.Hashtable;
public abstract class PositionDependentRecordContainer extends RecordContainer implements PositionDependentRecord
{
private int sheetId; // Found from PersistPtrHolder
/**
* Fetch our sheet ID, as found from a PersistPtrHolder.
* Should match the RefId of our matching SlidePersistAtom
*/
public int getSheetId() { return sheetId; }
/**
* Set our sheet ID, as found from a PersistPtrHolder
*/
public void setSheetId(int id) { sheetId = id; }
/** Our location on the disk, as of the last write out */
protected int myLastOnDiskOffset;

View File

@ -99,7 +99,7 @@ public class Slide extends PositionDependentRecordContainer
* We are of type 1006
*/
public long getRecordType() { return _type; }
/**
* Write the contents of the record back, so it can be written
* to disk

View File

@ -33,6 +33,7 @@ import org.apache.poi.hslf.record.Document;
import org.apache.poi.hslf.record.DocumentAtom;
import org.apache.poi.hslf.record.FontCollection;
import org.apache.poi.hslf.record.ParentAwareRecord;
import org.apache.poi.hslf.record.PositionDependentRecordContainer;
import org.apache.poi.hslf.record.Record;
import org.apache.poi.hslf.record.RecordContainer;
import org.apache.poi.hslf.record.RecordTypes;
@ -210,6 +211,14 @@ public class SlideShow
(Integer)slideIDtoRecordLookup.get(thisID);
int storeAt = storeAtI.intValue();
// Tell it its Sheet ID, if it cares
// TODO: Check that this is the right ID to feed in
if(pdr instanceof PositionDependentRecordContainer) {
PositionDependentRecordContainer pdrc =
(PositionDependentRecordContainer)_records[i];
pdrc.setSheetId(thisID.intValue());
}
// Finally, save the record
_mostRecentCoreRecords[storeAt] = _records[i];
}
@ -356,6 +365,7 @@ public class SlideShow
org.apache.poi.hslf.record.Slide slideRecord = (org.apache.poi.hslf.record.Slide)slidesV.get(i);
// Decide if we've got a SlideAtomSet to use
// TODO: Use the internal IDs to match instead
SlideAtomsSet atomSet = null;
if(i < slideAtomSets.length) {
atomSet = slideAtomSets[i];
@ -368,14 +378,14 @@ public class SlideShow
int notesID = sa.getNotesID();
if(notesID != 0) {
for(int k=0; k<_notes.length; k++) {
if(_notes[k].getSheetNumber() == notesID) {
if(_notes[k].getSlideInternalNumber() == notesID) {
thisNotes = _notes[k];
}
}
}
// Create the Slide model layer
_slides[i] = new Slide(slideRecord,thisNotes,atomSet);
_slides[i] = new Slide(slideRecord,thisNotes,atomSet, (i+1));
// Now supply ourselves to all the rich text runs
// of this slide's TextRuns
@ -492,7 +502,6 @@ public class SlideShow
if(prev.getSlideIdentifier() < spa.getSlideIdentifier()) {
prev = spa;
}
System.err.println("Prev is " + prev.getRefID());
}
}
@ -512,7 +521,8 @@ public class SlideShow
// Create a new Slide
Slide slide = new Slide();
Slide slide = new Slide(sp.getRefID(), _slides.length+1);
// Add in to the list of Slides
Slide[] s = new Slide[_slides.length+1];
System.arraycopy(_slides, 0, s, 0, _slides.length);
s[_slides.length] = slide;
@ -520,7 +530,8 @@ public class SlideShow
System.out.println("Added slide " + _slides.length + " with ref " + sp.getRefID() + " and identifier " + sp.getSlideIdentifier());
// 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();
slideRecord.setSheetId(sp.getRefID());
int slideRecordPos = _hslfSlideShow.appendRootLevelRecord(slideRecord);
_records = _hslfSlideShow.getRecords();