summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-05-27 09:03:51 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-05-27 09:32:42 +0200
commit72159041cbb70f59017df0b5c90c5fbbfb6b62aa (patch)
tree27192f49fe094b109bf445d7f136bb82da39e33a /sw
parent0a3fe4c281be942e75b498073378b39a6e1a8ba7 (diff)
Initial SwTextBoxHelper
Change-Id: I2674d72a2ba7bf49f102e09ed8435445c9687bb2
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/textboxhelper.hxx37
-rw-r--r--sw/source/core/doc/textboxhelper.cxx189
2 files changed, 226 insertions, 0 deletions
diff --git a/sw/inc/textboxhelper.hxx b/sw/inc/textboxhelper.hxx
new file mode 100644
index 000000000000..65ba9cf2cba4
--- /dev/null
+++ b/sw/inc/textboxhelper.hxx
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_SW_INC_TEXTBOXHELPER_HXX
+#define INCLUDED_SW_INC_TEXTBOXHELPER_HXX
+
+#include <com/sun/star/uno/Any.h>
+#include <com/sun/star/uno/Type.h>
+
+class SwFrmFmt;
+
+/**
+ * A TextBox is a TextFrame, that is tied to a drawinglayer shape.
+ *
+ * This class provides helper methods to create, query and maintain such
+ * TextBoxes.
+ */
+class SwTextBoxHelper
+{
+public:
+ /// Create a TextBox for a shape.
+ static void create(SwFrmFmt* pShape);
+ /// Get XTextAppend of a shape's TextBox, if there is any.
+ static css::uno::Any getXTextAppend(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 OUString& rPropertyName, const css::uno::Any& rValue);
+};
+
+#endif // INCLUDED_SW_INC_TEXTBOXHELPER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
new file mode 100644
index 000000000000..d7702f7ce9a0
--- /dev/null
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -0,0 +1,189 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <textboxhelper.hxx>
+#include <frmfmt.hxx>
+#include <fmtcntnt.hxx>
+#include <doc.hxx>
+#include <docsh.hxx>
+#include <docary.hxx>
+#include <unocoll.hxx>
+#include <unoframe.hxx>
+#include <unotextbodyhf.hxx>
+#include <unotextrange.hxx>
+#include <unomid.h>
+
+#include <svx/svdoashp.hxx>
+#include <svx/unopage.hxx>
+
+#include <com/sun/star/table/BorderLine2.hpp>
+#include <com/sun/star/text/SizeType.hpp>
+#include <com/sun/star/text/XTextContent.hpp>
+#include <com/sun/star/text/XTextDocument.hpp>
+
+using namespace com::sun::star;
+
+void SwTextBoxHelper::create(SwFrmFmt* pShape)
+{
+ // If TextBox wasn't enabled previously
+ if (!pShape->GetAttrSet().HasItem(RES_CNTNT))
+ {
+ // Create the associated TextFrame and insert it into the document.
+ uno::Reference<text::XTextContent> xTextFrame(SwXServiceProvider::MakeInstance(SW_SERVICE_TYPE_TEXTFRAME, pShape->GetDoc()), uno::UNO_QUERY);
+ uno::Reference<text::XTextDocument> xTextDocument(pShape->GetDoc()->GetDocShell()->GetBaseModel(), uno::UNO_QUERY);
+ uno::Reference<text::XTextContentAppend> xTextContentAppend(xTextDocument->getText(), uno::UNO_QUERY);
+ xTextContentAppend->appendTextContent(xTextFrame, uno::Sequence<beans::PropertyValue>());
+
+ // Initialize properties.
+ uno::Reference<beans::XPropertySet> xPropertySet(xTextFrame, uno::UNO_QUERY);
+ uno::Any aEmptyBorder = uno::makeAny(table::BorderLine2());
+ xPropertySet->setPropertyValue("TopBorder", aEmptyBorder);
+ xPropertySet->setPropertyValue("BottomBorder", aEmptyBorder);
+ xPropertySet->setPropertyValue("LeftBorder", aEmptyBorder);
+ xPropertySet->setPropertyValue("RightBorder", aEmptyBorder);
+
+ xPropertySet->setPropertyValue("FillTransparence", uno::makeAny(sal_Int32(100)));
+
+ xPropertySet->setPropertyValue("SizeType", uno::makeAny(text::SizeType::FIX));
+
+ // Link its text range to the original shape.
+ uno::Reference<text::XTextRange> xTextBox(xTextFrame, uno::UNO_QUERY_THROW);
+ SwUnoInternalPaM aInternalPaM(*pShape->GetDoc());
+ if (sw::XTextRangeToSwPaM(aInternalPaM, xTextBox))
+ {
+ SwAttrSet aSet(pShape->GetAttrSet());
+ SwFmtCntnt aCntnt(aInternalPaM.GetNode()->StartOfSectionNode());
+ aSet.Put(aCntnt);
+ pShape->SetFmtAttr(aSet);
+ }
+ }
+}
+
+// If we have an associated TextFrame, then return that.
+SwFrmFmt* lcl_findTextBox(SwFrmFmt* pShape)
+{
+ SwFrmFmt* pRet = 0;
+
+ if (pShape->GetAttrSet().HasItem(RES_CNTNT))
+ {
+ const SwFmtCntnt& rCntnt = pShape->GetCntnt();
+ SwFrmFmts& rSpzFrmFmts = *pShape->GetDoc()->GetSpzFrmFmts();
+ for (SwFrmFmts::iterator it = rSpzFrmFmts.begin(); it != rSpzFrmFmts.end(); ++it)
+ {
+ SwFrmFmt* pFmt = *it;
+ if (pFmt->Which() == RES_FLYFRMFMT && pFmt->GetAttrSet().HasItem(RES_CNTNT) && pFmt->GetCntnt() == rCntnt)
+ {
+ pRet = pFmt;
+ break;
+ }
+ }
+ }
+
+ return pRet;
+}
+
+uno::Any SwTextBoxHelper::getXTextAppend(SwFrmFmt* pShape, const uno::Type& rType)
+{
+ uno::Any aRet;
+
+ if (rType == cppu::UnoType<css::text::XTextAppend>::get())
+ {
+ if (SwFrmFmt* pFmt = lcl_findTextBox(pShape))
+ {
+ uno::Reference<text::XTextAppend> xTextAppend(static_cast<cppu::OWeakObject*>(SwXFrames::GetObject(*pFmt, FLYCNTTYPE_FRM)), uno::UNO_QUERY);
+ aRet <<= xTextAppend;
+ }
+ }
+
+ return aRet;
+}
+
+void SwTextBoxHelper::syncProperty(SwFrmFmt* pShape, sal_uInt16 nWID, sal_uInt8 nMemberId, const OUString& rPropertyName, const css::uno::Any& rValue)
+{
+ uno::Any aValue(rValue);
+ nMemberId &= ~CONVERT_TWIPS;
+
+ if (SwFrmFmt* pFmt = lcl_findTextBox(pShape))
+ {
+ bool bSync = false;
+ bool bAdjustX = false;
+ bool bAdjustY = false;
+ bool bAdjustSize = false;
+ switch (nWID)
+ {
+ case RES_HORI_ORIENT:
+ switch (nMemberId)
+ {
+ case MID_HORIORIENT_ORIENT:
+ case MID_HORIORIENT_RELATION:
+ bSync = true;
+ break;
+ case MID_HORIORIENT_POSITION:
+ bSync = true;
+ bAdjustX = true;
+ break;
+ }
+ break;
+ case RES_VERT_ORIENT:
+ switch (nMemberId)
+ {
+ case MID_VERTORIENT_ORIENT:
+ case MID_VERTORIENT_RELATION:
+ bSync = true;
+ break;
+ case MID_VERTORIENT_POSITION:
+ bSync = true;
+ bAdjustY = true;
+ break;
+ }
+ break;
+ case RES_FRM_SIZE:
+ bSync = true;
+ bAdjustSize = true;
+ break;
+ }
+
+ if (bSync)
+ {
+ // Position/size should be the text position/size, not the shape one as-is.
+ if (bAdjustX || bAdjustY || bAdjustSize)
+ {
+ SdrObjCustomShape* pCustomShape = dynamic_cast<SdrObjCustomShape*>(pShape->FindRealSdrObject());
+ if (pCustomShape)
+ {
+ Rectangle aRect;
+ pCustomShape->GetTextBounds(aRect);
+
+ if (bAdjustX || bAdjustY)
+ {
+ sal_Int32 nValue;
+ if (aValue >>= nValue)
+ {
+ if (bAdjustX)
+ nValue = TWIPS_TO_MM(aRect.getX());
+ else if (bAdjustY)
+ nValue = TWIPS_TO_MM(aRect.getY());
+ aValue <<= nValue;
+ }
+ }
+ else if (bAdjustSize)
+ {
+ awt::Size aSize(TWIPS_TO_MM(aRect.getWidth()), TWIPS_TO_MM(aRect.getHeight()));
+ aValue <<= aSize;
+ }
+ }
+ }
+
+ uno::Reference<beans::XPropertySet> xPropertySet(static_cast<cppu::OWeakObject*>(SwXFrames::GetObject(*pFmt, FLYCNTTYPE_FRM)), uno::UNO_QUERY);
+ xPropertySet->setPropertyValue(rPropertyName, aValue);
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */