[Libreoffice-commits] core.git: 4 commits - sw/source

Jan Holesovsky kendy at collabora.com
Tue Oct 8 05:55:10 PDT 2013


 sw/source/filter/ww8/attributeoutputbase.hxx |    5 
 sw/source/filter/ww8/docxattributeoutput.cxx |  220 +++++++++++++++++++++++++--
 sw/source/filter/ww8/docxattributeoutput.hxx |   12 +
 sw/source/filter/ww8/rtfattributeoutput.cxx  |    7 
 sw/source/filter/ww8/rtfattributeoutput.hxx  |    5 
 sw/source/filter/ww8/wrtw8nds.cxx            |    4 
 sw/source/filter/ww8/ww8attributeoutput.hxx  |    5 
 7 files changed, 236 insertions(+), 22 deletions(-)

New commits:
commit 62ceeb1d1a0ff32e1be615f78da796aa13aaa06c
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Oct 8 13:50:42 2013 +0200

    DOCX export: Export run properties defaults in docDefaults.
    
    The paragraph properties still need some work, so that part is disabled in
    order not to break the unit tests.
    
    Change-Id: I06e55a5345d4fe08b14b8a260ab774b38770bf7b

diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index b63d78c..1940fa2 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -37,6 +37,7 @@
 
 #include <i18nlangtag/languagetag.hxx>
 
+#include <editeng/autokernitem.hxx>
 #include <editeng/unoprnms.hxx>
 #include <editeng/fontitem.hxx>
 #include <editeng/tstpitem.hxx>
@@ -2359,6 +2360,180 @@ void DocxAttributeOutput::StartStyles()
     DocDefaults();
 }
 
