You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by jo...@apache.org on 2009/08/18 04:41:50 UTC

svn commit: r805262 [4/6] - in /poi/trunk/src: java/org/apache/poi/hssf/dev/ java/org/apache/poi/hssf/model/ java/org/apache/poi/hssf/record/ java/org/apache/poi/hssf/record/formula/ java/org/apache/poi/hssf/record/formula/atp/ java/org/apache/poi/hssf...

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java?rev=805262&r1=805261&r2=805262&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java Tue Aug 18 02:41:45 2009
@@ -38,220 +38,212 @@
 import org.apache.poi.hslf.model.Slide;
 import org.apache.poi.hslf.record.*;
 import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
-import org.apache.poi.util.ArrayUtil;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 
 /**
  * This class is a friendly wrapper on top of the more scary HSLFSlideShow.
  *
- * TODO:
- *  - figure out how to match notes to their correct sheet
- *    (will involve understanding DocSlideList and DocNotesList)
- *  - handle Slide creation cleaner
+ * TODO: - figure out how to match notes to their correct sheet (will involve
+ * understanding DocSlideList and DocNotesList) - handle Slide creation cleaner
  *
  * @author Nick Burch
  * @author Yegor kozlov
  */
 public final class SlideShow {
-  // What we're based on
-  private HSLFSlideShow _hslfSlideShow;
+	// What we're based on
+	private HSLFSlideShow _hslfSlideShow;
 
-  // Low level contents, as taken from HSLFSlideShow
-  private Record[] _records;
+	// Low level contents, as taken from HSLFSlideShow
+	private Record[] _records;
 
-  // Pointers to the most recent versions of the core records
-  //  (Document, Notes, Slide etc)
-  private Record[] _mostRecentCoreRecords;
-  // Lookup between the PersitPtr "sheet" IDs, and the position
-  //  in the mostRecentCoreRecords array
-  private Hashtable _sheetIdToCoreRecordsLookup;
-
-  // Records that are interesting
-  private Document _documentRecord;
-
-  // Friendly objects for people to deal with
-  private SlideMaster[] _masters;
-  private TitleMaster[] _titleMasters;
-  private Slide[] _slides;
-  private Notes[] _notes;
-  private FontCollection _fonts;
-
-  // For logging
-    private POILogger logger = POILogFactory.getLogger(this.getClass());
-
-
-  /* ===============================================================
-   *                       Setup Code
-   * ===============================================================
-   */
-
-
-  /**
-   * Constructs a Powerpoint document from the underlying
-   * HSLFSlideShow object. Finds the model stuff from this
-   *
-   * @param hslfSlideShow the HSLFSlideShow to base on
-   */
-  public SlideShow(HSLFSlideShow hslfSlideShow) {
+	// Pointers to the most recent versions of the core records
+	// (Document, Notes, Slide etc)
+	private Record[] _mostRecentCoreRecords;
+	// Lookup between the PersitPtr "sheet" IDs, and the position
+	// in the mostRecentCoreRecords array
+	private Hashtable _sheetIdToCoreRecordsLookup;
+
+	// Records that are interesting
+	private Document _documentRecord;
+
+	// Friendly objects for people to deal with
+	private SlideMaster[] _masters;
+	private TitleMaster[] _titleMasters;
+	private Slide[] _slides;
+	private Notes[] _notes;
+	private FontCollection _fonts;
+
+	// For logging
+	private POILogger logger = POILogFactory.getLogger(this.getClass());
+
+
+	/* ===============================================================
+	 *                       Setup Code
+	 * ===============================================================
+	 */
+
+
+	/**
+	 * Constructs a Powerpoint document from the underlying
+	 * HSLFSlideShow object. Finds the model stuff from this
+	 *
+	 * @param hslfSlideShow the HSLFSlideShow to base on
+	 */
+	public SlideShow(HSLFSlideShow hslfSlideShow) {
 	// Get useful things from our base slideshow
-    _hslfSlideShow = hslfSlideShow;
-	_records = _hslfSlideShow.getRecords();
+	_hslfSlideShow = hslfSlideShow;
+		_records = _hslfSlideShow.getRecords();
 
-	// Handle Parent-aware Reocrds
-	for(int i=0; i<_records.length; i++) {
-		handleParentAwareRecords(_records[i]);
-	}
-
-	// Find the versions of the core records we'll want to use
-	findMostRecentCoreRecords();
-
-	// Build up the model level Slides and Notes
-	buildSlidesAndNotes();
-  }
-
-  /**
-   * Constructs a new, empty, Powerpoint document.
-   */
-  public SlideShow() {
-	this(HSLFSlideShow.create());
-  }
-
-    /**
-     * Constructs a Powerpoint document from an input stream.
-     */
-    public SlideShow(InputStream inputStream) throws IOException {
-      this(new HSLFSlideShow(inputStream));
-    }
-
-  /**
-   * Find the records that are parent-aware, and tell them
-   *  who their parent is
-   */
-  private void handleParentAwareRecords(Record baseRecord) {
-	  // Only need to do something if this is a container record
-	  if(baseRecord instanceof RecordContainer) {
-		RecordContainer br = (RecordContainer)baseRecord;
-		Record[] childRecords = br.getChildRecords();
-
-		// Loop over child records, looking for interesting ones
-		for(int i=0; i<childRecords.length; i++) {
-			Record record = childRecords[i];
-			// Tell parent aware records of their parent
-			if(record instanceof ParentAwareRecord) {
-				((ParentAwareRecord)record).setParentRecord(br);
-			}
-			// Walk on down for the case of container records
-			if(record instanceof RecordContainer) {
-				handleParentAwareRecords(record);
-			}
-		}
-	  }
-  }
-
-
-  /**
-   * Use the PersistPtrHolder entries to figure out what is
-   *  the "most recent" version of all the core records
-   *  (Document, Notes, Slide etc), and save a record of them.
-   * Do this by walking from the oldest PersistPtr to the newest,
-   *  overwriting any references found along the way with newer ones
-   */
-  private void findMostRecentCoreRecords() {
-	// To start with, find the most recent in the byte offset domain
-	Hashtable mostRecentByBytes = new Hashtable();
-	for(int i=0; i<_records.length; i++) {
-		if(_records[i] instanceof PersistPtrHolder) {
-			PersistPtrHolder pph = (PersistPtrHolder)_records[i];
-
-			// If we've already seen any of the "slide" IDs for this
-			//  PersistPtr, remove their old positions
-			int[] ids = pph.getKnownSlideIDs();
-			for(int j=0; j<ids.length; j++) {
-				Integer id = new Integer(ids[j]);
-				if( mostRecentByBytes.containsKey(id)) {
-					mostRecentByBytes.remove(id);
-				}
-			}
-
-			// Now, update the byte level locations with their latest values
-			Hashtable thisSetOfLocations = pph.getSlideLocationsLookup();
-			for(int j=0; j<ids.length; j++) {
-				Integer id = new Integer(ids[j]);
-				mostRecentByBytes.put(id, thisSetOfLocations.get(id));
-			}
-		}
-	}
-
-	// We now know how many unique special records we have, so init
-	//  the array
-	_mostRecentCoreRecords = new Record[mostRecentByBytes.size()];
-
-	// We'll also want to be able to turn the slide IDs into a position
-	//  in this array
-	_sheetIdToCoreRecordsLookup = new Hashtable();
-	int[] allIDs = new int[_mostRecentCoreRecords.length];
-	Enumeration ids = mostRecentByBytes.keys();
-	for(int i=0; i<allIDs.length; i++) {
-		Integer id = (Integer)ids.nextElement();
-		allIDs[i] = id.intValue();
-	}
-	Arrays.sort(allIDs);
-	for(int i=0; i<allIDs.length; i++) {
-		_sheetIdToCoreRecordsLookup.put(new Integer(allIDs[i]), new Integer(i));
-	}
-
-	// Now convert the byte offsets back into record offsets
-	for(int i=0; i<_records.length; i++) {
-		if(_records[i] instanceof PositionDependentRecord) {
-			PositionDependentRecord pdr = (PositionDependentRecord)_records[i];
-			Integer recordAt = new Integer(pdr.getLastOnDiskOffset());
-
-			// Is it one we care about?
-			for(int j=0; j<allIDs.length; j++) {
-				Integer thisID = new Integer(allIDs[j]);
-				Integer thatRecordAt = (Integer)mostRecentByBytes.get(thisID);
-
-				if(thatRecordAt.equals(recordAt)) {
-					// Bingo. Now, where do we store it?
-					Integer storeAtI =
-						(Integer)_sheetIdToCoreRecordsLookup.get(thisID);
-					int storeAt = storeAtI.intValue();
-
-					// Tell it its Sheet ID, if it cares
-					if(pdr instanceof PositionDependentRecordContainer) {
-						PositionDependentRecordContainer pdrc =
-							(PositionDependentRecordContainer)_records[i];
-						pdrc.setSheetId(thisID.intValue());
-					}
+		// Handle Parent-aware Reocrds
+		for (int i = 0; i < _records.length; i++) {
+			handleParentAwareRecords(_records[i]);
+		}
+
+		// Find the versions of the core records we'll want to use
+		findMostRecentCoreRecords();
 
-					// Finally, save the record
-					_mostRecentCoreRecords[storeAt] = _records[i];
+		// Build up the model level Slides and Notes
+		buildSlidesAndNotes();
+	}
+
+	/**
+	 * Constructs a new, empty, Powerpoint document.
+	 */
+	public SlideShow() {
+		this(HSLFSlideShow.create());
+	}
+
+	/**
+	 * Constructs a Powerpoint document from an input stream.
+	 */
+	public SlideShow(InputStream inputStream) throws IOException {
+		this(new HSLFSlideShow(inputStream));
+	}
+
+	/**
+	 * Find the records that are parent-aware, and tell them who their parent is
+	 */
+	private void handleParentAwareRecords(Record baseRecord) {
+		// Only need to do something if this is a container record
+		if (baseRecord instanceof RecordContainer) {
+			RecordContainer br = (RecordContainer) baseRecord;
+			Record[] childRecords = br.getChildRecords();
+
+			// Loop over child records, looking for interesting ones
+			for (int i = 0; i < childRecords.length; i++) {
+				Record record = childRecords[i];
+				// Tell parent aware records of their parent
+				if (record instanceof ParentAwareRecord) {
+					((ParentAwareRecord) record).setParentRecord(br);
+				}
+				// Walk on down for the case of container records
+				if (record instanceof RecordContainer) {
+					handleParentAwareRecords(record);
 				}
 			}
 		}
 	}
 
-	// Now look for the interesting records in there
-	for(int i=0; i<_mostRecentCoreRecords.length; i++) {
-		// Check there really is a record at this number
-		if(_mostRecentCoreRecords[i] != null) {
-			// Find the Document, and interesting things in it
-			if(_mostRecentCoreRecords[i].getRecordType() == RecordTypes.Document.typeID) {
-				_documentRecord = (Document)_mostRecentCoreRecords[i];
-				_fonts = _documentRecord.getEnvironment().getFontCollection();
+	/**
+	 * Use the PersistPtrHolder entries to figure out what is the "most recent"
+	 * version of all the core records (Document, Notes, Slide etc), and save a
+	 * record of them. Do this by walking from the oldest PersistPtr to the
+	 * newest, overwriting any references found along the way with newer ones
+	 */
+	private void findMostRecentCoreRecords() {
+		// To start with, find the most recent in the byte offset domain
+		Hashtable mostRecentByBytes = new Hashtable();
+		for (int i = 0; i < _records.length; i++) {
+			if (_records[i] instanceof PersistPtrHolder) {
+				PersistPtrHolder pph = (PersistPtrHolder) _records[i];
+
+				// If we've already seen any of the "slide" IDs for this
+				// PersistPtr, remove their old positions
+				int[] ids = pph.getKnownSlideIDs();
+				for (int j = 0; j < ids.length; j++) {
+					Integer id = new Integer(ids[j]);
+					if (mostRecentByBytes.containsKey(id)) {
+						mostRecentByBytes.remove(id);
+					}
+				}
+
+				// Now, update the byte level locations with their latest values
+				Hashtable thisSetOfLocations = pph.getSlideLocationsLookup();
+				for (int j = 0; j < ids.length; j++) {
+					Integer id = new Integer(ids[j]);
+					mostRecentByBytes.put(id, thisSetOfLocations.get(id));
+				}
+			}
+		}
+
+		// We now know how many unique special records we have, so init
+		// the array
+		_mostRecentCoreRecords = new Record[mostRecentByBytes.size()];
+
+		// We'll also want to be able to turn the slide IDs into a position
+		// in this array
+		_sheetIdToCoreRecordsLookup = new Hashtable();
+		int[] allIDs = new int[_mostRecentCoreRecords.length];
+		Enumeration ids = mostRecentByBytes.keys();
+		for (int i = 0; i < allIDs.length; i++) {
+			Integer id = (Integer) ids.nextElement();
+			allIDs[i] = id.intValue();
+		}
+		Arrays.sort(allIDs);
+		for (int i = 0; i < allIDs.length; i++) {
+			_sheetIdToCoreRecordsLookup.put(new Integer(allIDs[i]), new Integer(i));
+		}
+
+		// Now convert the byte offsets back into record offsets
+		for (int i = 0; i < _records.length; i++) {
+			if (_records[i] instanceof PositionDependentRecord) {
+				PositionDependentRecord pdr = (PositionDependentRecord) _records[i];
+				Integer recordAt = new Integer(pdr.getLastOnDiskOffset());
+
+				// Is it one we care about?
+				for (int j = 0; j < allIDs.length; j++) {
+					Integer thisID = new Integer(allIDs[j]);
+					Integer thatRecordAt = (Integer) mostRecentByBytes.get(thisID);
+
+					if (thatRecordAt.equals(recordAt)) {
+						// Bingo. Now, where do we store it?
+						Integer storeAtI = (Integer) _sheetIdToCoreRecordsLookup.get(thisID);
+						int storeAt = storeAtI.intValue();
+
+						// Tell it its Sheet ID, if it cares
+						if (pdr instanceof PositionDependentRecordContainer) {
+							PositionDependentRecordContainer pdrc = (PositionDependentRecordContainer) _records[i];
+							pdrc.setSheetId(thisID.intValue());
+						}
+
+						// Finally, save the record
+						_mostRecentCoreRecords[storeAt] = _records[i];
+					}
+				}
+			}
+		}
+
+		// Now look for the interesting records in there
+		for (int i = 0; i < _mostRecentCoreRecords.length; i++) {
+			// Check there really is a record at this number
+			if (_mostRecentCoreRecords[i] != null) {
+				// Find the Document, and interesting things in it
+				if (_mostRecentCoreRecords[i].getRecordType() == RecordTypes.Document.typeID) {
+					_documentRecord = (Document) _mostRecentCoreRecords[i];
+					_fonts = _documentRecord.getEnvironment().getFontCollection();
+				}
+			} else {
+				// No record at this number
+				// Odd, but not normally a problem
 			}
-		} else {
-			// No record at this number
-			// Odd, but not normally a problem
 		}
 	}
-  }
 
-  	/**
-  	 * For a given SlideAtomsSet, return the core record, based on the refID from the
-  	 *  SlidePersistAtom
-  	 */
+	/**
+	 * For a given SlideAtomsSet, return the core record, based on the refID
+	 * from the SlidePersistAtom
+	 */
 	private Record getCoreRecordForSAS(SlideAtomsSet sas) {
 		SlidePersistAtom spa = sas.getSlidePersistAtom();
 		int refID = spa.getRefID();
@@ -259,223 +251,247 @@
 	}
 
 	/**
-   	 * For a given refID (the internal, 0 based numbering scheme), return the
-	 *  core record
-	 * @param refID the refID
+	 * For a given refID (the internal, 0 based numbering scheme), return the
+	 * core record
+	 *
+	 * @param refID
+	 *            the refID
 	 */
 	private Record getCoreRecordForRefID(int refID) {
-		Integer coreRecordId = (Integer)
-			_sheetIdToCoreRecordsLookup.get(new Integer(refID));
-		if(coreRecordId != null) {
+		Integer coreRecordId = (Integer) _sheetIdToCoreRecordsLookup.get(new Integer(refID));
+		if (coreRecordId != null) {
 			Record r = _mostRecentCoreRecords[coreRecordId.intValue()];
 			return r;
 		} else {
-			logger.log(POILogger.ERROR, "We tried to look up a reference to a core record, but there was no core ID for reference ID " + refID);
+			logger.log(POILogger.ERROR,
+					"We tried to look up a reference to a core record, but there was no core ID for reference ID "
+							+ refID);
 			return null;
 		}
 	}
 
-  /**
-   * Build up model level Slide and Notes objects, from the underlying
-   *  records.
-   */
-  private void buildSlidesAndNotes() {
-	// Ensure we really found a Document record earlier
-	// If we didn't, then the file is probably corrupt
-	if(_documentRecord == null) {
-		throw new CorruptPowerPointFileException("The PowerPoint file didn't contain a Document Record in its PersistPtr blocks. It is probably corrupt.");
-	}
-
-
-	// Fetch the SlideListWithTexts in the most up-to-date Document Record
-	//
-	// As far as we understand it:
-	//  * The first SlideListWithText will contain a SlideAtomsSet
-	//     for each of the master slides
-	//  * The second SlideListWithText will contain a SlideAtomsSet
-	//     for each of the slides, in their current order
-	//    These SlideAtomsSets will normally contain text
-	//  * The third SlideListWithText (if present), will contain a
-	//     SlideAtomsSet for each Notes
-	//    These SlideAtomsSets will not normally contain text
-	//
-	// Having indentified the masters, slides and notes + their orders,
-	//  we have to go and find their matching records
-	// We always use the latest versions of these records, and use the
-	//  SlideAtom/NotesAtom to match them with the StyleAtomSet
-
-	SlideListWithText masterSLWT = _documentRecord.getMasterSlideListWithText();
-	SlideListWithText slidesSLWT = _documentRecord.getSlideSlideListWithText();
-	SlideListWithText notesSLWT  = _documentRecord.getNotesSlideListWithText();
-
-    // Find master slides
-	// These can be MainMaster records, but oddly they can also be
-	//  Slides or Notes, and possibly even other odd stuff....
-	// About the only thing you can say is that the master details are in
-	//  the first SLWT.
-    SlideAtomsSet[] masterSets = new SlideAtomsSet[0];
-    if (masterSLWT != null){
-        masterSets = masterSLWT.getSlideAtomsSets();
-
-		ArrayList mmr = new ArrayList();
-        ArrayList tmr = new ArrayList();
-
-		for(int i=0; i<masterSets.length; i++) {
-			Record r = getCoreRecordForSAS(masterSets[i]);
-            SlideAtomsSet sas = masterSets[i];
-            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, sheetNo);
-                master.setSlideShow(this);
-                tmr.add(master);
-			} else if(r instanceof org.apache.poi.hslf.record.MainMaster) {
-                SlideMaster master = new SlideMaster((org.apache.poi.hslf.record.MainMaster)r, sheetNo);
-                master.setSlideShow(this);
-                mmr.add(master);
-            }
-		}
-
-        _masters = new SlideMaster[mmr.size()];
-        mmr.toArray(_masters);
-
-        _titleMasters = new TitleMaster[tmr.size()];
-        tmr.toArray(_titleMasters);
-
-    }
-
-
-	// Having sorted out the masters, that leaves the notes and slides
-
-
-	// Start by finding the notes records to go with the entries in
-	//  notesSLWT
-	org.apache.poi.hslf.record.Notes[] notesRecords;
-	SlideAtomsSet[] notesSets = new SlideAtomsSet[0];
-	Hashtable slideIdToNotes = new Hashtable();
-	if(notesSLWT == null) {
-		// None
-		notesRecords = new org.apache.poi.hslf.record.Notes[0];
-	} else {
-		// Match up the records and the SlideAtomSets
-		notesSets = notesSLWT.getSlideAtomsSets();
-		ArrayList notesRecordsL = new ArrayList();
-		for(int i=0; i<notesSets.length; i++) {
-			// Get the right core record
-			Record r = getCoreRecordForSAS(notesSets[i]);
-
-			// Ensure it really is a notes record
-			if(r instanceof org.apache.poi.hslf.record.Notes) {
-                org.apache.poi.hslf.record.Notes notesRecord = (org.apache.poi.hslf.record.Notes)r;
-				notesRecordsL.add( notesRecord );
-
-				// Record the match between slide id and these notes
-                SlidePersistAtom spa = notesSets[i].getSlidePersistAtom();
-                Integer slideId = new Integer(spa.getSlideIdentifier());
-                slideIdToNotes.put(slideId, new Integer(i));
-			} else {
-				logger.log(POILogger.ERROR, "A Notes SlideAtomSet at " + i + " said its record was at refID " + notesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r);
+	/**
+	 * Build up model level Slide and Notes objects, from the underlying
+	 * records.
+	 */
+	private void buildSlidesAndNotes() {
+		// Ensure we really found a Document record earlier
+		// If we didn't, then the file is probably corrupt
+		if (_documentRecord == null) {
+			throw new CorruptPowerPointFileException(
+					"The PowerPoint file didn't contain a Document Record in its PersistPtr blocks. It is probably corrupt.");
+		}
+
+		// Fetch the SlideListWithTexts in the most up-to-date Document Record
+		//
+		// As far as we understand it:
+		// * The first SlideListWithText will contain a SlideAtomsSet
+		// for each of the master slides
+		// * The second SlideListWithText will contain a SlideAtomsSet
+		// for each of the slides, in their current order
+		// These SlideAtomsSets will normally contain text
+		// * The third SlideListWithText (if present), will contain a
+		// SlideAtomsSet for each Notes
+		// These SlideAtomsSets will not normally contain text
+		//
+		// Having indentified the masters, slides and notes + their orders,
+		// we have to go and find their matching records
+		// We always use the latest versions of these records, and use the
+		// SlideAtom/NotesAtom to match them with the StyleAtomSet
+
+		SlideListWithText masterSLWT = _documentRecord.getMasterSlideListWithText();
+		SlideListWithText slidesSLWT = _documentRecord.getSlideSlideListWithText();
+		SlideListWithText notesSLWT = _documentRecord.getNotesSlideListWithText();
+
+		// Find master slides
+		// These can be MainMaster records, but oddly they can also be
+		// Slides or Notes, and possibly even other odd stuff....
+		// About the only thing you can say is that the master details are in
+		// the first SLWT.
+		SlideAtomsSet[] masterSets = new SlideAtomsSet[0];
+		if (masterSLWT != null) {
+			masterSets = masterSLWT.getSlideAtomsSets();
+
+			ArrayList mmr = new ArrayList();
+			ArrayList tmr = new ArrayList();
+
+			for (int i = 0; i < masterSets.length; i++) {
+				Record r = getCoreRecordForSAS(masterSets[i]);
+				SlideAtomsSet sas = masterSets[i];
+				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,
+							sheetNo);
+					master.setSlideShow(this);
+					tmr.add(master);
+				} else if (r instanceof org.apache.poi.hslf.record.MainMaster) {
+					SlideMaster master = new SlideMaster((org.apache.poi.hslf.record.MainMaster) r,
+							sheetNo);
+					master.setSlideShow(this);
+					mmr.add(master);
+				}
+			}
+
+			_masters = new SlideMaster[mmr.size()];
+			mmr.toArray(_masters);
+
+			_titleMasters = new TitleMaster[tmr.size()];
+			tmr.toArray(_titleMasters);
+
+		}
+
+		// Having sorted out the masters, that leaves the notes and slides
+
+		// Start by finding the notes records to go with the entries in
+		// notesSLWT
+		org.apache.poi.hslf.record.Notes[] notesRecords;
+		SlideAtomsSet[] notesSets = new SlideAtomsSet[0];
+		Hashtable slideIdToNotes = new Hashtable();
+		if (notesSLWT == null) {
+			// None
+			notesRecords = new org.apache.poi.hslf.record.Notes[0];
+		} else {
+			// Match up the records and the SlideAtomSets
+			notesSets = notesSLWT.getSlideAtomsSets();
+			ArrayList notesRecordsL = new ArrayList();
+			for (int i = 0; i < notesSets.length; i++) {
+				// Get the right core record
+				Record r = getCoreRecordForSAS(notesSets[i]);
+
+				// Ensure it really is a notes record
+				if (r instanceof org.apache.poi.hslf.record.Notes) {
+					org.apache.poi.hslf.record.Notes notesRecord = (org.apache.poi.hslf.record.Notes) r;
+					notesRecordsL.add(notesRecord);
+
+					// Record the match between slide id and these notes
+					SlidePersistAtom spa = notesSets[i].getSlidePersistAtom();
+					Integer slideId = new Integer(spa.getSlideIdentifier());
+					slideIdToNotes.put(slideId, new Integer(i));
+				} else {
+					logger.log(POILogger.ERROR, "A Notes SlideAtomSet at " + i
+							+ " said its record was at refID "
+							+ notesSets[i].getSlidePersistAtom().getRefID()
+							+ ", but that was actually a " + r);
+				}
 			}
+			notesRecords = new org.apache.poi.hslf.record.Notes[notesRecordsL.size()];
+			notesRecords = (org.apache.poi.hslf.record.Notes[]) notesRecordsL.toArray(notesRecords);
 		}
-		notesRecords = new org.apache.poi.hslf.record.Notes[notesRecordsL.size()];
-		notesRecords = (org.apache.poi.hslf.record.Notes[])
-			notesRecordsL.toArray(notesRecords);
-	}
-
-	// Now, do the same thing for our slides
-	org.apache.poi.hslf.record.Slide[] slidesRecords;
-	SlideAtomsSet[] slidesSets = new SlideAtomsSet[0];
-	if(slidesSLWT == null) {
-		// None
-		slidesRecords = new org.apache.poi.hslf.record.Slide[0];
-	} else {
-		// Match up the records and the SlideAtomSets
-		slidesSets = slidesSLWT.getSlideAtomsSets();
-		slidesRecords = new org.apache.poi.hslf.record.Slide[slidesSets.length];
-		for(int i=0; i<slidesSets.length; i++) {
-			// Get the right core record
-			Record r = getCoreRecordForSAS(slidesSets[i]);
-
-			// Ensure it really is a slide record
-			if(r instanceof org.apache.poi.hslf.record.Slide) {
-				slidesRecords[i] = (org.apache.poi.hslf.record.Slide)r;
-			} else {
-				logger.log(POILogger.ERROR, "A Slide SlideAtomSet at " + i + " said its record was at refID " + slidesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r);
+
+		// Now, do the same thing for our slides
+		org.apache.poi.hslf.record.Slide[] slidesRecords;
+		SlideAtomsSet[] slidesSets = new SlideAtomsSet[0];
+		if (slidesSLWT == null) {
+			// None
+			slidesRecords = new org.apache.poi.hslf.record.Slide[0];
+		} else {
+			// Match up the records and the SlideAtomSets
+			slidesSets = slidesSLWT.getSlideAtomsSets();
+			slidesRecords = new org.apache.poi.hslf.record.Slide[slidesSets.length];
+			for (int i = 0; i < slidesSets.length; i++) {
+				// Get the right core record
+				Record r = getCoreRecordForSAS(slidesSets[i]);
+
+				// Ensure it really is a slide record
+				if (r instanceof org.apache.poi.hslf.record.Slide) {
+					slidesRecords[i] = (org.apache.poi.hslf.record.Slide) r;
+				} else {
+					logger.log(POILogger.ERROR, "A Slide SlideAtomSet at " + i
+							+ " said its record was at refID "
+							+ slidesSets[i].getSlidePersistAtom().getRefID()
+							+ ", but that was actually a " + r);
+				}
 			}
 		}
+
+		// Finally, generate model objects for everything
+		// Notes first
+		_notes = new Notes[notesRecords.length];
+		for (int i = 0; i < _notes.length; i++) {
+			_notes[i] = new Notes(notesRecords[i]);
+			_notes[i].setSlideShow(this);
+		}
+		// Then slides
+		_slides = new Slide[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;
+			// Slide.SlideAtom.notesId references the corresponding notes slide.
+			// 0 if slide has no notes.
+			int noteId = slidesRecords[i].getSlideAtom().getNotesID();
+			if (noteId != 0) {
+				Integer notesPos = (Integer) slideIdToNotes.get(new Integer(noteId));
+				if (notesPos != null)
+					notes = _notes[notesPos.intValue()];
+				else
+					logger.log(POILogger.ERROR, "Notes not found for noteId=" + noteId);
+			}
+
+			// Now, build our slide
+			_slides[i] = new Slide(slidesRecords[i], notes, sas, slideIdentifier, (i + 1));
+			_slides[i].setSlideShow(this);
+		}
 	}
 
-	// Finally, generate model objects for everything
-	// Notes first
-	_notes = new Notes[notesRecords.length];
-	for(int i=0; i<_notes.length; i++) {
-		_notes[i] = new Notes(notesRecords[i]);
-		_notes[i].setSlideShow(this);
-	}
-	// Then slides
-	_slides = new Slide[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;
-        //Slide.SlideAtom.notesId references the corresponding notes slide. 0 if slide has no notes.
-        int noteId = slidesRecords[i].getSlideAtom().getNotesID();
-        if (noteId != 0){
-            Integer notesPos = (Integer)slideIdToNotes.get(new Integer(noteId));
-            if (notesPos != null) notes = _notes[notesPos.intValue()];
-            else logger.log(POILogger.ERROR, "Notes not found for noteId=" + noteId);
-        }
-
-		// Now, build our slide
-		_slides[i] = new Slide(slidesRecords[i], notes, sas, slideIdentifier, (i+1));
-		_slides[i].setSlideShow(this);
-	}
-  }
-
-  /**
-   * Writes out the slideshow file the is represented by an instance of
-   *  this class
-   * @param out The OutputStream to write to.
-   *  @throws IOException If there is an unexpected IOException from the passed
-   *            in OutputStream
-   */
-   public void write(OutputStream out) throws IOException {
-	_hslfSlideShow.write(out);
-   }
-
-
-   /* ===============================================================
-    *                       Accessor Code
-    * ===============================================================
-    */
+	/**
+	 * Writes out the slideshow file the is represented by an instance of this
+	 * class
+	 *
+	 * @param out
+	 *            The OutputStream to write to.
+	 * @throws IOException
+	 *             If there is an unexpected IOException from the passed in
+	 *             OutputStream
+	 */
+	public void write(OutputStream out) throws IOException {
+		_hslfSlideShow.write(out);
+	}
 
+	/*
+	 * ===============================================================
+	 *                         Accessor Code
+	 * ===============================================================
+	 */
 
 	/**
 	 * Returns an array of the most recent version of all the interesting
-	 *  records
+	 * records
 	 */
-	public Record[] getMostRecentCoreRecords() { return _mostRecentCoreRecords; }
+	public Record[] getMostRecentCoreRecords() {
+		return _mostRecentCoreRecords;
+	}
 
 	/**
 	 * Returns an array of all the normal Slides found in the slideshow
 	 */
-	public Slide[] getSlides() { return _slides; }
+	public Slide[] getSlides() {
+		return _slides;
+	}
 
 	/**
 	 * Returns an array of all the normal Notes found in the slideshow
 	 */
-	public Notes[] getNotes() { return _notes; }
+	public Notes[] getNotes() {
+		return _notes;
+	}
+
+	/**
+	 * Returns an array of all the normal Slide Masters found in the slideshow
+	 */
+	public SlideMaster[] getSlidesMasters() {
+		return _masters;
+	}
 
 	/**
-     * Returns an array of all the normal Slide Masters found in the slideshow
+	 * Returns an array of all the normal Title Masters found in the slideshow
 	 */
-    public SlideMaster[] getSlidesMasters() { return _masters; }
+	public TitleMaster[] getTitleMasters() {
+		return _titleMasters;
+	}
 
-    /**
-     * Returns an array of all the normal Title Masters found in the slideshow
-     */
-    public TitleMaster[] getTitleMasters() { return _titleMasters; }
 	/**
 	 * Returns the data of all the pictures attached to the SlideShow
 	 */
@@ -483,561 +499,598 @@
 		return _hslfSlideShow.getPictures();
 	}
 
-    /**
-     * Returns the data of all the embedded OLE object in the SlideShow
-     */
-    public ObjectData[] getEmbeddedObjects() {
-        return _hslfSlideShow.getEmbeddedObjects();
-    }
-
-    /**
-     * Returns the data of all the embedded sounds in the SlideShow
-     */
-    public SoundData[] getSoundData() {
-        return SoundData.find(_documentRecord);
-    }
+	/**
+	 * Returns the data of all the embedded OLE object in the SlideShow
+	 */
+	public ObjectData[] getEmbeddedObjects() {
+		return _hslfSlideShow.getEmbeddedObjects();
+	}
+
+	/**
+	 * Returns the data of all the embedded sounds in the SlideShow
+	 */
+	public SoundData[] getSoundData() {
+		return SoundData.find(_documentRecord);
+	}
 
 	/**
 	 * Return the current page size
 	 */
-	public Dimension getPageSize(){
+	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() * Shape.POINT_DPI / Shape.MASTER_DPI;
+		int pgy = (int) docatom.getSlideSizeY() * Shape.POINT_DPI / Shape.MASTER_DPI;
 		return new Dimension(pgx, pgy);
 	}
 
 	/**
 	 * Change the current page size
 	 *
-	 * @param pgsize page size (in points)
+	 * @param pgsize
+	 *            page size (in points)
 	 */
-	public void setPageSize(Dimension pgsize){
+	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 * Shape.MASTER_DPI / Shape.POINT_DPI);
+		docatom.setSlideSizeY(pgsize.height * Shape.MASTER_DPI / Shape.POINT_DPI);
 	}
 
 	/**
 	 * Helper method for usermodel: Get the font collection
 	 */
-	protected FontCollection getFontCollection() { return _fonts; }
+	protected FontCollection getFontCollection() {
+		return _fonts;
+	}
+
 	/**
 	 * Helper method for usermodel and model: Get the document record
 	 */
-	public Document getDocumentRecord() { return _documentRecord; }
-
+	public Document getDocumentRecord() {
+		return _documentRecord;
+	}
 
-	/* ===============================================================
-	 *                       Re-ordering Code
+	/*
+	 * ===============================================================
+	 * Re-ordering Code
 	 * ===============================================================
 	 */
 
-
 	/**
 	 * Re-orders a slide, to a new position.
-	 * @param oldSlideNumber The old slide number (1 based)
-	 * @param newSlideNumber The new slide number (1 based)
+	 *
+	 * @param oldSlideNumber
+	 *            The old slide number (1 based)
+	 * @param newSlideNumber
+	 *            The new slide number (1 based)
 	 */
 	public void reorderSlide(int oldSlideNumber, int newSlideNumber) {
 		// Ensure these numbers are valid
-		if(oldSlideNumber < 1 || newSlideNumber < 1) {
+		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) {
-			throw new IllegalArgumentException("Old and new slide numbers must not exceed the number of slides (" + _slides.length + ")");
+		if (oldSlideNumber > _slides.length || newSlideNumber > _slides.length) {
+			throw new IllegalArgumentException(
+					"Old and new slide numbers must not exceed the number of slides ("
+							+ _slides.length + ")");
+		}
+
+		// The order of slides is defined by the order of slide atom sets in the
+		// SlideListWithText container.
+		SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
+		SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
+
+		SlideAtomsSet tmp = sas[oldSlideNumber - 1];
+		sas[oldSlideNumber - 1] = sas[newSlideNumber - 1];
+		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);
+		}
+		Record[] r = (Record[]) lst.toArray(new Record[lst.size()]);
+		slwt.setChildRecord(r);
+	}
+
+	/**
+	 * Removes the slide at the given index (0-based).
+	 * <p>
+	 * Shifts any subsequent slides to the left (subtracts one from their slide
+	 * numbers).
+	 * </p>
+	 *
+	 * @param index
+	 *            the index of the slide to remove (0-based)
+	 * @return the slide that was removed from the slide show.
+	 */
+	public Slide removeSlide(int index) {
+		int lastSlideIdx = _slides.length - 1;
+		if (index < 0 || index > lastSlideIdx) {
+			throw new IllegalArgumentException("Slide index (" + index + ") is out of range (0.."
+					+ lastSlideIdx + ")");
+		}
+
+		SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
+		SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
+
+		Slide removedSlide = null;
+		ArrayList<Record> records = new ArrayList<Record>();
+		ArrayList<SlideAtomsSet> sa = new ArrayList<SlideAtomsSet>();
+		ArrayList<Slide> sl = new ArrayList<Slide>();
+
+		ArrayList<Notes> nt = new ArrayList<Notes>();
+		for (Notes 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());
+			}
+		}
+		if (sa.size() == 0) {
+			_documentRecord.removeSlideListWithText(slwt);
+		} else {
+			slwt.setSlideAtomsSets(sa.toArray(new SlideAtomsSet[sa.size()]));
+			slwt.setChildRecord(records.toArray(new Record[records.size()]));
 		}
+		_slides = sl.toArray(new Slide[sl.size()]);
 
-        //  The order of slides is defined by the order of slide atom sets in the SlideListWithText container.
-        SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
-        SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
-
-        SlideAtomsSet tmp = sas[oldSlideNumber-1];
-        sas[oldSlideNumber-1] = sas[newSlideNumber-1];
-        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);
-        }
-        Record[] r = (Record[])lst.toArray(new Record[lst.size()]);
-        slwt.setChildRecord(r);
-	}
-
-    /**
-     * Removes the slide at the given index (0-based).
-     * <p>Shifts any subsequent slides to the left (subtracts one from their slide numbers).</p>
-     *
-     * @param index the index of the slide to remove (0-based)
-     * @return the slide that was removed from the slide show.
-     */
-    public Slide removeSlide(int index) {
-        int lastSlideIdx = _slides.length - 1;
-        if(index < 0 || index > lastSlideIdx) {
-            throw new IllegalArgumentException("Slide index ("
-                    + index +") is out of range (0.." +  lastSlideIdx + ")");
-        }
-
-        SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
-        SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
-
-        Slide removedSlide = null;
-        ArrayList<Record> records = new ArrayList<Record>();
-        ArrayList<SlideAtomsSet> sa = new ArrayList<SlideAtomsSet>();
-        ArrayList<Slide> sl = new ArrayList<Slide>();
-
-        ArrayList<Notes> nt = new ArrayList<Notes>();
-        for(Notes 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());
-            }
-        }
-        if(sa.size() == 0){
-            _documentRecord.removeSlideListWithText(slwt);
-        } else {
-            slwt.setSlideAtomsSets( sa.toArray(new SlideAtomsSet[sa.size()]) );
-            slwt.setChildRecord(records.toArray(new Record[records.size()]));
-        }
-        _slides = sl.toArray(new Slide[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<Record>();
-                ArrayList<SlideAtomsSet> na = new ArrayList<SlideAtomsSet>();
-                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()));
-                    }
-                }
-                if(na.size() == 0){
-                    _documentRecord.removeSlideListWithText(nslwt);
-                } else {
-                    nslwt.setSlideAtomsSets( na.toArray(new SlideAtomsSet[na.size()]) );
-                    nslwt.setChildRecord(records.toArray(new Record[records.size()]));
-                }
-
-            }
-        }
-        _notes = nt.toArray(new Notes[nt.size()]);
+		// if the removed slide had notes - remove references to them too
 
