sd/source/core/CustomAnimationEffect.cxx        |    1 
 sd/source/ui/animations/CustomAnimationList.cxx |   13 ++++++++
 sd/source/ui/animations/CustomAnimationPane.cxx |   36 ++++++++++++++++++++++++
 svx/source/unodraw/unoshtxt.cxx                 |    5 ++-
 4 files changed, 52 insertions(+), 3 deletions(-)

New commits:
commit f8eb28d6b6e306d87e5cec3f1b6f83c841a5f01e
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Feb 9 19:52:43 2022 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Feb 10 21:30:44 2022 +0100

    tdf#137571 use XActionGuard to lock blocks that don't need updating
    
    so we can avoid constantly generating new TextForwarders which
    are the same as the one they replace.
    
    The underlying problem is that of tdf#123470 but this solution should
    be safe to backport
    
    Change-Id: I742f2a9ce0024adf9bd0acc5bb8edb9372fc0af5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129775
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/sd/source/core/CustomAnimationEffect.cxx 
b/sd/source/core/CustomAnimationEffect.cxx
index cf6dcadc1b86..d9d88443ebe5 100644
--- a/sd/source/core/CustomAnimationEffect.cxx
+++ b/sd/source/core/CustomAnimationEffect.cxx
@@ -51,6 +51,7 @@
 #include <com/sun/star/util/XCloneable.hpp>
 #include <com/sun/star/util/XChangesNotifier.hpp>
 #include <comphelper/processfactory.hxx>
+#include <comphelper/scopeguard.hxx>
 #include <comphelper/sequence.hxx>
 #include <com/sun/star/lang/Locale.hpp>
 #include <com/sun/star/i18n/BreakIterator.hpp>
diff --git a/sd/source/ui/animations/CustomAnimationList.cxx 
b/sd/source/ui/animations/CustomAnimationList.cxx
index 356093d69810..09822606d67d 100644
--- a/sd/source/ui/animations/CustomAnimationList.cxx
+++ b/sd/source/ui/animations/CustomAnimationList.cxx
@@ -17,6 +17,8 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <com/sun/star/document/XActionLockable.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
 #include <com/sun/star/drawing/XShapes.hpp>
 #include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
 #include <com/sun/star/presentation/EffectNodeType.hpp>
@@ -26,7 +28,7 @@
 #include <com/sun/star/presentation/EffectCommands.hpp>
 #include <com/sun/star/text/XTextRange.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <comphelper/scopeguard.hxx>
 #include <CustomAnimationList.hxx>
 #include <CustomAnimationPreset.hxx>
 #include <vcl/commandevent.hxx>
@@ -182,6 +184,15 @@ static OUString getDescription( const Any& rTarget, bool 
bWithText )
         ParagraphTarget aParaTarget;
         rTarget >>= aParaTarget;
 
+        css::uno::Reference<css::document::XActionLockable> 
xLockable(aParaTarget.Shape, css::uno::UNO_QUERY);
+        if (xLockable.is())
+            xLockable->addActionLock();
+        comphelper::ScopeGuard aGuard([&xLockable]()
+        {
+            if (xLockable.is())
+                xLockable->removeActionLock();
+        });
+
         Reference< XEnumerationAccess > xText( aParaTarget.Shape, 
UNO_QUERY_THROW );
         Reference< XEnumeration > xEnumeration( xText->createEnumeration(), 
css::uno::UNO_SET_THROW );
         sal_Int32 nPara = aParaTarget.Paragraph;
diff --git a/sd/source/ui/animations/CustomAnimationPane.cxx 
b/sd/source/ui/animations/CustomAnimationPane.cxx
index 66ded2c772c9..3f52abb544b3 100644
--- a/sd/source/ui/animations/CustomAnimationPane.cxx
+++ b/sd/source/ui/animations/CustomAnimationPane.cxx
@@ -22,6 +22,7 @@
 #include <com/sun/star/animations/AnimationNodeType.hpp>
 #include <com/sun/star/animations/ParallelTimeContainer.hpp>
 #include <com/sun/star/view/XSelectionSupplier.hpp>
