mirror of https://github.com/apache/poi.git
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:
parent
ea9f17a105
commit
bdd3c6d413
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue