Author: yegor Date: Fri May 25 05:04:45 2007 New Revision: 541622 URL: http://svn.apache.org/viewvc?view=rev&rev=541622 Log: added support for TitleMaster object
Added: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SheetContainer.java jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/alterman_security.ppt (with props) jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MainMaster.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Notes.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Slide.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/slide_master.ppt jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java Fri May 25 05:04:45 2007 @@ -16,6 +16,9 @@ */ package org.apache.poi.hslf.model; +import org.apache.poi.hslf.record.SheetContainer; +import org.apache.poi.hslf.model.textproperties.TextProp; + /** * The superclass of all master sheets - Slide masters, Notes masters, etc. * @@ -24,5 +27,14 @@ * @author Yegor Kozlov */ public abstract class MasterSheet extends Sheet { + public MasterSheet(SheetContainer container, int sheetNo){ + super(container, sheetNo); + } + + /** + * Pickup a style attribute from the master. + * This is the "workhorse" which returns the default style attrubutes. + */ + public abstract TextProp getStyleAttribute(int txtype, int level, String name, boolean isCharacter) ; } Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java Fri May 25 05:04:45 2007 @@ -20,8 +20,6 @@ package org.apache.poi.hslf.model; -import org.apache.poi.hslf.record.PPDrawing; - /** * This class represents a slide's notes in a PowerPoint Document. It * allows access to the text within, and the layout. For now, it only @@ -32,9 +30,6 @@ public class Notes extends Sheet { - private int _refSheetNo; - private int _slideNo; - private org.apache.poi.hslf.record.Notes _notes; private TextRun[] _runs; /** @@ -44,18 +39,12 @@ * @param notes the Notes record to read from */ public Notes (org.apache.poi.hslf.record.Notes notes) { - _notes = notes; - - // Grab our internal sheet ID - _refSheetNo = notes.getSheetId(); - - // Grab the number of the slide we're for, via the NotesAtom - _slideNo = _notes.getNotesAtom().getSlideID(); + super(notes, notes.getNotesAtom().getSlideID()); // Now, build up TextRuns from pairs of TextHeaderAtom and // one of TextBytesAtom or TextCharsAtom, found inside // EscherTextboxWrapper's in the PPDrawing - _runs = findTextRuns(_notes.getPPDrawing()); + _runs = findTextRuns(getPPDrawing()); // Set the sheet on each TextRun for (int i = 0; i < _runs.length; i++) @@ -70,15 +59,11 @@ */ public TextRun[] getTextRuns() { return _runs; } - /** - * Returns the (internal, RefID based) sheet number, as used - * to in PersistPtr stuff. - */ - public int _getSheetRefId() { return _refSheetNo; } - /** - * Returns the (internal, SlideIdentifer based) number of the - * slide we're attached to - */ - public int _getSheetNumber() { return _slideNo; } - - protected PPDrawing getPPDrawing() { return _notes.getPPDrawing(); }} + /** + * Return <code>null</code> - Notes Masters are not yet supported + */ + public MasterSheet getMasterSheet() { + return null; + } + +} Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java Fri May 25 05:04:45 2007 @@ -39,8 +39,6 @@ int type = spRecord.getOptions() >> 4; switch (type){ case ShapeTypes.TextBox: - shape = new TextBox(spContainer, parent); - break; case ShapeTypes.Rectangle: EscherTextboxRecord txtbox = (EscherTextboxRecord)Shape.getEscherChild(spContainer, EscherTextboxRecord.RECORD_ID); if (txtbox == null) Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java Fri May 25 05:04:45 2007 @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.hslf.model; @@ -33,195 +31,254 @@ /** * This class defines the common format of "Sheets" in a powerpoint - * document. Such sheets could be Slides, Notes, Master etc + * document. Such sheets could be Slides, Notes, Master etc * * @author Nick Burch + * @author Yegor Kozlov */ -public abstract class Sheet -{ - /** - * The <code>SlideShow</code> we belong to - */ - private SlideShow _slideShow; - - /** - * Returns an array of all the TextRuns in the sheet. - */ - public abstract TextRun[] getTextRuns(); - - /** - * Returns the (internal, RefID based) sheet number, as used - * to in PersistPtr stuff. - */ - public abstract int _getSheetRefId(); - - /** - * Returns the (internal, SlideIdentifier based) sheet number, as used - * to reference this sheet from other records. - */ - public abstract int _getSheetNumber(); - - /** - * Fetch the PPDrawing from the underlying record - */ - protected abstract PPDrawing getPPDrawing(); - - - /** - * Fetch the SlideShow we're attached to - */ - public SlideShow getSlideShow() { return _slideShow; } - - /** - * Set the SlideShow we're attached to. - * Also passes it on to our child RichTextRuns - */ - public void setSlideShow(SlideShow ss) { - _slideShow = ss; - TextRun[] trs = getTextRuns(); - if(trs != null) { - for(int i=0; i<trs.length; i++) { - trs[i].supplySlideShow(_slideShow); - } - } - } - - - /** - * For a given PPDrawing, grab all the TextRuns - */ - public static TextRun[] findTextRuns(PPDrawing ppdrawing) { - Vector runsV = new Vector(); - EscherTextboxWrapper[] wrappers = ppdrawing.getTextboxWrappers(); - for(int i=0; i<wrappers.length; i++) { - findTextRuns(wrappers[i].getChildRecords(),runsV); - } - TextRun[] runs = new TextRun[runsV.size()]; - for(int i=0; i<runs.length; i++) { - runs[i] = (TextRun)runsV.get(i); - } - return runs; - } - - /** - * Scans through the supplied record array, looking for - * a TextHeaderAtom followed by one of a TextBytesAtom or - * a TextCharsAtom. Builds up TextRuns from these - * - * @param records the records to build from - * @param found vector to add any found to - */ - protected static void findTextRuns(Record[] records, Vector found) { - // Look for a TextHeaderAtom - for(int i=0; i<(records.length-1); i++) { - if(records[i] instanceof TextHeaderAtom) { - TextRun trun = null; - TextHeaderAtom tha = (TextHeaderAtom)records[i]; - StyleTextPropAtom stpa = null; - - // Look for a subsequent StyleTextPropAtom - if(i < (records.length-2)) { - if(records[i+2] instanceof StyleTextPropAtom) { - stpa = (StyleTextPropAtom)records[i+2]; - } - } - - // See what follows the TextHeaderAtom - if(records[i+1] instanceof TextCharsAtom) { - TextCharsAtom tca = (TextCharsAtom)records[i+1]; - trun = new TextRun(tha,tca,stpa); - } else if(records[i+1] instanceof TextBytesAtom) { - TextBytesAtom tba = (TextBytesAtom)records[i+1]; - trun = new TextRun(tha,tba,stpa); - } else if(records[i+1].getRecordType() == 4001l) { - // StyleTextPropAtom - Safe to ignore - } else if(records[i+1].getRecordType() == 4010l) { - // TextSpecInfoAtom - Safe to ignore - } else { - System.err.println("Found a TextHeaderAtom not followed by a TextBytesAtom or TextCharsAtom: Followed by " + records[i+1].getRecordType()); - continue; - } - - if(trun != null) { - found.add(trun); - i++; - } else { - // Not a valid one, so skip on to next and look again - } - } - } - } - - /** - * Returns all shapes contained in this Sheet - * - * @return all shapes contained in this Sheet (Slide or Notes) - */ - public Shape[] getShapes() { - PPDrawing ppdrawing = getPPDrawing(); - - EscherContainerRecord dg = (EscherContainerRecord)ppdrawing.getEscherRecords()[0]; - EscherContainerRecord spgr = null; - List ch = dg.getChildRecords(); - - for (Iterator it = ch.iterator(); it.hasNext();) { - EscherRecord rec = (EscherRecord)it.next(); - if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER){ - spgr = (EscherContainerRecord)rec; - break; - } - } - ch = spgr.getChildRecords(); - - ArrayList shapes = new ArrayList(); - for (int i=1;i<ch.size();i++) { - EscherContainerRecord sp = (EscherContainerRecord)ch.get(i); - Shape sh = ShapeFactory.createShape(sp, null); - sh.setSheet(this); - shapes.add(sh); - } - - return (Shape[])shapes.toArray(new Shape[shapes.size()]); - } - - /** - * Add a new Shape to this Slide - * - * @param shape - the Shape to add - */ - public void addShape(Shape shape){ - PPDrawing ppdrawing = getPPDrawing(); - - EscherContainerRecord dgContainer = (EscherContainerRecord)ppdrawing.getEscherRecords()[0]; - EscherContainerRecord spgr = (EscherContainerRecord)Shape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER); - spgr.addChildRecord(shape.getSpContainer()); - - EscherDgRecord dg = (EscherDgRecord)Shape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID); - dg.setNumShapes(dg.getNumShapes()+1); - - shape.setSheet(this); - shape.afterInsert(this); - - // If it's a TextBox, we need to tell the PPDrawing, as it has to - // track TextboxWrappers specially - if(shape instanceof TextBox) { - TextBox tbox = (TextBox)shape; - ppdrawing.addTextboxWrapper(tbox._txtbox); - } - } - +public abstract class Sheet { /** - * Return the master sheet . + * The <code>SlideShow</code> we belong to + */ + private SlideShow _slideShow; + + /** + * Sheet background + */ + private Background _background; + + /** + * Record container that holds sheet data. + * For slides it is org.apache.poi.hslf.record.Slide, + * for notes it is org.apache.poi.hslf.record.Notes, + * for slide masters it is org.apache.poi.hslf.record.SlideMaster, etc. + */ + private SheetContainer _container; + + private int _sheetNo; + + public Sheet(SheetContainer container, int sheetNo) { + _container = container; + _sheetNo = sheetNo; + } + + /** + * Returns an array of all the TextRuns in the sheet. + */ + public abstract TextRun[] getTextRuns(); + + /** + * Returns the (internal, RefID based) sheet number, as used + * to in PersistPtr stuff. + */ + public int _getSheetRefId() { + return _container.getSheetId(); + } + + /** + * Returns the (internal, SlideIdentifier based) sheet number, as used + * to reference this sheet from other records. + */ + public int _getSheetNumber() { + return _sheetNo; + } + + /** + * Fetch the PPDrawing from the underlying record + */ + protected PPDrawing getPPDrawing() { + return _container.getPPDrawing(); + } + + /** + * Fetch the SlideShow we're attached to + */ + public SlideShow getSlideShow() { + return _slideShow; + } + + /** + * Return record container for this sheet */ - public MasterSheet getMasterSheet(){ - return null; + public SheetContainer getSheetContainer() { + return _container; } /** + * Set the SlideShow we're attached to. + * Also passes it on to our child RichTextRuns + */ + public void setSlideShow(SlideShow ss) { + _slideShow = ss; + TextRun[] trs = getTextRuns(); + if (trs != null) { + for (int i = 0; i < trs.length; i++) { + trs[i].supplySlideShow(_slideShow); + } + } + } + + + /** + * For a given PPDrawing, grab all the TextRuns + */ + public static TextRun[] findTextRuns(PPDrawing ppdrawing) { + Vector runsV = new Vector(); + EscherTextboxWrapper[] wrappers = ppdrawing.getTextboxWrappers(); + for (int i = 0; i < wrappers.length; i++) { + findTextRuns(wrappers[i].getChildRecords(), runsV); + } + TextRun[] runs = new TextRun[runsV.size()]; + for (int i = 0; i < runs.length; i++) { + runs[i] = (TextRun) runsV.get(i); + } + return runs; + } + + /** + * Scans through the supplied record array, looking for + * a TextHeaderAtom followed by one of a TextBytesAtom or + * a TextCharsAtom. Builds up TextRuns from these + * + * @param records the records to build from + * @param found vector to add any found to + */ + protected static void findTextRuns(Record[] records, Vector found) { + // Look for a TextHeaderAtom + for (int i = 0; i < (records.length - 1); i++) { + if (records[i] instanceof TextHeaderAtom) { + TextRun trun = null; + TextHeaderAtom tha = (TextHeaderAtom) records[i]; + StyleTextPropAtom stpa = null; + + // Look for a subsequent StyleTextPropAtom + if (i < (records.length - 2)) { + if (records[i + 2] instanceof StyleTextPropAtom) { + stpa = (StyleTextPropAtom) records[i + 2]; + } + } + + // See what follows the TextHeaderAtom + if (records[i + 1] instanceof TextCharsAtom) { + TextCharsAtom tca = (TextCharsAtom) records[i + 1]; + trun = new TextRun(tha, tca, stpa); + } else if (records[i + 1] instanceof TextBytesAtom) { + TextBytesAtom tba = (TextBytesAtom) records[i + 1]; + trun = new TextRun(tha, tba, stpa); + } else if (records[i + 1].getRecordType() == 4001l) { + // StyleTextPropAtom - Safe to ignore + } else if (records[i + 1].getRecordType() == 4010l) { + // TextSpecInfoAtom - Safe to ignore + } else { + System.err.println("Found a TextHeaderAtom not followed by a TextBytesAtom or TextCharsAtom: Followed by " + records[i + 1].getRecordType()); + continue; + } + + if (trun != null) { + found.add(trun); + i++; + } else { + // Not a valid one, so skip on to next and look again + } + } + } + } + + /** + * Returns all shapes contained in this Sheet + * + * @return all shapes contained in this Sheet (Slide or Notes) + */ + public Shape[] getShapes() { + PPDrawing ppdrawing = getPPDrawing(); + + EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; + EscherContainerRecord spgr = null; + List ch = dg.getChildRecords(); + + for (Iterator it = ch.iterator(); it.hasNext();) { + EscherRecord rec = (EscherRecord) it.next(); + if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) { + spgr = (EscherContainerRecord) rec; + break; + } + } + ch = spgr.getChildRecords(); + + ArrayList shapes = new ArrayList(); + for (int i = 1; i < ch.size(); i++) { + EscherContainerRecord sp = (EscherContainerRecord) ch.get(i); + Shape sh = ShapeFactory.createShape(sp, null); + sh.setSheet(this); + shapes.add(sh); + } + + return (Shape[]) shapes.toArray(new Shape[shapes.size()]); + } + + /** + * Add a new Shape to this Slide + * + * @param shape - the Shape to add + */ + public void addShape(Shape shape) { + PPDrawing ppdrawing = getPPDrawing(); + + EscherContainerRecord dgContainer = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; + EscherContainerRecord spgr = (EscherContainerRecord) Shape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER); + spgr.addChildRecord(shape.getSpContainer()); + + EscherDgRecord dg = (EscherDgRecord) Shape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID); + dg.setNumShapes(dg.getNumShapes() + 1); + + shape.setSheet(this); + shape.afterInsert(this); + + // If it's a TextBox, we need to tell the PPDrawing, as it has to + // track TextboxWrappers specially + if (shape instanceof TextBox) { + TextBox tbox = (TextBox) shape; + ppdrawing.addTextboxWrapper(tbox._txtbox); + } + } + + /** + * Return the master sheet . + */ + public abstract MasterSheet getMasterSheet(); + + /** * Color scheme for this sheet. */ - public ColorSchemeAtom getColorScheme(){ - return null; + public ColorSchemeAtom getColorScheme() { + return _container.getColorScheme(); + } + + /** + * Returns the background shape for this sheet. + * + * @return the background shape for this sheet. + */ + public Background getBackground() { + if (_background == null) { + PPDrawing ppdrawing = getPPDrawing(); + + EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0]; + EscherContainerRecord spContainer = null; + List ch = dg.getChildRecords(); + + for (Iterator it = ch.iterator(); it.hasNext();) { + EscherRecord rec = (EscherRecord) it.next(); + if (rec.getRecordId() == EscherContainerRecord.SP_CONTAINER) { + spContainer = (EscherContainerRecord) rec; + break; + } + } + _background = new Background(spContainer, null); + _background.setSheet(this); + } + return _background; } + } Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java Fri May 25 05:04:45 2007 @@ -44,15 +44,10 @@ public class Slide extends Sheet { - private int _refSheetNo; - private int _sheetNo; private int _slideNo; - private org.apache.poi.hslf.record.Slide _slide; private SlideAtomsSet _atomSet; private TextRun[] _runs; - private TextRun[] _otherRuns; // Any from the PPDrawing, shouldn't really be any though private Notes _notes; // usermodel needs to set this - private Background _background; /** * Constructs a Slide from the Slide record, and the SlideAtomsSet @@ -64,15 +59,14 @@ * @param atomSet the SlideAtomsSet to get the text from */ public Slide(org.apache.poi.hslf.record.Slide slide, Notes notes, SlideAtomsSet atomSet, int slideIdentifier, int slideNumber) { - _slide = slide; + super(slide, slideIdentifier); + _notes = notes; _atomSet = atomSet; - _refSheetNo = slide.getSheetId(); - _sheetNo = slideIdentifier; _slideNo = slideNumber; - // Grab the TextRuns from the PPDrawing - _otherRuns = findTextRuns(_slide.getPPDrawing()); + // Grab the TextRuns from the PPDrawing + TextRun[] _otherRuns = findTextRuns(getPPDrawing()); // For the text coming in from the SlideAtomsSet: // Build up TextRuns from pairs of TextHeaderAtom and @@ -105,10 +99,9 @@ * @param slideNumber The user facing number of the sheet */ public Slide(int sheetNumber, int sheetRefId, int slideNumber){ - _slide = new org.apache.poi.hslf.record.Slide(); - _refSheetNo = sheetRefId; - _sheetNo = sheetNumber; + super(new org.apache.poi.hslf.record.Slide(), sheetNumber); _slideNo = slideNumber; + getSheetContainer().setSheetId(sheetRefId); } /** @@ -119,7 +112,7 @@ _notes = notes; // Update the Slide Atom's ID of where to point to - SlideAtom sa = _slide.getSlideAtom(); + SlideAtom sa = getSlideRecord().getSlideAtom(); if(notes == null) { // Set to 0 @@ -132,7 +125,7 @@ /** * Changes the Slide's (external facing) page number. - * @see SlideShow.reorderSlide() + * @see org.apache.poi.hslf.usermodel.SlideShow#reorderSlide(int, int) */ public void setSlideNumber(int newSlideNumber) { _slideNo = newSlideNumber; @@ -188,17 +181,6 @@ public TextRun[] getTextRuns() { return _runs; } /** - * Returns the (internal, RefID based) sheet number, as used - * to in PersistPtr stuff. - */ - public int _getSheetRefId() { return _refSheetNo; } - /** - * Returns the (internal, SlideIdentifier based) sheet number - * @see #getSlideNumber() - */ - public int _getSheetNumber() { return _sheetNo; } - - /** * Returns the (public facing) page number of this slide */ public int getSlideNumber() { return _slideNo; } @@ -206,7 +188,9 @@ /** * Returns the underlying slide record */ - public org.apache.poi.hslf.record.Slide getSlideRecord() { return _slide; } + public org.apache.poi.hslf.record.Slide getSlideRecord() { + return (org.apache.poi.hslf.record.Slide)getSheetContainer(); + } /** * Returns the Notes Sheet for this slide, or null if there isn't one @@ -214,71 +198,49 @@ public Notes getNotesSheet() { return _notes; } /** - * Returns the PPDrawing associated with this slide, or null if there isn't one - */ - protected PPDrawing getPPDrawing() { return _slide.getPPDrawing(); } - - /** * @return set of records inside <code>SlideListWithtext</code> container * which hold text data for this slide (typically for placeholders). */ protected SlideAtomsSet getSlideAtomsSet() { return _atomSet; } /** - * Returns the slide master associated with this slide. + * Returns master sheet associated with this slide. + * It can be either SlideMaster or TitleMaster objects. * - * @return the slide master associated with this slide. + * @return the master sheet associated with this slide. */ public MasterSheet getMasterSheet(){ SlideMaster[] master = getSlideShow().getSlidesMasters(); - SlideAtom sa = _slide.getSlideAtom(); + SlideAtom sa = getSlideRecord().getSlideAtom(); int masterId = sa.getMasterID(); + MasterSheet sheet = null; for (int i = 0; i < master.length; i++) { - if (masterId == master[i]._getSheetNumber()) return master[i]; + if (masterId == master[i]._getSheetNumber()) { + sheet = master[i]; + break; + } } - return null; + if (sheet == null){ + TitleMaster[] titleMaster = getSlideShow().getTitleMasters(); + if(titleMaster != null) for (int i = 0; i < titleMaster.length; i++) { + if (masterId == titleMaster[i]._getSheetNumber()) { + sheet = titleMaster[i]; + break; + } + } + } + return sheet; } /** * Change Master of this slide. */ public void setMasterSheet(MasterSheet master){ - SlideAtom sa = _slide.getSlideAtom(); + SlideAtom sa = getSlideRecord().getSlideAtom(); int sheetNo = master._getSheetNumber(); sa.setMasterID(sheetNo); } - - public ColorSchemeAtom getColorScheme(){ - return _slide.getColorScheme(); - } - - /** - * Returns the background shape for this sheet. - * - * @return the background shape for this sheet. - */ - public Background getBackground(){ - if (_background == null){ - PPDrawing ppdrawing = getPPDrawing(); - - EscherContainerRecord dg = (EscherContainerRecord)ppdrawing.getEscherRecords()[0]; - EscherContainerRecord spContainer = null; - List ch = dg.getChildRecords(); - - for (Iterator it = ch.iterator(); it.hasNext();) { - EscherRecord rec = (EscherRecord)it.next(); - if (rec.getRecordId() == EscherContainerRecord.SP_CONTAINER){ - spContainer = (EscherContainerRecord)rec; - break; - } - } - _background = new Background(spContainer, null); - _background.setSheet(this); - } - return _background; - } - /** * Sets whether this slide follows master background * @@ -286,7 +248,7 @@ * <code>false</code> otherwise */ public void setFollowMasterBackground(boolean flag){ - SlideAtom sa = _slide.getSlideAtom(); + SlideAtom sa = getSlideRecord().getSlideAtom(); sa.setFollowMasterBackground(flag); } @@ -297,7 +259,7 @@ * <code>false</code> otherwise */ public boolean getFollowMasterBackground(){ - SlideAtom sa = _slide.getSlideAtom(); + SlideAtom sa = getSlideRecord().getSlideAtom(); return sa.getFollowMasterBackground(); } } Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java Fri May 25 05:04:45 2007 @@ -36,11 +36,7 @@ * @author Yegor Kozlov */ public class SlideMaster extends MasterSheet { - private int _refSheetNo; - private int _sheetNo; - private MainMaster _master; private TextRun[] _runs; - private Background _background; /** * all TxMasterStyleAtoms available in this master @@ -51,16 +47,11 @@ * Constructs a SlideMaster from the MainMaster record, * */ - public SlideMaster(org.apache.poi.hslf.record.MainMaster rec, int slideId) { - _master = rec; + public SlideMaster(MainMaster record, int sheetNo) { + super(record, sheetNo); - // Grab our internal sheet ID - _refSheetNo = rec.getSheetId(); - - // Grab the number of the slide we're for, via the NotesAtom - _sheetNo = slideId; - - _runs = findTextRuns(_master.getPPDrawing()); + _runs = findTextRuns(getPPDrawing()); + for (int i = 0; i < _runs.length; i++) _runs[i].setSheet(this); } /** @@ -71,26 +62,10 @@ } /** - * Returns the (internal, RefID based) sheet number, as used - * to in PersistPtr stuff. - */ - public int _getSheetRefId() { - return _refSheetNo; - } - - /** - * Returns the (internal, SlideIdentifer based) number of the - * slide we're attached to + * Returns <code>null</code> since SlideMasters doen't have master sheet. */ - public int _getSheetNumber() { - return _sheetNo; - } - - /** - * Returns the PPDrawing associated with this slide master - */ - protected PPDrawing getPPDrawing() { - return _master.getPPDrawing(); + public MasterSheet getMasterSheet() { + return null; } /** @@ -138,44 +113,10 @@ TxMasterStyleAtom txdoc = getSlideShow().getDocumentRecord().getEnvironment().getTxMasterStyleAtom(); _txmaster[txdoc.getTextType()] = txdoc; - TxMasterStyleAtom[] txrec = _master.getTxMasterStyleAtoms(); + TxMasterStyleAtom[] txrec = ((MainMaster)getSheetContainer()).getTxMasterStyleAtoms(); for (int i = 0; i < txrec.length; i++) { _txmaster[txrec[i].getTextType()] = txrec[i]; } } } - - /** - * Returns the ColorSchemeAtom associated with this slide master - */ - public ColorSchemeAtom getColorScheme(){ - return _master.getColorScheme(); - } - - /** - * Returns the background shape for this sheet. - * - * @return the background shape for this sheet. - */ - public Background getBackground(){ - if (_background == null){ - PPDrawing ppdrawing = getPPDrawing(); - - EscherContainerRecord dg = (EscherContainerRecord)ppdrawing.getEscherRecords()[0]; - EscherContainerRecord spContainer = null; - List ch = dg.getChildRecords(); - - for (Iterator it = ch.iterator(); it.hasNext();) { - EscherRecord rec = (EscherRecord)it.next(); - if (rec.getRecordId() == EscherContainerRecord.SP_CONTAINER){ - spContainer = (EscherContainerRecord)rec; - break; - } - } - _background = new Background(spContainer, null); - _background.setSheet(this); - } - return _background; - } - } Added: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java?view=auto&rev=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java (added) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java Fri May 25 05:04:45 2007 @@ -0,0 +1,69 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.model; + +import org.apache.poi.hslf.model.textproperties.TextProp; +import org.apache.poi.hslf.record.*; + +/** + * Title masters define the design template for slides with a Title Slide layout. + * + * @author Yegor Kozlov + */ +public class TitleMaster extends MasterSheet { + private TextRun[] _runs; + + /** + * Constructs a TitleMaster + * + */ + public TitleMaster(org.apache.poi.hslf.record.Slide record, int sheetNo) { + super(record, sheetNo); + + _runs = findTextRuns(getPPDrawing()); + for (int i = 0; i < _runs.length; i++) _runs[i].setSheet(this); + } + + /** + * Returns an array of all the TextRuns found + */ + public TextRun[] getTextRuns() { + return _runs; + } + + /** + * Delegate the call to the underlying slide master. + */ + public TextProp getStyleAttribute(int txtype, int level, String name, boolean isCharacter) { + MasterSheet master = getMasterSheet(); + return master == null ? null : master.getStyleAttribute(txtype, level, name, isCharacter); + } + + /** + * Returns the slide master for this title master. + */ + public MasterSheet getMasterSheet(){ + SlideMaster[] master = getSlideShow().getSlidesMasters(); + SlideAtom sa = ((org.apache.poi.hslf.record.Slide)getSheetContainer()).getSlideAtom(); + int masterId = sa.getMasterID(); + for (int i = 0; i < master.length; i++) { + if (masterId == master[i]._getSheetNumber()) return master[i]; + } + return null; + } +} Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MainMaster.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MainMaster.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MainMaster.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MainMaster.java Fri May 25 05:04:45 2007 @@ -31,7 +31,7 @@ * @author Yegor Kozlov */ -public class MainMaster extends PositionDependentRecordContainer +public class MainMaster extends SheetContainer { private byte[] _header; private static long _type = 1016; Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Notes.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Notes.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Notes.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Notes.java Fri May 25 05:04:45 2007 @@ -29,7 +29,7 @@ * @author Nick Burch */ -public class Notes extends PositionDependentRecordContainer +public class Notes extends SheetContainer { private byte[] _header; private static long _type = 1008l; @@ -37,6 +37,7 @@ // Links to our more interesting children private NotesAtom notesAtom; private PPDrawing ppDrawing; + private ColorSchemeAtom _colorScheme; /** * Returns the NotesAtom of this Notes @@ -69,6 +70,9 @@ if(_children[i] instanceof PPDrawing) { ppDrawing = (PPDrawing)_children[i]; } + if(ppDrawing != null && _children[i] instanceof ColorSchemeAtom) { + _colorScheme = (ColorSchemeAtom)_children[i]; + } } } @@ -85,4 +89,8 @@ public void writeOut(OutputStream out) throws IOException { writeOut(_header[0],_header[1],_type,_children,out); } + + public ColorSchemeAtom getColorScheme(){ + return _colorScheme; + } } Added: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SheetContainer.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SheetContainer.java?view=auto&rev=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SheetContainer.java (added) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SheetContainer.java Fri May 25 05:04:45 2007 @@ -0,0 +1,32 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You 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; + +/** + * The superclass of all sheet container records - Slide, Notes, MainMaster, etc. + */ +public abstract class SheetContainer extends PositionDependentRecordContainer { + + /** + * Returns the PPDrawing of this sheet, which has all the + * interesting data in it + */ + public abstract PPDrawing getPPDrawing(); + + public abstract ColorSchemeAtom getColorScheme(); + +} Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Slide.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Slide.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Slide.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Slide.java Fri May 25 05:04:45 2007 @@ -31,7 +31,7 @@ * @author Nick Burch */ -public class Slide extends PositionDependentRecordContainer +public class Slide extends SheetContainer { private byte[] _header; private static long _type = 1006l; Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java Fri May 25 05:04:45 2007 @@ -23,9 +23,11 @@ import org.apache.poi.hslf.model.TextRun; import org.apache.poi.hslf.model.Sheet; import org.apache.poi.hslf.model.SlideMaster; +import org.apache.poi.hslf.model.MasterSheet; import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; import org.apache.poi.hslf.model.textproperties.TextProp; import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.hslf.model.textproperties.BitMaskTextProp; import org.apache.poi.hslf.record.ColorSchemeAtom; import java.awt.*; @@ -60,7 +62,7 @@ private TextPropCollection characterStyle; private boolean sharingParagraphStyle; private boolean sharingCharacterStyle; - + /** * Create a new wrapper around a (currently not) * rich text string @@ -169,7 +171,7 @@ if (cftp == null){ Sheet sheet = parentRun.getSheet(); int txtype = parentRun.getRunType(); - SlideMaster master = (SlideMaster)sheet.getMasterSheet(); + MasterSheet master = sheet.getMasterSheet(); if (master != null) cftp = (CharFlagsTextProp)master.getStyleAttribute(txtype, getIndentLevel(), "char_flags", true); } @@ -192,7 +194,7 @@ fetchOrAddTextProp(characterStyle, "char_flags"); cftp.setSubValue(value,index); } - + /** * Returns the named TextProp, either by fetching it (if it exists) or adding it * (if it didn't) @@ -223,7 +225,7 @@ if (prop == null){ Sheet sheet = parentRun.getSheet(); int txtype = parentRun.getRunType(); - SlideMaster master = (SlideMaster)sheet.getMasterSheet(); + MasterSheet master = sheet.getMasterSheet(); if (master != null) prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, true); } @@ -243,7 +245,7 @@ if (prop == null){ Sheet sheet = parentRun.getSheet(); int txtype = parentRun.getRunType(); - SlideMaster master = (SlideMaster)sheet.getMasterSheet(); + MasterSheet master = sheet.getMasterSheet(); if (master != null) prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); } Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java Fri May 25 05:04:45 2007 @@ -74,6 +74,7 @@ // Friendly objects for people to deal with private SlideMaster[] _masters; + private TitleMaster[] _titleMasters; private Slide[] _slides; private Notes[] _notes; private FontCollection _fonts; @@ -311,25 +312,33 @@ // About the only thing you can say is that the master details are in // the first SLWT. SlideAtomsSet[] masterSets = new SlideAtomsSet[0]; - org.apache.poi.hslf.record.MainMaster[] mainMasterRecords = null; if (masterSLWT != null){ masterSets = masterSLWT.getSlideAtomsSets(); - // For now, we only care about the records which are MainMasters - // (In future, we might want to know about the other too) 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) { - // Slide master, skip + 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) { - mmr.add(r); - } + SlideMaster master = new SlideMaster((org.apache.poi.hslf.record.MainMaster)r, sheetNo); + master.setSlideShow(this); + mmr.add(master); + } } - mainMasterRecords = new org.apache.poi.hslf.record.MainMaster[mmr.size()]; - mmr.toArray(mainMasterRecords); + _masters = new SlideMaster[mmr.size()]; + mmr.toArray(_masters); + + _titleMasters = new TitleMaster[tmr.size()]; + tmr.toArray(_titleMasters); + } @@ -351,12 +360,12 @@ 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()); @@ -394,14 +403,6 @@ } // Finally, generate model objects for everything - _masters = new SlideMaster[mainMasterRecords.length]; - for(int i=0; i<_masters.length; i++) { - SlideAtomsSet sas = masterSets[i]; - int sheetNo = sas.getSlidePersistAtom().getSlideIdentifier(); - _masters[i] = new SlideMaster(mainMasterRecords[i], sheetNo); - _masters[i].setSlideShow(this); - } - // Notes first _notes = new Notes[notesRecords.length]; for(int i=0; i<_notes.length; i++) { @@ -465,10 +466,14 @@ public Notes[] getNotes() { return _notes; } /** - * Returns an array of all the normal Slides found in the slideshow + * 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 Title Masters found in the slideshow + */ + public TitleMaster[] getTitleMasters() { return _titleMasters; } /** * Returns the data of all the pictures attached to the SlideShow */ Added: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/alterman_security.ppt URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/alterman_security.ppt?view=auto&rev=541622 ============================================================================== Binary file - no diff available. Propchange: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/alterman_security.ppt ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Modified: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/slide_master.ppt URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/slide_master.ppt?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== Binary files - no diff available. Added: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java?view=auto&rev=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java (added) +++ jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java Fri May 25 05:04:45 2007 @@ -0,0 +1,100 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.model; + +import junit.framework.TestCase; + +import java.io.FileInputStream; +import java.io.File; + +import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; +import org.apache.poi.hslf.record.ColorSchemeAtom; +import org.apache.poi.hslf.record.PPDrawing; +import org.apache.poi.hslf.usermodel.SlideShow; + +/** + * Test common functionality of the <code>Sheet</code> object. + * For each ppt in the test directory check that all sheets are properly initialized + * + * @author Yegor Kozlov + */ +public class TestSheet extends TestCase{ + + /** + * For each ppt in the test directory check that all sheets are properly initialized + */ + public void testSheet() throws Exception { + File home = new File(System.getProperty("HSLF.testdata.path")); + File[] files = home.listFiles(); + for (int i = 0; i < files.length; i++) { + if(!files[i].getName().endsWith(".ppt")) continue; + try { + FileInputStream is = new FileInputStream(files[i]); + HSLFSlideShow hslf = new HSLFSlideShow(is); + is.close(); + + SlideShow ppt = new SlideShow(hslf); + doSlideShow(ppt); + } catch (EncryptedPowerPointFileException e){ + ; //skip encrypted ppt + } + } + } + + private void doSlideShow(SlideShow ppt) throws Exception { + Slide[] slide = ppt.getSlides(); + for (int i = 0; i < slide.length; i++) { + verify(slide[i]); + + Notes notes = slide[i].getNotesSheet(); + if(notes != null) verify(notes); + + MasterSheet master = slide[i].getMasterSheet(); + assertNotNull(master); + verify(master); + } + } + + private void verify(Sheet sheet){ + ColorSchemeAtom colorscheme = sheet.getColorScheme(); + assertNotNull(colorscheme); + + PPDrawing ppdrawing = sheet.getPPDrawing(); + assertNotNull(ppdrawing); + + Background background = sheet.getBackground(); + assertNotNull(background); + + assertTrue(sheet._getSheetNumber() != 0); + assertTrue(sheet._getSheetRefId() != 0); + + TextRun[] txt = sheet.getTextRuns(); + assertTrue(txt != null); + for (int i = 0; i < txt.length; i++) { + assertNotNull(txt[i].getSheet()); + } + + Shape[] shape = sheet.getShapes(); + assertTrue(shape != null); + for (int i = 0; i < shape.length; i++) { + assertNotNull(shape[i].getSheet()); + } + + assertNotNull(sheet.getSlideShow()); + } +} Modified: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java (original) +++ jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java Fri May 25 05:04:45 2007 @@ -27,6 +27,7 @@ import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; +import java.awt.*; /** * Tests for SlideMaster @@ -82,12 +83,62 @@ } /** + * Test we can read default text attributes for a title master sheet + */ + public void testTitleMasterTextAttributes() throws Exception { + SlideShow ppt = new SlideShow(new HSLFSlideShow(home + "/slide_master.ppt")); + TitleMaster[] master = ppt.getTitleMasters(); + assertEquals(1, master.length); + + assertEquals(32, master[0].getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "font.size", true).getValue()); + CharFlagsTextProp prop1 = (CharFlagsTextProp)master[0].getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "char_flags", true); + assertEquals(true, prop1.getSubValue(CharFlagsTextProp.BOLD_IDX)); + assertEquals(false, prop1.getSubValue(CharFlagsTextProp.ITALIC_IDX)); + assertEquals(true, prop1.getSubValue(CharFlagsTextProp.UNDERLINE_IDX)); + + assertEquals(20, master[0].getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "font.size", true).getValue()); + CharFlagsTextProp prop2 = (CharFlagsTextProp)master[0].getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "char_flags", true); + assertEquals(true, prop2.getSubValue(CharFlagsTextProp.BOLD_IDX)); + assertEquals(false, prop2.getSubValue(CharFlagsTextProp.ITALIC_IDX)); + assertEquals(false, prop2.getSubValue(CharFlagsTextProp.UNDERLINE_IDX)); + } + + /** + * Slide 3 has title layout and follows the TitleMaster. Verify that. + */ + public void testTitleMaster() throws Exception { + SlideShow ppt = new SlideShow(new HSLFSlideShow(home + "/slide_master.ppt")); + Slide slide = ppt.getSlides()[2]; + MasterSheet masterSheet = slide.getMasterSheet(); + assertTrue(masterSheet instanceof TitleMaster); + + TextRun[] txt = slide.getTextRuns(); + for (int i = 0; i < txt.length; i++) { + RichTextRun rt = txt[i].getRichTextRuns()[0]; + switch(txt[i].getRunType()){ + case TextHeaderAtom.CENTER_TITLE_TYPE: + assertEquals("Arial", rt.getFontName()); + assertEquals(32, rt.getFontSize()); + assertEquals(true, rt.isBold()); + assertEquals(true, rt.isUnderlined()); + break; + case TextHeaderAtom.CENTRE_BODY_TYPE: + assertEquals("Courier New", rt.getFontName()); + assertEquals(20, rt.getFontSize()); + assertEquals(true, rt.isBold()); + assertEquals(false, rt.isUnderlined()); + break; + } + + } + } + /** * If a style attribute is not set ensure it is read from the master */ public void testMasterAttributes() throws Exception { SlideShow ppt = new SlideShow(new HSLFSlideShow(home + "/slide_master.ppt")); Slide[] slide = ppt.getSlides(); - assertEquals(2, slide.length); + assertEquals(3, slide.length); TextRun[] trun; trun = slide[0].getTextRuns(); Modified: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java?view=diff&rev=541622&r1=541621&r2=541622 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java (original) +++ jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java Fri May 25 05:04:45 2007 @@ -163,4 +163,25 @@ assertTrue("No Exceptions while reading file", true); } + /** + * Bug 41381: Exception from Slide.getMasterSheet() on a seemingly valid PPT file + */ + public void test41381() throws Exception { + FileInputStream is = new FileInputStream(new File(cwd, "alterman_security.ppt")); + HSLFSlideShow hslf = new HSLFSlideShow(is); + is.close(); + + SlideShow ppt = new SlideShow(hslf); + assertTrue("No Exceptions while reading file", true); + + assertEquals(1, ppt.getSlidesMasters().length); + assertEquals(1, ppt.getTitleMasters().length); + Slide[] slide = ppt.getSlides(); + for (int i = 0; i < slide.length; i++) { + MasterSheet master = slide[i].getMasterSheet(); + if (i == 0) assertTrue(master instanceof TitleMaster); //the first slide follows TitleMaster + else assertTrue(master instanceof SlideMaster); + } + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] Mailing List: http://jakarta.apache.org/site/mail2.html#poi The Apache Jakarta POI Project: http://jakarta.apache.org/poi/