-        return removedSlide;
-    }
+		if (removedSlide != null) {
+			int notesId = removedSlide.getSlideRecord().getSlideAtom().getNotesID();
+			if (notesId != 0) {
+				SlideListWithText nslwt = _documentRecord.getNotesSlideListWithText();
+				records = new ArrayList<Record>();
+				ArrayList<SlideAtomsSet> na = new ArrayList<SlideAtomsSet>();
+				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()));
+					}
+				}
+				if (na.size() == 0) {
+					_documentRecord.removeSlideListWithText(nslwt);
+				} else {
+					nslwt.setSlideAtomsSets(na.toArray(new SlideAtomsSet[na.size()]));
+					nslwt.setChildRecord(records.toArray(new Record[records.size()]));
+				}
 
-    /* ===============================================================
-	 *                       Addition Code
+			}
+		}
+		_notes = nt.toArray(new Notes[nt.size()]);
+
+		return removedSlide;
+	}
+
+	/*
+	 * ===============================================================
+	 *  Addition Code
 	 * ===============================================================
 	 */
 
-
 	/**
 	 * Create a blank <code>Slide</code>.
 	 *
-	 * @return  the created <code>Slide</code>
+	 * @return the created <code>Slide</code>
 	 */
-  	public Slide createSlide() {
-  		SlideListWithText slist = null;
+	public Slide createSlide() {
+		SlideListWithText slist = null;
 
-  		// We need to add the records to the SLWT that deals
-  		//  with Slides.
-  		// Add it, if it doesn't exist
-  		slist = _documentRecord.getSlideSlideListWithText();
-  		if(slist == null) {
-  			// Need to add a new one
-  			slist = new SlideListWithText();
-  			slist.setInstance(SlideListWithText.SLIDES);
-            _documentRecord.addSlideListWithText(slist);
-  		}
-
-  		// Grab the SlidePersistAtom with the highest Slide Number.
-  		// (Will stay as null if no SlidePersistAtom exists yet in
-  		//  the slide, or only master slide's ones do)
-  		SlidePersistAtom prev = null;
+		// We need to add the records to the SLWT that deals
+		// with Slides.
+		// Add it, if it doesn't exist
+		slist = _documentRecord.getSlideSlideListWithText();
+		if (slist == null) {
+			// Need to add a new one
+			slist = new SlideListWithText();
+			slist.setInstance(SlideListWithText.SLIDES);
+			_documentRecord.addSlideListWithText(slist);
+		}
+
+		// Grab the SlidePersistAtom with the highest Slide Number.
+		// (Will stay as null if no SlidePersistAtom exists yet in
+		// the slide, or only master slide's ones do)
+		SlidePersistAtom prev = null;
 		SlideAtomsSet[] sas = slist.getSlideAtomsSets();
-  		for(int j=0; j<sas.length; j++) {
-  			SlidePersistAtom spa = sas[j].getSlidePersistAtom();
-  			if(spa.getSlideIdentifier() < 0) {
-  				// This is for a master slide
-  				// Odd, since we only deal with the Slide SLWT
-  			} else {
+		for (int j = 0; j < sas.length; j++) {
+			SlidePersistAtom spa = sas[j].getSlidePersistAtom();
+			if (spa.getSlideIdentifier() < 0) {
+				// This is for a master slide
+				// Odd, since we only deal with the Slide SLWT
+			} else {
 				// Must be for a real slide
-  				if(prev == null) { prev = spa; }
-  				if(prev.getSlideIdentifier() < spa.getSlideIdentifier()) {
-  					prev = spa;
-  				}
-  			}
-  		}
-
-  		// Set up a new  SlidePersistAtom for this slide
-  		SlidePersistAtom sp = new SlidePersistAtom();
-
-  		// First slideId is always 256
-  		sp.setSlideIdentifier(prev == null ? 256 : (prev.getSlideIdentifier() + 1));
-
-  		// Add this new SlidePersistAtom to the SlideListWithText
-  		slist.addSlidePersistAtom(sp);
-
-
-  		// Create a new Slide
-  		Slide slide = new Slide(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];
-  		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() + " 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();
-  		int slideRecordPos = _hslfSlideShow.appendRootLevelRecord(slideRecord);
-  		_records = _hslfSlideShow.getRecords();
-
-
-  		// Add the new Slide into the PersistPtr stuff
-  		int offset = 0;
-  		int slideOffset = 0;
-  		PersistPtrHolder ptr = null;
-  		UserEditAtom usr = null;
-  		for (int i = 0; i < _records.length; i++) {
-  			Record record = _records[i];
-  			ByteArrayOutputStream out = new ByteArrayOutputStream();
-  			try {
-                record.writeOut(out);
-            } catch (IOException e){
-                throw new HSLFException(e);
-            }
-
-              // Grab interesting records as they come past
-  			if(_records[i].getRecordType() == RecordTypes.PersistPtrIncrementalBlock.typeID){
-  				ptr = (PersistPtrHolder)_records[i];
-  			}
-  			if(_records[i].getRecordType() == RecordTypes.UserEditAtom.typeID) {
-  				usr = (UserEditAtom)_records[i];
-  			}
-
-  			if(i == slideRecordPos) {
-  				slideOffset = offset;
-  			}
-  			offset += out.size();
-  		}
-
-        // persist ID is UserEditAtom.maxPersistWritten + 1
-        int psrId = usr.getMaxPersistWritten() + 1;
-        sp.setRefID(psrId);
-        slideRecord.setSheetId(psrId);
-
-        // Last view is now of the slide
-        usr.setLastViewType((short)UserEditAtom.LAST_VIEW_SLIDE_VIEW);
-        usr.setMaxPersistWritten(psrId);    //increment the number of persit objects
+				if (prev == null) {
+					prev = spa;
+				}
+				if (prev.getSlideIdentifier() < spa.getSlideIdentifier()) {
+					prev = spa;
+				}
+			}
+		}
+
+		// Set up a new SlidePersistAtom for this slide
+		SlidePersistAtom sp = new SlidePersistAtom();
+
+		// First slideId is always 256
+		sp.setSlideIdentifier(prev == null ? 256 : (prev.getSlideIdentifier() + 1));
+
+		// Add this new SlidePersistAtom to the SlideListWithText
+		slist.addSlidePersistAtom(sp);
+
+		// Create a new Slide
+		Slide slide = new Slide(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];
+		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()
+				+ " 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();
+		int slideRecordPos = _hslfSlideShow.appendRootLevelRecord(slideRecord);
+		_records = _hslfSlideShow.getRecords();
+
+		// Add the new Slide into the PersistPtr stuff
+		int offset = 0;
+		int slideOffset = 0;
+		PersistPtrHolder ptr = null;
+		UserEditAtom usr = null;
+		for (int i = 0; i < _records.length; i++) {
+			Record record = _records[i];
+			ByteArrayOutputStream out = new ByteArrayOutputStream();
+			try {
+				record.writeOut(out);
+			} catch (IOException e) {
+				throw new HSLFException(e);
+			}
+
+			// Grab interesting records as they come past
+			if (_records[i].getRecordType() == RecordTypes.PersistPtrIncrementalBlock.typeID) {
+				ptr = (PersistPtrHolder) _records[i];
+			}
+			if (_records[i].getRecordType() == RecordTypes.UserEditAtom.typeID) {
+				usr = (UserEditAtom) _records[i];
+			}
+
+			if (i == slideRecordPos) {
+				slideOffset = offset;
+			}
+			offset += out.size();
+		}
+
+		// persist ID is UserEditAtom.maxPersistWritten + 1
+		int psrId = usr.getMaxPersistWritten() + 1;
+		sp.setRefID(psrId);
+		slideRecord.setSheetId(psrId);
+
+		// Last view is now of the slide
+		usr.setLastViewType((short) UserEditAtom.LAST_VIEW_SLIDE_VIEW);
+		usr.setMaxPersistWritten(psrId); // increment the number of persit
+										 // objects
 
 		// Add the new slide into the last PersistPtr
-  		// (Also need to tell it where it is)
+		// (Also need to tell it where it is)
 		slideRecord.setLastOnDiskOffset(slideOffset);
 		ptr.addSlideLookup(sp.getRefID(), slideOffset);
 		logger.log(POILogger.INFO, "New slide ended up at " + slideOffset);
 
-        slide.setMasterSheet(_masters[0]);
-          // All done and added
-  		return slide;
-	}
-
-    /**
-     * Adds a picture to this presentation and returns the associated index.
-     *
-     * @param data      picture data
-     * @param format    the format of the picture.  One of constans defined in the <code>Picture</code> class.
-     * @return          the index to this picture (1 based).
-     */
-    public int addPicture(byte[] data, int format) throws IOException {
-        byte[] uid = PictureData.getChecksum(data);
-
-        EscherContainerRecord bstore;
-
-        EscherContainerRecord dggContainer = _documentRecord.getPPDrawingGroup().getDggContainer();
-        bstore = (EscherContainerRecord)Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
-        if (bstore == null){
-            bstore = new EscherContainerRecord();
-            bstore.setRecordId( EscherContainerRecord.BSTORE_CONTAINER);
-
-            dggContainer.addChildBefore(bstore, EscherOptRecord.RECORD_ID);
-        } else {
-            Iterator<EscherRecord> iter = bstore.getChildIterator();
-            for (int i = 0; iter.hasNext(); i++) {
-                EscherBSERecord bse = (EscherBSERecord) iter.next();
-                if (Arrays.equals(bse.getUid(), uid)){
-                    return i + 1;
-                }
-             }
-        }
-
-        PictureData pict = PictureData.create(format);
-        pict.setData(data);
-
-        int offset = _hslfSlideShow.addPicture(pict);
-
-        EscherBSERecord bse = new EscherBSERecord();
-        bse.setRecordId(EscherBSERecord.RECORD_ID);
-        bse.setOptions( (short) ( 0x0002 | ( format << 4 ) ) );
-        bse.setSize(pict.getRawData().length + 8);
-        bse.setUid(uid);
-
-        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);
-
-        bse.setRef(0);
-        bse.setOffset(offset);
-        bse.setRemainingData( new byte[0] );
-
-        bstore.addChildRecord(bse);
-        int count = bstore.getChildRecords().size();
-        bstore.setOptions((short)( (count << 4) | 0xF ));
-
-        return count;
-    }
-
-    /**
-     * Adds a picture to this presentation and returns the associated index.
-     *
-     * @param pict       the file containing the image to add
-     * @param format    the format of the picture.  One of constans defined in the <code>Picture</code> class.
-     * @return          the index to this picture (1 based).
-     */
-    public int addPicture(File pict, int format) throws IOException {
-        int length = (int)pict.length();
-        byte[] data = new byte[length];
-        try {
-            FileInputStream is = new FileInputStream(pict);
-            is.read(data);
-            is.close();
-        } catch (IOException e){
-            throw new HSLFException(e);
-        }
-        return addPicture(data, format);
-    }
-
-    /**
-     * Add a font in this presentation
-     *
-     * @param font the font to add
-     * @return 0-based index of the font
-     */
-    public int addFont(PPFont font) {
-        FontCollection fonts = getDocumentRecord().getEnvironment().getFontCollection();
-        int idx = fonts.getFontIndex(font.getFontName());
-        if(idx == -1){
-            idx = fonts.addFont(font.getFontName(), font.getCharSet(), font.getFontFlags(), font.getFontType(), font.getPitchAndFamily());
-        }
-        return idx;
-    }
-
-    /**
-     * Get a font by index
-     *
-     * @param idx 0-based index of the font
-     * @return of an instance of <code>PPFont</code> or <code>null</code> if not found
-     */
-    public PPFont getFont(int idx) {
-        PPFont font = null;
-        FontCollection fonts = getDocumentRecord().getEnvironment().getFontCollection();
-        Record[] ch = fonts.getChildRecords();
-        for (int i = 0; i < ch.length; i++) {
-            if(ch[i] instanceof FontEntityAtom) {
-                FontEntityAtom atom = (FontEntityAtom)ch[i];
-                if(atom.getFontIndex() == idx){
-                    font = new PPFont(atom);
-                    break;
-                }
-            }
-        }
-        return font;
-    }
-
-    /**
-     * get the number of fonts in the presentation
-     *
-     * @return number of fonts
-     */
-    public int getNumberOfFonts() {
-        return getDocumentRecord().getEnvironment().getFontCollection().getNumberOfFonts();
-    }
-
-    /**
-     * Return  Header / Footer settings for slides
-     *
-     * @return Header / Footer settings for slides
-     */
-    public HeadersFooters getSlideHeadersFooters(){
-        //detect if this ppt was saved in Office2007
-        String tag = getSlidesMasters()[0].getProgrammableTag();
-        boolean ppt2007 = "___PPT12".equals(tag);
-
-        HeadersFootersContainer hdd = null;
-        Record[] ch = _documentRecord.getChildRecords();
-        for (int i = 0; i < ch.length; i++) {
-            if(ch[i] instanceof HeadersFootersContainer &&
-                    ((HeadersFootersContainer)ch[i]).getOptions() == HeadersFootersContainer.SlideHeadersFootersContainer){
-                hdd = (HeadersFootersContainer)ch[i];
-                break;
-            }
-        }
-        boolean newRecord = false;
-        if(hdd == null) {
-            hdd = new HeadersFootersContainer(HeadersFootersContainer.SlideHeadersFootersContainer);
-            newRecord = true;
-        }
-        return new HeadersFooters(hdd, this, newRecord, ppt2007);
-    }
-
-    /**
-     * Return  Header / Footer settings for notes
-     *
-     * @return Header / Footer settings for notes
-     */
-    public HeadersFooters getNotesHeadersFooters(){
-        //detect if this ppt was saved in Office2007
-        String tag = getSlidesMasters()[0].getProgrammableTag();
-        boolean ppt2007 = "___PPT12".equals(tag);
-
-        HeadersFootersContainer hdd = null;
-        Record[] ch = _documentRecord.getChildRecords();
-        for (int i = 0; i < ch.length; i++) {
-            if(ch[i] instanceof HeadersFootersContainer &&
-                    ((HeadersFootersContainer)ch[i]).getOptions() == HeadersFootersContainer.NotesHeadersFootersContainer){
-                hdd = (HeadersFootersContainer)ch[i];
-                break;
-           }
-        }
-        boolean newRecord = false;
-        if(hdd == null) {
-            hdd = new HeadersFootersContainer(HeadersFootersContainer.NotesHeadersFootersContainer);
-            newRecord = true;
-        }
-        if(ppt2007 && _notes.length > 0){
-            return new HeadersFooters(hdd, _notes[0], newRecord, ppt2007);
-        } else {
-            return new HeadersFooters(hdd, this, newRecord, ppt2007);
-        }
-    }
-
-    /**
-     * Add a movie in this presentation
-     *
-     * @param path the path or url to the movie
-     * @return 0-based index of the movie
-     */
-    public int addMovie(String path, int type) {
-        ExObjList lst = (ExObjList)_documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
-        if(lst == null){
-            lst = new ExObjList();
-            _documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
-        }
-
-        ExObjListAtom objAtom = lst.getExObjListAtom();
-        //increment the object ID seed
-        int objectId = (int)objAtom.getObjectIDSeed() + 1;
-        objAtom.setObjectIDSeed(objectId);
-        ExMCIMovie mci;
-        switch (type){
-            case MovieShape.MOVIE_MPEG:
-                mci = new ExMCIMovie();
-                break;
-            case MovieShape.MOVIE_AVI:
-                mci = new ExAviMovie();
-                break;
-            default:
-                throw new IllegalArgumentException("Unsupported Movie: " + type);
-        }
-
-        lst.appendChildRecord(mci);
-        ExVideoContainer exVideo = mci.getExVideo();
-        exVideo.getExMediaAtom().setObjectId(objectId);
-        exVideo.getExMediaAtom().setMask(0xE80000);
-        exVideo.getPathAtom().setText(path);
-        return objectId;
-    }
-
-    /**
-     * Add a control in this presentation
-     *
-     * @param name   name of the control, e.g. "Shockwave Flash Object"
-     * @param progId OLE Programmatic Identifier, e.g. "ShockwaveFlash.ShockwaveFlash.9"
-     * @return 0-based index of the control
-     */
-    public int addControl(String name, String progId) {
-        ExObjList lst = (ExObjList)_documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
-        if (lst == null) {
-            lst = new ExObjList();
-            _documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
-        }
-        ExObjListAtom objAtom = lst.getExObjListAtom();
-        //increment the object ID seed
-        int objectId = (int) objAtom.getObjectIDSeed() + 1;
-        objAtom.setObjectIDSeed(objectId);
-        ExControl ctrl = new ExControl();
-        ExOleObjAtom oleObj = ctrl.getExOleObjAtom();
-        oleObj.setObjID(objectId);
-        oleObj.setDrawAspect(ExOleObjAtom.DRAW_ASPECT_VISIBLE);
-        oleObj.setType(ExOleObjAtom.TYPE_CONTROL);
-        oleObj.setSubType(ExOleObjAtom.SUBTYPE_DEFAULT);
-
-        ctrl.setProgId(progId);
-        ctrl.setMenuName(name);
-        ctrl.setClipboardName(name);
-        lst.addChildAfter(ctrl, objAtom);
-
-        return objectId;
-    }
-
-    /**
-     * Add a hyperlink to this presentation
-     *
-     * @return 0-based index of the hyperlink
-     */
-    public int addHyperlink(Hyperlink link) {
-        ExObjList lst = (ExObjList)_documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
-        if (lst == null) {
-            lst = new ExObjList();
-            _documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
-        }
-        ExObjListAtom objAtom = lst.getExObjListAtom();
-        //increment the object ID seed
-        int objectId = (int) objAtom.getObjectIDSeed() + 1;
-        objAtom.setObjectIDSeed(objectId);
-
-        ExHyperlink ctrl = new ExHyperlink();
-        ExHyperlinkAtom obj = ctrl.getExHyperlinkAtom();
-        obj.setNumber(objectId);
-        ctrl.setLinkURL(link.getAddress());
-        ctrl.setLinkTitle(link.getTitle());
-        lst.addChildAfter(ctrl, objAtom);
-        link.setId(objectId);
+		slide.setMasterSheet(_masters[0]);
+		// All done and added
+		return slide;
+	}
+
+	/**
+	 * Adds a picture to this presentation and returns the associated index.
+	 *
+	 * @param data
+	 *            picture data
+	 * @param format
+	 *            the format of the picture. One of constans defined in the
+	 *            <code>Picture</code> class.
+	 * @return the index to this picture (1 based).
+	 */
+	public int addPicture(byte[] data, int format) throws IOException {
+		byte[] uid = PictureData.getChecksum(data);
+
+		EscherContainerRecord bstore;
+
+		EscherContainerRecord dggContainer = _documentRecord.getPPDrawingGroup().getDggContainer();
+		bstore = (EscherContainerRecord) Shape.getEscherChild(dggContainer,
+				EscherContainerRecord.BSTORE_CONTAINER);
+		if (bstore == null) {
+			bstore = new EscherContainerRecord();
+			bstore.setRecordId(EscherContainerRecord.BSTORE_CONTAINER);
+
+			dggContainer.addChildBefore(bstore, EscherOptRecord.RECORD_ID);
+		} else {
+			Iterator<EscherRecord> iter = bstore.getChildIterator();
+			for (int i = 0; iter.hasNext(); i++) {
+				EscherBSERecord bse = (EscherBSERecord) iter.next();
+				if (Arrays.equals(bse.getUid(), uid)) {
+					return i + 1;
+				}
+			}
+		}
+
+		PictureData pict = PictureData.create(format);
+		pict.setData(data);
+
+		int offset = _hslfSlideShow.addPicture(pict);
+
+		EscherBSERecord bse = new EscherBSERecord();
+		bse.setRecordId(EscherBSERecord.RECORD_ID);
+		bse.setOptions((short) (0x0002 | (format << 4)));
+		bse.setSize(pict.getRawData().length + 8);
+		bse.setUid(uid);
+
+		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);
+
+		bse.setRef(0);
+		bse.setOffset(offset);
+		bse.setRemainingData(new byte[0]);
+
+		bstore.addChildRecord(bse);
+		int count = bstore.getChildRecords().size();
+		bstore.setOptions((short) ((count << 4) | 0xF));
+
+		return count;
+	}
+
+	/**
+	 * Adds a picture to this presentation and returns the associated index.
+	 *
+	 * @param pict
+	 *            the file containing the image to add
+	 * @param format
+	 *            the format of the picture. One of constans defined in the
+	 *            <code>Picture</code> class.
+	 * @return the index to this picture (1 based).
+	 */
+	public int addPicture(File pict, int format) throws IOException {
+		int length = (int) pict.length();
+		byte[] data = new byte[length];
+		try {
+			FileInputStream is = new FileInputStream(pict);
+			is.read(data);
+			is.close();
+		} catch (IOException e) {
+			throw new HSLFException(e);
+		}
+		return addPicture(data, format);
+	}
+
+	/**
+	 * Add a font in this presentation
+	 *
+	 * @param font
+	 *            the font to add
+	 * @return 0-based index of the font
+	 */
+	public int addFont(PPFont font) {
+		FontCollection fonts = getDocumentRecord().getEnvironment().getFontCollection();
+		int idx = fonts.getFontIndex(font.getFontName());
+		if (idx == -1) {
+			idx = fonts.addFont(font.getFontName(), font.getCharSet(), font.getFontFlags(), font
+					.getFontType(), font.getPitchAndFamily());
+		}
+		return idx;
+	}
+
+	/**
+	 * Get a font by index
+	 *
+	 * @param idx
+	 *            0-based index of the font
+	 * @return of an instance of <code>PPFont</code> or <code>null</code> if not
+	 *         found
+	 */
+	public PPFont getFont(int idx) {
+		PPFont font = null;
+		FontCollection fonts = getDocumentRecord().getEnvironment().getFontCollection();
+		Record[] ch = fonts.getChildRecords();
+		for (int i = 0; i < ch.length; i++) {
+			if (ch[i] instanceof FontEntityAtom) {
+				FontEntityAtom atom = (FontEntityAtom) ch[i];
+				if (atom.getFontIndex() == idx) {
+					font = new PPFont(atom);
+					break;
+				}
+			}
+		}
+		return font;
+	}
+
+	/**
+	 * get the number of fonts in the presentation
+	 *
+	 * @return number of fonts
+	 */
+	public int getNumberOfFonts() {
+		return getDocumentRecord().getEnvironment().getFontCollection().getNumberOfFonts();
+	}
+
+	/**
+	 * Return Header / Footer settings for slides
+	 *
+	 * @return Header / Footer settings for slides
+	 */
+	public HeadersFooters getSlideHeadersFooters() {
+		// detect if this ppt was saved in Office2007
+		String tag = getSlidesMasters()[0].getProgrammableTag();
+		boolean ppt2007 = "___PPT12".equals(tag);
+
+		HeadersFootersContainer hdd = null;
+		Record[] ch = _documentRecord.getChildRecords();
+		for (int i = 0; i < ch.length; i++) {
+			if (ch[i] instanceof HeadersFootersContainer
+					&& ((HeadersFootersContainer) ch[i]).getOptions() == HeadersFootersContainer.SlideHeadersFootersContainer) {
+				hdd = (HeadersFootersContainer) ch[i];
+				break;
+			}
+		}
+		boolean newRecord = false;
+		if (hdd == null) {
+			hdd = new HeadersFootersContainer(HeadersFootersContainer.SlideHeadersFootersContainer);
+			newRecord = true;
+		}
+		return new HeadersFooters(hdd, this, newRecord, ppt2007);
+	}
+
+	/**
+	 * Return Header / Footer settings for notes
+	 *
+	 * @return Header / Footer settings for notes
+	 */
+	public HeadersFooters getNotesHeadersFooters() {
+		// detect if this ppt was saved in Office2007
+		String tag = getSlidesMasters()[0].getProgrammableTag();
+		boolean ppt2007 = "___PPT12".equals(tag);
+
+		HeadersFootersContainer hdd = null;
+		Record[] ch = _documentRecord.getChildRecords();
+		for (int i = 0; i < ch.length; i++) {
+			if (ch[i] instanceof HeadersFootersContainer
+					&& ((HeadersFootersContainer) ch[i]).getOptions() == HeadersFootersContainer.NotesHeadersFootersContainer) {
+				hdd = (HeadersFootersContainer) ch[i];
+				break;
+			}
+		}
+		boolean newRecord = false;
+		if (hdd == null) {
+			hdd = new HeadersFootersContainer(HeadersFootersContainer.NotesHeadersFootersContainer);
+			newRecord = true;
+		}
+		if (ppt2007 && _notes.length > 0) {
+			return new HeadersFooters(hdd, _notes[0], newRecord, ppt2007);
+		} else {
+			return new HeadersFooters(hdd, this, newRecord, ppt2007);
+		}
+	}
 
