]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Make RTF output human-friendly by inserting line feeds.
authorJeremias Maerki <jeremias@apache.org>
Wed, 8 Dec 2004 18:52:32 +0000 (18:52 +0000)
committerJeremias Maerki <jeremias@apache.org>
Wed, 8 Dec 2004 18:52:32 +0000 (18:52 +0000)
Adding support for table cell padding.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@198194 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/render/rtf/FOPRtfAttributes.java
src/java/org/apache/fop/render/rtf/TableAttributesConverter.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfColorTable.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfElement.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfFontManager.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfGenerator.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfHeader.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfTableCell.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfTableRow.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfTextrun.java

index 5dea87cf5567a57171ef265a28e4438bd6d041d9..1f287c83cc919e48bc088ec9f9396be4bdcb997d 100755 (executable)
@@ -41,6 +41,17 @@ public class FOPRtfAttributes extends RtfAttributes {
         return this;
     }
 
+    /**
+     * Set an attribute using a value in millipoints (internal units in twips)
+     * @param name name of attribute
+     * @param value value of attribute (in millipoints)
+     * @return this (which now contains the new entry)
+     */
+    public RtfAttributes setTwips(String name, int value) {
+        set(name, value / (1000 / 20)); //Convert millipoints to twips
+        return this;
+    }
+
     /**
      * Set an attribute that has a Length value (internal units in half-points)
      * @param name name of attribute
index 6f2000e025f92a1e6116153e28f99ad643d02466..d16f17119c8ae8794ab2fa87d739512e44ed8405 100644 (file)
@@ -116,9 +116,10 @@ public class TableAttributesConverter {
         FOPRtfAttributes attrib = new FOPRtfAttributes();
 
         boolean isBorderPresent = false;
+        CommonBorderPaddingBackground border = fobj.getCommonBorderPaddingBackground();
 
         // Cell background color
-        ColorType color = fobj.getCommonBorderPaddingBackground().backgroundColor;
+        ColorType color = border.backgroundColor;
         if ((color != null) 
                 && (color.getAlpha() != 0
                         || color.getRed() != 0
@@ -127,7 +128,6 @@ public class TableAttributesConverter {
             attrib.set(ITableAttributes.CELL_COLOR_BACKGROUND, color);
         }
 
-        CommonBorderPaddingBackground border = fobj.getCommonBorderPaddingBackground();
         BorderAttributesConverter.makeBorder(border, CommonBorderPaddingBackground.BEFORE,
                 attrib, ITableAttributes.CELL_BORDER_TOP);
         BorderAttributesConverter.makeBorder(border, CommonBorderPaddingBackground.AFTER,
@@ -137,6 +137,44 @@ public class TableAttributesConverter {
         BorderAttributesConverter.makeBorder(border, CommonBorderPaddingBackground.END,
                 attrib,  ITableAttributes.CELL_BORDER_RIGHT);
 
+        int padding;
+        boolean reproduceMSWordBug = true;
+        //TODO Make this configurable
+        if (reproduceMSWordBug) {
+            //MS Word has a bug where padding left and top are exchanged
+            padding = border.getPaddingStart(false);
+            if (padding != 0) {
+                attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_TOP, padding);
+                attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_TOP, 3 /*=twips*/);
+            }
+            padding = border.getPaddingBefore(false);
+            if (padding != 0) {
+                attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_LEFT, padding);
+                attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_LEFT, 3 /*=twips*/);
+            }
+        } else {
+            padding = border.getPaddingStart(false);
+            if (padding != 0) {
+                attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_LEFT, padding);
+                attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_LEFT, 3 /*=twips*/);
+            }
+            padding = border.getPaddingBefore(false);
+            if (padding != 0) {
+                attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_TOP, padding);
+                attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_TOP, 3 /*=twips*/);
+            }
+        }
+        padding = border.getPaddingEnd(false);
+        if (padding != 0) {
+            attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_RIGHT, padding);
+            attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_RIGHT, 3 /*=twips*/);
+        }
+        padding = border.getPaddingAfter(false);
+        if (padding != 0) {
+            attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_BOTTOM, padding);
+            attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_BOTTOM, 3 /*=twips*/);
+        }
+        
         int n = fobj.getNumberColumnsSpanned();
         // Column spanning :
         if (n > 1) {
index 4bbaefd2bb9be0571de214ff1ffc41a9b7c07346..ab77a7dd93acde9e7c72c11cd7a5496183312ddf 100644 (file)
@@ -184,6 +184,7 @@ public class RtfColorTable {
             return;
         }
 
+        header.newLine();
         header.writeGroupMark (true);
         //Don't use writeControlWord, because it appends a blank,
         //which may confuse Wordpad.
@@ -196,11 +197,13 @@ public class RtfColorTable {
         for (int i = 0; i < len; i++) {
             int identifier = ((Integer) colorTable.get (i)).intValue ();
 
+            header.newLine();
             header.write ("\\red" + determineColorLevel (identifier, RED));
             header.write ("\\green" + determineColorLevel (identifier, GREEN));
             header.write ("\\blue" + determineColorLevel (identifier, BLUE) + ";");
         }
 
+        header.newLine();
         header.writeGroupMark (false);
     }
 
index 03d5697d3a6e0c788b3e0516febf5998f35f9c34..9d66997ee81baf2c8fd5aca59ae0a5932dfbb070 100644 (file)
@@ -89,6 +89,15 @@ public abstract class RtfElement {
         }
     }
 
