Author: ltheussl
Date: Tue May 12 20:18:35 2009
New Revision: 774060

URL: http://svn.apache.org/viewvc?rev=774060&view=rev
Log:
include toc sub-items in toc and pdf bookmarks

Modified:
    
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java
    
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt

Modified: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java?rev=774060&r1=774059&r2=774060&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java
 Tue May 12 20:18:35 2009
@@ -23,6 +23,8 @@
 
 import java.util.Calendar;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Stack;
 
 import javax.swing.text.MutableAttributeSet;
 import javax.swing.text.html.HTML.Tag;
@@ -63,6 +65,9 @@
     /** Content in head is ignored in aggregated documents. */
     private boolean ignoreText;
 
+    /** Used to get the current position in the TOC. */
+    private final Stack tocStack = new Stack();
+
     /**
      * Constructor.
      *
@@ -685,23 +690,62 @@
         writeEmptyTag( TABLE_COLUMN_TAG, "column-width", "5in" ); // TODO
         writeStartTag( TABLE_BODY_TAG, "" );
 
-        int count = 0;
+        writeTocItems( toc.getItems(), 1 );
+
+        writeEndTag( TABLE_BODY_TAG );
+        writeEndTag( TABLE_TAG );
+        writeEndTag( FLOW_TAG );
+        writeEndTag( PAGE_SEQUENCE_TAG );
+    }
 
-        for ( Iterator k = toc.getItems().iterator(); k.hasNext(); )
+    private void writeTocItems( List tocItems, int level )
+    {
+        final int maxTocLevel = 4;
+
+        if ( level < 1 || level > maxTocLevel )
+        {
+            return;
+        }
+
+        tocStack.push( new NumberedListItem( NUMBERING_DECIMAL ) );
+
+        for ( Iterator k = tocItems.iterator(); k.hasNext(); )
         {
             DocumentTOCItem tocItem = (DocumentTOCItem) k.next();
-            count++;
 
             String ref = getIdName( tocItem.getRef() );
 
             writeStartTag( TABLE_ROW_TAG, "keep-with-next", "auto" );
+
+            if ( level > 2 )
+            {
+                for ( int i = 0; i < level - 2; i++ )
+                {
+                    writeStartTag( TABLE_CELL_TAG );
+                    writeEmptyTag( BLOCK_TAG, "" );
+                    writeEndTag( TABLE_CELL_TAG );
+                }
+            }
+
             writeStartTag( TABLE_CELL_TAG, "toc.cell" );
             writeStartTag( BLOCK_TAG, "toc.number.style" );
-            write( Integer.toString( count ) );
+
+            NumberedListItem current = (NumberedListItem) tocStack.peek();
+            current.next();
+            write( currentTocNumber() );
+
             writeEndTag( BLOCK_TAG );
             writeEndTag( TABLE_CELL_TAG );
-            writeStartTag( TABLE_CELL_TAG, "number-columns-spanned", "3", 
"toc.cell" );
-            MutableAttributeSet atts = getFoConfiguration().getAttributeSet( 
"toc.h1.style" );
+
+            String span = "3";
+
+            if ( level > 2 )
+            {
+                span = Integer.toString( 5 - level );
+            }
+
+            writeStartTag( TABLE_CELL_TAG, "number-columns-spanned", span, 
"toc.cell" );
+            MutableAttributeSet atts = getFoConfiguration().getAttributeSet( 
"toc.h" + level + ".style" );
             atts.addAttribute( "text-align-last", "justify" );
             writeStartTag( BLOCK_TAG, atts );
             writeStartTag( BASIC_LINK_TAG, "internal-destination", ref );
@@ -714,14 +758,26 @@
             writeEndTag( BLOCK_TAG );
             writeEndTag( TABLE_CELL_TAG );
             writeEndTag( TABLE_ROW_TAG );
+
+            if ( tocItem.getItems() != null )
+            {
+                writeTocItems( tocItem.getItems(), level + 1 );
+            }
         }
 
-        writeEndTag( TABLE_BODY_TAG );
-        writeEndTag( TABLE_TAG );
-        writeEndTag( FLOW_TAG );
-        writeEndTag( PAGE_SEQUENCE_TAG );
+        tocStack.pop();
+    }
+
+    private String currentTocNumber()
+    {
+        String ch = ( (NumberedListItem) tocStack.get( 0 ) 
).getListItemSymbol();
 
+        for ( int i = 1; i < tocStack.size(); i++ )
+        {
+            ch = ch + "." + ( (NumberedListItem) tocStack.get( i ) 
).getListItemSymbol();
+        }
 
+        return ch;
     }
 
     /**
@@ -731,38 +787,38 @@
      */
     protected void pdfBookmarks()
     {
-        if ( this.docModel == null )
+        if ( docModel == null || docModel.getToc() == null )
         {
             return;
         }
 
-        DocumentTOC toc = docModel.getToc();
+        writeStartTag( BOOKMARK_TREE_TAG, "" );
 
-        if ( toc == null )
-        {
-            return;
-        }
+        renderBookmarkItems( docModel.getToc().getItems() );
 
-        writeStartTag( BOOKMARK_TREE_TAG, "" );
+        writeEndTag( BOOKMARK_TREE_TAG );
+    }
 
-        for ( Iterator k = toc.getItems().iterator(); k.hasNext(); )
+    private void renderBookmarkItems( List items )
+    {
+        for ( Iterator k = items.iterator(); k.hasNext(); )
         {
             DocumentTOCItem tocItem = (DocumentTOCItem) k.next();
 
             String ref = getIdName( tocItem.getRef() );
 
             writeStartTag( BOOKMARK_TAG, "internal-destination", ref );
-
             writeStartTag( BOOKMARK_TITLE_TAG, "" );
-
             write( tocItem.getName() );
-
             writeEndTag( BOOKMARK_TITLE_TAG );
 
+            if ( tocItem.getItems() != null )
+            {
+                renderBookmarkItems( tocItem.getItems() );
+            }
+
             writeEndTag( BOOKMARK_TAG );
         }
-
-        writeEndTag( BOOKMARK_TREE_TAG );
     }
 
     /**

Modified: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt?rev=774060&r1=774059&r2=774060&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt
 Tue May 12 20:18:35 2009
@@ -482,12 +482,12 @@
         <xsl:attribute name="space-before">18pt</xsl:attribute>
     </xsl:attribute-set>
     <xsl:attribute-set name="toc.h2.style" use-attribute-sets="toc.base.style">
-        <xsl:attribute name="font-size">9.5pt</xsl:attribute>
+        <xsl:attribute name="font-size">11pt</xsl:attribute>
         <xsl:attribute name="space-before">15pt</xsl:attribute>
         <xsl:attribute name="space-before">3pt</xsl:attribute>
     </xsl:attribute-set>
     <xsl:attribute-set name="toc.h3.style" use-attribute-sets="toc.base.style">
-        <xsl:attribute name="font-size">9.5pt</xsl:attribute>
+        <xsl:attribute name="font-size">10pt</xsl:attribute>
         <xsl:attribute name="space-before">4pt</xsl:attribute>
     </xsl:attribute-set>
     <xsl:attribute-set name="toc.h4.style" use-attribute-sets="toc.base.style">


Reply via email to