[Libreoffice-commits] core.git: Branch 'feature/textbox' - 5 commits - sw/inc sw/source

Miklos Vajna vmiklos at collabora.co.uk
Thu May 22 06:13:18 PDT 2014


 sw/inc/doc.hxx                       |    4 ++--
 sw/inc/textboxhelper.hxx             |    2 +-
 sw/source/core/doc/docfly.cxx        |   23 +++++++++++++++++++++--
 sw/source/core/doc/textboxhelper.cxx |   10 ++++++----
 sw/source/core/unocore/unocoll.cxx   |   12 +++++++++---
 5 files changed, 39 insertions(+), 12 deletions(-)

New commits:
commit f7f16dd245ea73cfd198684fb33abe968380768b
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu May 22 15:12:03 2014 +0200

    SwXFrameEnumeration: ignore textboxes
    
    Change-Id: Ifd8ff27bfb11b1162197e7a159c5bbe25b7d9bc3

diff --git a/sw/source/core/unocore/unocoll.cxx b/sw/source/core/unocore/unocoll.cxx
index 95fe53e..99a6146 100644
--- a/sw/source/core/unocore/unocoll.cxx
+++ b/sw/source/core/unocore/unocoll.cxx
@@ -49,6 +49,7 @@
 #include <unofield.hxx>
 #include <unoidx.hxx>
 #include <unoframe.hxx>
+#include <textboxhelper.hxx>
 #include <unofootnote.hxx>
 #include <vcl/svapp.hxx>
 #include <fmtcntnt.hxx>
@@ -1087,12 +1088,15 @@ SwXFrameEnumeration<T>::SwXFrameEnumeration(const SwDoc* const pDoc)
     ::std::insert_iterator<frmcontainer_t> pInserter = ::std::insert_iterator<frmcontainer_t>(m_aFrames, m_aFrames.begin());
     // #i104937#
     SwFrmFmt* pFmt( 0 );
+
+    std::list<SwFrmFmt*> aTextBoxes = SwTextBoxHelper::findTextBoxes(pDoc);
+
     for( sal_uInt16 i = 0; i < nSize; ++i )
 //    for(SwFrmFmt* pFmt = (*pFmts)[0]; pFmt < pFmtsEnd; ++pFmt)
     {
         // #i104937#
         pFmt = (*pFmts)[i];
-        if(pFmt->Which() != RES_FLYFRMFMT)
+        if(pFmt->Which() != RES_FLYFRMFMT || std::find(aTextBoxes.begin(), aTextBoxes.end(), pFmt) != aTextBoxes.end())
             continue;
         const SwNodeIndex* pIdx =  pFmt->GetCntnt().GetCntntIdx();
         if(!pIdx || !pIdx->GetNodes().IsDocNodes())
commit 18824d52c4a326c2b31c30c2153e05adbaf27faa
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu May 22 14:51:41 2014 +0200

    SwXFrames::getByIndex: ignore textboxes
    
    Change-Id: I0d0f16e147092402b85d84e90fe8ee9812a2937f

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index bccd5dd..8bab97a 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -1233,7 +1233,7 @@ public:
     /** Access to frames.
     Iterate over Flys - forr Basic-Collections. */
     sal_uInt16 GetFlyCount( FlyCntType eType = FLYCNTTYPE_ALL, bool bIgnoreTextBoxes = false ) const;
-    SwFrmFmt* GetFlyNum(sal_uInt16 nIdx, FlyCntType eType = FLYCNTTYPE_ALL);
+    SwFrmFmt* GetFlyNum(sal_uInt16 nIdx, FlyCntType eType = FLYCNTTYPE_ALL, bool bIgnoreTextBoxes = false );
 
     // Copy formats in own arrays and return them.
     SwFrmFmt  *CopyFrmFmt ( const SwFrmFmt& );
diff --git a/sw/source/core/doc/docfly.cxx b/sw/source/core/doc/docfly.cxx
index c657db0..4755251 100644
--- a/sw/source/core/doc/docfly.cxx
+++ b/sw/source/core/doc/docfly.cxx
@@ -120,16 +120,25 @@ sal_uInt16 SwDoc::GetFlyCount( FlyCntType eType, bool bIgnoreTextBoxes ) const
 }
 
 /// @attention If you change this, also update SwXFrameEnumeration in unocoll.
