Navigation Menu

Skip to content

Commit

Permalink
Support re-ordering of slides, now that we know how slider ordering w…
Browse files Browse the repository at this point in the history
…orks

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@418612 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
Gagravarr committed Jul 2, 2006
1 parent 19894ff commit 9f3cfdc
Show file tree
Hide file tree
Showing 5 changed files with 498 additions and 35 deletions.
8 changes: 8 additions & 0 deletions src/scratchpad/src/org/apache/poi/hslf/model/Slide.java
Expand Up @@ -119,6 +119,14 @@ public void setNotes(Notes notes) {
}
}

/**
* Changes the Slide's (external facing) page number.
* @see SlideShow.reorderSlide()
*/
public void setSlideNumber(int newSlideNumber) {
_slideNo = newSlideNumber;
}

/**
* Create a <code>TextBox</code> object that represents the slide's title.
*
Expand Down
161 changes: 127 additions & 34 deletions src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java
Expand Up @@ -18,6 +18,7 @@

package org.apache.poi.hslf.record;

import org.apache.poi.util.ArrayUtil;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hslf.util.MutableByteArrayOutputStream;

Expand All @@ -35,7 +36,7 @@
public abstract class RecordContainer extends Record
{
protected Record[] _children;
private Boolean addingChildRecordLock = new Boolean(true);
private Boolean changingChildRecordsLock = new Boolean(true);

/**
* Return any children
Expand All @@ -47,22 +48,19 @@ public abstract class RecordContainer extends Record
*/
public boolean isAnAtom() { return false; }

/**
* Add a new child record onto a record's list of children.
*/
public void appendChildRecord(Record newChild) {
synchronized(addingChildRecordLock) {
addChildAt(newChild, _children.length);
}
}

/* ===============================================================
* Internal Move Helpers
* ===============================================================
*/