+#include <com/sun/star/document/XActionLockable.hpp>
 #include <com/sun/star/drawing/XDrawView.hpp>
 #include <com/sun/star/drawing/XShape.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
@@ -36,6 +37,7 @@
 #include <com/sun/star/drawing/LineStyle.hpp>
 #include <com/sun/star/drawing/FillStyle.hpp>
 #include <comphelper/processfactory.hxx>
+#include <comphelper/scopeguard.hxx>
 #include <sfx2/dispatch.hxx>
 #include <sfx2/viewfrm.hxx>
 #include <tools/debug.hxx>
@@ -1657,6 +1659,15 @@ static bool getTextSelection( const Any& rSelection, 
Reference< XShape >& xShape
     {
         xShape.set( xSelectedText->getText(), UNO_QUERY_THROW );
 
+        css::uno::Reference<css::document::XActionLockable> xLockable(xShape, 
css::uno::UNO_QUERY);
+        if (xLockable.is())
+            xLockable->addActionLock();
+        comphelper::ScopeGuard aGuard([&xLockable]()
+        {
+            if (xLockable.is())
+                xLockable->removeActionLock();
+        });
+
         Reference< XTextRangeCompare > xTextRangeCompare( xShape, 
UNO_QUERY_THROW );
         Reference< XEnumerationAccess > xParaEnumAccess( xShape, 
UNO_QUERY_THROW );
         Reference< XEnumeration > xParaEnum( 
xParaEnumAccess->createEnumeration(), UNO_SET_THROW );
@@ -1710,6 +1721,22 @@ static bool getTextSelection( const Any& rSelection, 
Reference< XShape >& xShape
     return false;
 }
 
+namespace
+{
+    Reference<XShape> getTargetShape(const Any& rTarget)
+    {
+        Reference<XShape> xShape;
+        rTarget >>= xShape;
+        if( !xShape.is() )
+        {
+            ParagraphTarget aParaTarget;
+            if (rTarget >>= aParaTarget)
+                xShape = aParaTarget.Shape;
+        }
+        return xShape;
+    }
+}
+
 void CustomAnimationPane::onAdd()
 {
     bool bHasText = true;
@@ -1815,6 +1842,15 @@ void CustomAnimationPane::onAdd()
         bool bFirst = true;
         for( const auto& rTarget : aTargets )
         {
+            css::uno::Reference<css::document::XActionLockable> 
xLockable(getTargetShape(rTarget), css::uno::UNO_QUERY);
+            if (xLockable.is())
+                xLockable->addActionLock();
+            comphelper::ScopeGuard aGuard([&xLockable]()
+            {
+                if (xLockable.is())
+                    xLockable->removeActionLock();
+            });
+
             CustomAnimationEffectPtr pCreated = mpMainSequence->append( 
pDescriptor, rTarget, fDuration );
 
             // if only one shape with text and no fill or outline is selected, 
animate only by first level paragraphs
diff --git a/svx/source/unodraw/unoshtxt.cxx b/svx/source/unodraw/unoshtxt.cxx
index ae35681d57b5..02c70e3049a9 100644
--- a/svx/source/unodraw/unoshtxt.cxx
+++ b/svx/source/unodraw/unoshtxt.cxx
@@ -661,8 +661,9 @@ SvxTextForwarder* SvxTextEditSourceImpl::GetTextForwarder()
     {
         // tdf#123470 if the text edit mode of the shape is active, then we
         // cannot trust a previously cached TextForwarder state as the text may
-        // be out of date, so force a refetch in that case.
-        if (IsEditMode())
+        // be out of date, so force a refetch in that case, unless locked 
against
+        // changes
+        if (IsEditMode() && mpTextForwarder && !mbIsLocked)
         {
             assert(!mbForwarderIsEditMode); // because without a view there is 
no other option except !mbForwarderIsEditMode
             bool bTextEditActive = false;

Reply via email to