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