You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by Charles Simon <ch...@selectbs.com> on 2011/03/11 18:15:21 UTC

Insert child before 1st child in outline

While using PDFBox 1.5.0 I had the need to insert a child as the first 
child of an outline but there was no way to do this.  You can only 
append to the outline.

After some investigation I determined that the new code needed to go 
into "PDOutlineNode.java" in package 
"org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline".

The following is the code for a new method I wrote and tested.  Since I 
can not commit the code I will leave that to someone who can.  The code 
has been tested, but another pair of eyes never hurts.

********* Begin code for new method in PDOutlineNode.java *****************
     /**
      * Insert this node before the current first child node or as the only
      * node if there are no children.
      * @param outlineNode
      */
     public void insertFirstChild( PDOutlineItem outlineNode )
     {
         PDOutlineItem wasFirstNode = this.getFirstChild();
         int currentOpenCount = getOpenCount();
         int numberOfOpenNodesWeAreAdding = 1;
         outlineNode.setParent( this );
         PDOutlineItem lastAddedNode = outlineNode;
         while(lastAddedNode.getNextSibling() != null)
         {
             lastAddedNode = lastAddedNode.getNextSibling();
             lastAddedNode.setParent(this);
         }
         setFirstChild( outlineNode );
         //  1 for the the item we are adding;
         if( outlineNode.isNodeOpen() )
         {
             numberOfOpenNodesWeAreAdding += outlineNode.getOpenCount();
         }
         // now update the count like appendChild() does
         if( isNodeOpen() )
         {
             setOpenCount( currentOpenCount + 
numberOfOpenNodesWeAreAdding );
         }
         else
         {
             setOpenCount( currentOpenCount - 
numberOfOpenNodesWeAreAdding );
         }
         // link the 2 subsets together
         // end of added list -> to first of old set
         lastAddedNode.setNextSibling(wasFirstNode);
         // first of old set -> back to last of added set
         wasFirstNode.setPreviousSibling(lastAddedNode);
         // tell the parent about the new node(s) we just added
         updateParentOpenCount( numberOfOpenNodesWeAreAdding );
         // update last if there were no child nodes when we started.
         if ( wasFirstNode == null )
           setLastChild( lastAddedNode );
         // else previous last is still the last one
     }

********* end code *****************

-- 

Charles Simon
Principal Software Engineer
Select Business Solutions, Inc.
35 Nutmeg Drive
Trumbull, CT 06611
http://www.selectbs.com