[Libreoffice-commits] core.git: sw/inc sw/source
Miklos Vajna
vmiklos at collabora.co.uk
Thu Jun 19 08:17:00 PDT 2014
sw/inc/textboxhelper.hxx | 4 ++
sw/source/core/doc/docfly.cxx | 2 +
sw/source/core/doc/textboxhelper.cxx | 50 +++++++++++++++++++++++++++++++++++
3 files changed, 56 insertions(+)
New commits:
commit 8ba6d7a809d51edcb8b93d3298b9d27155276cec
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Thu Jun 19 17:10:59 2014 +0200
SwDoc::SetFlyFrmAttr: sync position between draw shape and its textbox
The effect of this is that if you move around a shape (having a textbox)
with the keyboard or mouse, then the position of the textbox is now also
adjusted as you would expect it, as a user.
Change-Id: Ie079f8c7b76e9a97095e4233eded5bda514cf405
diff --git a/sw/inc/textboxhelper.hxx b/sw/inc/textboxhelper.hxx
index 665f82a..c7ba2f4 100644
--- a/sw/inc/textboxhelper.hxx
+++ b/sw/inc/textboxhelper.hxx
@@ -23,6 +23,7 @@
#include <swdllapi.h>
class SdrPage;
+class SfxItemSet;
class SwFrmFmt;
class SwFrmFmts;
class SwFmtCntnt;
@@ -57,6 +58,9 @@ public:
/// Get a property of the underlying TextFrame.
static void getProperty(SwFrmFmt* pShape, sal_uInt16 nWID, sal_uInt8 nMemberID, css::uno::Any& rValue);
+ /// Similar to syncProperty(), but used by the internal API (e.g. for UI purposes).
+ static void syncFlyFrmAttr(SwFrmFmt& rShape, SfxItemSet& rSet);
+
/// If we have an associated TextFrame, then return that.
static SwFrmFmt* findTextBox(SwFrmFmt* pShape);
static SwFrmFmt* findTextBox(css::uno::Reference<css::drawing::XShape> xShape);
diff --git a/sw/source/core/doc/docfly.cxx b/sw/source/core/doc/docfly.cxx
index d3982f1..79f516e 100644
--- a/sw/source/core/doc/docfly.cxx
+++ b/sw/source/core/doc/docfly.cxx
@@ -534,6 +534,8 @@ bool SwDoc::SetFlyFrmAttr( SwFrmFmt& rFlyFmt, SfxItemSet& rSet )
SetModified();
+ SwTextBoxHelper::syncFlyFrmAttr(rFlyFmt, rSet);
+
return bRet;
}
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index 39e9828..06bbc7f 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -12,6 +12,7 @@
#include <fmtcntnt.hxx>
#include <fmtanchr.hxx>
#include <fmtcnct.hxx>
+#include <fmtornt.hxx>
#include <doc.hxx>
#include <docsh.hxx>
#include <docary.hxx>
@@ -30,6 +31,7 @@
#include <svx/svdoashp.hxx>
#include <svx/unopage.hxx>
#include <svx/svdpage.hxx>
+#include <svl/itemiter.hxx>
#include <com/sun/star/document/XActionLockable.hpp>
#include <com/sun/star/table/BorderLine2.hpp>
@@ -472,4 +474,52 @@ void SwTextBoxHelper::restoreLinks(std::set<_ZSortFly>& rOld, std::vector<SwFrmF
}
}
+void SwTextBoxHelper::syncFlyFrmAttr(SwFrmFmt& rShape, SfxItemSet& rSet)
+{
+ if (SwFrmFmt* pFmt = findTextBox(&rShape))
+ {
+ SfxItemSet aTextBoxSet(pFmt->GetDoc()->GetAttrPool(), aFrmFmtSetRange);
+
+ SfxItemIter aIter(rSet);
+ sal_uInt16 nWhich = aIter.GetCurItem()->Which();
+ do
+ {
+ switch (nWhich)
+ {
+ case RES_VERT_ORIENT:
+ {
+ const SwFmtVertOrient& rOrient = static_cast<const SwFmtVertOrient&>(*aIter.GetCurItem());
+ SwFmtVertOrient aOrient(rOrient);
+
+ Rectangle aRect = getTextRectangle(&rShape, /*bAbsolute=*/false);
+ if (!aRect.IsEmpty())
+ aOrient.SetPos(aOrient.GetPos() + aRect.getY());
+
+ aTextBoxSet.Put(aOrient);
+ }
+ break;
+ case RES_HORI_ORIENT:
+ {
+ const SwFmtHoriOrient& rOrient = static_cast<const SwFmtHoriOrient&>(*aIter.GetCurItem());
+ SwFmtHoriOrient aOrient(rOrient);
+
+ Rectangle aRect = getTextRectangle(&rShape, /*bAbsolute=*/false);
+ if (!aRect.IsEmpty())
+ aOrient.SetPos(aOrient.GetPos() + aRect.getX());
+
+ aTextBoxSet.Put(aOrient);
+ }
+ break;
+ }
+
+ if (aIter.IsAtEnd())
+ break;
+ }
+ while (0 != (nWhich = aIter.NextItem()->Which()));
+
+ if (aTextBoxSet.Count())
+ pFmt->GetDoc()->SetFlyFrmAttr(*pFmt, aTextBoxSet);
+ }
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list