tdf#149775 - VBA: Find should stay around.
Previously we would create and destroy it for each set of a
property on it making it useless. VBA Find object oddly
represents the Find dialog in Word. Add it to SwDoc.
Change-Id: Id9850cbd2296b24f9c93dc99b2967095bd84921f
Signed-off-by: Hannah Meeks <hmeeks4135@gmail.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136630
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 6246868..e882149 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -175,6 +175,10 @@ namespace com::sun::star {
namespace script::vba { class XVBAEventProcessor; }
}
namespace ooo::vba::word {
class XFind;
}
namespace sfx2 {
class IXmlIdRegistry;
}
@@ -281,6 +285,7 @@ class SW_DLLPUBLIC SwDoc final
std::unique_ptr<IGrammarContact> mpGrammarContact; //< for grammar checking in paragraphs during editing
css::uno::Reference< css::script::vba::XVBAEventProcessor > mxVbaEvents;
css::uno::Reference< ooo::vba::word::XFind > mxVbaFind;
css::uno::Reference<css::container::XNameContainer> m_xTemplateToProjectCache;
/// Table styles (autoformats that are applied with table changes).
@@ -1619,6 +1624,8 @@ public:
void SetDefaultPageMode(bool bSquaredPageMode);
bool IsSquaredPageMode() const;
css::uno::Reference< ooo::vba::word::XFind > getVbaFind() const { return mxVbaFind; }
void setVbaFind( const css::uno::Reference< ooo::vba::word::XFind > &xFind) { mxVbaFind = xFind; }
css::uno::Reference< css::script::vba::XVBAEventProcessor > const & GetVbaEventProcessor();
void SetVBATemplateToProjectCache( css::uno::Reference< css::container::XNameContainer > const & xCache ) { m_xTemplateToProjectCache = xCache; };
const css::uno::Reference< css::container::XNameContainer >& GetVBATemplateToProjectCache() const { return m_xTemplateToProjectCache; };
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index 1a9f7e8..576dde4c 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -395,6 +395,8 @@ SwDoc::SwDoc()
*/
SwDoc::~SwDoc()
{
mxVbaFind.clear();
// nothing here should create Undo actions!
GetIDocumentUndoRedo().DoUndo(false);
diff --git a/sw/source/ui/vba/vbafind.cxx b/sw/source/ui/vba/vbafind.cxx
index db34a32..3c9940c 100644
--- a/sw/source/ui/vba/vbafind.cxx
+++ b/sw/source/ui/vba/vbafind.cxx
@@ -22,13 +22,18 @@
#include <ooo/vba/word/WdReplace.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/text/XTextRangeCompare.hpp>
#include <doc.hxx>
#include <docsh.hxx>
#include "wordvbahelper.hxx"
#include <rtl/ref.hxx>
#include <sal/log.hxx>
using namespace ::ooo::vba;
using namespace ::com::sun::star;
SwVbaFind::SwVbaFind( const uno::Reference< ooo::vba::XHelperInterface >& rParent, const uno::Reference< uno::XComponentContext >& rContext, const uno::Reference< frame::XModel >& xModel, const uno::Reference< text::XTextRange >& xTextRange ) :
SwVbaFind_BASE( rParent, rContext ), mxModel( xModel ), mxTextRange( xTextRange ), mbReplace( false ), mnReplaceType( word::WdReplace::wdReplaceOne ), mnWrap( word::WdFindWrap::wdFindStop )
SwVbaFind::SwVbaFind( const uno::Reference< ooo::vba::XHelperInterface >& rParent, const uno::Reference< uno::XComponentContext >& rContext, const uno::Reference< frame::XModel >& xModel ) :
SwVbaFind_BASE( rParent, rContext ), mxModel( xModel ), mbReplace( false ), mnReplaceType( word::WdReplace::wdReplaceOne ), mnWrap( word::WdFindWrap::wdFindStop )
{
mxReplaceable.set( mxModel, uno::UNO_QUERY_THROW );
mxPropertyReplace.set( mxReplaceable->createReplaceDescriptor(), uno::UNO_QUERY_THROW );
@@ -40,6 +45,27 @@ SwVbaFind::~SwVbaFind()
{
}
uno::Reference< word::XFind > SwVbaFind::GetOrCreateFind(const uno::Reference< ooo::vba::XHelperInterface >& rParent,
const uno::Reference< uno::XComponentContext >& rContext,
const uno::Reference< frame::XModel >& xModel,
const uno::Reference< text::XTextRange >& xTextRange)
{
rtl::Reference< SwVbaFind > xFind;
SwDoc* pDoc = word::getDocShell( xModel )->GetDoc();
if( pDoc )
xFind = dynamic_cast<SwVbaFind *>( pDoc->getVbaFind().get() );
if ( !xFind )
{
xFind = new SwVbaFind( rParent, rContext, xModel );
if ( pDoc )
pDoc->setVbaFind( xFind );
}
xFind->mxTextRange = xTextRange;
return xFind;
}
bool SwVbaFind::InRange( const uno::Reference< text::XTextRange >& xCurrentRange )
{
uno::Reference< text::XTextRangeCompare > xTRC( mxTextRange->getText(), uno::UNO_QUERY_THROW );
diff --git a/sw/source/ui/vba/vbafind.hxx b/sw/source/ui/vba/vbafind.hxx
index cdbcc95..ed2df83 100644
--- a/sw/source/ui/vba/vbafind.hxx
+++ b/sw/source/ui/vba/vbafind.hxx
@@ -57,9 +57,10 @@ private:
/// @throws css::uno::RuntimeException
bool SearchReplace();
public:
/// @throws css::uno::RuntimeException
SwVbaFind( const css::uno::Reference< ooo::vba::XHelperInterface >& rParent, const css::uno::Reference< css::uno::XComponentContext >& rContext, const css::uno::Reference< css::frame::XModel >& xModel, const css::uno::Reference< css::text::XTextRange >& xTextRange );
SwVbaFind( const css::uno::Reference< ooo::vba::XHelperInterface >& rParent, const css::uno::Reference< css::uno::XComponentContext >& rContext, const css::uno::Reference< css::frame::XModel >& xModel );
public:
static css::uno::Reference< ooo::vba::word::XFind > GetOrCreateFind(const css::uno::Reference< ooo::vba::XHelperInterface >& rParent, const css::uno::Reference< com::sun::star::uno::XComponentContext >& rContext, const css::uno::Reference< com::sun::star::frame::XModel >& xModel, const css::uno::Reference< css::text::XTextRange >& xTextRange);
virtual ~SwVbaFind() override;
// Attributes
diff --git a/sw/source/ui/vba/vbaselection.cxx b/sw/source/ui/vba/vbaselection.cxx
index dde7d4e..43da7dc 100644
--- a/sw/source/ui/vba/vbaselection.cxx
+++ b/sw/source/ui/vba/vbaselection.cxx
@@ -60,6 +60,7 @@
#include "vbastyle.hxx"
#include <docsh.hxx>
#include <tblenum.hxx>
#include <sal/log.hxx>
#include <fesh.hxx>
using namespace ::ooo::vba;
@@ -518,7 +519,7 @@ uno::Reference< word::XFind > SAL_CALL
SwVbaSelection::getFind()
{
uno::Reference< text::XTextRange > xTextRange = GetSelectedRange();
return uno::Reference< word::XFind >( new SwVbaFind( this, mxContext, mxModel, xTextRange ) );
return SwVbaFind::GetOrCreateFind(this, mxContext, mxModel, xTextRange);
}
uno::Any SAL_CALL