+    /**
+     * Starts a new line in the RTF file being written. This is only to format
+     * the RTF file itself (for easier debugging), not its content.
+     * @throws IOException in case of an I/O problem
+     */
+    protected void newLine() throws IOException {
+        writer.write("\n");
+    }
+    
     /**
      * Write an RTF control word to our Writer
      * @param word RTF control word to write
index e92154f65de0c06c2d5f584a226a2a843011d5b2..bf839b48944c9ae26b2dc3b629177bda68b90c41 100644 (file)
@@ -144,6 +144,7 @@ public class RtfFontManager {
             return;
         }
 
+        header.newLine();
         header.writeGroupMark (true);
         header.writeControlWord ("fonttbl;");
 
@@ -151,11 +152,13 @@ public class RtfFontManager {
 
         for (int i = 0; i < len; i++) {
             header.writeGroupMark (true);
+            header.newLine();
             header.write ("\\f" + i);
             header.write (" " + (String) fontTable.elementAt (i));
             header.writeGroupMark (false);
         }
 
+        header.newLine();
         header.writeGroupMark (false);
     }
 
index 91a63f26ec81c5f399a8f722c22ad2de7ca46c24..e2ee8b618ef242036b63410b38b1ed5372f5ffae 100644 (file)
@@ -37,12 +37,13 @@ public class RtfGenerator extends RtfElement {
      * @see org.apache.fop.render.rtf.rtflib.rtfdoc.RtfElement#writeRtfContent()
      */
     protected void writeRtfContent() throws IOException {
-        parent.writeGroupMark(true);
-        parent.writeStarControlWord("generator");
-        parent.writer.write("Apache FOP ");
-        parent.writer.write(Fop.getVersion());
-        parent.writer.write(";");
-        parent.writeGroupMark(false);
+        newLine();
+        writeGroupMark(true);
+        writeStarControlWord("generator");
+        writer.write("Apache FOP ");
+        writer.write(Fop.getVersion());
+        writer.write(";");
+        writeGroupMark(false);
     }
 
     /**
index c63b0a8e3505c6865d482b85bb9325ff4c9e61c7..9a00f4bf151d1265056e27cc72bdd859cf92fde8 100644 (file)
@@ -103,9 +103,10 @@ class RtfHeader extends RtfContainer {
      *write properties for footnote handling
      */
     private void writeFootnoteProperties() throws IOException {
-    writeControlWord("fet0");  //footnotes, not endnotes
-    writeControlWord("ftnbj"); //place footnotes at the end of the
-                               //page (should be the default, but
-                               //Word 2000 thinks otherwise)
+        newLine();
+        writeControlWord("fet0");  //footnotes, not endnotes
+        writeControlWord("ftnbj"); //place footnotes at the end of the
+                                   //page (should be the default, but
+                                   //Word 2000 thinks otherwise)
     }
 }
index c1856d7d93a48999bdfd0d64931dde592389f3ae..f7a1b93b367d378a93b9745a1ee6d769bcd5f807 100644 (file)
@@ -226,6 +226,7 @@ implements IRtfParagraphContainer, IRtfListContainer, IRtfTableContainer,
      *  @return widthOffset + width of this cell
      */
     int writeCellDef(int widthOffset) throws IOException {
+        newLine();
         this.widthOffset = widthOffset;
 
         // vertical cell merge codes
@@ -268,6 +269,7 @@ implements IRtfParagraphContainer, IRtfListContainer, IRtfTableContainer,
 
         writeControlWord("cellx" + xPos);
 
+        //TODO Why is this here, right after an alignment command is written (see above)?
         writeControlWord("ql");
 
         return xPos;
index 681b075408144f7af662ae76ab0c083df2506fa7..a0777e620362f4b7589ab8f6265105727ed6d974 100644 (file)
@@ -122,6 +122,7 @@ public class RtfTableRow extends RtfContainer implements ITableAttributes {
      * @throws IOException for I/O problems
      */
     protected void writeRtfPrefix() throws IOException {
+        newLine();
         writeGroupMark(true);
     }
 
@@ -276,6 +277,8 @@ public class RtfTableRow extends RtfContainer implements ITableAttributes {
           index++; // Added by Boris POUDEROUS on 2002/07/02
         }
 
+        newLine();
+        
         // now children can write themselves, we have the correct RTF prefix code
         super.writeRtfContent();
     }
index 3ef9dcc0fc5e55384516d9ced5e029100e727cb9..ab6761dc4a2ea928c47ecb9b0ee2e8695fd6df4b 100644 (file)
@@ -235,7 +235,7 @@ public class RtfTextrun extends RtfContainer {
         if (rtfListItem != null) {
             rtfListItem.getRtfListStyle().writeParagraphPrefix(this);
         }
-        
+
         //write all children
         boolean bPrevPar = false;
         boolean bFirst = true;
@@ -260,6 +260,7 @@ public class RtfTextrun extends RtfContainer {
                         && e == lastParagraphBreak));
                 
             if (!bHide) {
+                newLine();
                 e.writeRtf(); 
                 
                 if (rtfListItem != null && e instanceof RtfParagraphBreak) {