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

Miklos Vajna vmiklos at collabora.co.uk
Tue May 20 10:16:43 PDT 2014


 sw/inc/textboxhelper.hxx             |    3 +++
 sw/source/core/doc/textboxhelper.cxx |   32 ++++++++++++++++++++++++++++++--
 sw/source/core/unocore/unodraw.cxx   |    6 +++++-
 3 files changed, 38 insertions(+), 3 deletions(-)

New commits:
commit 83857d750b9205db02d4b8bfc3c304364fae0619
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue May 20 19:15:29 2014 +0200

    SwXDrawPage::getByIndex(): ignore textboxes
    
    Change-Id: Ie91619e1f44694a547bfbbc5ff8110099c8002e6

diff --git a/sw/inc/textboxhelper.hxx b/sw/inc/textboxhelper.hxx
index bac2dcc..d3532c0 100644
--- a/sw/inc/textboxhelper.hxx
+++ b/sw/inc/textboxhelper.hxx
@@ -14,6 +14,7 @@
 
 #include <com/sun/star/uno/Any.h>
 #include <com/sun/star/uno/Type.h>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
 
 class SdrPage;
 class SwFrmFmt;
@@ -43,6 +44,8 @@ public:
     static std::list<SwFrmFmt*> findTextBoxes(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.
+    static css::uno::Any getByIndex(SdrPage* pPage, sal_Int32 nIndex, std::list<SwFrmFmt*>& rTextBoxes) throw(css::lang::IndexOutOfBoundsException);
 };
 
 #endif // INCLUDED_SW_INC_TEXTBOXHELPER_HXX
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index 4671580..d2cd4d7 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -98,19 +98,47 @@ std::list<SwFrmFmt*> SwTextBoxHelper::findTextBoxes(SwDoc* pDoc)
     return aRet;
 }
 
+/// If the passed SdrObject is in fact a TextFrame, that is used as a TextBox.
+bool lcl_isTextBox(SdrObject* pSdrObject, std::list<SwFrmFmt*>& rTextBoxes)
+{
+    SwVirtFlyDrawObj* pObject = PTR_CAST(SwVirtFlyDrawObj, pSdrObject);
+    return pObject && std::find(rTextBoxes.begin(), rTextBoxes.end(), pObject->GetFmt()) != rTextBoxes.end();
+}
+
 sal_Int32 SwTextBoxHelper::getCount(SdrPage* pPage, std::list<SwFrmFmt*>& rTextBoxes)
 {
     sal_Int32 nRet = 0;
     for (size_t i = 0; i < pPage->GetObjCount(); ++i)
     {
-        SwVirtFlyDrawObj* pObject = PTR_CAST(SwVirtFlyDrawObj, pPage->GetObj(i));
-        if (pObject && std::find(rTextBoxes.begin(), rTextBoxes.end(), pObject->GetFmt()) != rTextBoxes.end())
+        if (lcl_isTextBox(pPage->GetObj(i), rTextBoxes))
             continue;
         ++nRet;
     }
     return nRet;
 }
 
+uno::Any SwTextBoxHelper::getByIndex(SdrPage* pPage, sal_Int32 nIndex, std::list<SwFrmFmt*>& rTextBoxes) throw(lang::IndexOutOfBoundsException)
+{
+    if (nIndex < 0 || nIndex >= getCount(pPage, rTextBoxes))
+        throw lang::IndexOutOfBoundsException();
+
+    SdrObject* pRet = 0;
+    sal_Int32 nCount = 0; // Current logical index.
+    for (size_t i = 0; i < pPage->GetObjCount(); ++i)
+    {
+        if (lcl_isTextBox(pPage->GetObj(i), rTextBoxes))
+            continue;
+        if (nCount == nIndex)
+        {
+            pRet = pPage->GetObj(i);
+            break;
+        }
+        ++nCount;
+    }
+    assert(pRet);
+    return uno::makeAny(uno::Reference<drawing::XShape>(pRet->getUnoShape(), uno::UNO_QUERY));
+}
+
 SwFrmFmt* SwTextBoxHelper::findTextBox(SwFrmFmt* pShape)
 {
     SwFrmFmt* pRet = 0;
diff --git a/sw/source/core/unocore/unodraw.cxx b/sw/source/core/unocore/unodraw.cxx
index 0c639fa..f3851d9 100644
--- a/sw/source/core/unocore/unodraw.cxx
+++ b/sw/source/core/unocore/unodraw.cxx
@@ -538,7 +538,11 @@ uno::Any SwXDrawPage::getByIndex(sal_Int32 nIndex)
         throw lang::IndexOutOfBoundsException();
 
     ((SwXDrawPage*)this)->GetSvxPage();
-    return pDrawPage->getByIndex( nIndex );
+    std::list<SwFrmFmt*> aTextBoxes = SwTextBoxHelper::findTextBoxes(pDoc);
+    if (aTextBoxes.empty())
+        return pDrawPage->getByIndex( nIndex );
+    else
+        return SwTextBoxHelper::getByIndex(pDrawPage->GetSdrPage(), nIndex, aTextBoxes);
 }
 
 uno::Type  SwXDrawPage::getElementType(void) throw( uno::RuntimeException, std::exception )


More information about the Libreoffice-commits mailing list