package org.docx4j.finders;
import java.util.ArrayList;
import java.util.List;
import org.docx4j.TraversalUtil.CallbackImpl;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.P;
import org.docx4j.wml.SectPr;
public class SectPrFinder extends CallbackImpl {
/*
* There can be a body level sectPr.
*
* Other sectPr are typically in a top level paragraph.
*
* They can also be in a rich text content control.
*
* (Word won't let you copy/paste a sectPr into a table cell.
* And if you put one there in the XML, on opening, Word will
* display the table, but gets a bit confused - it may show it
* twice the second time on a separate page. On save, the
* sectPr will be retained. If you put the sectPr in a
* content control in a tc, the behaviour is similar. )
*
* If you put a sectPr in a text box, Word can open the
* docx, and shows it as a page break. But trying to
* do that from within the Word UI results in:
* "You cannot put section breaks into a header, footer,
* footnote, endnote, comment, text box, callout, or macro."
*
* Based on the above, this finder looks for the sectPr
* only:
* - body level sectPr
* - top level P
* - inside a p in a content control (but not in a
* table)
*/
private List<SectPr> sectPrList = new ArrayList<SectPr>();
private SectPr bodyLevel = null;
public SectPrFinder(MainDocumentPart mdp) {
// Handle the body level one
if (mdp.getJaxbElement().getBody().getSectPr()!=null) {
bodyLevel = mdp.getJaxbElement().getBody().getSectPr();
}
}
private SectPrFinder(){};
/**
* Note that the body level sectPr (if there is one)
* is at the start of the list.
*
* @return the sectPrList
*/
@Deprecated
public List<SectPr> getSectPrList() {
if (bodyLevel!=null ) {
sectPrList.remove(bodyLevel);
sectPrList.add(0, bodyLevel);
}
return sectPrList;
}
/**
* The body level sectPr (if there is one)
* is at the end of the list.
*
* @return the sectPrList
*/
public List<SectPr> getOrderedSectPrList() {
if (bodyLevel!=null ) {
sectPrList.remove(bodyLevel); // in case user has previously called this method or the deprecated getSectPrList()
sectPrList.add(bodyLevel);
}
return sectPrList;
}
@Override
public List<Object> apply(Object o) {
if (o instanceof P) {
P p = (P)o;
if ( p.getPPr()!=null && p.getPPr().getSectPr()!=null ) {
// System.out.println("Found sectpr!");
sectPrList.add(p.getPPr().getSectPr());
}
}
return null;
}
public boolean shouldTraverse(Object o) {
// System.out.println(o.getClass().getName() );
return !(o instanceof P
|| o instanceof org.docx4j.wml.Tbl);
}
}