/**
* Finds the location of the given child record
*/
private int findChildLocation(Record child) {
// Synchronized as we don't want things changing
// as we're doing our search
synchronized(addingChildRecordLock) {
synchronized(changingChildRecordsLock) {
for(int i=0; i<_children.length; i++) {
if(_children[i].equals(child)) {
return i;
Expand All @@ -72,37 +70,69 @@ private int findChildLocation(Record child) {
return -1;
}

/**
* Adds a child record, at the very end.
* @param newChild The child record to add
*/
private void appendChild(Record newChild) {
synchronized(changingChildRecordsLock) {
// Copy over, and pop the child in at the end
Record[] nc = new Record[(_children.length + 1)];
System.arraycopy(_children, 0, nc, 0, _children.length);
// Switch the arrays
nc[_children.length] = newChild;
_children = nc;
}
}

/**
* Adds the given new Child Record at the given location,
* shuffling everything from there on down by one
* @param newChild
* @param position
*/
private void addChildAt(Record newChild, int position) {
synchronized(addingChildRecordLock) {
Record[] newChildren = new Record[_children.length+1];
// Move over to the new array, shuffling on by one after
// the addition point
for(int i=0; i<_children.length; i++) {
if(i == position) {
newChildren[i] = newChild;
}

if(i >= position) {
newChildren[i+1] = _children[i];
}
if(i < position) {
newChildren[i] = _children[i];
}
}
synchronized(changingChildRecordsLock) {
// Firstly, have the child added in at the end
appendChild(newChild);

// Special case - new record goes at the end
if(position == _children.length) {
newChildren[position] = newChild;
}
// Now, have them moved to the right place
moveChildRecords( (_children.length-1), position, 1 );
}
}

/**
* Moves <i>number</i> child records from <i>oldLoc</i>
* to <i>newLoc</i>. Caller must have the changingChildRecordsLock
* @param oldLoc the current location of the records to move
* @param newLoc the new location for the records
* @param number the number of records to move
*/
private void moveChildRecords(int oldLoc, int newLoc, int number) {
if(oldLoc == newLoc) { return; }
if(number == 0) { return; }

// All done, replace our child list
_children = newChildren;
// Check that we're not asked to move too many
if(oldLoc+number > _children.length) {
throw new IllegalArgumentException("Asked to move more records than there are!");
}

// Do the move
ArrayUtil.arrayMoveWithin(_children, oldLoc, newLoc, number);
}


/* ===============================================================
* External Move Methods
* ===============================================================
*/

/**
* Add a new child record onto a record's list of children.
*/
public void appendChildRecord(Record newChild) {
synchronized(changingChildRecordsLock) {
appendChild(newChild);
}
}

Expand All @@ -112,7 +142,7 @@ private void addChildAt(Record newChild, int position) {
* @param after
*/
public void addChildAfter(Record newChild, Record after) {
synchronized(addingChildRecordLock) {
synchronized(changingChildRecordsLock) {
// Decide where we're going to put it
int loc = findChildLocation(after);
if(loc == -1) {
Expand All @@ -130,7 +160,7 @@ public void addChildAfter(Record newChild, Record after) {
* @param after
*/
public void addChildBefore(Record newChild, Record before) {
synchronized(addingChildRecordLock) {
synchronized(changingChildRecordsLock) {
// Decide where we're going to put it
int loc = findChildLocation(before);
if(loc == -1) {
Expand All @@ -142,6 +172,69 @@ public void addChildBefore(Record newChild, Record before) {
}
}

/**
* Moves the given Child Record to before the supplied record
*/
public void moveChildBefore(Record child, Record before) {
moveChildrenBefore(child, 1, before);
}

/**
* Moves the given Child Records to before the supplied record
*/
public void moveChildrenBefore(Record firstChild, int number, Record before) {
if(number < 1) { return; }

synchronized(changingChildRecordsLock) {
// Decide where we're going to put them
int newLoc = findChildLocation(before);
if(newLoc == -1) {
throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
}

// Figure out where they are now
int oldLoc = findChildLocation(firstChild);
if(oldLoc == -1) {
throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
}

// Actually move
moveChildRecords(oldLoc, newLoc, number);
}
}

/**
* Moves the given Child Records to after the supplied record
*/
public void moveChildrenAfter(Record firstChild, int number, Record after) {
if(number < 1) { return; }

synchronized(changingChildRecordsLock) {
// Decide where we're going to put them
int newLoc = findChildLocation(after);
if(newLoc == -1) {
throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
}
// We actually want after this though
newLoc++;

// Figure out where they are now
int oldLoc = findChildLocation(firstChild);
if(oldLoc == -1) {
throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
}

// Actually move
moveChildRecords(oldLoc, newLoc, number);
}
}


/* ===============================================================
* External Serialisation Methods
* ===============================================================
*/

/**
* Write out our header, and our children.
* @param headerA the first byte of the header
Expand Down
Expand Up @@ -18,6 +18,7 @@

package org.apache.poi.hslf.record;

import org.apache.poi.util.ArrayUtil;
import org.apache.poi.util.LittleEndian;

import java.io.IOException;
Expand Down Expand Up @@ -149,6 +150,34 @@ public void writeOut(OutputStream out) throws IOException {
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
Expand Down
40 changes: 39 additions & 1 deletion src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
Expand Up @@ -45,6 +45,7 @@
import org.apache.poi.hslf.record.PersistPtrHolder;
import org.apache.poi.hslf.record.PositionDependentRecord;
import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
import org.apache.poi.util.ArrayUtil;

/**
* This class is a friendly wrapper on top of the more scary HSLFSlideShow.
Expand Down Expand Up @@ -243,7 +244,8 @@ private void findMostRecentCoreRecords() {
_fonts = _documentRecord.getEnvironment().getFontCollection();
}
} else {
System.err.println("No core record found with ID " + (i+1) + " based on PersistPtr lookup");
// No record at this number
// Odd, but not normally a problem
}
}
}
Expand Down Expand Up @@ -461,6 +463,42 @@ public void setPageSize(Dimension pgsize){
public Document getDocumentRecord() { return _documentRecord; }


/* ===============================================================
* Re-ordering Code
* ===============================================================
*/


/**
* Re-orders a slide, to a new position.
* @param oldSlideNumer The old slide number (1 based)
* @param newSlideNumber The new slide number (1 based)
*/
public void reorderSlide(int oldSlideNumer, int newSlideNumber) {
// Ensure these numbers are valid
if(oldSlideNumer < 1 || newSlideNumber < 1) {
throw new IllegalArgumentException("Old and new slide numbers must be greater than 0");
}
if(oldSlideNumer > _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) );
}
}

/* ===============================================================
* Addition Code
* ===============================================================
Expand Down

0 comments on commit 9f3cfdc

Please sign in to comment.