-SwFrmFmt* SwDoc::GetFlyNum( sal_uInt16 nIdx, FlyCntType eType )
+SwFrmFmt* SwDoc::GetFlyNum( sal_uInt16 nIdx, FlyCntType eType, bool bIgnoreTextBoxes )
 {
     SwFrmFmts& rFmts = *GetSpzFrmFmts();
     SwFrmFmt* pRetFmt = 0;
     sal_uInt16 nSize = rFmts.size();
     const SwNodeIndex* pIdx;
     sal_uInt16 nCount = 0;
+
+    std::list<SwFrmFmt*> aTextBoxes;
+    if (bIgnoreTextBoxes)
+        aTextBoxes = SwTextBoxHelper::findTextBoxes(this);
+
     for( sal_uInt16 i = 0; !pRetFmt && i < nSize; ++i )
     {
         SwFrmFmt* pFlyFmt = rFmts[ i ];
+
+        if (bIgnoreTextBoxes && std::find(aTextBoxes.begin(), aTextBoxes.end(), pFlyFmt) != aTextBoxes.end())
+            continue;
+
         if( RES_FLYFRMFMT == pFlyFmt->Which()
             && 0 != ( pIdx = pFlyFmt->GetCntnt().GetCntntIdx() )
             && pIdx->GetNodes().IsDocNodes()
diff --git a/sw/source/core/unocore/unocoll.cxx b/sw/source/core/unocore/unocoll.cxx
index d0d1a32..95fe53e 100644
--- a/sw/source/core/unocore/unocoll.cxx
+++ b/sw/source/core/unocore/unocoll.cxx
@@ -1200,7 +1200,8 @@ uno::Any SwXFrames::getByIndex(sal_Int32 nIndex)
         throw uno::RuntimeException();
     if(nIndex < 0 || nIndex >= USHRT_MAX)
         throw IndexOutOfBoundsException();
-    SwFrmFmt* pFmt = GetDoc()->GetFlyNum(static_cast<sal_uInt16>(nIndex), eType);
+    // Ignore TextBoxes for TextFrames.
+    SwFrmFmt* pFmt = GetDoc()->GetFlyNum(static_cast<sal_uInt16>(nIndex), eType, /*bIgnoreTextBoxes=*/eType == FLYCNTTYPE_FRM);
     if(!pFmt)
         throw IndexOutOfBoundsException();
     return lcl_UnoWrapFrame(pFmt, eType);
commit d41fdbdb56dc1a27b83753f2facd50e12add9b77
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu May 22 14:21:38 2014 +0200

    SwXFrames::getCount: ignore TextFrames, which are TextBoxes
    
    Change-Id: I39fb4fcff2a55cef658d93c80c1cf448bd2e7c86

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 4e833d8..bccd5dd 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -1232,7 +1232,7 @@ public:
 
     /** Access to frames.
     Iterate over Flys - forr Basic-Collections. */
-    sal_uInt16 GetFlyCount( FlyCntType eType = FLYCNTTYPE_ALL) const;
+    sal_uInt16 GetFlyCount( FlyCntType eType = FLYCNTTYPE_ALL, bool bIgnoreTextBoxes = false ) const;
     SwFrmFmt* GetFlyNum(sal_uInt16 nIdx, FlyCntType eType = FLYCNTTYPE_ALL);
 
     // Copy formats in own arrays and return them.
diff --git a/sw/source/core/doc/docfly.cxx b/sw/source/core/doc/docfly.cxx
index e306eb8..c657db0 100644
--- a/sw/source/core/doc/docfly.cxx
+++ b/sw/source/core/doc/docfly.cxx
@@ -42,6 +42,7 @@
 #include <pagefrm.hxx>
 #include <rootfrm.hxx>
 #include <flyfrms.hxx>
+#include <textboxhelper.hxx>
 #include <frmtool.hxx>
 #include <frmfmt.hxx>
 #include <ndtxt.hxx>
@@ -68,15 +69,24 @@
 
 using namespace ::com::sun::star;
 
-sal_uInt16 SwDoc::GetFlyCount( FlyCntType eType ) const
+sal_uInt16 SwDoc::GetFlyCount( FlyCntType eType, bool bIgnoreTextBoxes ) const
 {
     const SwFrmFmts& rFmts = *GetSpzFrmFmts();
     sal_uInt16 nSize = rFmts.size();
     sal_uInt16 nCount = 0;
     const SwNodeIndex* pIdx;
+
+    std::list<SwFrmFmt*> aTextBoxes;
+    if (bIgnoreTextBoxes)
+        aTextBoxes = SwTextBoxHelper::findTextBoxes(this);
+
     for ( sal_uInt16 i = 0; i < nSize; i++)
     {
         const SwFrmFmt* pFlyFmt = rFmts[ i ];
+
+        if (bIgnoreTextBoxes && std::find(aTextBoxes.begin(), aTextBoxes.end(), pFlyFmt) != aTextBoxes.end())
+            continue;
+
         if( RES_FLYFRMFMT == pFlyFmt->Which()
             && 0 != ( pIdx = pFlyFmt->GetCntnt().GetCntntIdx() )
             && pIdx->GetNodes().IsDocNodes()
diff --git a/sw/source/core/unocore/unocoll.cxx b/sw/source/core/unocore/unocoll.cxx
index 7229102..d0d1a32 100644
--- a/sw/source/core/unocore/unocoll.cxx
+++ b/sw/source/core/unocore/unocoll.cxx
@@ -1188,7 +1188,8 @@ sal_Int32 SwXFrames::getCount(void) throw(uno::RuntimeException, std::exception)
     SolarMutexGuard aGuard;
     if(!IsValid())
         throw uno::RuntimeException();
-    return GetDoc()->GetFlyCount(eType);
+    // Ignore TextBoxes for TextFrames.
+    return GetDoc()->GetFlyCount(eType, /*bIgnoreTextBoxes=*/eType == FLYCNTTYPE_FRM);
 }
 
 uno::Any SwXFrames::getByIndex(sal_Int32 nIndex)
commit e6d1ef3eb34f3dc43698042b9c05d01aceaa0161
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu May 22 13:58:35 2014 +0200

    SwTextBoxHelper::findTextBox: only draw frames can have textboxes
    
    Change-Id: Id351b96d616eecc780e987a1d0e99ca3f40e4b7c

diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index 36c302a..56b4e0e 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -143,13 +143,15 @@ SwFrmFmt* SwTextBoxHelper::findTextBox(SwFrmFmt* pShape)
 {
     SwFrmFmt* pRet = 0;
 
-    if (pShape->GetAttrSet().HasItem(RES_CNTNT))
+    // Only draw frames can have TextBoxes.
+    if (pShape->Which() == RES_DRAWFRMFMT && pShape->GetAttrSet().HasItem(RES_CNTNT))
     {
         const SwFmtCntnt& rCntnt = pShape->GetCntnt();
         SwFrmFmts& rSpzFrmFmts = *pShape->GetDoc()->GetSpzFrmFmts();
         for (SwFrmFmts::iterator it = rSpzFrmFmts.begin(); it != rSpzFrmFmts.end(); ++it)
         {
             SwFrmFmt* pFmt = *it;
+            // Only a fly frame can be a TextBox.
             if (pFmt->Which() == RES_FLYFRMFMT && pFmt->GetAttrSet().HasItem(RES_CNTNT) && pFmt->GetCntnt() == rCntnt)
             {
                 pRet = pFmt;
commit 3d5ecdfd3f30ea6e70848f9e110e208991dd7676
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu May 22 13:47:43 2014 +0200

    let SwTextBoxHelper::findTextBoxes() take a const SwDoc
    
    Change-Id: I173b85c15fb59f4fb0bbdf5befdc998aabc27565

diff --git a/sw/inc/textboxhelper.hxx b/sw/inc/textboxhelper.hxx
index d3532c0..28f8d71 100644
--- a/sw/inc/textboxhelper.hxx
+++ b/sw/inc/textboxhelper.hxx
@@ -41,7 +41,7 @@ public:
     static SwFrmFmt* findTextBox(SwFrmFmt* pShape);
 
     /// Look up TextFrames in a document, which are in fact TextBoxes.
-    static std::list<SwFrmFmt*> findTextBoxes(SwDoc* pDoc);
+    static std::list<SwFrmFmt*> findTextBoxes(const SwDoc* pDoc);
     /// Count number of shapes in the document, excluding TextBoxes.
     static sal_Int32 getCount(SdrPage* pPage, std::list<SwFrmFmt*>& rTextBoxes);
     /// Get a shape by index, excluding TextBoxes.
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index d2cd4d7..36c302a 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -83,12 +83,12 @@ void SwTextBoxHelper::destroy(SwFrmFmt* pShape)
     }
 }
 
-std::list<SwFrmFmt*> SwTextBoxHelper::findTextBoxes(SwDoc* pDoc)
+std::list<SwFrmFmt*> SwTextBoxHelper::findTextBoxes(const SwDoc* pDoc)
 {
     std::list<SwFrmFmt*> aRet;
 
-    SwFrmFmts& rSpzFrmFmts = *pDoc->GetSpzFrmFmts();
-    for (SwFrmFmts::iterator it = rSpzFrmFmts.begin(); it != rSpzFrmFmts.end(); ++it)
+    const SwFrmFmts& rSpzFrmFmts = *pDoc->GetSpzFrmFmts();
+    for (SwFrmFmts::const_iterator it = rSpzFrmFmts.begin(); it != rSpzFrmFmts.end(); ++it)
     {
         SwFrmFmt* pTextBox = findTextBox(*it);
         if (pTextBox)


More information about the Libreoffice-commits mailing list