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

Luboš Luňák l.lunak at collabora.com
Wed Nov 5 04:59:24 PST 2014


 sw/inc/index.hxx                     |    4 +++
 sw/inc/ndindex.hxx                   |    3 ++
 sw/inc/pam.hxx                       |    6 +++++
 sw/qa/extras/inc/swmodeltestbase.hxx |   37 +++++++++++++++++++++++++++++++++++
 sw/source/core/bastyp/index.cxx      |    5 ++++
 sw/source/core/crsr/pam.cxx          |   14 +++++++++++++
 sw/source/core/docnode/ndindex.cxx   |    5 ++++
 sw/source/core/layout/frmtool.cxx    |   29 +++++++++++++++++----------
 8 files changed, 92 insertions(+), 11 deletions(-)

New commits:
commit 2bd1896e207f7fda2861d019702b931f07c9c4e1
Author: Luboš Luňák <l.lunak at collabora.com>
Date:   Wed Oct 22 18:23:34 2014 +0200

    allow checking odt docs with assertXPath() etc. too
    
    Change-Id: I01469514372ad5aab8cb81feb5e09f3315162e2a

diff --git a/sw/qa/extras/inc/swmodeltestbase.hxx b/sw/qa/extras/inc/swmodeltestbase.hxx
index aae1f4d..b642abc 100644
--- a/sw/qa/extras/inc/swmodeltestbase.hxx
+++ b/sw/qa/extras/inc/swmodeltestbase.hxx
@@ -707,6 +707,7 @@ protected:
      */
     virtual void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) SAL_OVERRIDE
     {
+        // docx
         xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("w"), BAD_CAST("http://schemas.openxmlformats.org/wordprocessingml/2006/main"));
         xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("v"), BAD_CAST("urn:schemas-microsoft-com:vml"));
         xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("mc"), BAD_CAST("http://schemas.openxmlformats.org/markup-compatibility/2006"));
@@ -724,6 +725,42 @@ protected:
         xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("extended-properties"), BAD_CAST("http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"));
         xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("a14"), BAD_CAST("http://schemas.microsoft.com/office/drawing/2010/main"));
         xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("o"), BAD_CAST("urn:schemas-microsoft-com:office:office"));
