[Libreoffice-commits] core.git: sw/inc sw/source

Miklos Vajna vmiklos at collabora.co.uk
Fri May 30 09:06:39 PDT 2014


 sw/inc/textboxhelper.hxx             |    4 ++++
 sw/source/core/doc/textboxhelper.cxx |   18 ++++++++++++++++++
 sw/source/core/unocore/unodraw.cxx   |    7 +++++++
 3 files changed, 29 insertions(+)

New commits:
commit 24d8bcc763b550d8da0e0a6b9f5c3b4113662b5c
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri May 30 17:42:22 2014 +0200

    SwTextBoxHelper: handle size when it's set before CustomShapeGeometry
    
    E.g. the ODF import won't set an explicit size, it'll just set a
    Transformation property, and a CustomShapeGeometry one, which contains
    the textbox rectangle.
    
    Change-Id: I9ac7ab5a324dc9c7c5ce3196fee8d257b7426f41

diff --git a/sw/inc/textboxhelper.hxx b/sw/inc/textboxhelper.hxx
index 5deb5f6..75d2fac 100644
--- a/sw/inc/textboxhelper.hxx
+++ b/sw/inc/textboxhelper.hxx
@@ -36,8 +36,12 @@ public:
     static void destroy(SwFrmFmt* pShape);
     /// Get interface of a shape's TextBox, if there is any.
     static css::uno::Any queryInterface(SwFrmFmt* pShape, const css::uno::Type& rType);
+
     /// Sync property of TextBox with the one of the shape.
     static void syncProperty(SwFrmFmt* pShape, sal_uInt16 nWID, sal_uInt8 nMemberID, const css::uno::Any& rValue);
+    /// Does the same, but works on properties which lack an sw-specific WID / MemberID.
+    static void syncProperty(SwFrmFmt* pShape, const OUString& rPropertyName, const css::uno::Any& rValue);
+
     /// If we have an associated TextFrame, then return that.
     static SwFrmFmt* findTextBox(SwFrmFmt* pShape);
     /// Return the textbox rectangle of a draw shape (in twips).
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index 02980e3..34e9590 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -26,6 +26,7 @@
 #include <svx/unopage.hxx>
 #include <svx/svdpage.hxx>
 
+#include <com/sun/star/document/XActionLockable.hpp>
 #include <com/sun/star/table/BorderLine2.hpp>
 #include <com/sun/star/text/SizeType.hpp>
 #include <com/sun/star/text/TextContentAnchorType.hpp>
@@ -212,7 +213,18 @@ Rectangle SwTextBoxHelper::getTextRectangle(SwFrmFmt* pShape, bool bAbsolute)
     aRet.SetEmpty();
     SdrObjCustomShape* pCustomShape = dynamic_cast<SdrObjCustomShape*>(pShape->FindRealSdrObject());
     if (pCustomShape)
+    {
+        // Need to temporarily release the lock acquired in
+        // SdXMLShapeContext::AddShape(), otherwise we get an empty rectangle,
+        // see EnhancedCustomShapeEngine::getTextBounds().
+        uno::Reference<document::XActionLockable> xLockable(pCustomShape->getUnoShape(), uno::UNO_QUERY);
+        sal_Int16 nLocks = 0;
+        if (xLockable.is())
+            nLocks = xLockable->resetActionLocks();
         pCustomShape->GetTextBounds(aRet);
+        if (nLocks)
+            xLockable->setActionLocks(nLocks);
+    }
 
     if (!bAbsolute)
     {
@@ -228,6 +240,12 @@ Rectangle SwTextBoxHelper::getTextRectangle(SwFrmFmt* pShape, bool bAbsolute)
     return aRet;
 }
 
+void SwTextBoxHelper::syncProperty(SwFrmFmt* pShape, const OUString& rPropertyName, const css::uno::Any& /*rValue*/)
+{
+    if (rPropertyName == "CustomShapeGeometry")
+        syncProperty(pShape, RES_FRM_SIZE, MID_FRMSIZE_SIZE, uno::Any());
+}
+
 void SwTextBoxHelper::syncProperty(SwFrmFmt* pShape, sal_uInt16 nWID, sal_uInt8 nMemberId, const css::uno::Any& rValue)
 {
     // No shape yet? Then nothing to do, initial properties are set by create().
diff --git a/sw/source/core/unocore/unodraw.cxx b/sw/source/core/unocore/unodraw.cxx
index e3f787c..abb97a1 100644
--- a/sw/source/core/unocore/unodraw.cxx
+++ b/sw/source/core/unocore/unodraw.cxx
@@ -1442,6 +1442,13 @@ void SwXShape::setPropertyValue(const OUString& rPropertyName, const uno::Any& a
             }
             else
                 xPrSet->setPropertyValue(rPropertyName, aValue);
+
+            if (pFmt)
+            {
+                // We have a pFmt (but no pEntry): try to sync TextBox property.
+                SwTextBoxHelper::syncProperty(pFmt, rPropertyName, aValue);
+            }
+
             // #i31698# - restore object position, if caption point is set.
             if ( rPropertyName == "CaptionPoint" && getShapeType() == "com.sun.star.drawing.CaptionShape" )
             {


More information about the Libreoffice-commits mailing list