-        return objectId;
-    }
+	/**
+	 * Add a movie in this presentation
+	 *
+	 * @param path
+	 *            the path or url to the movie
+	 * @return 0-based index of the movie
+	 */
+	public int addMovie(String path, int type) {
+		ExObjList lst = (ExObjList) _documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
+		if (lst == null) {
+			lst = new ExObjList();
+			_documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
+		}
+
+		ExObjListAtom objAtom = lst.getExObjListAtom();
+		// increment the object ID seed
+		int objectId = (int) objAtom.getObjectIDSeed() + 1;
+		objAtom.setObjectIDSeed(objectId);
+		ExMCIMovie mci;
+		switch (type) {
+			case MovieShape.MOVIE_MPEG:
+				mci = new ExMCIMovie();
+				break;
+			case MovieShape.MOVIE_AVI:
+				mci = new ExAviMovie();
+				break;
+			default:
+				throw new IllegalArgumentException("Unsupported Movie: " + type);
+		}
+
+		lst.appendChildRecord(mci);
+		ExVideoContainer exVideo = mci.getExVideo();
+		exVideo.getExMediaAtom().setObjectId(objectId);
+		exVideo.getExMediaAtom().setMask(0xE80000);
+		exVideo.getPathAtom().setText(path);
+		return objectId;
+	}
+
+	/**
+	 * Add a control in this presentation
+	 *
+	 * @param name
+	 *            name of the control, e.g. "Shockwave Flash Object"
+	 * @param progId
+	 *            OLE Programmatic Identifier, e.g.
+	 *            "ShockwaveFlash.ShockwaveFlash.9"
+	 * @return 0-based index of the control
+	 */
+	public int addControl(String name, String progId) {
+		ExObjList lst = (ExObjList) _documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
+		if (lst == null) {
+			lst = new ExObjList();
+			_documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
+		}
+		ExObjListAtom objAtom = lst.getExObjListAtom();
+		// increment the object ID seed
+		int objectId = (int) objAtom.getObjectIDSeed() + 1;
+		objAtom.setObjectIDSeed(objectId);
+		ExControl ctrl = new ExControl();
+		ExOleObjAtom oleObj = ctrl.getExOleObjAtom();
+		oleObj.setObjID(objectId);
+		oleObj.setDrawAspect(ExOleObjAtom.DRAW_ASPECT_VISIBLE);
+		oleObj.setType(ExOleObjAtom.TYPE_CONTROL);
+		oleObj.setSubType(ExOleObjAtom.SUBTYPE_DEFAULT);
+
+		ctrl.setProgId(progId);
+		ctrl.setMenuName(name);
+		ctrl.setClipboardName(name);
+		lst.addChildAfter(ctrl, objAtom);
+
+		return objectId;
+	}
+
+	/**
+	 * Add a hyperlink to this presentation
+	 *
+	 * @return 0-based index of the hyperlink
+	 */
+	public int addHyperlink(Hyperlink link) {
+		ExObjList lst = (ExObjList) _documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
+		if (lst == null) {
+			lst = new ExObjList();
+			_documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
+		}
+		ExObjListAtom objAtom = lst.getExObjListAtom();
+		// increment the object ID seed
+		int objectId = (int) objAtom.getObjectIDSeed() + 1;
+		objAtom.setObjectIDSeed(objectId);
+
+		ExHyperlink ctrl = new ExHyperlink();
+		ExHyperlinkAtom obj = ctrl.getExHyperlinkAtom();
+		obj.setNumber(objectId);
+		ctrl.setLinkURL(link.getAddress());
+		ctrl.setLinkTitle(link.getTitle());
+		lst.addChildAfter(ctrl, objAtom);
+		link.setId(objectId);
+
+		return objectId;
+	}
 }

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/DocumentProperties.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/DocumentProperties.java?rev=805262&r1=805261&r2=805262&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/DocumentProperties.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/DocumentProperties.java Tue Aug 18 02:41:45 2009
@@ -17,7 +17,6 @@
 
 package org.apache.poi.hwpf.model;
 
