fixed bug #45728: SlideShow.reorderSlide didn't work properly

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@691533 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yegor Kozlov 2008-09-03 08:04:07 +00:00
parent ea9f17a105
commit bdd3c6d413
7 changed files with 109 additions and 75 deletions

View File

@ -37,6 +37,7 @@
<!-- Don't forget to update status.xml too! -->
<release version="3.1.1-alpha1" date="2008-??-??">
<action dev="POI-DEVELOPERS" type="fix">45728 Fix for SlideShow.reorderSlide in HSLF</action>
<action dev="POI-DEVELOPERS" type="add">Initial support for embedded movies and controls in HSLF</action>
<action dev="POI-DEVELOPERS" type="fix">45358 - signed/unsigned error when parsing 3-d area refs, performance problem evaluating area refs, and ClassCastExcecption in IF()</action>
<action dev="POI-DEVELOPERS" type="add">Support for HPBF Publisher hyperlinks, including during text extraction</action>

View File

@ -34,6 +34,7 @@
<!-- Don't forget to update changes.xml too! -->
<changes>
<release version="3.1.1-alpha1" date="2008-??-??">
<action dev="POI-DEVELOPERS" type="fix">45728 Fix for SlideShow.reorderSlide in HSLF</action>
<action dev="POI-DEVELOPERS" type="add">Initial support for embedded movies and controls in HSLF</action>
<action dev="POI-DEVELOPERS" type="fix">45358 - signed/unsigned error when parsing 3-d area refs, performance problem evaluating area refs, and ClassCastExcecption in IF()</action>
<action dev="POI-DEVELOPERS" type="add">Support for HPBF Publisher hyperlinks, including during text extraction</action>

View File