+void DocxAttributeOutput::OutputDefaultItem(const SfxPoolItem& rHt)
+{
+    bool bMustWrite = true;
+    switch (rHt.Which())
+    {
+        case RES_CHRATR_CASEMAP:
+            bMustWrite = static_cast< const SvxCaseMapItem& >(rHt).GetCaseMap() != SVX_CASEMAP_NOT_MAPPED;
+            break;
+        case RES_CHRATR_COLOR:
+            bMustWrite = static_cast< const SvxColorItem& >(rHt).GetValue().GetColor() != COL_AUTO;
+            break;
+        case RES_CHRATR_CONTOUR:
+            bMustWrite = static_cast< const SvxContourItem& >(rHt).GetValue();
+            break;
+        case RES_CHRATR_CROSSEDOUT:
+            bMustWrite = static_cast< const SvxCrossedOutItem& >(rHt).GetStrikeout() != STRIKEOUT_NONE;
+            break;
+        case RES_CHRATR_ESCAPEMENT:
+            bMustWrite = static_cast< const SvxEscapementItem& >(rHt).GetEscapement() != SVX_ESCAPEMENT_OFF;
+            break;
+        case RES_CHRATR_FONT:
+            bMustWrite = true;
+            break;
+        case RES_CHRATR_FONTSIZE:
+            bMustWrite = static_cast< const SvxFontHeightItem& >(rHt).GetHeight() != 200; // see StyleSheetTable_Impl::StyleSheetTable_Impl() where we set this default
+            break;
+        case RES_CHRATR_KERNING:
+            bMustWrite = static_cast< const SvxKerningItem& >(rHt).GetValue() != 0;
+            break;
+        case RES_CHRATR_LANGUAGE:
+            bMustWrite = true;
+            break;
+        case RES_CHRATR_POSTURE:
+            bMustWrite = static_cast< const SvxPostureItem& >(rHt).GetPosture() != ITALIC_NONE;
+            break;
+        case RES_CHRATR_SHADOWED:
+            bMustWrite = static_cast< const SvxShadowedItem& >(rHt).GetValue();
+            break;
+        case RES_CHRATR_UNDERLINE:
+            bMustWrite = static_cast< const SvxUnderlineItem& >(rHt).GetLineStyle() != UNDERLINE_NONE;
+            break;
+        case RES_CHRATR_WEIGHT:
+            bMustWrite = static_cast< const SvxWeightItem& >(rHt).GetWeight() != WEIGHT_NORMAL;
+            break;
+        case RES_CHRATR_AUTOKERN:
+            bMustWrite = static_cast< const SvxAutoKernItem& >(rHt).GetValue();
+            break;
+        case RES_CHRATR_BLINK:
+            bMustWrite = static_cast< const SvxBlinkItem& >(rHt).GetValue();
+            break;
+        case RES_CHRATR_BACKGROUND:
+            {
+                const SvxBrushItem& rBrushItem = static_cast< const SvxBrushItem& >(rHt);
+                bMustWrite = (rBrushItem.GetColor() != COL_AUTO ||
+                              rBrushItem.GetShadingValue() != sal_uInt32(ShadingPattern::CLEAR) ||
+                              rBrushItem.GetGraphic() != NULL ||
+                              rBrushItem.GetGraphicObject() != NULL);
+            }
+            break;
+
+        case RES_CHRATR_CJK_FONT:
+            bMustWrite = true;
+            break;
+        case RES_CHRATR_CJK_FONTSIZE:
+            bMustWrite = false; // we have written it already as RES_CHRATR_FONTSIZE
+            break;
+        case RES_CHRATR_CJK_LANGUAGE:
+            bMustWrite = true;
+            break;
+        case RES_CHRATR_CJK_POSTURE:
+            bMustWrite = false; // we have written it already as RES_CHRATR_POSTURE
+            break;
+        case RES_CHRATR_CJK_WEIGHT:
+            bMustWrite = false; // we have written it already as RES_CHRATR_WEIGHT
+            break;
+
+        case RES_CHRATR_CTL_FONT:
+            bMustWrite = true;
+            break;
+        case RES_CHRATR_CTL_FONTSIZE:
+            bMustWrite = static_cast< const SvxFontHeightItem& >(rHt).GetHeight() != 200; // see StyleSheetTable_Impl::StyleSheetTable_Impl() where we set this default
+            break;
+        case RES_CHRATR_CTL_LANGUAGE:
+            bMustWrite = true;
+            break;
+        case RES_CHRATR_CTL_POSTURE:
+            bMustWrite = static_cast< const SvxPostureItem& >(rHt).GetPosture() != ITALIC_NONE;
+            break;
+        case RES_CHRATR_CTL_WEIGHT:
+            bMustWrite = static_cast< const SvxWeightItem& >(rHt).GetWeight() != WEIGHT_NORMAL;
+            break;
+
+        case RES_CHRATR_ROTATE:
+            bMustWrite = static_cast< const SvxCharRotateItem& >(rHt).GetValue() != 0;
+            break;
+        case RES_CHRATR_EMPHASIS_MARK:
+            bMustWrite = static_cast< const SvxEmphasisMarkItem& >(rHt).GetValue() != EMPHASISMARK_NONE;
+            break;
+        case RES_CHRATR_TWO_LINES:
+            bMustWrite = static_cast< const SvxTwoLinesItem& >(rHt).GetValue();
+            break;
+        case RES_CHRATR_SCALEW:
+            bMustWrite = static_cast< const SvxCharScaleWidthItem& >(rHt).GetValue() != 100;
+            break;
+        case RES_CHRATR_RELIEF:
+            bMustWrite = static_cast< const SvxCharReliefItem& >(rHt).GetValue() != RELIEF_NONE;
+            break;
+        case RES_CHRATR_HIDDEN:
+            bMustWrite = static_cast< const SvxCharHiddenItem& >(rHt).GetValue();
+            break;
+        case RES_CHRATR_BOX:
+            {
+                const SvxBoxItem& rBoxItem = static_cast< const SvxBoxItem& >(rHt);
+                bMustWrite = rBoxItem.GetTop() || rBoxItem.GetLeft() ||
+                             rBoxItem.GetBottom() || rBoxItem.GetRight() ||
+                             rBoxItem.GetDistance();
+            }
+            break;
+        case RES_CHRATR_HIGHLIGHT:
+            {
+                const SvxBrushItem& rBrushItem = static_cast< const SvxBrushItem& >(rHt);
+                bMustWrite = (rBrushItem.GetColor() != COL_AUTO ||
+                              rBrushItem.GetShadingValue() != sal_uInt32(ShadingPattern::CLEAR) ||
+                              rBrushItem.GetGraphic() != NULL ||
+                              rBrushItem.GetGraphicObject() != NULL);
+            }
+            break;
+
+        case RES_PARATR_LINESPACING:
+            //FIXME ParaLineSpacing( static_cast< const SvxLineSpacingItem& >( rHt ) );
+            break;
+        case RES_PARATR_ADJUST:
+            //FIXME ParaAdjust( static_cast< const SvxAdjustItem& >( rHt ) );
+            break;
+        case RES_PARATR_SPLIT:
+            //FIXME ParaSplit( static_cast< const SvxFmtSplitItem& >( rHt ) );
+            break;
+        case RES_PARATR_WIDOWS:
+            //FIXME ParaWidows( static_cast< const SvxWidowsItem& >( rHt ) );
+            break;
+        case RES_PARATR_TABSTOP:
+            //FIXME ParaTabStop( static_cast< const SvxTabStopItem& >( rHt ) );
+            break;
+        case RES_PARATR_HYPHENZONE:
+            //FIXME ParaHyphenZone( static_cast< const SvxHyphenZoneItem& >( rHt ) );
+            break;
+        case RES_PARATR_NUMRULE:
+            //FIXME ParaNumRule( static_cast< const SwNumRuleItem& >( rHt ) );
+            break;
+        case RES_PARATR_SCRIPTSPACE:
+            //FIXME ParaScriptSpace( static_cast< const SfxBoolItem& >( rHt ) );
+            break;
+        case RES_PARATR_HANGINGPUNCTUATION:
+            //FIXME ParaHangingPunctuation( static_cast< const SfxBoolItem& >( rHt ) );
+            break;
+        case RES_PARATR_FORBIDDEN_RULES:
+            //FIXME ParaForbiddenRules( static_cast< const SfxBoolItem& >( rHt ) );
+            break;
+        case RES_PARATR_VERTALIGN:
+            //FIXME ParaVerticalAlign( static_cast< const SvxParaVertAlignItem& >( rHt ) );
+            break;
+        case RES_PARATR_SNAPTOGRID:
+            //FIXME ParaSnapToGrid( static_cast< const SvxParaGridItem& >( rHt ) );
+            break;
+
+        default:
+            SAL_INFO("sw.ww8", "Unhandled SfxPoolItem with id " << rHt.Which() );
+            break;
+    }
+
+    if (bMustWrite)
+        OutputItem(rHt);
+}
+
 void DocxAttributeOutput::DocDefaults( )
 {
     // Write the '<w:docDefaults>' section here
@@ -2366,21 +2541,30 @@ void DocxAttributeOutput::DocDefaults( )
 
     // Output the default run properties
     m_pSerializer->startElementNS(XML_w, XML_rPrDefault, FSEND);
-    StartRunProperties();
 
-    // TODO find out which run properties do we want to write
-    const RES_CHRATR aDefaultRunProperties[] = {
-        RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_FONT,
-        RES_CHRATR_LANGUAGE, RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CTL_LANGUAGE,
-    };
-    for (size_t i = 0; i < SAL_N_ELEMENTS(aDefaultRunProperties); ++i)
-        OutputItem(m_rExport.pDoc->GetDefault(aDefaultRunProperties[i]));
+    StartStyleProperties(false, 0);
+
+    for (int i = int(RES_CHRATR_BEGIN); i < int(RES_CHRATR_END); ++i)
+        OutputDefaultItem(m_rExport.pDoc->GetDefault(i));
+
+    EndStyleProperties(false);
 
-    EndRunProperties(NULL);
     m_pSerializer->endElementNS(XML_w, XML_rPrDefault);
 
-    // TODO should we output some paragraph properties too?
-    m_pSerializer->singleElementNS(XML_w, XML_pPrDefault, FSEND);
+    // Output the default paragraph properties
+    m_pSerializer->startElementNS(XML_w, XML_pPrDefault, FSEND);
+
+    /* TODO Paragraph properties still need work.
+    StartStyleProperties(true, 0);
+
+    for (int i = int(RES_PARATR_BEGIN); i < int(RES_PARATR_END); ++i)
+        OutputDefaultItem(m_rExport.pDoc->GetDefault(i));
+
+    EndStyleProperties(true);
+    */
+
+    m_pSerializer->endElementNS(XML_w, XML_pPrDefault);
+
     m_pSerializer->endElementNS(XML_w, XML_docDefaults);
 }
 
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index e88202a..54d3c79 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -214,6 +214,13 @@ public:
     /// Write Doc Defaults
     void DocDefaults( );
 
