[Libreoffice-commits] core.git: Branch 'libreoffice-4-3' - oox/source sw/qa sw/source

Luboš Luňák l.lunak at collabora.com
Wed Oct 1 00:49:32 PDT 2014


 oox/source/token/properties.txt                           |    1 
 oox/source/vml/vmlshape.cxx                               |   27 ++
 sw/qa/extras/ooxmlexport/data/bnc884615-mso-position.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport.cxx                  |   37 +++
 sw/source/filter/ww8/docxattributeoutput.cxx              |  168 +++++++-------
 5 files changed, 151 insertions(+), 82 deletions(-)

New commits:
commit bccb5eff14b2aebd18fd933c2790d78a2fa940e9
Author: Luboš Luňák <l.lunak at collabora.com>
Date:   Sat Sep 27 16:59:48 2014 +0200

    fix/improve handling of mso-position-(horizontal|vertical)(-relative)
    
    This is a squash of commits f6fa787 to e5bbc721 .
    
    Change-Id: Ieb76ccb2fe8a425af3204de144021b7a731d0778
    Reviewed-on: https://gerrit.libreoffice.org/11701
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt
index 988857b..f1b237b 100644
--- a/oox/source/token/properties.txt
+++ b/oox/source/token/properties.txt
@@ -339,6 +339,7 @@ OutputPosition
 OverlapSequence
 PageScale
 PageStyle
+PageToggle
 PageViewZoomValue
 PaintTransparent
 ParaAdjust
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index d7783d8..3adf5c8 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -482,12 +482,38 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel)
 {
     if ( rTypeModel.maPositionHorizontal == "center" )
         rPropSet.setAnyProperty(PROP_HoriOrient, makeAny(text::HoriOrientation::CENTER));
+    else if ( rTypeModel.maPositionHorizontal == "left" )
+        rPropSet.setAnyProperty(PROP_HoriOrient, makeAny(text::HoriOrientation::LEFT));
+    else if ( rTypeModel.maPositionHorizontal == "right" )
+        rPropSet.setAnyProperty(PROP_HoriOrient, makeAny(text::HoriOrientation::RIGHT));
+    else if ( rTypeModel.maPositionHorizontal == "inside" )
+    {
+        rPropSet.setAnyProperty(PROP_HoriOrient, makeAny(text::HoriOrientation::LEFT));
+        rPropSet.setAnyProperty(PROP_PageToggle, makeAny(sal_True));
+    }
+    else if ( rTypeModel.maPositionHorizontal == "outside" )
+    {
+        rPropSet.setAnyProperty(PROP_HoriOrient, makeAny(text::HoriOrientation::RIGHT));
+        rPropSet.setAnyProperty(PROP_PageToggle, makeAny(sal_True));
+    }
 
     if ( rTypeModel.maPositionHorizontalRelative == "page" )
         rPropSet.setAnyProperty(PROP_HoriOrientRelation, makeAny(text::RelOrientation::PAGE_FRAME));
+    else if ( rTypeModel.maPositionVerticalRelative == "margin" )
+        rPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::PAGE_PRINT_AREA);
+    else if ( rTypeModel.maPositionVerticalRelative == "text" )
+        rPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::FRAME);
 
     if ( rTypeModel.maPositionVertical == "center" )
         rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::CENTER));
+    else if ( rTypeModel.maPositionVertical == "top" )
+        rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::TOP));
+    else if ( rTypeModel.maPositionVertical == "bottom" )
+        rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::BOTTOM));
+    else if ( rTypeModel.maPositionVertical == "inside" )
+        rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::LINE_TOP));
+    else if ( rTypeModel.maPositionVertical == "outside" )
+        rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::LINE_BOTTOM));
 
     if ( rTypeModel.maPosition == "absolute" )
     {
@@ -504,7 +530,6 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel)
         }
         else
         {
-            // Vertical placement relative to margin, because parent style must not modify vertical position
             rPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::FRAME);
         }
     }
