diff options
-rw-r--r-- | desktop/qa/desktop_lib/test_desktop_lib.cxx | 25 | ||||
-rw-r--r-- | desktop/source/lib/init.cxx | 19 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKit.h | 3 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKit.hxx | 14 | ||||
-rw-r--r-- | include/vcl/ITiledRenderable.hxx | 8 | ||||
-rw-r--r-- | sw/inc/crsrsh.hxx | 2 | ||||
-rw-r--r-- | sw/inc/unotxdoc.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/crsr/crsrsh.cxx | 14 | ||||
-rw-r--r-- | sw/source/uibase/uno/unotxdoc.cxx | 11 |
9 files changed, 98 insertions, 0 deletions
diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx index d7b93472c1b5..a7696d824bee 100644 --- a/desktop/qa/desktop_lib/test_desktop_lib.cxx +++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx @@ -52,12 +52,14 @@ public: void testGetFonts(); void testCreateView(); void testGetFilterTypes(); + void testGetPartPageRectangles(); CPPUNIT_TEST_SUITE(DesktopLOKTest); CPPUNIT_TEST(testGetStyles); CPPUNIT_TEST(testGetFonts); CPPUNIT_TEST(testCreateView); CPPUNIT_TEST(testGetFilterTypes); + CPPUNIT_TEST(testGetPartPageRectangles); CPPUNIT_TEST_SUITE_END(); uno::Reference<lang::XComponent> mxComponent; @@ -152,6 +154,29 @@ void DesktopLOKTest::testCreateView() closeDoc(); } +void DesktopLOKTest::testGetPartPageRectangles() +{ + // Test that we get as many page rectangles as expected: blank document is + // one page. + LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); + char* pRectangles = pDocument->pClass->getPartPageRectangles(pDocument); + OUString sRectangles = OUString::fromUtf8(pRectangles); + + std::vector<OUString> aRectangles; + sal_Int32 nIndex = 0; + do + { + OUString aRectangle = sRectangles.getToken(0, ';', nIndex); + if (!aRectangle.isEmpty()) + aRectangles.push_back(aRectangle); + } + while (nIndex >= 0); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aRectangles.size()); + + free(pRectangles); + closeDoc(); +} + void DesktopLOKTest::testGetFilterTypes() { LibLibreOffice_Impl aOffice; diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index b581bca5d011..509983c1c8ac 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -204,6 +204,7 @@ static void doc_destroy(LibreOfficeKitDocument* pThis); static int doc_saveAs(LibreOfficeKitDocument* pThis, const char* pUrl, const char* pFormat, const char* pFilterOptions); static int doc_getDocumentType(LibreOfficeKitDocument* pThis); static int doc_getParts(LibreOfficeKitDocument* pThis); +static char* doc_getPartPageRectangles(LibreOfficeKitDocument* pThis); static int doc_getPart(LibreOfficeKitDocument* pThis); static void doc_setPart(LibreOfficeKitDocument* pThis, int nPart); static char* doc_getPartName(LibreOfficeKitDocument* pThis, int nPart); @@ -266,6 +267,7 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone m_pDocumentClass->saveAs = doc_saveAs; m_pDocumentClass->getDocumentType = doc_getDocumentType; m_pDocumentClass->getParts = doc_getParts; + m_pDocumentClass->getPartPageRectangles = doc_getPartPageRectangles; m_pDocumentClass->getPart = doc_getPart; m_pDocumentClass->setPart = doc_setPart; m_pDocumentClass->getPartName = doc_getPartName; @@ -659,6 +661,23 @@ static void doc_setPart(LibreOfficeKitDocument* pThis, int nPart) pDoc->setPart( nPart ); } +static char* doc_getPartPageRectangles(LibreOfficeKitDocument* pThis) +{ + ITiledRenderable* pDoc = getTiledRenderable(pThis); + if (!pDoc) + { + gImpl->maLastExceptionMsg = "Document doesn't support tiled rendering"; + return 0; + } + + OUString sRectangles = pDoc->getPartPageRectangles(); + OString aString = OUStringToOString(sRectangles, RTL_TEXTENCODING_UTF8); + char* pMemory = static_cast<char*>(malloc(aString.getLength() + 1)); + strcpy(pMemory, aString.getStr()); + return pMemory; + +} + static char* doc_getPartName(LibreOfficeKitDocument* pThis, int nPart) { ITiledRenderable* pDoc = getTiledRenderable(pThis); diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h index d5094bdb1b76..d83dd49f32b5 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.h +++ b/include/LibreOfficeKit/LibreOfficeKit.h @@ -85,6 +85,9 @@ struct _LibreOfficeKitDocumentClass /// @see lok::Document::getParts(). int (*getParts) (LibreOfficeKitDocument* pThis); + /// @see lok::Document::getPartPageRectangles(). + char* (*getPartPageRectangles) (LibreOfficeKitDocument* pThis); + /// @see lok::Document::getPart(). int (*getPart) (LibreOfficeKitDocument* pThis); diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx index 207a9ce6e883..cd12ad64f245 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -76,6 +76,20 @@ public: return mpDoc->pClass->getParts(mpDoc); } + /** + * Get the logical rectangle of each part in the document. + * + * A part refers to an individual page in Writer and has no relevant for + * Calc or Impress. + * + * @return a rectangle list, using the same format as + * LOK_CALLBACK_TEXT_SELECTION. + */ + inline char* getPartPageRectangles() + { + return mpDoc->pClass->getPartPageRectangles(mpDoc); + } + /// Get the current part of the document. inline int getPart() { diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx index 6639745e4a2f..fd336f603296 100644 --- a/include/vcl/ITiledRenderable.hxx +++ b/include/vcl/ITiledRenderable.hxx @@ -139,6 +139,14 @@ public: * @see lok::Document::resetSelection(). */ virtual void resetSelection() = 0; + + /** + * @see lok::Document::getPartPageRectangles(). + */ + virtual OUString getPartPageRectangles() + { + return OUString(); + } }; } // namespace vcl diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx index 0cdeee5860c2..0629a04a9299 100644 --- a/sw/inc/crsrsh.hxx +++ b/sw/inc/crsrsh.hxx @@ -847,6 +847,8 @@ public: OUString GetCrsrDescr() const; virtual void dumpAsXml(struct _xmlTextWriter* pWriter) const SAL_OVERRIDE; + /// Implementation of lok::Document::getPartPageRectangles() for Writer. + OUString getPageRectangles(); }; // Cursor Inlines: diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx index 8306b83f5616..1edefc4c82be 100644 --- a/sw/inc/unotxdoc.hxx +++ b/sw/inc/unotxdoc.hxx @@ -428,6 +428,8 @@ public: virtual void setGraphicSelection(int nType, int nX, int nY) SAL_OVERRIDE; /// @see vcl::ITiledRenderable::resetSelection(). virtual void resetSelection() SAL_OVERRIDE; + /// @see vcl::ITiledRenderable::getPartPageRectangles(). + virtual OUString getPartPageRectangles() SAL_OVERRIDE; // ::com::sun::star::tiledrendering::XTiledRenderable virtual void SAL_CALL paintTile( const ::css::uno::Any& Parent, ::sal_Int32 nOutputWidth, ::sal_Int32 nOutputHeight, ::sal_Int32 nTilePosX, ::sal_Int32 nTilePosY, ::sal_Int32 nTileWidth, ::sal_Int32 nTileHeight ) throw (::css::uno::RuntimeException, ::std::exception) SAL_OVERRIDE; diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index 06aed4f369b6..fee18190fdaf 100644 --- a/sw/source/core/crsr/crsrsh.cxx +++ b/sw/source/core/crsr/crsrsh.cxx @@ -1200,6 +1200,20 @@ sal_uInt16 SwCrsrShell::GetPageCnt() return GetLayout()->GetPageNum(); } +OUString SwCrsrShell::getPageRectangles() +{ + CurrShell aCurr(this); + SwRootFrm* pLayout = GetLayout(); + std::stringstream ss; + for (const SwFrm* pFrm = pLayout->GetLower(); pFrm; pFrm = pFrm->GetNext()) + { + if (pFrm != pLayout->GetLower()) + ss << "; "; + ss << pFrm->Frm().Left() << ", " << pFrm->Frm().Top() << ", " << pFrm->Frm().Width() << ", " << pFrm->Frm().Height(); + } + return OUString::fromUtf8(ss.str().c_str()); +} + /// go to the next SSelection bool SwCrsrShell::GoNextCrsr() { diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx index ab5b8281e29e..8a0471fa06da 100644 --- a/sw/source/uibase/uno/unotxdoc.cxx +++ b/sw/source/uibase/uno/unotxdoc.cxx @@ -3176,6 +3176,17 @@ int SwXTextDocument::getParts() return pWrtShell->GetPageCnt(); } +OUString SwXTextDocument::getPartPageRectangles() +{ + SolarMutexGuard aGuard; + + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + if (!pWrtShell) + return OUString(); + + return pWrtShell->getPageRectangles(); +} + int SwXTextDocument::getPart() { SolarMutexGuard aGuard; |