+    /** Similar to OutputItem(), but write something only if it is not the default.
+
+        This is to output the docDefaults, and we should write something out
+        only in case it is not what MSO already uses for the document by default.
+    */
+    void OutputDefaultItem(const SfxPoolItem& rHt);
+
     /// Start of a style in the styles table.
     virtual void StartStyle( const String& rName, bool bPapFmt,
             sal_uInt16 nBase, sal_uInt16 nNext, sal_uInt16 nWwId, sal_uInt16 nId,
commit 8c176f1e1c2df2c2c791a9b160eff3cf0a76069f
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Oct 8 09:20:32 2013 +0200

    DOCX export: Fix potential crash.
    
    Change-Id: I8a7fb3ba70676c4574bc493c5e0ea9eea5267608

diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 5e6beff..b63d78c 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -4858,7 +4858,8 @@ void DocxAttributeOutput::ParaAdjust( const SvxAdjustItem& rAdjust )
     bool bEcma = GetExport().GetFilter().getVersion( ) == oox::core::ECMA_DIALECT;
 
     const SfxItemSet* pItems = GetExport().GetCurItemSet();
-    const SvxFrameDirectionItem* rFrameDir = static_cast< const SvxFrameDirectionItem* >( pItems->GetItem( RES_FRAMEDIR ) );
+    const SvxFrameDirectionItem* rFrameDir = pItems?
+        static_cast< const SvxFrameDirectionItem* >( pItems->GetItem( RES_FRAMEDIR ) ): NULL;
 
     short nDir = FRMDIR_ENVIRONMENT;
     if( rFrameDir != NULL )
commit 531f47777fc4add536c0f18c5ffd2cc3803886ab
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Oct 8 09:06:40 2013 +0200

    DOCX export: Fix potential crash.
    
    Change-Id: I27f4dde08443938201fb020c96f06aa46c6c5102

diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 6b5198a..5e6beff 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -4117,10 +4117,10 @@ void DocxAttributeOutput::CharEscapement( const SvxEscapementItem& rEscapement )
         m_pSerializer->singleElementNS( XML_w, XML_vertAlign,
            FSNS( XML_w, XML_val ), sIss.getStr(), FSEND );
 
-    if ( sIss.isEmpty() || sIss.match( OString( "baseline" ) ) )
+    const SvxFontHeightItem& rItem = static_cast<const SvxFontHeightItem&>(m_rExport.GetItem(RES_CHRATR_FONTSIZE));
+    if (&rItem != NULL && (sIss.isEmpty() || sIss.match(OString("baseline"))))
     {
-        long nHeight = ((SvxFontHeightItem&)m_rExport.GetItem(
-                                    RES_CHRATR_FONTSIZE )).GetHeight();
+        long nHeight = rItem.GetHeight();
         OString sPos = OString::number( ( nHeight * nEsc + 500 ) / 1000 );
         m_pSerializer->singleElementNS( XML_w, XML_position,
                 FSNS( XML_w, XML_val ), sPos.getStr( ), FSEND );
commit 6ab170647c902753eec4ec9b4f6a32c5ce130e5c
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Oct 8 08:56:06 2013 +0200

    DOCX export: Move output of section breaks to a separate method.
    
    It does not really belong to StartParagraphProperties(), and also hinders
    re-uisng StartParagraphProperties() in DocDefaults().
    
    Change-Id: I178f69a81fd65ad2d21916c45249357728c2629c

diff --git a/sw/source/filter/ww8/attributeoutputbase.hxx b/sw/source/filter/ww8/attributeoutputbase.hxx
index c25f648..414e52b 100644
--- a/sw/source/filter/ww8/attributeoutputbase.hxx
+++ b/sw/source/filter/ww8/attributeoutputbase.hxx
@@ -144,8 +144,11 @@ public:
     /// End of the paragraph.
     virtual void EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pTextNodeInfoInner ) = 0;
 
+    /// Called in order to output section breaks.
+    virtual void SectionBreaks(const SwTxtNode& rNode) = 0;
+
     /// Called before we start outputting the attributes.
-    virtual void StartParagraphProperties( const SwTxtNode& rNode ) = 0;
+    virtual void StartParagraphProperties() = 0;
 
     /// Called after we end outputting the attributes.
     virtual void EndParagraphProperties() = 0;
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 8e3c1c3..6b5198a 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -465,7 +465,7 @@ void DocxAttributeOutput::EmptyParagraph()
     m_pSerializer->singleElementNS( XML_w, XML_p, FSEND );
 }
 