+        // odt
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("office"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:office:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("style"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:style:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("text"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:text:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("table"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:table:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("draw"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("fo"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xlink"), BAD_CAST("http://www.w3.org/1999/xlink"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("dc"), BAD_CAST("http://purl.org/dc/elements/1.1/"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("meta"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:meta:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("number"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("svg"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("chart"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:chart:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("dr3d"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("math"), BAD_CAST("http://www.w3.org/1998/Math/MathML"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("form"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:form:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("script"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:script:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("ooo"), BAD_CAST("http://openoffice.org/2004/office"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("ooow"), BAD_CAST("http://openoffice.org/2004/writer"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("oooc"), BAD_CAST("http://openoffice.org/2004/calc"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("dom"), BAD_CAST("http://www.w3.org/2001/xml-events"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xforms"), BAD_CAST("http://www.w3.org/2002/xforms"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xsd"), BAD_CAST("http://www.w3.org/2001/XMLSchema"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xsi"), BAD_CAST("http://www.w3.org/2001/XMLSchema-instance"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("rpt"), BAD_CAST("http://openoffice.org/2005/report"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("of"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:of:1.2"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xhtml"), BAD_CAST("http://www.w3.org/1999/xhtml"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("grddl"), BAD_CAST("http://www.w3.org/2003/g/data-view#"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("officeooo"), BAD_CAST("http://openoffice.org/2009/office"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("tableooo"), BAD_CAST("http://openoffice.org/2009/table"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("drawooo"), BAD_CAST("http://openoffice.org/2010/draw"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("calcext"), BAD_CAST("urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("loext"), BAD_CAST("urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("field"), BAD_CAST("urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("formx"), BAD_CAST("urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"));
+        xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("css3t"), BAD_CAST("http://www.w3.org/TR/css3-text/"));
     }
 
     virtual OUString registerDBsource( const OUString &aURI, const OUString &aPrefix, const OUString &aWorkDir )
commit 6557b081b9d2390396408a97bbf0b50a2830b747
Author: Luboš Luňák <l.lunak at collabora.com>
Date:   Tue Oct 21 19:57:45 2014 +0200

    more local variable
    
    Change-Id: Ibe67ecdd5b121ad5624bfd111dca33897d6e1991

diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index f9a275d..a2cda52 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -1076,9 +1076,9 @@ void AppendObjs( const SwFrmFmts *pTbl, sal_uLong nIndex,
 
 static bool lcl_ObjConnected( SwFrmFmt *pFmt, const SwFrm* pSib )
 {
-    SwIterator<SwFlyFrm,SwFmt> aIter( *pFmt );
     if ( RES_FLYFRMFMT == pFmt->Which() )
     {
+        SwIterator<SwFlyFrm,SwFmt> aIter( *pFmt );
         const SwRootFrm* pRoot = pSib ? pSib->getRootFrm() : 0;
         const SwFlyFrm* pTmpFrm;
         for( pTmpFrm = aIter.First(); pTmpFrm; pTmpFrm = aIter.Next() )
commit 16f18fb34b5cfae86a48e8e360d98b95d458ee85
Author: Luboš Luňák <l.lunak at collabora.com>
Date:   Tue Oct 21 19:06:20 2014 +0200

    repeated vector::erase() is a bad idea for performance
    
    Especially given that it seems here it was usually called on every single
    element.
    
    Change-Id: Ifc5497aac5108481595df80d00c6e00c00f17596

diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index f45b6a8..f9a275d 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -1123,16 +1123,21 @@ void AppendAllObjs( const SwFrmFmts *pTbl, const SwFrm* pSib )
     //because we neither use character bound frames nor objects which
     //are anchored to character bounds.
 
-    SwFrmFmts aCpy( *pTbl );
+    // Optimization: This code used to make a copy of pTbl and erase() handled items, but using
+    // vector::erase() is a bad idea for performance (especially with large mailmerge documents
+    // it results in extensive repeated copying). Use another vector for marking whether the item
+    // has been handled and operate on the original data without altering them.
+    std::vector< bool > handled( pTbl->size(), false );
+    size_t handledCount = 0;
 
-    sal_uInt16 nOldCnt = USHRT_MAX;
-
-    while ( !aCpy.empty() && aCpy.size() != nOldCnt )
+    while ( handledCount < pTbl->size())
     {
-        nOldCnt = aCpy.size();
-        for ( int i = 0; i < int(aCpy.size()); ++i )
+        bool changed = false;
+        for ( int i = 0; i < int(pTbl->size()); ++i )
         {
-            SwFrmFmt *pFmt = (SwFrmFmt*)aCpy[ sal_uInt16(i) ];
+            if( handled[ i ] )
+                continue;
+            SwFrmFmt *pFmt = (*pTbl)[ i ];
             const SwFmtAnchor &rAnch = pFmt->GetAnchor();
             bool bRemove = false;
             if ((rAnch.GetAnchorId() == FLY_AT_PAGE) ||
@@ -1156,12 +1161,14 @@ void AppendAllObjs( const SwFrmFmts *pTbl, const SwFrm* pSib )
             }
             if ( bRemove )
             {
-                aCpy.erase( aCpy.begin() + i );
-                --i;
+                handled[ i ] = true;
+                ++handledCount;
+                changed = true;
             }
         }
+        if( !changed )
+            break;
     }
-    aCpy.clear();
 }
 
 /** local method to set 'working' position for newly inserted frames
commit 12637c634cfaebb4213f32cc83dcd0a2028c3d55
Author: Luboš Luňák <l.lunak at collabora.com>
Date:   Thu Oct 16 16:02:23 2014 +0200

    operator<< for SwPosition/SwPaM/etc. for use with SAL_DEBUG
    
    Change-Id: I99ffa87afa6dbdbd20042a882af428d166546af3

diff --git a/sw/inc/index.hxx b/sw/inc/index.hxx
index e364853..3330861 100644
--- a/sw/inc/index.hxx
+++ b/sw/inc/index.hxx
@@ -23,6 +23,8 @@
 #include <tools/rtti.hxx>
 #include <swdllapi.h>
 
+#include <iostream>
+
 class SwIndexReg;
 struct SwPosition;
 
@@ -107,6 +109,8 @@ public:
     void SetMark(const sw::mark::IMark* pMark);
 };
 
+std::ostream& operator <<(std::ostream& s, const SwIndex& index);
+
 class SwIndexReg
 {
     friend class SwIndex;
diff --git a/sw/inc/ndindex.hxx b/sw/inc/ndindex.hxx
index 028ce54..c8221c2 100644
--- a/sw/inc/ndindex.hxx
+++ b/sw/inc/ndindex.hxx
@@ -20,6 +20,7 @@
 #define INCLUDED_SW_INC_NDINDEX_HXX
 
 #include <limits.h>
+#include <iostream>
 
 #include <tools/solar.h>
 
@@ -92,6 +93,8 @@ public:
     SwNode& GetNode() const { return *pNd; }
 };
 
+std::ostream &operator <<(std::ostream& s, const SwNodeIndex& index);
+
 // SwRange
 
 class SW_DLLPUBLIC SwNodeRange
diff --git a/sw/inc/pam.hxx b/sw/inc/pam.hxx
index dd95d13..8614453 100644
--- a/sw/inc/pam.hxx
+++ b/sw/inc/pam.hxx
@@ -28,6 +28,8 @@
 #include <ndindex.hxx>
 #include "swdllapi.h"
 
+#include <iostream>
+
 class SwFmt;
 class SfxPoolItem;
 class SfxItemSet;
@@ -74,6 +76,8 @@ struct SW_DLLPUBLIC SwPosition
     bool operator !=(const SwPosition &) const;
 };
 
+std::ostream &operator <<(std::ostream& s, const SwPosition& position);
+
 // Result of comparing positions.
 enum SwComparePosition {
     POS_BEFORE,             ///< Pos1 before Pos2.
@@ -301,6 +305,8 @@ public:
     void InvalidatePaM();
 };
 
+std::ostream &operator <<(std::ostream& s, const SwPaM& pam);
+
 bool CheckNodesRange( const SwNodeIndex&, const SwNodeIndex&, bool bChkSection );
 
 #endif // INCLUDED_SW_INC_PAM_HXX
diff --git a/sw/source/core/bastyp/index.cxx b/sw/source/core/bastyp/index.cxx
index b6f7632..d77e2396 100644
--- a/sw/source/core/bastyp/index.cxx
+++ b/sw/source/core/bastyp/index.cxx
@@ -392,4 +392,9 @@ SwIndex& SwIndex::operator= ( sal_Int32 const nVal )
 
 #endif
 
+std::ostream& operator <<(std::ostream& s, const SwIndex& index)
+{
+    return s << "SwIndex offset (" << index.GetIndex() << ")";
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/crsr/pam.cxx b/sw/source/core/crsr/pam.cxx
index 5a1d1fa..ad5bbf5 100644
--- a/sw/source/core/crsr/pam.cxx
+++ b/sw/source/core/crsr/pam.cxx
@@ -190,6 +190,11 @@ SwDoc * SwPosition::GetDoc() const
     return nNode.GetNode().GetDoc();
 }
 
+std::ostream &operator <<(std::ostream& s, const SwPosition& position)
+{
+    return s << "SwPosition (node " << position.nNode.GetIndex() << ", offset " << position.nContent.GetIndex() << ")";
+}
+
 enum CHKSECTION { Chk_Both, Chk_One, Chk_None };
 
 static CHKSECTION lcl_TstIdx( sal_uLong nSttIdx, sal_uLong nEndIdx, const SwNode& rEndNd )
@@ -1085,4 +1090,13 @@ void SwPaM::InvalidatePaM()
     }
 }
 
+std::ostream &operator <<(std::ostream& s, const SwPaM& pam)
+{
+    if( pam.HasMark())
+        return s << "SwPaM (point " << *pam.GetPoint() << ", mark " << *pam.GetMark() << ")";
+    else
+        return s << "SwPaM (point " << *pam.GetPoint() << ")";
+}
+
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/docnode/ndindex.cxx b/sw/source/core/docnode/ndindex.cxx
index 3c3a9f6..03e98be 100644
--- a/sw/source/core/docnode/ndindex.cxx
+++ b/sw/source/core/docnode/ndindex.cxx
@@ -130,4 +130,9 @@ SwNodeIndex& SwNodeIndex::Assign( const SwNode& rNd, long nOffset )
     return *this;
 }
 
+std::ostream &operator <<(std::ostream& s, const SwNodeIndex& index)
+{
+    return s << "SwNodeIndex (node " << index.GetIndex() << ")";
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list