diff --git a/sw/qa/extras/ooxmlexport/data/bnc884615-mso-position.docx b/sw/qa/extras/ooxmlexport/data/bnc884615-mso-position.docx
new file mode 100644
index 0000000..2fb28ec
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bnc884615-mso-position.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index 5590246..18c15fa 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -3658,6 +3658,43 @@ DECLARE_OOXMLEXPORT_TEST(testFooterBodyDistance, "footer-body-distance.docx")
 
 #endif
 
+DECLARE_OOXMLEXPORT_TEST(testMsoPosition, "bnc884615-mso-position.docx")
+{
+    if(xmlDocPtr doc = parseExport("word/footer1.xml"))
+    {
+        // We write the frames out in different order than they were read, so check it's the correct
+        // textbox first by checking width. These tests may need reordering if that gets fixed.
+        OUString style1 = getXPath(doc, "/w:ftr/w:p/w:r[3]/mc:AlternateContent/mc:Fallback/w:pict/v:rect", "style");
+        CPPUNIT_ASSERT( style1.indexOf( ";width:531pt;" ) >= 0 );
+        CPPUNIT_ASSERT( style1.indexOf( ";mso-position-vertical-relative:page" ) >= 0 );
+        CPPUNIT_ASSERT( style1.indexOf( ";mso-position-horizontal-relative:page" ) >= 0 );
+        OUString style2 = getXPath(doc, "/w:ftr/w:p/w:r[4]/mc:AlternateContent/mc:Fallback/w:pict/v:rect", "style");
+        CPPUNIT_ASSERT( style2.indexOf( ";width:549pt;" ) >= 0 );
+        CPPUNIT_ASSERT( style2.indexOf( ";mso-position-vertical-relative:text" ) >= 0 );
+        CPPUNIT_ASSERT( style2.indexOf( ";mso-position-horizontal:center" ) >= 0 );
+        CPPUNIT_ASSERT( style2.indexOf( ";mso-position-horizontal-relative:text" ) >= 0 );
+        OUString style3 = getXPath(doc, "/w:ftr/w:p/w:r[5]/mc:AlternateContent/mc:Fallback/w:pict/v:rect", "style");
+        CPPUNIT_ASSERT( style3.indexOf( ";width:36pt;" ) >= 0 );
+        CPPUNIT_ASSERT( style3.indexOf( ";mso-position-horizontal-relative:text" ) >= 0 );
+        CPPUNIT_ASSERT( style3.indexOf( ";mso-position-vertical-relative:text" ) >= 0 );
+    }
+    if(xmlDocPtr doc = parseExport("word/header1.xml"))
+    {
+        OUString style1 = getXPath(doc, "/w:hdr/w:p/w:r[2]/mc:AlternateContent/mc:Fallback/w:pict/v:rect", "style");
+        CPPUNIT_ASSERT( style1.indexOf( ";width:335.75pt;" ) >= 0 );
+        CPPUNIT_ASSERT( style1.indexOf( ";mso-position-horizontal-relative:page" ) >= 0 );
+        CPPUNIT_ASSERT( style1.indexOf( ";mso-position-vertical-relative:page" ) >= 0 );
+        OUString style2 = getXPath(doc, "/w:hdr/w:p/w:r[3]/mc:AlternateContent/mc:Fallback/w:pict/v:rect", "style");
+        CPPUNIT_ASSERT( style2.indexOf( ";width:138.15pt;" ) >= 0 );
+        CPPUNIT_ASSERT( style2.indexOf( ";mso-position-horizontal-relative:page" ) >= 0 );
+        CPPUNIT_ASSERT( style2.indexOf( ";mso-position-vertical-relative:page" ) >= 0 );
+        OUString style3 = getXPath(doc, "/w:hdr/w:p/w:r[4]/mc:AlternateContent/mc:Fallback/w:pict/v:rect", "style");
+        CPPUNIT_ASSERT( style3.indexOf( ";width:163.8pt;" ) >= 0 );
+        CPPUNIT_ASSERT( style3.indexOf( ";mso-position-horizontal-relative:page" ) >= 0 );
+        CPPUNIT_ASSERT( style3.indexOf( ";mso-position-vertical-relative:page" ) >= 0 );
+    }
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index a77b8fa..37ad4f7 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -6665,121 +6665,127 @@ void DocxAttributeOutput::FormatSurround( const SwFmtSurround& rSurround )
 
 void DocxAttributeOutput::FormatVertOrientation( const SwFmtVertOrient& rFlyVert )
 {
+    OString sAlign;
+    switch( rFlyVert.GetVertOrient() )
+    {
+        case text::VertOrientation::NONE:
+            break;
+        case text::VertOrientation::CENTER:
+        case text::VertOrientation::LINE_CENTER:
+            sAlign = OString( "center" );
+            break;
+        case text::VertOrientation::BOTTOM:
+            sAlign = OString( "bottom" );
+            break;
+        case text::VertOrientation::LINE_BOTTOM:
+            sAlign = OString( "outside" );
+            break;
+        case text::VertOrientation::TOP:
+            sAlign = OString( "top" );
+            break;
+        case text::VertOrientation::LINE_TOP:
+        default:
+            sAlign = OString( "inside" );
+            break;
+    }
+    OString sVAnchor( "page" );
+    switch ( rFlyVert.GetRelationOrient( ) )
+    {
+        case text::RelOrientation::CHAR:
+        case text::RelOrientation::PRINT_AREA:
+        case text::RelOrientation::TEXT_LINE:
+        case text::RelOrientation::FRAME:
+            sVAnchor = OString( "text" );
+            break;
+        case text::RelOrientation::PAGE_LEFT:
+        case text::RelOrientation::PAGE_RIGHT:
+        case text::RelOrientation::FRAME_LEFT:
+        case text::RelOrientation::FRAME_RIGHT:
+        case text::RelOrientation::PAGE_PRINT_AREA:
+            sVAnchor = OString( "margin" );
+            break;
+        case text::RelOrientation::PAGE_FRAME:
+        default:
+            break;
+    }
+
     if (m_rExport.SdrExporter().getTextFrameSyntax())
     {
         m_rExport.SdrExporter().getTextFrameStyle().append(";margin-top:").append(double(rFlyVert.GetPos()) / 20).append("pt");
+        if ( !sAlign.isEmpty() )
+            m_rExport.SdrExporter().getTextFrameStyle().append(";mso-position-vertical:").append(sAlign);
+        m_rExport.SdrExporter().getTextFrameStyle().append(";mso-position-vertical-relative:").append(sVAnchor);
     }
     else if (m_rExport.SdrExporter().getDMLTextFrameSyntax())
     {
     }
     else if ( m_rExport.bOutFlyFrmAttrs )
     {
-        OString sAlign;
-        switch( rFlyVert.GetVertOrient() )
-        {
-            case text::VertOrientation::NONE:
-                break;
-            case text::VertOrientation::CENTER:
-            case text::VertOrientation::LINE_CENTER:
-                sAlign = OString( "center" );
-                break;
-            case text::VertOrientation::BOTTOM:
-            case text::VertOrientation::LINE_BOTTOM:
-                sAlign = OString( "bottom" );
-                break;
-            case text::VertOrientation::TOP:
-            case text::VertOrientation::LINE_TOP:
-            default:
-                sAlign = OString( "top" );
-                break;
-        }
-
         if ( !sAlign.isEmpty() )
             AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, XML_yAlign ), sAlign.getStr() );
         else
             AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, XML_y ),
                 OString::number( rFlyVert.GetPos() ).getStr() );