-void DocxAttributeOutput::StartParagraphProperties( const SwTxtNode& rNode )
+void DocxAttributeOutput::SectionBreaks(const SwTxtNode& rNode)
 {
     // output page/section breaks
     // Writer can have them at the beginning of a paragraph, or at the end, but
@@ -486,7 +486,10 @@ void DocxAttributeOutput::StartParagraphProperties( const SwTxtNode& rNode )
         const SwFrmFmt *pFmt = pTableNode->GetTable().GetFrmFmt();
         m_rExport.OutputSectionBreaks( &(pFmt->GetAttrSet()), *pTableNode );
     }
+}
 
+void DocxAttributeOutput::StartParagraphProperties()
+{
     m_pSerializer->mark( );
 
     m_pSerializer->startElementNS( XML_w, XML_pPr, FSEND );
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 2e99f9d..e88202a 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -114,8 +114,11 @@ public:
     /// Empty paragraph.
     virtual void EmptyParagraph();
 
+    /// Called in order to output section breaks.
+    virtual void SectionBreaks(const SwTxtNode& rNode);
+
     /// Called before we start outputting the attributes.
-    virtual void StartParagraphProperties( const SwTxtNode& rNode );
+    virtual void StartParagraphProperties();
 
     /// Called after we end outputting the attributes.
     virtual void EndParagraphProperties();
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx
index 953f416..c47abef 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -331,7 +331,7 @@ void RtfAttributeOutput::EmptyParagraph()
     m_rExport.Strm() << m_rExport.sNewLine << OOO_STRING_SVTOOLS_RTF_PAR << ' ';
 }
 
