sw/inc/IDocumentDrawModelAccess.hxx | 5 ++ sw/source/core/crsr/findtxt.cxx | 26 ++++++++-- sw/source/core/doc/DocumentDrawModelManager.cxx | 59 ++++++++++++++++++++++++ sw/source/core/inc/DocumentDrawModelManager.hxx | 2 sw/source/uibase/inc/view.hxx | 2 sw/source/uibase/uiview/viewdraw.cxx | 7 ++ 6 files changed, 96 insertions(+), 5 deletions(-)
New commits: commit bdc1824ea7acfa2fe9d71cdbe57882acce155577 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Tue May 19 17:20:10 2015 +0200 SwPaM::Find: search in shapes anchored to the range Change-Id: I028f95029deaebddcacf2730d429ad53abbc79fa diff --git a/sw/source/core/crsr/findtxt.cxx b/sw/source/core/crsr/findtxt.cxx index 200d02b..ba7dcbd 100644 --- a/sw/source/core/crsr/findtxt.cxx +++ b/sw/source/core/crsr/findtxt.cxx @@ -37,6 +37,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <IDocumentState.hxx> +#include <IDocumentDrawModelAccess.hxx> #include <pamtyp.hxx> #include <ndtxt.hxx> #include <swundo.hxx> @@ -244,7 +245,8 @@ bool SwPaM::Find( const SearchOptions& rSearchOpt, bool bSearchInNotes , utl::Te { if( pNode->IsTxtNode() ) { - sal_Int32 nTxtLen = pNode->GetTxtNode()->GetTxt().getLength(); + SwTxtNode& rTxtNode = *pNode->GetTxtNode(); + sal_Int32 nTxtLen = rTxtNode.GetTxt().getLength(); sal_Int32 nEnd; if( rNdIdx == pPam->GetMark()->nNode ) nEnd = pPam->GetMark()->nContent.GetIndex(); @@ -256,7 +258,7 @@ bool SwPaM::Find( const SearchOptions& rSearchOpt, bool bSearchInNotes , utl::Te // if there are SwPostItFields inside our current node text, we // split the text into separate pieces and search for text inside // the pieces as well as inside the fields - const SwpHints *pHts = pNode->GetTxtNode()->GetpSwpHints(); + const SwpHints *pHts = rTxtNode.GetpSwpHints(); // count PostItFields by looping over all fields sal_Int32 aNumberPostits = 0; @@ -295,14 +297,15 @@ bool SwPaM::Find( const SearchOptions& rSearchOpt, bool bSearchInNotes , utl::Te SwViewShell *const pWrtShell = (pDocShell) ? pDocShell->GetEditShell() : 0; SwPostItMgr *const pPostItMgr = (pWrtShell) ? pWrtShell->GetPostItMgr() : 0; + SvxSearchItem aSearchItem(SID_SEARCH_ITEM); + aSearchItem.SetSearchOptions(rSearchOpt); + aSearchItem.SetBackward(!bSrchForward); + // If there is an active text edit, then search there. if (SdrView* pSdrView = pWrtShell->GetDrawView()) { if (pSdrView->GetTextEditObject()) { - SvxSearchItem aSearchItem(SID_SEARCH_ITEM); - aSearchItem.SetSearchOptions(rSearchOpt); - aSearchItem.SetBackward(!bSrchForward); sal_uInt16 nResult = pSdrView->GetTextEditOutlinerView()->StartSearchAndReplace(aSearchItem); if (!nResult) { @@ -318,6 +321,19 @@ bool SwPaM::Find( const SearchOptions& rSearchOpt, bool bSearchInNotes , utl::Te } } + // If there are any shapes anchored to this node, search there. + SwPaM aPaM(pNode->GetDoc()->GetNodes().GetEndOfContent()); + aPaM.GetPoint()->nNode = rTxtNode; + aPaM.GetPoint()->nContent.Assign(aPaM.GetPoint()->nNode.GetNode().GetTxtNode(), nStart); + aPaM.SetMark(); + aPaM.GetMark()->nNode = rTxtNode.GetIndex() + 1; + aPaM.GetMark()->nContent.Assign(aPaM.GetMark()->nNode.GetNode().GetTxtNode(), 0); + if (pNode->GetDoc()->getIDocumentDrawModelAccess().Search(aPaM, aSearchItem)) + { + bFound = true; + break; + } + sal_Int32 aStart = 0; // do we need to finish a note? if (pPostItMgr && pPostItMgr->HasActiveSidebarWin()) commit b97fb340b23e1b6a48c5c95c8d42e9f10ece1748 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Tue May 19 17:19:14 2015 +0200 Add sw::DocumentDrawModelManager::Search() Change-Id: Idcbbb9e049f0fbc5d6503b86fd506df9fb2ad3c5 diff --git a/sw/inc/IDocumentDrawModelAccess.hxx b/sw/inc/IDocumentDrawModelAccess.hxx index 7cf0b86..a8b5ba2 100644 --- a/sw/inc/IDocumentDrawModelAccess.hxx +++ b/sw/inc/IDocumentDrawModelAccess.hxx @@ -23,7 +23,9 @@ #include <svx/svdtypes.hxx> class SwDrawModel; +class SwPaM; class SdrPageView; +class SvxSearchItem; class IDocumentDrawModelAccess { @@ -89,6 +91,9 @@ public: */ virtual SdrLayerID GetInvisibleLayerIdByVisibleOne( const SdrLayerID& _nVisibleLayerId ) = 0; + /// Searches text in shapes anchored inside rPaM. + virtual bool Search(const SwPaM& rPaM, const SvxSearchItem& rSearchItem) = 0; + protected: virtual ~IDocumentDrawModelAccess() {}; diff --git a/sw/source/core/doc/DocumentDrawModelManager.cxx b/sw/source/core/doc/DocumentDrawModelManager.cxx index 5cb1e0d..bed970f 100644 --- a/sw/source/core/doc/DocumentDrawModelManager.cxx +++ b/sw/source/core/doc/DocumentDrawModelManager.cxx @@ -26,11 +26,15 @@ #include <IDocumentLinksAdministration.hxx> #include <IDocumentLayoutAccess.hxx> #include <docsh.hxx> +#include <wrtsh.hxx> #include <swtypes.hxx> +#include <ndtxt.hxx> #include <swhints.hxx> #include <viewsh.hxx> +#include <view.hxx> #include <drawdoc.hxx> #include <rootfrm.hxx> +#include <fmtanchr.hxx> #include <editeng/eeitem.hxx> #include <editeng/fhgtitem.hxx> #include <svx/svdmodel.hxx> @@ -38,7 +42,9 @@ #include <svx/svdoutl.hxx> #include <svx/svdpage.hxx> #include <svx/svdpagv.hxx> +#include <svx/svdotext.hxx> #include <svl/smplhint.hxx> +#include <svl/srchitem.hxx> #include <tools/link.hxx> class SdrOutliner; @@ -364,6 +370,59 @@ SdrLayerID DocumentDrawModelManager::GetInvisibleLayerIdByVisibleOne( const SdrL return nInvisibleLayerId; } +bool DocumentDrawModelManager::Search(const SwPaM& rPaM, const SvxSearchItem& rSearchItem) +{ + SwPosFlyFrms aFrames = m_rDoc.GetAllFlyFmts(&rPaM, /*bDrawAlso=*/true); + + for (const SwPosFlyFrmPtr& pPosFlyFrm : aFrames) + { + // Filter for at-paragraph anchored draw frames. + const SwFrmFmt& rFrmFmt = pPosFlyFrm->GetFmt(); + const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor(); + if (rAnchor.GetAnchorId() != FLY_AT_PARA || rFrmFmt.Which() != RES_DRAWFRMFMT) + continue; + + // Does the shape have matching text? + SdrOutliner& rOutliner = GetDrawModel()->GetDrawOutliner(); + SdrObject* pObject = const_cast<SdrObject*>(rFrmFmt.FindSdrObject()); + SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObject); + if (!pTextObj) + continue; + const OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject(); + if (!pParaObj) + continue; + rOutliner.SetText(*pParaObj); + SwDocShell* pDocShell = m_rDoc.GetDocShell(); + if (!pDocShell) + return false; + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + if (!pWrtShell) + return false; + if (!rOutliner.HasText(rSearchItem)) + continue; + + // If so, then select highlight the search result. + pWrtShell->SelectObj(Point(), 0, pObject); + SwView* pView = pDocShell->GetView(); + if (!pView) + return false; + if (!pView->EnterShapeDrawTextMode(pObject)) + continue; + SdrView* pSdrView = pWrtShell->GetDrawView(); + if (!pSdrView) + return false; + OutlinerView* pOutlinerView = pSdrView->GetTextEditOutlinerView(); + if (!rSearchItem.GetBackward()) + pOutlinerView->SetSelection(ESelection(0, 0, 0, 0)); + else + pOutlinerView->SetSelection(ESelection(EE_PARA_MAX_COUNT, EE_TEXTPOS_MAX_COUNT, EE_PARA_MAX_COUNT, EE_TEXTPOS_MAX_COUNT)); + pOutlinerView->StartSearchAndReplace(rSearchItem); + return true; + } + + return false; +} + void DocumentDrawModelManager::DrawNotifyUndoHdl() { mpDrawModel->SetNotifyUndoActionHdl( Link<>() ); diff --git a/sw/source/core/inc/DocumentDrawModelManager.hxx b/sw/source/core/inc/DocumentDrawModelManager.hxx index b87b06f..32656a8 100644 --- a/sw/source/core/inc/DocumentDrawModelManager.hxx +++ b/sw/source/core/inc/DocumentDrawModelManager.hxx @@ -63,6 +63,8 @@ public: virtual SdrLayerID GetInvisibleLayerIdByVisibleOne( const SdrLayerID& _nVisibleLayerId ) SAL_OVERRIDE; + virtual bool Search(const SwPaM& rPaM, const SvxSearchItem& rSearchItem) SAL_OVERRIDE; + virtual ~DocumentDrawModelManager() {} private: commit 0549f250aac361075287d8acae9b7ee73c66256d Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Tue May 19 17:18:19 2015 +0200 Add SwView::EnterShapeDrawTextMode() Change-Id: Ic19519ee727bd4b6c18d14dc3eb21b2eeb4395c9 diff --git a/sw/source/uibase/inc/view.hxx b/sw/source/uibase/inc/view.hxx index c89d330..9d6a9b2 100644 --- a/sw/source/uibase/inc/view.hxx +++ b/sw/source/uibase/inc/view.hxx @@ -556,6 +556,8 @@ public: inline void FlipDrawSelMode() { m_bDrawSelMode = !m_bDrawSelMode; } void NoRotate(); // turn off rotate mode bool EnterDrawTextMode(const Point& aDocPos); + /// Same as EnterDrawTextMode(), but takes an SdrObject instead of guessing it by document position. + bool EnterShapeDrawTextMode(SdrObject* pObject); void LeaveDrawCreate() { m_nDrawSfxId = m_nFormSfxId = USHRT_MAX; m_sDrawCustom.clear();} bool IsDrawMode() { return (m_nDrawSfxId != USHRT_MAX || m_nFormSfxId != USHRT_MAX); } bool IsFormMode() const; diff --git a/sw/source/uibase/uiview/viewdraw.cxx b/sw/source/uibase/uiview/viewdraw.cxx index 51e0376..38c405f 100644 --- a/sw/source/uibase/uiview/viewdraw.cxx +++ b/sw/source/uibase/uiview/viewdraw.cxx @@ -504,6 +504,13 @@ bool SwView::EnterDrawTextMode(const Point& aDocPos) return bReturn; } +bool SwView::EnterShapeDrawTextMode(SdrObject* pObject) +{ + SdrView* pSdrView = GetWrtShell().GetDrawView(); + SdrPageView* pPageView = pSdrView->GetSdrPageView(); + return BeginTextEdit(pObject, pPageView, m_pEditWin); +} + // Enable DrawTextEditMode bool SwView::BeginTextEdit(SdrObject* pObj, SdrPageView* pPV, vcl::Window* pWin, _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits