sw content control: fix lost properties on copy&paste
E.g. a checkbox content control was turned into a rich text one on
copy&paste, so toggling didn't work on the copied content control.
Change-Id: Ia7262e0b88dff12a2f87acd7b0e6cc3fbde3c3a8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148613
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
diff --git a/sw/qa/core/txtnode/txtnode.cxx b/sw/qa/core/txtnode/txtnode.cxx
index 55413b4..e0526bd 100644
--- a/sw/qa/core/txtnode/txtnode.cxx
+++ b/sw/qa/core/txtnode/txtnode.cxx
@@ -30,6 +30,7 @@
#include <txatbase.hxx>
#include <ndtxt.hxx>
#include <textcontentcontrol.hxx>
#include <swdtflvr.hxx>
/// Covers sw/source/core/txtnode/ fixes.
class SwCoreTxtnodeTest : public SwModelTestBase
@@ -328,6 +329,36 @@ CPPUNIT_TEST_FIXTURE(SwCoreTxtnodeTest, testDateContentControlKeyboard)
CPPUNIT_ASSERT(bShouldOpen);
}
CPPUNIT_TEST_FIXTURE(SwCoreTxtnodeTest, testContentControlCopy)
{
// Given a document with a content control:
createSwDoc();
SwDoc* pDoc = getSwDoc();
SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
pWrtShell->InsertContentControl(SwContentControlType::CHECKBOX);
// When copying that content control:
pWrtShell->SelAll();
rtl::Reference<SwTransferable> xTransfer = new SwTransferable(*pWrtShell);
xTransfer->Copy();
// Kill the selection, go to the end of the document:
pWrtShell->EndOfSection();
TransferableDataHelper aHelper(xTransfer);
SwTransferable::Paste(*pWrtShell, aHelper);
// Then make sure that the copy is also a checkbox:
SwContentControlManager& rManager = pDoc->GetContentControlManager();
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rManager.GetCount());
const SwFormatContentControl& rFormat1 = rManager.Get(0)->GetContentControl();
CPPUNIT_ASSERT_EQUAL(SwContentControlType::CHECKBOX, rFormat1.GetContentControl()->GetType());
const SwFormatContentControl& rFormat2 = rManager.Get(1)->GetContentControl();
// Without the accompanying fix in place, this test would have failed with:
// - Expected: 1 (CHECKBOX)
// - Actual : 0 (RICH_TEXT)
// i.e. properties were not copied from the source to the destination content control.
CPPUNIT_ASSERT_EQUAL(SwContentControlType::CHECKBOX, rFormat2.GetContentControl()->GetType());
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/txtnode/attrcontentcontrol.cxx b/sw/source/core/txtnode/attrcontentcontrol.cxx
index 88e1060..c167f8d 100644
--- a/sw/source/core/txtnode/attrcontentcontrol.cxx
+++ b/sw/source/core/txtnode/attrcontentcontrol.cxx
@@ -183,6 +183,42 @@ SwContentControl::SwContentControl(SwFormatContentControl* pFormat)
, m_pFormat(pFormat)
, m_pTextNode(nullptr)
{
if (!pFormat)
{
return;
}
const std::shared_ptr<SwContentControl>& pOther = pFormat->GetContentControl();
if (!pOther)
{
return;
}
SetShowingPlaceHolder(pOther->m_bShowingPlaceHolder);
SetCheckbox(pOther->m_bCheckbox);
SetChecked(pOther->m_bChecked);
SetCheckedState(pOther->m_aCheckedState);
SetUncheckedState(pOther->m_aUncheckedState);
SetListItems(pOther->m_aListItems);
SetPicture(pOther->m_bPicture);
SetDate(pOther->m_bDate);
SetDateFormat(pOther->m_aDateFormat);
SetDateLanguage(pOther->m_aDateLanguage);
SetCurrentDate(pOther->m_aCurrentDate);
SetPlainText(pOther->m_bPlainText);
SetComboBox(pOther->m_bComboBox);
SetDropDown(pOther->m_bDropDown);
SetPlaceholderDocPart(pOther->m_aPlaceholderDocPart);
SetDataBindingPrefixMappings(pOther->m_aDataBindingPrefixMappings);
SetDataBindingXpath(pOther->m_aDataBindingXpath);
SetDataBindingStoreItemID(pOther->m_aDataBindingStoreItemID);
SetColor(pOther->m_aColor);
SetAppearance(pOther->m_aAppearance);
SetAlias(pOther->m_aAlias);
SetTag(pOther->m_aTag);
SetId(pOther->m_nId);
SetTabIndex(pOther->m_nTabIndex);
SetLock(pOther->m_aLock);
}
SwContentControl::~SwContentControl() {}