@ -71,27 +71,44 @@ public class Document extends PositionDependentRecordContainer
* This will normally return an array of size 2 or 3
*/
public SlideListWithText[] getSlideListWithTexts() { return slwts; }
/**
* Returns the SlideListWithText that deals with the
* Master Slides
*/
public SlideListWithText getMasterSlideListWithText() {
if(slwts.length > 0) { return slwts[0]; }
return null; }
for (int i = 0; i < slwts.length; i++) {
if(slwts[i].getInstance() == SlideListWithText.MASTER) {
return slwts[i];
}
}
return null;
}
/**
* Returns the SlideListWithText that deals with the
* Slides, or null if there isn't one
*/
public SlideListWithText getSlideSlideListWithText() {
if(slwts.length > 1) { return slwts[1]; }
return null; }
for (int i = 0; i < slwts.length; i++) {
if(slwts[i].getInstance() == SlideListWithText.SLIDES) {
return slwts[i];
}
}
return null;
}
/**
* Returns the SlideListWithText that deals with the
* notes, or null if there isn't one
*/
public SlideListWithText getNotesSlideListWithText() {
if(slwts.length > 2) { return slwts[2]; }
return null; }
for (int i = 0; i < slwts.length; i++) {
if(slwts[i].getInstance() == SlideListWithText.NOTES) {
return slwts[i];
}
}
return null;
}
/**

View File

@ -244,6 +244,14 @@ public abstract class RecordContainer extends Record
}
}
/**
* Set child records.
*
* @param records the new child records
*/
public void setChildRecord(Record[] records) {
this._children = records;
}
/* ===============================================================
* External Serialisation Methods

View File

@ -50,6 +50,23 @@ import java.util.Vector;
// For now, pretend to be an atom
public class SlideListWithText extends RecordContainer
{
/**
* Instance filed of the record header indicates that this SlideListWithText stores
* references to slides
*/
public static final int SLIDES = 0;
/**
* Instance filed of the record header indicates that this SlideListWithText stores
* references to master slides
*/
public static final int MASTER = 1;
/**
* Instance filed of the record header indicates that this SlideListWithText stores
* references to notes
*/
public static final int NOTES = 2;
private byte[] _header;
private static long _type = 4080;
@ -133,6 +150,14 @@ public class SlideListWithText extends RecordContainer
slideAtomsSets = sas;
}
public int getInstance(){
return LittleEndian.getShort(_header, 0) >> 4;
}
public void setInstance(int inst){
LittleEndian.putShort(_header, (short)((inst << 4) | 0xF));
}
/**
* Get access to the SlideAtomsSets of the children of this record
*/
@ -151,35 +176,6 @@ public class SlideListWithText extends RecordContainer
writeOut(_header[0],_header[1],_type,_children,out);
}
/**
* Shifts a SlideAtomsSet to a new position.
* Works by shifting the child records about, then updating
* the SlideAtomSets array
* @param toMove The SlideAtomsSet to move
* @param newPosition The new (0 based) position for the SlideAtomsSet
*/
public void repositionSlideAtomsSet(SlideAtomsSet toMove, int newPosition) {
// Ensure it's one of ours
int curPos = -1;
for(int i=0; i<slideAtomsSets.length; i++) {
if(slideAtomsSets[i] == toMove) { curPos = i; }
}
if(curPos == -1) {
throw new IllegalArgumentException("The supplied SlideAtomsSet didn't belong to this SlideListWithText");
}
// Ensure the newPosision is valid
if(newPosition < 0 || newPosition >= slideAtomsSets.length) {
throw new IllegalArgumentException("The new position must be between 0, and the number of SlideAtomsSets");
}
// Build the new records list
moveChildrenBefore(toMove.getSlidePersistAtom(), toMove.slideRecords.length, slideAtomsSets[newPosition].getSlidePersistAtom());
// Build the new SlideAtomsSets list
ArrayUtil.arrayMoveWithin(slideAtomsSets, curPos, newPosition, 1);
}
/**
* Inner class to wrap up a matching set of records that hold the
* text for a given sheet. Contains the leading SlidePersistAtom,

View File

@ -536,32 +536,37 @@ public final class SlideShow {
/**
* Re-orders a slide, to a new position.
* @param oldSlideNumer The old slide number (1 based)
* @param oldSlideNumber The old slide number (1 based)
* @param newSlideNumber The new slide number (1 based)
*/
public void reorderSlide(int oldSlideNumer, int newSlideNumber) {
public void reorderSlide(int oldSlideNumber, int newSlideNumber) {
// Ensure these numbers are valid
if(oldSlideNumer < 1 || newSlideNumber < 1) {
if(oldSlideNumber < 1 || newSlideNumber < 1) {
throw new IllegalArgumentException("Old and new slide numbers must be greater than 0");
}
if(oldSlideNumer > _slides.length || newSlideNumber > _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 + ")");
}
// Shift the SlideAtomsSet
// The order of slides is defined by the order of slide atom sets in the SlideListWithText container.
SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
slwt.repositionSlideAtomsSet(
slwt.getSlideAtomsSets()[(oldSlideNumer-1)],
(newSlideNumber-1)
);
SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
// Re-order the slides
ArrayUtil.arrayMoveWithin(_slides, (oldSlideNumer-1), (newSlideNumber-1), 1);
SlideAtomsSet tmp = sas[oldSlideNumber-1];
sas[oldSlideNumber-1] = sas[newSlideNumber-1];
sas[newSlideNumber-1] = tmp;
// Tell the appropriate slides their new numbers
for(int i=0; i<_slides.length; i++) {
_slides[i].setSlideNumber( (i+1) );
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);
}
/* ===============================================================
@ -585,6 +590,7 @@ public final class SlideShow {
if(slist == null) {
// Need to add a new one
slist = new SlideListWithText();
slist.setInstance(SlideListWithText.SLIDES);
_documentRecord.addSlideListWithText(slist);
}
@ -678,11 +684,11 @@ public final class SlideShow {
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.
*

View File

@ -279,18 +279,23 @@ public class TestReOrderingSlides extends TestCase {
assertEquals(3, ss_read.getSlides().length);
// And check it's as expected
s1 = ss_read.getSlides()[0];
s2 = ss_read.getSlides()[1];
s3 = ss_read.getSlides()[2];
Slide _s1 = ss_read.getSlides()[0];
Slide _s2 = ss_read.getSlides()[1];
Slide _s3 = ss_read.getSlides()[2];
assertEquals(257, s1._getSheetNumber());
assertEquals(4, s1._getSheetRefId());
// 1 --> 3
assertEquals(s1._getSheetNumber(), _s3._getSheetNumber());
assertEquals(s1._getSheetRefId(), _s3._getSheetRefId());
assertEquals(1, s1.getSlideNumber());
assertEquals(256, s2._getSheetNumber());
assertEquals(3, s2._getSheetRefId());
// 2nd slide is not updated
assertEquals(s2._getSheetNumber(), _s2._getSheetNumber());
assertEquals(s2._getSheetRefId(), _s2._getSheetRefId());
assertEquals(2, s2.getSlideNumber());
assertEquals(258, s3._getSheetNumber());
assertEquals(5, s3._getSheetRefId());
// 3 --> 1
assertEquals(s3._getSheetNumber(), _s1._getSheetNumber());
assertEquals(s3._getSheetRefId(), _s1._getSheetRefId());
assertEquals(3, s3.getSlideNumber());
}
}