[prev in list] [next in list] [prev in thread] [next in thread] 

List:       koffice-devel
Subject:    make the MS Word filter handle page borders
From:       Inge Wallin <inge () lysator ! liu ! se>
Date:       2009-10-24 17:52:04
Message-ID: 200910241952.04259.inge () lysator ! liu ! se
[Download RAW message or body]

Here is a patch that introduces page borders into the MS Word filter.

Cyrille wanted me to post it here for review before committing it.  I have 
tested it with oowriter since kword doesn't show page borders yet.

In addition to the fo:border* attributes, it also creates fo:margin and 
fo:padding attributes for pages.  I'm not sure if these are handled correctly 
yet by KOffice, but I'm going to find out.

Comments are welcome.

	-Inge

["msword-odf-page-borders.diff" (text/x-patch)]

Index: filters/kword/msword-odf/paragraph.cpp
===================================================================
--- filters/kword/msword-odf/paragraph.cpp	(revision 1039416)
+++ filters/kword/msword-odf/paragraph.cpp	(working copy)
@@ -421,6 +421,7 @@
     //
     // TODO: Check if we can use fo:border instead of all the
     //       fo:border-{top,bottom,left,right}
+    // TODO: Check if borderStyle is "double" and add attributes for that.
     if ( !refPap || refPap->brcTop.brcType != pap.brcTop.brcType )
     {
         style->addProperty( "fo:border-top", Conversion::setBorderAttributes( pap.brcTop ), \
                KoGenStyle::ParagraphType );
Index: filters/kword/msword-odf/document.cpp
===================================================================
--- filters/kword/msword-odf/document.cpp	(revision 1039416)
+++ filters/kword/msword-odf/document.cpp	(working copy)
@@ -358,6 +358,7 @@
     m_masterStyle->addAttribute("style:display-name", \
                masterStyleName.append(QString::number(m_textHandler->m_sectionNumber)));
     m_masterStyleName = m_mainStyles->lookup(*m_masterStyle, masterStyleName, \
                KoGenStyles::DontForceNumbering);
     delete m_masterStyle; //delete the object since we've added it to the collection
+
     //set master style name in m_textHandler because that's where we'll write it
     m_textHandler->m_masterStyleName = m_masterStyleName;
     //get a pointer to the object in the collection
@@ -379,11 +380,15 @@
     bool landscape = (sep->dmOrientPage == 2);
     m_pageLayoutStyle->addProperty("style:print-orientation", landscape? "landscape" : "portrait");
     m_pageLayoutStyle->addProperty("style:num-format", "1");
+
+    // Set default left/right margins for the case when there is no
+    // border.  This will be changed below if there are borders defined.
     m_pageLayoutStyle->addPropertyPt("fo:margin-left", (double)sep->dxaLeft / 20.0);
     m_pageLayoutStyle->addPropertyPt("fo:margin-right", (double)sep->dxaRight / 20.0);
-    QString header("<style:header-style>");
+
     //set the minimum height of header/footer to the full margin minus margin above header
     //TODO the margin between header/footer and text is just hard-coded for now
+    QString header("<style:header-style>");
     header.append("<style:header-footer-properties fo:margin-bottom=\"20pt\" fo:min-height=\"");
     header.append(QString::number((sep->dyaTop - sep->dyaHdrTop)/20.0));
     header.append("pt\"/>");
@@ -395,12 +400,62 @@
     footer.append("</style:footer-style>");
     m_pageLayoutStyle->addProperty("1header-style", header, KoGenStyle::StyleChildElement);
     m_pageLayoutStyle->addProperty("2footer-style", footer, KoGenStyle::StyleChildElement);
+
     m_pageLayoutStyle->setAutoStyleInStylesDotXml(true);
 
     pageLayoutStyleName = m_mainStyles->lookup(*m_pageLayoutStyle, pageLayoutStyleName, \
                KoGenStyles::DontForceNumbering);
     m_masterStyle->addAttribute("style:page-layout-name", pageLayoutStyleName);
 
-    // TODO apply brcTop/brcLeft etc. to the main FRAME
+    // Page borders
+    // FIXME: check if we can use fo:border instead of fo:border-left, etc.
+    if (sep->brcLeft.brcType != 0 ) {
+        m_pageLayoutStyle->addProperty( "fo:border-left",
+                                        Conversion::setBorderAttributes( sep->brcLeft ) );
+        
+    }
+    if (sep->brcTop.brcType != 0 ) {
+        m_pageLayoutStyle->addProperty( "fo:border-top",
+                                        Conversion::setBorderAttributes( sep->brcTop ) );
+    }
+    if (sep->brcRight.brcType != 0 ) {
+        m_pageLayoutStyle->addProperty( "fo:border-right",
+                                        Conversion::setBorderAttributes( sep->brcRight ) );
+    }
+    if (sep->brcBottom.brcType != 0 ) {
+        m_pageLayoutStyle->addProperty( "fo:border-bottom",
+                                        Conversion::setBorderAttributes( sep->brcBottom ) );
+    }
+
+    // the pgbOffsetFrom variable determins how to calculate the margins and paddings.
+    if (sep->pgbOffsetFrom == 0) {
+        // page border offset is from the text
+        m_pageLayoutStyle->addPropertyPt("fo:padding-left",   sep->brcLeft.dptSpace);
+        m_pageLayoutStyle->addPropertyPt("fo:padding-top",    sep->brcTop.dptSpace);
+        m_pageLayoutStyle->addPropertyPt("fo:padding-right",  sep->brcRight.dptSpace);
+        m_pageLayoutStyle->addPropertyPt("fo:padding-bottom", sep->brcBottom.dptSpace);
+        // FIXME: How should fo:margin be created in this case?
+    }
+    else {
+        // page border offset is from the edge of the page
+
+        // Add margin. This value is fetched directly from the BRC's.
+        m_pageLayoutStyle->addPropertyPt("fo:margin-left",   sep->brcLeft.dptSpace);
+        m_pageLayoutStyle->addPropertyPt("fo:margin-top",    sep->brcTop.dptSpace);
+        m_pageLayoutStyle->addPropertyPt("fo:margin-right",  sep->brcRight.dptSpace);
+        m_pageLayoutStyle->addPropertyPt("fo:margin-bottom", sep->brcBottom.dptSpace);
+
+        // The *20 and /20 below is the conversion between twips (1/20th of a point) and points.
+        m_pageLayoutStyle->addPropertyPt("fo:padding-left",
+                                         (sep->dxaLeft - (sep->brcLeft.dptSpace * 20)) / 20);
+        m_pageLayoutStyle->addPropertyPt("fo:padding-top",
+                                         (sep->dyaTop - (sep->brcTop.dptSpace * 20)) / 20);
+        m_pageLayoutStyle->addPropertyPt("fo:padding-right",
+                                         (sep->dxaRight - (sep->brcRight.dptSpace * 20)) / 20);
+        m_pageLayoutStyle->addPropertyPt("fo:padding-bottom",
+                                         (sep->dyaBottom - (sep->brcBottom.dptSpace * 20)) / 20);
+    }
+
+
     // TODO use sep->fEndNote to set the 'use endnotes or footnotes' flag
 }
 
@@ -412,14 +467,14 @@
         kDebug(30513) << "setting margin for header...";
         m_pageLayoutStyle->addPropertyPt("fo:margin-top", (double)sep->dyaHdrTop / 20.0);
     }
-    else {
-        kDebug(30513) << "setting margin for no header...";
+    else if (sep->brcTop.brcType == 0 ) {
+        kDebug(30513) << "setting margin for no header and no top border...";
         m_pageLayoutStyle->addPropertyPt("fo:margin-top", (double)sep->dyaTop / 20.0);
     }
     if(m_hasFooter) {
         m_pageLayoutStyle->addPropertyPt("fo:margin-bottom", (double)sep->dyaHdrBottom / 20.0);
     }
-    else {
+    else if (sep->brcBottom.brcType == 0 ) {
         m_pageLayoutStyle->addPropertyPt("fo:margin-bottom", (double)sep->dyaBottom / 20.0);
     }
     //insert the page-layout style into the collection,



_______________________________________________
koffice-devel mailing list
koffice-devel@kde.org
https://mail.kde.org/mailman/listinfo/koffice-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic