summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannah Meeks <hmeeks4135@gmail.com>2022-06-29 16:27:17 +0100
committerTomaž Vajngerl <quikee@gmail.com>2022-07-12 07:38:07 +0200
commitf6be2bf969bac1f5c6ac452b313374ba09ffaa58 (patch)
tree9e2ae5213af0d92ea3b8933c804347a68ee3aabf
parentfaa88099d842b83365fa86a661dc56f0031a9b29 (diff)
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>
-rw-r--r--sw/inc/doc.hxx7
-rw-r--r--sw/source/core/doc/docnew.cxx2
-rw-r--r--sw/source/ui/vba/vbafind.cxx30
-rw-r--r--sw/source/ui/vba/vbafind.hxx5
-rw-r--r--sw/source/ui/vba/vbaselection.cxx3
5 files changed, 42 insertions, 5 deletions
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 624686890850..e88214977e76 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 1a9f7e868980..576dde4c7a89 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 db34a32f9b64..3c9940cc0e1f 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 cdbcc95538f7..ed2df832f00e 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 dde7d4e21fb5..43da7dc6af48 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