diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-05-27 09:03:51 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-05-27 09:32:42 +0200 |
commit | 72159041cbb70f59017df0b5c90c5fbbfb6b62aa (patch) | |
tree | 27192f49fe094b109bf445d7f136bb82da39e33a /sw | |
parent | 0a3fe4c281be942e75b498073378b39a6e1a8ba7 (diff) |
Initial SwTextBoxHelper
Change-Id: I2674d72a2ba7bf49f102e09ed8435445c9687bb2
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/textboxhelper.hxx | 37 | ||||
-rw-r--r-- | sw/source/core/doc/textboxhelper.cxx | 189 |
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: */ |