-
-        OString sVAnchor( "page" );
-        switch ( rFlyVert.GetRelationOrient( ) )
-        {
-            case text::RelOrientation::CHAR:
-            case text::RelOrientation::PRINT_AREA:
-            case text::RelOrientation::TEXT_LINE:
-                sVAnchor = OString( "column" );
-                break;
-            case text::RelOrientation::FRAME:
-            case text::RelOrientation::PAGE_LEFT:
-            case text::RelOrientation::PAGE_RIGHT:
-            case text::RelOrientation::FRAME_LEFT:
-            case text::RelOrientation::FRAME_RIGHT:
-                sVAnchor = OString( "margin" );
-                break;
-            case text::RelOrientation::PAGE_FRAME:
-            case text::RelOrientation::PAGE_PRINT_AREA:
-            default:
-                break;
-        }
-
         AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, XML_vAnchor ), sVAnchor.getStr() );
     }
 }
 
 void DocxAttributeOutput::FormatHorizOrientation( const SwFmtHoriOrient& rFlyHori )
 {
+    OString sAlign;
+    switch( rFlyHori.GetHoriOrient() )
+    {
+        case text::HoriOrientation::NONE:
+            break;
+        case text::HoriOrientation::LEFT:
+            sAlign = OString( rFlyHori.IsPosToggle( ) ? "inside" : "left" );
+            break;
+        case text::HoriOrientation::RIGHT:
+            sAlign = OString( rFlyHori.IsPosToggle( ) ? "outside" : "right" );
+            break;
+        case text::HoriOrientation::CENTER:
+        case text::HoriOrientation::FULL: // FULL only for tables
+        default:
+            sAlign = OString( "center" );
+            break;
+    }
+    OString sHAnchor( "page" );
+    switch ( rFlyHori.GetRelationOrient( ) )
+    {
+        case text::RelOrientation::CHAR:
+        case text::RelOrientation::PRINT_AREA:
+        case text::RelOrientation::FRAME:
+            sHAnchor = OString( "text" );
+            break;
+        case text::RelOrientation::PAGE_LEFT:
+        case text::RelOrientation::PAGE_RIGHT:
+        case text::RelOrientation::FRAME_LEFT:
+        case text::RelOrientation::FRAME_RIGHT:
+        case text::RelOrientation::PAGE_PRINT_AREA:
+            sHAnchor = OString( "margin" );
+            break;
+        case text::RelOrientation::PAGE_FRAME:
+        default:
+            break;
+    }
+
     if (m_rExport.SdrExporter().getTextFrameSyntax())
     {
         m_rExport.SdrExporter().getTextFrameStyle().append(";margin-left:").append(double(rFlyHori.GetPos()) / 20).append("pt");
+        if ( !sAlign.isEmpty() )
+            m_rExport.SdrExporter().getTextFrameStyle().append(";mso-position-horizontal:").append(sAlign);
+        m_rExport.SdrExporter().getTextFrameStyle().append(";mso-position-horizontal-relative:").append(sHAnchor);
     }
     else if (m_rExport.SdrExporter().getDMLTextFrameSyntax())
     {
     }
     else if ( m_rExport.bOutFlyFrmAttrs )
     {
-        OString sAlign;
-        switch( rFlyHori.GetHoriOrient() )
-        {
-            case text::HoriOrientation::NONE:
-                break;
-            case text::HoriOrientation::LEFT:
-                sAlign = OString( rFlyHori.IsPosToggle( ) ? "inside" : "left" );
-                break;
-            case text::HoriOrientation::RIGHT:
-                sAlign = OString( rFlyHori.IsPosToggle( ) ? "outside" : "right" );
-                break;
-            case text::HoriOrientation::CENTER:
-            case text::HoriOrientation::FULL: // FULL only for tables
-            default:
-                sAlign = OString( "center" );
-                break;
-        }
-
         if ( !sAlign.isEmpty() )
             AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, XML_xAlign ), sAlign.getStr() );
         else
             AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, XML_x ),
                 OString::number( rFlyHori.GetPos() ).getStr() );
-
-        OString sHAnchor( "page" );
-        switch ( rFlyHori.GetRelationOrient( ) )
-        {
-            case text::RelOrientation::CHAR:
-            case text::RelOrientation::PRINT_AREA:
-                sHAnchor = OString( "text" );
-                break;
-            case text::RelOrientation::FRAME:
-            case text::RelOrientation::PAGE_LEFT:
-            case text::RelOrientation::PAGE_RIGHT:
-            case text::RelOrientation::FRAME_LEFT:
-            case text::RelOrientation::FRAME_RIGHT:
-                sHAnchor = OString( "margin" );
-                break;
-            case text::RelOrientation::PAGE_FRAME:
-            case text::RelOrientation::PAGE_PRINT_AREA:
-            default:
-                break;
-        }
-
         AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, XML_hAnchor ), sHAnchor.getStr() );
     }
 }


More information about the Libreoffice-commits mailing list