From 4028abde1d31d9ca889130840c201758e626d21b Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sun, 19 Mar 2006 15:59:23 +0000 Subject: [PATCH] Create a Document record class, to do a lot of the common Document stuff for us git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@386981 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/hslf/record/Document.java | 110 ++++++++++++++ .../apache/poi/hslf/record/RecordTypes.java | 2 +- .../apache/poi/hslf/usermodel/SlideShow.java | 134 ++++++++++++++---- 3 files changed, 221 insertions(+), 25 deletions(-) create mode 100644 src/scratchpad/src/org/apache/poi/hslf/record/Document.java diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/Document.java b/src/scratchpad/src/org/apache/poi/hslf/record/Document.java new file mode 100644 index 0000000000..1534116287 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/Document.java @@ -0,0 +1,110 @@ + +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + + +package org.apache.poi.hslf.record; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Master container for Document. There is one of these for every + * slideshow, and it holds lots of definitions, and some summaries. + * + * @author Nick Burch + */ + +public class Document extends PositionDependentRecordContainer +{ + private byte[] _header; + private static long _type = 1000; + + // Links to our more interesting children + private DocumentAtom documentAtom; + private Record environment; + private SlideListWithText[] slwts; + + /** + * Returns the DocumentAtom of this Document + */ + public DocumentAtom getDocumentAtom() { return documentAtom; } + /** + * Returns the Environment of this Notes, which lots of + * settings for the document in it + */ + public Record getEnvironment() { return environment; } + /** + * Returns all the SlideListWithTexts that are defined for + * this Document. They hold the text, and some of the text + * properties, which are referred to by the slides. + */ + public SlideListWithText[] getSlideListWithTexts() { return slwts; } + + + /** + * Set things up, and find our more interesting children + */ + protected Document(byte[] source, int start, int len) { + // Grab the header + _header = new byte[8]; + System.arraycopy(source,start,_header,0,8); + + // Find our children + _children = Record.findChildRecords(source,start+8,len-8); + + // Our first one should be a document atom + if(! (_children[0] instanceof DocumentAtom)) { + throw new IllegalStateException("The first child of a Document must be a DocumentAtom"); + } + documentAtom = (DocumentAtom)_children[0]; + + // Find how many SlideListWithTexts we have + // Also, grab the Environment record on our way past + int slwtcount = 0; + for(int i=1; i<_children.length; i++) { + if(_children[i] instanceof SlideListWithText) { + slwtcount++; + } + if(_children[i].getRecordType() == RecordTypes.Environment.typeID) { + environment = _children[i]; + } + } + // Now grab them all + slwts = new SlideListWithText[slwtcount]; + slwtcount = 0; + for(int i=1; i<_children.length; i++) { + if(_children[i] instanceof SlideListWithText) { + slwts[slwtcount] = (SlideListWithText)_children[i]; + slwtcount++; + } + } + } + + + /** + * We are of type 1000 + */ + public long getRecordType() { return _type; } + + /** + * Write the contents of the record back, so it can be written + * to disk + */ + public void writeOut(OutputStream out) throws IOException { + writeOut(_header[0],_header[1],_type,_children,out); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java index 96c2dad145..d31bf84da3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java @@ -34,7 +34,7 @@ public class RecordTypes { public static HashMap typeToClass; public static final Type Unknown = new Type(0,null); - public static final Type Document = new Type(1000,DummyPositionSensitiveRecordWithChildren.class); + public static final Type Document = new Type(1000,Document.class); public static final Type DocumentAtom = new Type(1001,DocumentAtom.class); public static final Type EndDocument = new Type(1002,null); public static final Type Slide = new Type(1006,Slide.class); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java index db024e7984..1fc4c6fda7 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java @@ -20,12 +20,13 @@ package org.apache.poi.hslf.usermodel; import java.util.*; +import java.awt.Dimension; import java.io.*; -import org.apache.poi.util.LittleEndian; - import org.apache.poi.hslf.*; import org.apache.poi.hslf.model.*; +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.Record; @@ -62,7 +63,7 @@ public class SlideShow private Record[] _mostRecentCoreRecords; // Records that are interesting - private Record _documentRecord; + private Document _documentRecord; // Friendly objects for people to deal with private Slide[] _slides; @@ -201,7 +202,7 @@ public class SlideShow // Now look for the interesting records in there for(int i=0; i<_mostRecentCoreRecords.length; i++) { if(_mostRecentCoreRecords[i].getRecordType() == RecordTypes.Document.typeID) { - _documentRecord = _mostRecentCoreRecords[i]; + _documentRecord = (Document)_mostRecentCoreRecords[i]; } } } @@ -380,6 +381,83 @@ public class SlideShow } } + /** + * Create a blank Slide. + * + * @return the created Slide + * @throws IOException + */ + public Slide createSlide() throws IOException { +// RecordContainer slist=null; +// Record[] rec = doc.getChildRecords(); +// int num = 0; +// for (int i = 0; i < rec.length; i++) { +// Record record = rec[i]; +// if (record.getRecordType() == RecordTypes.SlideListWithText.typeID){ +// if (num > 0){ +// slist = (RecordContainer)record; +// } +// num++; +// } +// } +// if (num == 1){ +// slist = new SlideListWithText(); +// rec = doc.getChildRecords(); +// for (int i = 0; i < rec.length-1; i++) { +// Record record = rec[i+1]; +// if (record.getRecordType() == RecordTypes.EndDocument.typeID){ +// +// doc.addChildAfter(slist, rec[i]); +// } +// } +// } +// rec = slist.getChildRecords(); +// +// //add SlidePersistAtom +// SlidePersistAtom prev = rec.length == 0 ? null : (SlidePersistAtom)rec[rec.length - 1]; +// SlidePersistAtom sp = new SlidePersistAtom(); +// +// //refernce is the 1-based index of the slide container in the document root. +// //it always starts with 3 (1 is Document, 2 is MainMaster, 3 is the first slide) +// sp.setRefID(prev == null ? 3 : (prev.getRefID() + 1)); +// //first slideId is always 256 +// sp.setSlideIdentifier(prev == null ? 256 : (prev.getSlideIdentifier() + 1)); +// +// Record[] r = slist.appendChildRecord(sp, +// slist.getChildRecords() == null ? new Record[]{} : slist.getChildRecords()); +// slist.setChildRecords(r); +// Slide slide = new Slide(); +// +// int offset = 0; +// List lst = new ArrayList(); +// for (int i = 0; i < _records.length; i++) { +// Record record = _records[i]; +// lst.add(record); +// ByteArrayOutputStream out = new ByteArrayOutputStream(); +// record.writeOut(out); +// +// if (_records[i].getRecordType() == RecordTypes.PersistPtrIncrementalBlock.typeID){ +// lst.add(i, slide.getSlideRecord()); +// +// slide.getSlideRecord().setLastOnDiskOffset(offset); +// PersistPtrHolder ptr = (PersistPtrHolder)_records[i]; +// int id = sp.getRefID(); +// ptr.getSlideDataLocationsLookup().put(new Integer(id), new Integer((i+1)*4)); +// ptr.getSlideLocationsLookup().put(new Integer(id), new Integer(offset)); +// ptr.addSlideLookup(id, offset); +// +// } +// offset += out.size() ; +// } +// _records = (Record[])lst.toArray(new Record[lst.size()]); +// _hslfSlideShow.setRecords(_records); +// +// UserEditAtom usr = (UserEditAtom)_records[_records.length-1]; +// usr.setLastViewType((short)UserEditAtom.LAST_VIEW_SLIDE_VIEW); +// return slide; + return null; + } + /** * Writes out the slideshow file the is represented by an instance of @@ -393,29 +471,29 @@ public class SlideShow } - // Accesser methods follow + // Accesser methods follow - /** - * Returns an array of the most recent version of all the interesting - * records - */ - public Record[] getMostRecentCoreRecords() { return _mostRecentCoreRecords; } + /** + * Returns an array of the most recent version of all the interesting + * records + */ + public Record[] getMostRecentCoreRecords() { return _mostRecentCoreRecords; } - /** - * Returns an array of all the normal Slides found in the slideshow - */ - public Slide[] getSlides() { return _slides; } + /** + * Returns an array of all the normal Slides found in the slideshow + */ + public Slide[] getSlides() { return _slides; } - /** - * Returns an array of all the normal Notes found in the slideshow - */ - public Notes[] getNotes() { return _notes; } + /** + * Returns an array of all the normal Notes found in the slideshow + */ + public Notes[] getNotes() { return _notes; } - /** - * Returns an array of all the meta Sheets (master sheets etc) - * found in the slideshow - */ - //public MetaSheet[] getMetaSheets() { return _msheets; } + /** + * Returns an array of all the meta Sheets (master sheets etc) + * found in the slideshow + */ + //public MetaSheet[] getMetaSheets() { return _msheets; } /** * Returns all the pictures attached to the SlideShow @@ -424,6 +502,14 @@ public class SlideShow return _hslfSlideShow.getPictures(); } + /** + * Return the current page size + */ + public Dimension getPageSize(){ + DocumentAtom docatom = _documentRecord.getDocumentAtom(); + return new Dimension((int)docatom.getSlideSizeX(), (int)docatom.getSlideSizeY()); + } + /** * Helper method for usermodel: Get the font collection */ @@ -431,5 +517,5 @@ public class SlideShow /** * Helper method for usermodel: Get the document record */ - protected Record getDocumentRecord() { return _documentRecord; } + protected Document getDocumentRecord() { return _documentRecord; } } -- 2.39.5