-import org.apache.poi.util.LittleEndian;
 import org.apache.poi.hwpf.model.types.DOPAbstractType;
 
 /**
@@ -25,13 +24,10 @@
  *
  * @author Ryan Ackley
  */
+public final class DocumentProperties extends DOPAbstractType {
 
-public final class DocumentProperties extends DOPAbstractType
-{
 
-
-  public DocumentProperties(byte[] tableStream, int offset)
-  {
-    super.fillFields(tableStream, offset);
-  }
+	public DocumentProperties(byte[] tableStream, int offset) {
+		super.fillFields(tableStream, offset);
+	}
 }

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/PAPFormattedDiskPage.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/PAPFormattedDiskPage.java?rev=805262&r1=805261&r2=805262&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/PAPFormattedDiskPage.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/PAPFormattedDiskPage.java Tue Aug 18 02:41:45 2009
@@ -17,7 +17,6 @@
 
 package org.apache.poi.hwpf.model;
 
-import org.apache.poi.poifs.common.POIFSConstants;
 import org.apache.poi.util.LittleEndian;
 
 import java.util.ArrayList;
@@ -40,8 +39,7 @@
  *
  * @author Ryan Ackley
  */
-public final class PAPFormattedDiskPage extends FormattedDiskPage
-{
+public final class PAPFormattedDiskPage extends FormattedDiskPage {
 
     private static final int BX_SIZE = 13;
     private static final int FC_SIZE = 4;

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/StyleSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/StyleSheet.java?rev=805262&r1=805261&r2=805262&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/StyleSheet.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/StyleSheet.java Tue Aug 18 02:41:45 2009
@@ -17,7 +17,6 @@
 
 package org.apache.poi.hwpf.model;
 
-import java.util.*;
 import java.io.IOException;
 
 import org.apache.poi.util.LittleEndian;
@@ -35,9 +34,7 @@
  *
  * @author Ryan Ackley
  */
-
-public final class StyleSheet implements HDFType
-{
+public final class StyleSheet implements HDFType {
 
   public static final int NIL_STYLE = 4095;
   private static final int PAP_TYPE = 1;

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java?rev=805262&r1=805261&r2=805262&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java Tue Aug 18 02:41:45 2009
@@ -17,254 +17,229 @@
 
 package org.apache.poi.hwpf.model;
 
-
 import org.apache.poi.hwpf.model.io.HWPFOutputStream;
 import org.apache.poi.poifs.common.POIFSConstants;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 
 /**
- * The piece table for matching up character positions
- *  to bits of text.
- * This mostly works in bytes, but the TextPieces
- *  themselves work in characters. This does the icky
- *  convertion.
+ * The piece table for matching up character positions to bits of text. This
+ * mostly works in bytes, but the TextPieces themselves work in characters. This
+ * does the icky convertion.
+ *
  * @author Ryan Ackley
  */
-public final class TextPieceTable implements CharIndexTranslator
-{
-  protected ArrayList _textPieces = new ArrayList();
-  //int _multiple;
-  int _cpMin;
-
-  public TextPieceTable() {
-  }
-
-  public TextPieceTable(byte[] documentStream, byte[] tableStream, int offset,
-                        int size, int fcMin)
-    throws UnsupportedEncodingException
-  {
-    // get our plex of PieceDescriptors
-    PlexOfCps pieceTable = new PlexOfCps(tableStream, offset, size, PieceDescriptor.getSizeInBytes());
-
-    int length = pieceTable.length();
-    PieceDescriptor[] pieces = new PieceDescriptor[length];
-
-    // iterate through piece descriptors raw bytes and create
-    // PieceDescriptor objects
-    for (int x = 0; x < length; x++)
-    {
-      GenericPropertyNode node = pieceTable.getProperty(x);
-      pieces[x] = new PieceDescriptor(node.getBytes(), 0);
-    }
-
-
-    // Figure out the cp of the earliest text piece
-    // Note that text pieces don't have to be stored in order!
-    _cpMin = pieces[0].getFilePosition() - fcMin;
-    for (int x = 0; x < pieces.length; x++) {
-    	int start = pieces[x].getFilePosition() - fcMin;
-    	if(start < _cpMin) {
-    		_cpMin = start;
-    	}
-    }
-
-
-    // using the PieceDescriptors, build our list of TextPieces.
-    for (int x = 0; x < pieces.length; x++)
-    {
-      int start = pieces[x].getFilePosition();
-      PropertyNode node = pieceTable.getProperty(x);
-
-      // Grab the start and end, which are in characters
-      int nodeStartChars = node.getStart();
-      int nodeEndChars = node.getEnd();
-
-      // What's the relationship between bytes and characters?
-      boolean unicode = pieces[x].isUnicode();
-      int multiple = 1;
-      if (unicode) {
-        multiple = 2;
-      }
-
-      // Figure out the length, in bytes and chars
-      int textSizeChars = (nodeEndChars - nodeStartChars);
-      int textSizeBytes = textSizeChars * multiple;
-
-      // Grab the data that makes up the piece
-      byte[] buf = new byte[textSizeBytes];
-      System.arraycopy(documentStream, start, buf, 0, textSizeBytes);
-
-      // And now build the piece
-      _textPieces.add(new TextPiece(nodeStartChars, nodeEndChars, buf, pieces[x], node.getStart()));
-    }
-
-    // In the interest of our sanity, now sort the text pieces
-    //  into order, if they're not already
-    TextPiece[] tp = (TextPiece[])
-    	_textPieces.toArray(new TextPiece[_textPieces.size()]);
-    Arrays.sort(tp);
-    for(int i=0; i<tp.length; i++) {
-    	_textPieces.set(i, tp[i]);
-    }
-  }
-
-  public int getCpMin()
-  {
-    return _cpMin;
-  }
-
-  public List getTextPieces()
-  {
-    return _textPieces;
-  }
-
-  /**
-   * Is the text at the given Character offset
-   *  unicode, or plain old ascii?
-   * In a very evil fashion, you have to actually
-   *  know this to make sense of character and
-   *  paragraph properties :(
-   * @param cp The character offset to check about
-   */
-  public boolean isUnicodeAtCharOffset(int cp) {
-	  boolean lastWas = false;
-
-	  Iterator it = _textPieces.iterator();
-	  while(it.hasNext()) {
-		  TextPiece tp = (TextPiece)it.next();
-		  // If the text piece covers the character, all good
-		  if(tp.getStart() <= cp && tp.getEnd() >= cp) {
-			  return tp.isUnicode();
-		  }
-		  // Otherwise keep track for the last one
-		  lastWas = tp.isUnicode();
-	  }
-
-	  // If they ask off the end, just go with the last one...
-	  return lastWas;
-  }
-
-  public boolean isUnicodeAtByteOffset(int bytePos) {
-	  boolean lastWas = false;
-	 
-
-	  Iterator it = _textPieces.iterator();
-	  while(it.hasNext()) {
-		  TextPiece tp = (TextPiece)it.next();
-		  int curByte = tp.getPieceDescriptor().getFilePosition();
-		  int pieceEnd = curByte + tp.bytesLength();
-
-		  // If the text piece covers the character, all good
-		  if(curByte <= bytePos && pieceEnd > bytePos) {
-			  return tp.isUnicode();
-		  }
-		  // Otherwise keep track for the last one
-		  lastWas = tp.isUnicode();
-		  // Move along
-		  curByte = pieceEnd;
-	  }
-
-	  // If they ask off the end, just go with the last one...
-	  return lastWas;
-  }
-
-  public byte[] writeTo(HWPFOutputStream docStream)
-    throws IOException
-  {
-
-    PlexOfCps textPlex = new PlexOfCps(PieceDescriptor.getSizeInBytes());
-    //int fcMin = docStream.getOffset();
-
-    int size = _textPieces.size();
-    for (int x = 0; x < size; x++)
-    {
-      TextPiece next = (TextPiece)_textPieces.get(x);
-      PieceDescriptor pd = next.getPieceDescriptor();
-
-      int offset = docStream.getOffset();
-      int mod = (offset % POIFSConstants.BIG_BLOCK_SIZE);
-      if (mod != 0)
-      {
-        mod = POIFSConstants.BIG_BLOCK_SIZE - mod;
-        byte[] buf = new byte[mod];
-        docStream.write(buf);
-      }
-
-
-      // set the text piece position to the current docStream offset.
-      pd.setFilePosition(docStream.getOffset());
-
-      // write the text to the docstream and save the piece descriptor to the
-      // plex which will be written later to the tableStream.
-      docStream.write(next.getRawBytes());
-
-      // The TextPiece is already in characters, which
-      //  makes our life much easier
-      int nodeStart = next.getStart();
-      int nodeEnd = next.getEnd();
-      textPlex.addProperty(new GenericPropertyNode(nodeStart, nodeEnd,
-        pd.toByteArray()));
-    }
-
-    return textPlex.toByteArray();
-
-  }
-
-  /**
-   * Adjust all the text piece after inserting
-   *  some text into one of them
-   * @param listIndex The TextPiece that had characters inserted into
-   * @param length The number of characters inserted
-   */
-  public int adjustForInsert(int listIndex, int length) {
-    int size = _textPieces.size();
-
-    TextPiece tp = (TextPiece)_textPieces.get(listIndex);
-
-    // Update with the new end
-    tp.setEnd(tp.getEnd() + length);
-
-    // Now change all subsequent ones
-    for (int x = listIndex + 1; x < size; x++)
-    {
-      tp = (TextPiece)_textPieces.get(x);
-      tp.setStart(tp.getStart() + length);
-      tp.setEnd(tp.getEnd() + length);
-    }
-
-    // All done
-    return length;
-  }
-
-
-  public boolean equals(Object o)
-  {
-    TextPieceTable tpt = (TextPieceTable)o;
-
-    int size = tpt._textPieces.size();
-    if (size == _textPieces.size())
-    {
-      for (int x = 0; x < size; x++)
-      {
-        if (!tpt._textPieces.get(x).equals(_textPieces.get(x)))
-        {
-          return false;
-        }
-      }
-      return true;
-    }
-    return false;
-  }
-  	/* (non-Javadoc)
-	 * @see org.apache.poi.hwpf.model.CharIndexTranslator#getLengthInChars(int)
+public final class TextPieceTable implements CharIndexTranslator {
+	protected ArrayList _textPieces = new ArrayList();
+	// int _multiple;
+	int _cpMin;
+
+	public TextPieceTable() {
+	}
+
+	public TextPieceTable(byte[] documentStream, byte[] tableStream, int offset, int size, int fcMin) {
+		// get our plex of PieceDescriptors
+		PlexOfCps pieceTable = new PlexOfCps(tableStream, offset, size, PieceDescriptor
+				.getSizeInBytes());
+
+		int length = pieceTable.length();
+		PieceDescriptor[] pieces = new PieceDescriptor[length];
+
+		// iterate through piece descriptors raw bytes and create
+		// PieceDescriptor objects
+		for (int x = 0; x < length; x++) {
+			GenericPropertyNode node = pieceTable.getProperty(x);
+			pieces[x] = new PieceDescriptor(node.getBytes(), 0);
+		}
+
+		// Figure out the cp of the earliest text piece
+		// Note that text pieces don't have to be stored in order!
+		_cpMin = pieces[0].getFilePosition() - fcMin;
+		for (int x = 0; x < pieces.length; x++) {
+			int start = pieces[x].getFilePosition() - fcMin;
+			if (start < _cpMin) {
+				_cpMin = start;
+			}
+		}
+
+		// using the PieceDescriptors, build our list of TextPieces.
+		for (int x = 0; x < pieces.length; x++) {
+			int start = pieces[x].getFilePosition();
+			PropertyNode node = pieceTable.getProperty(x);
+
+			// Grab the start and end, which are in characters
+			int nodeStartChars = node.getStart();
+			int nodeEndChars = node.getEnd();
+
+			// What's the relationship between bytes and characters?
+			boolean unicode = pieces[x].isUnicode();
+			int multiple = 1;
+			if (unicode) {
+				multiple = 2;
+			}
+
+			// Figure out the length, in bytes and chars
+			int textSizeChars = (nodeEndChars - nodeStartChars);
+			int textSizeBytes = textSizeChars * multiple;
+
+			// Grab the data that makes up the piece
+			byte[] buf = new byte[textSizeBytes];
+			System.arraycopy(documentStream, start, buf, 0, textSizeBytes);
+
+			// And now build the piece
+			_textPieces.add(new TextPiece(nodeStartChars, nodeEndChars, buf, pieces[x], node
+					.getStart()));
+		}
+
+		// In the interest of our sanity, now sort the text pieces
+		// into order, if they're not already
+		TextPiece[] tp = (TextPiece[]) _textPieces.toArray(new TextPiece[_textPieces.size()]);
+		Arrays.sort(tp);
+		for (int i = 0; i < tp.length; i++) {
+			_textPieces.set(i, tp[i]);
+		}
+	}
+
+	public int getCpMin() {
+		return _cpMin;
+	}
+
+	public List getTextPieces() {
+		return _textPieces;
+	}
+
+	/**
+	 * Is the text at the given Character offset unicode, or plain old ascii? In
+	 * a very evil fashion, you have to actually know this to make sense of
+	 * character and paragraph properties :(
+	 *
+	 * @param cp
+	 *            The character offset to check about
+	 */
+	public boolean isUnicodeAtCharOffset(int cp) {
+		boolean lastWas = false;
+
+		Iterator it = _textPieces.iterator();
+		while (it.hasNext()) {
+			TextPiece tp = (TextPiece) it.next();
+			// If the text piece covers the character, all good
+			if (tp.getStart() <= cp && tp.getEnd() >= cp) {
+				return tp.isUnicode();
+			}
+			// Otherwise keep track for the last one
+			lastWas = tp.isUnicode();
+		}
+
+		// If they ask off the end, just go with the last one...
+		return lastWas;
+	}
+
+	public boolean isUnicodeAtByteOffset(int bytePos) {
+		boolean lastWas = false;
+
+		Iterator it = _textPieces.iterator();
+		while (it.hasNext()) {
+			TextPiece tp = (TextPiece) it.next();
+			int curByte = tp.getPieceDescriptor().getFilePosition();
+			int pieceEnd = curByte + tp.bytesLength();
+
+			// If the text piece covers the character, all good
+			if (curByte <= bytePos && pieceEnd > bytePos) {
+				return tp.isUnicode();
+			}
+			// Otherwise keep track for the last one
+			lastWas = tp.isUnicode();
+			// Move along
+			curByte = pieceEnd;
+		}
+
+		// If they ask off the end, just go with the last one...
+		return lastWas;
+	}
+
+	public byte[] writeTo(HWPFOutputStream docStream) throws IOException {
+
+		PlexOfCps textPlex = new PlexOfCps(PieceDescriptor.getSizeInBytes());
+		// int fcMin = docStream.getOffset();
+
+		int size = _textPieces.size();
+		for (int x = 0; x < size; x++) {
+			TextPiece next = (TextPiece) _textPieces.get(x);
+			PieceDescriptor pd = next.getPieceDescriptor();
+
+			int offset = docStream.getOffset();
+			int mod = (offset % POIFSConstants.BIG_BLOCK_SIZE);
+			if (mod != 0) {
+				mod = POIFSConstants.BIG_BLOCK_SIZE - mod;
+				byte[] buf = new byte[mod];
+				docStream.write(buf);
+			}
+
+			// set the text piece position to the current docStream offset.
+			pd.setFilePosition(docStream.getOffset());
+
+			// write the text to the docstream and save the piece descriptor to
+			// the
+			// plex which will be written later to the tableStream.
+			docStream.write(next.getRawBytes());
+
+			// The TextPiece is already in characters, which
+			// makes our life much easier
+			int nodeStart = next.getStart();
+			int nodeEnd = next.getEnd();
+			textPlex.addProperty(new GenericPropertyNode(nodeStart, nodeEnd, pd.toByteArray()));
+		}
+
+		return textPlex.toByteArray();
+
+	}
+
+	/**
+	 * Adjust all the text piece after inserting some text into one of them
+	 *
+	 * @param listIndex
+	 *            The TextPiece that had characters inserted into
+	 * @param length
+	 *            The number of characters inserted
 	 */
+	public int adjustForInsert(int listIndex, int length) {
+		int size = _textPieces.size();
+
+		TextPiece tp = (TextPiece) _textPieces.get(listIndex);
+
+		// Update with the new end
+		tp.setEnd(tp.getEnd() + length);
+
+		// Now change all subsequent ones
+		for (int x = listIndex + 1; x < size; x++) {
+			tp = (TextPiece) _textPieces.get(x);
+			tp.setStart(tp.getStart() + length);
+			tp.setEnd(tp.getEnd() + length);
+		}
+
+		// All done
+		return length;
+	}
+
+	public boolean equals(Object o) {
+		TextPieceTable tpt = (TextPieceTable) o;
+
+		int size = tpt._textPieces.size();
+		if (size == _textPieces.size()) {
+			for (int x = 0; x < size; x++) {
+				if (!tpt._textPieces.get(x).equals(_textPieces.get(x))) {
+					return false;
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
 	public int getCharIndex(int bytePos) {
 		int charCount = 0;
 
@@ -272,15 +247,14 @@
 		while (it.hasNext()) {
 			TextPiece tp = (TextPiece) it.next();
 			int pieceStart = tp.getPieceDescriptor().getFilePosition();
-			if(pieceStart >= bytePos) {
+			if (pieceStart >= bytePos) {
 				break;
 			}
-			
+
 			int bytesLength = tp.bytesLength();
 			int pieceEnd = pieceStart + bytesLength;
 
-			int toAdd = bytePos > pieceEnd ? bytesLength : bytesLength
-					- (pieceEnd - bytePos);
+			int toAdd = bytePos > pieceEnd ? bytesLength : bytesLength - (pieceEnd - bytePos);
 
 			if (tp.isUnicode()) {
 				charCount += toAdd / 2;
@@ -291,5 +265,5 @@
 
 		return charCount;
 	}
-	
+
 }

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/types/CHPAbstractType.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/types/CHPAbstractType.java?rev=805262&r1=805261&r2=805262&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/types/CHPAbstractType.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/types/CHPAbstractType.java Tue Aug 18 02:41:45 2009
@@ -19,13 +19,12 @@
 
 
 
+import org.apache.poi.hdf.model.hdftypes.HDFType;
+import org.apache.poi.hwpf.usermodel.BorderCode;
+import org.apache.poi.hwpf.usermodel.DateAndTime;
+import org.apache.poi.hwpf.usermodel.ShadingDescriptor;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
-import org.apache.poi.hdf.model.hdftypes.HDFType;
-import org.apache.poi.hwpf.usermodel.*;
 
 /**
  * Character Properties.

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/types/DOPAbstractType.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/types/DOPAbstractType.java?rev=805262&r1=805261&r2=805262&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/types/DOPAbstractType.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/types/DOPAbstractType.java Tue Aug 18 02:41:45 2009
@@ -18,25 +18,19 @@
 package org.apache.poi.hwpf.model.types;
 
 
-
+import org.apache.poi.hdf.model.hdftypes.HDFType;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
-import org.apache.poi.hdf.model.hdftypes.HDFType;
-import org.apache.poi.hwpf.usermodel.*;
 
 /**
  * Document Properties.
  * NOTE: This source is automatically generated please do not modify this file.  Either subclass or
  *       remove the record in src/records/definitions.
-
+ *
  * @author S. Ryan Ackley
  */
-public abstract class DOPAbstractType
-    implements HDFType
-{
+public abstract class DOPAbstractType implements HDFType {
 
     protected  byte field_1_formatFlags;
         private static BitField  fFacingPages = BitFieldFactory.getInstance(0x01);



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org