Package org.docx4j.finders

Source Code of org.docx4j.finders.SectPrFinder

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);
  }
 
}
TOP

Related Classes of org.docx4j.finders.SectPrFinder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.