[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