-void RtfAttributeOutput::StartParagraphProperties( const SwTxtNode& rNode )
+void RtfAttributeOutput::SectionBreaks(const SwTxtNode& rNode)
 {
     SAL_INFO("sw.rtf", OSL_THIS_FUNC);
     OSL_ENSURE(m_aStyles.getLength() == 0, "m_aStyles is not empty");
@@ -359,6 +359,11 @@ void RtfAttributeOutput::StartParagraphProperties( const SwTxtNode& rNode )
         m_rExport.OutputSectionBreaks( &(pFmt->GetAttrSet()), *pTableNode );
     }
     m_bBufferSectionBreaks = false;
+}
+
+void RtfAttributeOutput::StartParagraphProperties()
+{
+    SAL_INFO("sw.rtf", OSL_THIS_FUNC);
 
     OStringBuffer aPar;
     if (!m_rExport.bRTFFlySyntax)
diff --git a/sw/source/filter/ww8/rtfattributeoutput.hxx b/sw/source/filter/ww8/rtfattributeoutput.hxx
index aeb5264..0426749b 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.hxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.hxx
@@ -50,8 +50,11 @@ public:
     /// Empty paragraph.
     virtual void EmptyParagraph();
 
+    /// Called in order to output section breaks.
+    virtual void SectionBreaks(const SwTxtNode& rNode);
+
     /// Called before we start outputting the attributes.
-    virtual void StartParagraphProperties( const SwTxtNode& rNode );
+    virtual void StartParagraphProperties();
 
     /// Called after we end outputting the attributes.
     virtual void EndParagraphProperties();
diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
index c607163..5fce527 100644
--- a/sw/source/filter/ww8/wrtw8nds.cxx
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -2054,7 +2054,9 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
     }
     while ( nAktPos < nEnd );
 
-    AttrOutput().StartParagraphProperties( rNode );
+    AttrOutput().SectionBreaks(rNode);
+
+    AttrOutput().StartParagraphProperties();
 
     AttrOutput().ParagraphStyle( nStyle );
 
diff --git a/sw/source/filter/ww8/ww8attributeoutput.hxx b/sw/source/filter/ww8/ww8attributeoutput.hxx
index 24346d7..e60c3e9 100644
--- a/sw/source/filter/ww8/ww8attributeoutput.hxx
+++ b/sw/source/filter/ww8/ww8attributeoutput.hxx
@@ -35,8 +35,11 @@ public:
     /// End of the paragraph.
     virtual void EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pTextNodeInfoInner );
 
+    /// Called in order to output section breaks.
+    virtual void SectionBreaks(const SwTxtNode& /*rNode*/) {}
+
     /// Called before we start outputting the attributes.
-    virtual void StartParagraphProperties( const SwTxtNode& /*rNode*/ ) {}
+    virtual void StartParagraphProperties() {}
 
     /// Called after we end outputting the attributes.
     virtual void EndParagraphProperties() {}


More information about the Libreoffice-commits mailing list