You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2008/09/03 10:04:09 UTC

svn commit: r691533 - in /poi/trunk/src: documentation/content/xdocs/ scratchpad/src/org/apache/poi/hslf/record/ scratchpad/src/org/apache/poi/hslf/usermodel/ scratchpad/testcases/org/apache/poi/hslf/usermodel/

Author: yegor
Date: Wed Sep  3 01:04:07 2008
New Revision: 691533

URL: http://svn.apache.org/viewvc?rev=691533&view=rev
Log:
fixed bug #45728: SlideShow.reorderSlide didn't work properly

Modified:
    poi/trunk/src/documentation/content/xdocs/changes.xml
    poi/trunk/src/documentation/content/xdocs/status.xml
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Document.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
    poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java

Modified: poi/trunk/src/documentation/content/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/changes.xml?rev=691533&r1=691532&r2=691533&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/changes.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/changes.xml Wed Sep  3 01:04:07 2008
@@ -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>

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=691533&r1=691532&r2=691533&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Wed Sep  3 01:04:07 2008
@@ -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>

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Document.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Document.java?rev=691533&r1=691532&r2=691533&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Document.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Document.java Wed Sep  3 01:04:07 2008
@@ -71,27 +71,44 @@
 	 * 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; }
+	public SlideListWithText getSlideSlideListWithText() {
+        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;
+    }
 
 
 	/** 

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java?rev=691533&r1=691532&r2=691533&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java Wed Sep  3 01:04:07 2008
@@ -243,8 +243,16 @@
 			moveChildRecords(oldLoc, newLoc, number);
 		}
 	}
-	
-	
+
+    /**
+     * Set child records. 
+     *
+     * @param records   the new child records
+     */
+    public void setChildRecord(Record[] records) {
+        this._children = records;
+    }
+
 	/* ===============================================================
 	 *                 External Serialisation Methods
 	 * ===============================================================

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java?rev=691533&r1=691532&r2=691533&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java Wed Sep  3 01:04:07 2008
@@ -50,7 +50,24 @@
 // For now, pretend to be an atom
 public class SlideListWithText extends RecordContainer
 {
-	private byte[] _header;
+
+    /**
+     * 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;
 
 	private SlideAtomsSet[] slideAtomsSets;
@@ -123,9 +140,9 @@
 	public void addSlidePersistAtom(SlidePersistAtom spa) {
 		// Add the new SlidePersistAtom at the end
 		appendChildRecord(spa);
-		
+
 		SlideAtomsSet newSAS = new SlideAtomsSet(spa, new Record[0]);
-		
+
 		// Update our SlideAtomsSets with this
 		SlideAtomsSet[] sas = new SlideAtomsSet[slideAtomsSets.length+1];
 		System.arraycopy(slideAtomsSets, 0, sas, 0, slideAtomsSets.length);
@@ -133,7 +150,15 @@
 		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
 	 */
 	public SlideAtomsSet[] getSlideAtomsSets() { return slideAtomsSets; }
@@ -152,35 +177,6 @@
 	}
 
 	/**
-	 * 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,
 	 *  and all of the records until the next SlidePersistAtom. This 

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=691533&r1=691532&r2=691533&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 Wed Sep  3 01:04:07 2008
@@ -536,32 +536,37 @@
 	
 	/**
 	 * 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
-		SlideListWithText slwt = _documentRecord.getSlideSlideListWithText(); 
-		slwt.repositionSlideAtomsSet( 
-				slwt.getSlideAtomsSets()[(oldSlideNumer-1)],
-				(newSlideNumber-1)
-		);
-		
-		// Re-order the slides
-		ArrayUtil.arrayMoveWithin(_slides, (oldSlideNumer-1), (newSlideNumber-1), 1);
-		
-		// Tell the appropriate slides their new numbers
-		for(int i=0; i<_slides.length; i++) {
-			_slides[i].setSlideNumber( (i+1) );
-		}
+
+        //  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);
 	}
 
 	/* ===============================================================
@@ -585,7 +590,8 @@
   		if(slist == null) {
   			// Need to add a new one
   			slist = new SlideListWithText();
-  			_documentRecord.addSlideListWithText(slist);
+  			slist.setInstance(SlideListWithText.SLIDES);
+            _documentRecord.addSlideListWithText(slist);
   		}
 
   		// Grab the SlidePersistAtom with the highest Slide Number.
@@ -678,11 +684,11 @@
 		ptr.addSlideLookup(sp.getRefID(), slideOffset);
 		logger.log(POILogger.INFO, "New slide ended up at " + slideOffset);
 
-  		// All done and added
+        slide.setMasterSheet(_masters[0]);
+          // All done and added
   		return slide;
 	}
 
-
     /**
      * Adds a picture to this presentation and returns the associated index.
      *

Modified: poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java?rev=691533&r1=691532&r2=691533&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java (original)
+++ poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java Wed Sep  3 01:04:07 2008
@@ -279,18 +279,23 @@
 		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];
-		
-		assertEquals(257, s1._getSheetNumber());
-		assertEquals(4, s1._getSheetRefId());
+		Slide _s1 = ss_read.getSlides()[0];
+		Slide _s2 = ss_read.getSlides()[1];
+		Slide _s3 = ss_read.getSlides()[2];
+
+        // 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());
 	}
 }



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