summaryrefslogtreecommitdiffstats
path: root/sw/source/uibase/envelp
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/uibase/envelp')
-rw-r--r--sw/source/uibase/envelp/envimg.cxx337
-rw-r--r--sw/source/uibase/envelp/labelcfg.cxx330
-rw-r--r--sw/source/uibase/envelp/labimg.cxx465
-rw-r--r--sw/source/uibase/envelp/syncbtn.cxx87
4 files changed, 1219 insertions, 0 deletions
diff --git a/sw/source/uibase/envelp/envimg.cxx b/sw/source/uibase/envelp/envimg.cxx
new file mode 100644
index 000000000..317179e57
--- /dev/null
+++ b/sw/source/uibase/envelp/envimg.cxx
@@ -0,0 +1,337 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <o3tl/any.hxx>
+#include <o3tl/string_view.hxx>
+#include <osl/diagnose.h>
+#include <editeng/paperinf.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <tools/UnitConversion.hxx>
+#include <unotools/useroptions.hxx>
+#include <swmodule.hxx>
+#include <swtypes.hxx>
+#include <envimg.hxx>
+#include <strings.hrc>
+
+#include <cmdid.h>
+
+#include <unomid.h>
+
+#ifdef _WIN32
+constexpr OUStringLiteral NEXTLINE = u"\r\n";
+#else
+constexpr OUStringLiteral NEXTLINE = u"\n";
+#endif
+
+using namespace utl;
+using namespace ::com::sun::star::uno;
+
+
+SfxPoolItem* SwEnvItem::CreateDefault() { return new SwEnvItem; }
+
+OUString MakeSender()
+{
+ SvtUserOptions& rUserOpt = SW_MOD()->GetUserOptions();
+
+ const OUString sSenderToken(SwResId(STR_SENDER_TOKENS));
+ if (sSenderToken.isEmpty())
+ return OUString();
+
+ OUStringBuffer sRet;
+ sal_Int32 nSttPos = 0;
+ bool bLastLength = true;
+ do {
+ std::u16string_view sToken = o3tl::getToken(sSenderToken, 0, ';', nSttPos );
+ if (sToken == u"COMPANY")
+ {
+ sal_Int32 nOldLen = sRet.getLength();
+ sRet.append(rUserOpt.GetCompany());
+ bLastLength = sRet.getLength() != nOldLen;
+ }
+ else if (sToken == u"CR")
+ {
+ if(bLastLength)
+ sRet.append(NEXTLINE);
+ bLastLength = true;
+ }
+ else if (sToken == u"FIRSTNAME")
+ sRet.append(rUserOpt.GetFirstName());
+ else if (sToken == u"LASTNAME")
+ sRet.append(rUserOpt.GetLastName());
+ else if (sToken == u"ADDRESS")
+ sRet.append(rUserOpt.GetStreet());
+ else if (sToken == u"COUNTRY")
+ sRet.append(rUserOpt.GetCountry());
+ else if (sToken == u"POSTALCODE")
+ sRet.append(rUserOpt.GetZip());
+ else if (sToken == u"CITY")
+ sRet.append(rUserOpt.GetCity());
+ else if (sToken == u"STATEPROV")
+ sRet.append(rUserOpt.GetState());
+ else if (!sToken.empty()) //spaces
+ sRet.append(sToken);
+ } while (nSttPos>=0);
+ return sRet.makeStringAndClear();
+}
+
+SwEnvItem::SwEnvItem() :
+ SfxPoolItem(FN_ENVELOP)
+{
+ m_bSend = true;
+ m_aSendText = MakeSender();
+ m_nSendFromLeft = 566; // 1 cm
+ m_nSendFromTop = 566; // 1 cm
+ Size aEnvSz = SvxPaperInfo::GetPaperSize(PAPER_ENV_C65);
+ m_nWidth = aEnvSz.Width();
+ m_nHeight = aEnvSz.Height();
+ m_eAlign = ENV_HOR_LEFT;
+ m_bPrintFromAbove = true;
+ m_nShiftRight = 0;
+ m_nShiftDown = 0;
+
+ m_nAddrFromLeft = std::max(m_nWidth, m_nHeight) / 2;
+ m_nAddrFromTop = std::min(m_nWidth, m_nHeight) / 2;
+}
+
+SwEnvItem& SwEnvItem::operator =(const SwEnvItem& rItem)
+{
+ m_aAddrText = rItem.m_aAddrText;
+ m_bSend = rItem.m_bSend;
+ m_aSendText = rItem.m_aSendText;
+ m_nSendFromLeft = rItem.m_nSendFromLeft;
+ m_nSendFromTop = rItem.m_nSendFromTop;
+ m_nAddrFromLeft = rItem.m_nAddrFromLeft;
+ m_nAddrFromTop = rItem.m_nAddrFromTop;
+ m_nWidth = rItem.m_nWidth;
+ m_nHeight = rItem.m_nHeight;
+ m_eAlign = rItem.m_eAlign;
+ m_bPrintFromAbove = rItem.m_bPrintFromAbove;
+ m_nShiftRight = rItem.m_nShiftRight;
+ m_nShiftDown = rItem.m_nShiftDown;
+ return *this;
+}
+
+bool SwEnvItem::operator ==(const SfxPoolItem& rItem) const
+{
+ assert(SfxPoolItem::operator==(rItem));
+ const SwEnvItem& rEnv = static_cast<const SwEnvItem&>( rItem);
+
+ return m_aAddrText == rEnv.m_aAddrText &&
+ m_bSend == rEnv.m_bSend &&
+ m_aSendText == rEnv.m_aSendText &&
+ m_nSendFromLeft == rEnv.m_nSendFromLeft &&
+ m_nSendFromTop == rEnv.m_nSendFromTop &&
+ m_nAddrFromLeft == rEnv.m_nAddrFromLeft &&
+ m_nAddrFromTop == rEnv.m_nAddrFromTop &&
+ m_nWidth == rEnv.m_nWidth &&
+ m_nHeight == rEnv.m_nHeight &&
+ m_eAlign == rEnv.m_eAlign &&
+ m_bPrintFromAbove == rEnv.m_bPrintFromAbove &&
+ m_nShiftRight == rEnv.m_nShiftRight &&
+ m_nShiftDown == rEnv.m_nShiftDown;
+}
+
+SwEnvItem* SwEnvItem::Clone(SfxItemPool*) const
+{
+ return new SwEnvItem(*this);
+}
+
+SwEnvCfgItem::SwEnvCfgItem() :
+ ConfigItem("Office.Writer/Envelope")
+{
+ Sequence<OUString> aNames = GetPropertyNames();
+ Sequence<Any> aValues = GetProperties(aNames);
+ EnableNotification(aNames);
+ const Any* pValues = aValues.getConstArray();
+ OSL_ENSURE(aValues.getLength() == aNames.getLength(), "GetProperties failed");
+ if(aValues.getLength() != aNames.getLength())
+ return;
+
+ for(int nProp = 0; nProp < aNames.getLength(); nProp++)
+ {
+ if(pValues[nProp].hasValue())
+ {
+ switch(nProp)
+ {
+ case 0: pValues[nProp] >>= m_aEnvItem.m_aAddrText; break;// "Inscription/Addressee",
+ case 1: pValues[nProp] >>= m_aEnvItem.m_aSendText; break;// "Inscription/Sender",
+ case 2: m_aEnvItem.m_bSend = *o3tl::doAccess<bool>(pValues[nProp]); break;// "Inscription/UseSender",
+ case 3:
+ pValues[nProp] >>= m_aEnvItem.m_nAddrFromLeft;// "Format/AddresseeFromLeft",
+ m_aEnvItem.m_nAddrFromLeft = o3tl::toTwips(m_aEnvItem.m_nAddrFromLeft, o3tl::Length::mm100);
+ break;
+ case 4:
+ pValues[nProp] >>= m_aEnvItem.m_nAddrFromTop; // "Format/AddresseeFromTop",
+ m_aEnvItem.m_nAddrFromTop = o3tl::toTwips(m_aEnvItem.m_nAddrFromTop, o3tl::Length::mm100);
+ break;
+ case 5:
+ pValues[nProp] >>= m_aEnvItem.m_nSendFromLeft; // "Format/SenderFromLeft",
+ m_aEnvItem.m_nSendFromLeft = o3tl::toTwips(m_aEnvItem.m_nSendFromLeft, o3tl::Length::mm100);
+ break;
+ case 6:
+ pValues[nProp] >>= m_aEnvItem.m_nSendFromTop;// "Format/SenderFromTop",
+ m_aEnvItem.m_nSendFromTop = o3tl::toTwips(m_aEnvItem.m_nSendFromTop, o3tl::Length::mm100);
+ break;
+ case 7:
+ pValues[nProp] >>= m_aEnvItem.m_nWidth; // "Format/Width",
+ m_aEnvItem.m_nWidth = o3tl::toTwips(m_aEnvItem.m_nWidth, o3tl::Length::mm100);
+ break;
+ case 8:
+ pValues[nProp] >>= m_aEnvItem.m_nHeight; // "Format/Height",
+ m_aEnvItem.m_nHeight = o3tl::toTwips(m_aEnvItem.m_nHeight, o3tl::Length::mm100);
+ break;
+ case 9:
+ {
+ sal_Int32 nTemp = 0;
+ pValues[nProp] >>= nTemp; m_aEnvItem.m_eAlign = static_cast<SwEnvAlign>(nTemp); break;// "Print/Alignment",
+ }
+ case 10: m_aEnvItem.m_bPrintFromAbove = *o3tl::doAccess<bool>(pValues[nProp]); break;// "Print/FromAbove",
+ case 11:
+ pValues[nProp] >>= m_aEnvItem.m_nShiftRight;
+ m_aEnvItem.m_nShiftRight = o3tl::toTwips(m_aEnvItem.m_nShiftRight, o3tl::Length::mm100);// "Print/Right",
+ break;
+ case 12:
+ pValues[nProp] >>= m_aEnvItem.m_nShiftDown;
+ m_aEnvItem.m_nShiftDown = o3tl::toTwips(m_aEnvItem.m_nShiftDown, o3tl::Length::mm100);
+ break;// "Print/Down"
+ }
+ }
+ }
+}
+
+SwEnvCfgItem::~SwEnvCfgItem()
+{
+}
+
+void SwEnvCfgItem::ImplCommit()
+{
+ Sequence<OUString> aNames = GetPropertyNames();
+ Sequence<Any> aValues(aNames.getLength());
+ Any* pValues = aValues.getArray();
+
+ for(int nProp = 0; nProp < aNames.getLength(); nProp++)
+ {
+ switch(nProp)
+ {
+ case 0: pValues[nProp] <<= m_aEnvItem.m_aAddrText; break;// "Inscription/Addressee",
+ case 1: pValues[nProp] <<= m_aEnvItem.m_aSendText; break;// "Inscription/Sender",
+ case 2: pValues[nProp] <<= m_aEnvItem.m_bSend; break;// "Inscription/UseSender",
+ case 3: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nAddrFromLeft)) ; break;// "Format/AddresseeFromLeft",
+ case 4: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nAddrFromTop)) ; break;// "Format/AddresseeFromTop",
+ case 5: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nSendFromLeft)) ; break;// "Format/SenderFromLeft",
+ case 6: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nSendFromTop)) ; break;// "Format/SenderFromTop",
+ case 7: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nWidth)) ; break;// "Format/Width",
+ case 8: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nHeight)) ; break;// "Format/Height",
+ case 9: pValues[nProp] <<= sal_Int32(m_aEnvItem.m_eAlign); break;// "Print/Alignment",
+ case 10: pValues[nProp] <<= m_aEnvItem.m_bPrintFromAbove; break;// "Print/FromAbove",
+ case 11: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nShiftRight));break; // "Print/Right",
+ case 12: pValues[nProp] <<= static_cast <sal_Int32>(convertTwipToMm100(m_aEnvItem.m_nShiftDown)); break;// "Print/Down"
+ }
+ }
+ PutProperties(aNames, aValues);
+}
+
+void SwEnvCfgItem::Notify( const css::uno::Sequence< OUString >& ) {}
+
+Sequence<OUString> SwEnvCfgItem::GetPropertyNames()
+{
+ static const char* aPropNames[] =
+ {
+ "Inscription/Addressee", // 0
+ "Inscription/Sender", // 1
+ "Inscription/UseSender", // 2
+ "Format/AddresseeFromLeft", // 3
+ "Format/AddresseeFromTop", // 4
+ "Format/SenderFromLeft", // 5
+ "Format/SenderFromTop", // 6
+ "Format/Width", // 7
+ "Format/Height", // 8
+ "Print/Alignment", // 9
+ "Print/FromAbove", // 10
+ "Print/Right", // 11
+ "Print/Down" // 12
+ };
+ const int nCount = 13;
+ Sequence<OUString> aNames(nCount);
+ OUString* pNames = aNames.getArray();
+
+ for(int i = 0; i < nCount; i++)
+ pNames[i] = OUString::createFromAscii(aPropNames[i]);
+
+ return aNames;
+}
+
+bool SwEnvItem::QueryValue( Any& rVal, sal_uInt8 nMemberId ) const
+{
+ bool bRet = true;
+ switch(nMemberId & ~CONVERT_TWIPS)
+ {
+ case MID_ENV_ADDR_TEXT : rVal <<= m_aAddrText; break;
+ case MID_ENV_SEND : rVal <<= m_bSend; break;
+ case MID_SEND_TEXT : rVal <<= m_aSendText; break;
+ case MID_ENV_ADDR_FROM_LEFT : rVal <<= m_nAddrFromLeft; break;
+ case MID_ENV_ADDR_FROM_TOP : rVal <<= m_nAddrFromTop; break;
+ case MID_ENV_SEND_FROM_LEFT : rVal <<= m_nSendFromLeft; break;
+ case MID_ENV_SEND_FROM_TOP : rVal <<= m_nSendFromTop; break;
+ case MID_ENV_WIDTH : rVal <<= m_nWidth; break;
+ case MID_ENV_HEIGHT : rVal <<= m_nHeight; break;
+ case MID_ENV_ALIGN : rVal <<= static_cast<sal_Int16>(m_eAlign); break;
+ case MID_ENV_PRINT_FROM_ABOVE : rVal <<= m_bPrintFromAbove; break;
+ case MID_ENV_SHIFT_RIGHT : rVal <<= m_nShiftRight; break;
+ case MID_ENV_SHIFT_DOWN : rVal <<= m_nShiftDown; break;
+ default:
+ OSL_FAIL("Wrong memberId");
+ bRet = false;
+ }
+ return bRet;
+}
+
+bool SwEnvItem::PutValue(const Any& rVal, sal_uInt8 nMemberId)
+{
+ bool bRet = false;
+ switch(nMemberId & ~CONVERT_TWIPS)
+ {
+ case MID_ENV_ADDR_TEXT : bRet = (rVal >>= m_aAddrText); break;
+ case MID_ENV_SEND : bRet = (rVal >>= m_bSend); break;
+ case MID_SEND_TEXT : bRet = (rVal >>= m_aSendText); break;
+ case MID_ENV_ADDR_FROM_LEFT : bRet = (rVal >>= m_nAddrFromLeft); break;
+ case MID_ENV_ADDR_FROM_TOP : bRet = (rVal >>= m_nAddrFromTop); break;
+ case MID_ENV_SEND_FROM_LEFT : bRet = (rVal >>= m_nSendFromLeft); break;
+ case MID_ENV_SEND_FROM_TOP : bRet = (rVal >>= m_nSendFromTop); break;
+ case MID_ENV_WIDTH : bRet = (rVal >>= m_nWidth); break;
+ case MID_ENV_HEIGHT : bRet = (rVal >>= m_nHeight); break;
+ case MID_ENV_ALIGN :
+ {
+ sal_Int16 nTemp = 0;
+ bRet = (rVal >>= nTemp);
+ if (bRet)
+ m_eAlign = SwEnvAlign(nTemp);
+ break;
+ }
+ case MID_ENV_PRINT_FROM_ABOVE : bRet = (rVal >>= m_bPrintFromAbove); break;
+ case MID_ENV_SHIFT_RIGHT : bRet = (rVal >>= m_nShiftRight); break;
+ case MID_ENV_SHIFT_DOWN : bRet = (rVal >>= m_nShiftDown); break;
+ default:
+ OSL_FAIL("Wrong memberId");
+ }
+ return bRet;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/envelp/labelcfg.cxx b/sw/source/uibase/envelp/labelcfg.cxx
new file mode 100644
index 000000000..8d98c7a9f
--- /dev/null
+++ b/sw/source/uibase/envelp/labelcfg.cxx
@@ -0,0 +1,330 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <memory>
+#include <string_view>
+#include <config_folders.h>
+
+#include <swtypes.hxx>
+#include <labelcfg.hxx>
+#include <rtl/bootstrap.hxx>
+#include <tools/UnitConversion.hxx>
+#include <unotools/configpaths.hxx>
+#include <xmlreader/xmlreader.hxx>
+#include <comphelper/sequence.hxx>
+#include <osl/diagnose.h>
+#include <o3tl/string_view.hxx>
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+
+using namespace utl;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+
+static void lcl_assertEndingItem(xmlreader::XmlReader& reader)
+{
+ int nsId;
+ xmlreader::Span name;
+ xmlreader::XmlReader::Result res;
+ res = reader.nextItem(xmlreader::XmlReader::Text::NONE, &name, &nsId);
+ assert(res == xmlreader::XmlReader::Result::End);
+ (void) res;
+}
+
+static OUString lcl_getValue(xmlreader::XmlReader& reader,
+ const xmlreader::Span& span)
+{
+ int nsId;
+ xmlreader::Span name;
+ xmlreader::XmlReader::Result res;
+ res = reader.nextItem(xmlreader::XmlReader::Text::NONE, &name, &nsId);
+ assert(res == xmlreader::XmlReader::Result::Begin && name == span);
+ res = reader.nextItem(xmlreader::XmlReader::Text::Raw, &name, &nsId);
+ assert(res == xmlreader::XmlReader::Result::Text);
+ (void) res; (void) span;
+ OUString sTmp = name.convertFromUtf8();
+ lcl_assertEndingItem(reader);
+ return sTmp;
+}
+
+static Sequence<OUString> lcl_CreatePropertyNames(const OUString& rPrefix)
+{
+ return { OUString::Concat(rPrefix) + "Name", OUString::Concat(rPrefix) + "Measure" };
+}
+
+SwLabelConfig::SwLabelConfig() :
+ ConfigItem("Office.Labels/Manufacturer")
+{
+ OUString uri("$BRAND_BASE_DIR/" LIBO_SHARE_FOLDER "/labels/labels.xml");
+ rtl::Bootstrap::expandMacros(uri);
+ xmlreader::XmlReader reader(uri);
+ int nsId;
+ xmlreader::Span name;
+ xmlreader::XmlReader::Result res;
+ OUString sManufacturer;
+ OUString sName;
+ OUString sMeasure;
+
+ // fill m_aLabels and m_aManufacturers with the predefined labels
+ res = reader.nextItem(
+ xmlreader::XmlReader::Text::NONE, &name, &nsId);
+ assert(
+ res == xmlreader::XmlReader::Result::Begin
+ && name == "manufacturers");
+ res = reader.nextItem(
+ xmlreader::XmlReader::Text::NONE, &name, &nsId);
+ while (res != xmlreader::XmlReader::Result::End)
+ {
+ // Opening manufacturer
+ assert(
+ res == xmlreader::XmlReader::Result::Begin
+ && name == "manufacturer");
+ // Get the name
+ (void)reader.nextAttribute(&nsId, &name);
+ assert(
+ nsId == xmlreader::XmlReader::NAMESPACE_NONE
+ && name == "name");
+ sManufacturer = reader.getAttributeValue(false).convertFromUtf8();
+
+ for(;;) {
+ // Opening label or ending manufacturer
+ res = reader.nextItem(
+ xmlreader::XmlReader::Text::NONE, &name, &nsId);
+ if (res == xmlreader::XmlReader::Result::End)
+ break;
+ assert(
+ res == xmlreader::XmlReader::Result::Begin
+ && name == "label");
+ // Get name value
+ sName = lcl_getValue(reader, xmlreader::Span("name"));
+ // Get measure value
+ sMeasure = lcl_getValue(reader, xmlreader::Span("measure"));
+ // Ending label mark
+ lcl_assertEndingItem(reader);
+ if ( m_aLabels.find( sManufacturer ) == m_aLabels.end() )
+ m_aManufacturers.push_back( sManufacturer );
+ m_aLabels[sManufacturer][sName].m_aMeasure = sMeasure;
+ m_aLabels[sManufacturer][sName].m_bPredefined = true;
+ }
+ // Get next manufacturer or end
+ res = reader.nextItem(
+ xmlreader::XmlReader::Text::NONE, &name, &nsId);
+ };
+ res = reader.nextItem(
+ xmlreader::XmlReader::Text::NONE, &name, &nsId);
+ assert(res == xmlreader::XmlReader::Result::Done);
+
+ // add to m_aLabels and m_aManufacturers the custom labels
+ const Sequence<OUString>& rMan = GetNodeNames( OUString() );
+ for ( const OUString& rManufacturer : rMan )
+ {
+ const Sequence<OUString> aLabels = GetNodeNames( rManufacturer );
+ for( const OUString& rLabel : aLabels )
+ {
+ OUString sPrefix = rManufacturer + "/" + rLabel + "/";
+ Sequence<OUString> aPropNames = lcl_CreatePropertyNames( sPrefix );
+ Sequence<Any> aValues = GetProperties( aPropNames );
+ const Any* pValues = aValues.getConstArray();
+ if (aValues.getLength() >= 1)
+ if(pValues[0].hasValue())
+ pValues[0] >>= sName;
+ if (aValues.getLength() >= 2)
+ if(pValues[1].hasValue())
+ pValues[1] >>= sMeasure;
+ if ( m_aLabels.find( rManufacturer ) == m_aLabels.end() )
+ m_aManufacturers.push_back( rManufacturer );
+ m_aLabels[rManufacturer][sName].m_aMeasure = sMeasure;
+ m_aLabels[rManufacturer][sName].m_bPredefined = false;
+ }
+ }
+}
+
+SwLabelConfig::~SwLabelConfig()
+{
+}
+
+// the config item is not writable ?:
+void SwLabelConfig::ImplCommit() {}
+
+void SwLabelConfig::Notify( const css::uno::Sequence< OUString >& ) {}
+
+static std::unique_ptr<SwLabRec> lcl_CreateSwLabRec(const OUString& rType, std::u16string_view rMeasure, const OUString& rManufacturer)
+{
+ std::unique_ptr<SwLabRec> pNewRec(new SwLabRec);
+ pNewRec->m_aMake = rManufacturer;
+ pNewRec->m_nPWidth = 0;
+ pNewRec->m_nPHeight = 0;
+ pNewRec->m_aType = rType;
+ //all values are contained as colon-separated 1/100 mm values
+ //except for the continuous flag ('C'/'S') and nCols, nRows (sal_Int32)
+ sal_Int32 nTok{0};
+ sal_Int32 nIdx{rMeasure.empty() ? -1 : 0};
+ while (nIdx>=0)
+ {
+ const std::u16string_view sToken(o3tl::getToken(rMeasure, 0, ';', nIdx));
+ int nVal = o3tl::toInt32(sToken);
+ switch(nTok++)
+ {
+ case 0 : pNewRec->m_bCont = sToken[0] == 'C'; break;
+ case 1 : pNewRec->m_nHDist = o3tl::toTwips(nVal, o3tl::Length::mm100); break;
+ case 2 : pNewRec->m_nVDist = o3tl::toTwips(nVal, o3tl::Length::mm100); break;
+ case 3 : pNewRec->m_nWidth = o3tl::toTwips(nVal, o3tl::Length::mm100); break;
+ case 4 : pNewRec->m_nHeight = o3tl::toTwips(nVal, o3tl::Length::mm100); break;
+ case 5 : pNewRec->m_nLeft = o3tl::toTwips(nVal, o3tl::Length::mm100); break;
+ case 6 : pNewRec->m_nUpper = o3tl::toTwips(nVal, o3tl::Length::mm100); break;
+ case 7 : pNewRec->m_nCols = nVal; break;
+ case 8 : pNewRec->m_nRows = nVal; break;
+ case 9 : pNewRec->m_nPWidth = o3tl::toTwips(nVal, o3tl::Length::mm100); break;
+ case 10 : pNewRec->m_nPHeight = o3tl::toTwips(nVal, o3tl::Length::mm100); break;
+ }
+ }
+ // lines added for compatibility with custom label definitions saved before patch fdo#44516
+ if (pNewRec->m_nPWidth == 0 || pNewRec->m_nPHeight == 0)
+ {
+ // old style definition (no paper dimensions), calculate probable values
+ pNewRec->m_nPWidth = 2 * pNewRec->m_nLeft + (pNewRec->m_nCols - 1) * pNewRec->m_nHDist + pNewRec->m_nWidth;
+ pNewRec->m_nPHeight = ( pNewRec->m_bCont ? pNewRec->m_nRows * pNewRec->m_nVDist : 2 * pNewRec->m_nUpper + (pNewRec->m_nRows - 1) * pNewRec->m_nVDist + pNewRec->m_nHeight );
+ }
+ return pNewRec;
+}
+
+static Sequence<PropertyValue> lcl_CreateProperties(
+ Sequence<OUString> const & rPropNames, OUString& rMeasure, const SwLabRec& rRec)
+{
+ const OUString* pNames = rPropNames.getConstArray();
+ Sequence<PropertyValue> aRet(rPropNames.getLength());
+ PropertyValue* pValues = aRet.getArray();
+ OUString sColon(";");
+
+ for(sal_Int32 nProp = 0; nProp < rPropNames.getLength(); nProp++)
+ {
+ pValues[nProp].Name = pNames[nProp];
+ switch(nProp)
+ {
+ case 0: pValues[nProp].Value <<= rRec.m_aType; break;
+ case 1:
+ {
+ rMeasure.clear();
+ rMeasure += rRec.m_bCont ? std::u16string_view( u"C" ) : std::u16string_view( u"S" ); rMeasure += sColon;
+ rMeasure += OUString::number( convertTwipToMm100( rRec.m_nHDist ) ); rMeasure += sColon;
+ rMeasure += OUString::number( convertTwipToMm100( rRec.m_nVDist ) ); rMeasure += sColon;
+ rMeasure += OUString::number( convertTwipToMm100( rRec.m_nWidth ) ); rMeasure += sColon;
+ rMeasure += OUString::number( convertTwipToMm100( rRec.m_nHeight ) ); rMeasure += sColon;
+ rMeasure += OUString::number( convertTwipToMm100( rRec.m_nLeft ) ); rMeasure += sColon;
+ rMeasure += OUString::number( convertTwipToMm100( rRec.m_nUpper ) ); rMeasure += sColon;
+ rMeasure += OUString::number( rRec.m_nCols ); rMeasure += sColon;
+ rMeasure += OUString::number( rRec.m_nRows ); rMeasure += sColon;
+ rMeasure += OUString::number( convertTwipToMm100( rRec.m_nPWidth ) ); rMeasure += sColon;
+ rMeasure += OUString::number( convertTwipToMm100( rRec.m_nPHeight ) );
+ pValues[nProp].Value <<= rMeasure;
+ }
+ break;
+ }
+ }
+ return aRet;
+}
+
+// function fills SwLabDlg with label definitions for manufacturer rManufacturer
+void SwLabelConfig::FillLabels(const OUString& rManufacturer, SwLabRecs& rLabArr)
+{
+ if (m_aLabels.find(rManufacturer) == m_aLabels.end())
+ return;
+ for (const auto& rEntry : m_aLabels[rManufacturer])
+ rLabArr.push_back( lcl_CreateSwLabRec(rEntry.first, rEntry.second.m_aMeasure, rManufacturer) );
+}
+
+bool SwLabelConfig::HasLabel(const OUString& rManufacturer, const OUString& rType)
+{
+ return ( ( m_aLabels.find(rManufacturer) != m_aLabels.end() ) &&
+ ( m_aLabels[rManufacturer].find(rType) != m_aLabels[rManufacturer].end() ) );
+}
+
+// label is always saved as a custom label
+// predefined labels can NOT be overwritten by custom labels with same manufacturer/name
+void SwLabelConfig::SaveLabel( const OUString& rManufacturer,
+ const OUString& rType, const SwLabRec& rRec )
+{
+ OUString sFoundNode;
+ bool bManufacturerNodeFound;
+ if ( m_aLabels.find( rManufacturer ) == m_aLabels.end() ||
+ !GetNodeNames( rManufacturer ).hasElements() )
+ {
+ bManufacturerNodeFound = false;
+ // manufacturer node does not exist, add (and also to m_aManufacturers)
+ if ( !AddNode( OUString(), rManufacturer ) )
+ {
+ OSL_FAIL("New configuration node could not be created");
+ return ;
+ }
+ m_aManufacturers.push_back( rManufacturer );
+ }
+ else
+ bManufacturerNodeFound = true;
+
+ if ( !bManufacturerNodeFound ||
+ m_aLabels[rManufacturer].find( rType ) == m_aLabels[rManufacturer].end() )
+ {
+ // type does not yet exist, add to config
+ const Sequence<OUString> aLabels = GetNodeNames( rManufacturer );
+ sal_Int32 nIndex = aLabels.getLength();
+ OUString sPrefix( "Label" );
+ sFoundNode = sPrefix + OUString::number( nIndex );
+ while ( comphelper::findValue(aLabels, sFoundNode) != -1 )
+ {
+ sFoundNode = sPrefix + OUString::number(nIndex++);
+ }
+ }
+ else
+ {
+ // get the appropriate node
+ OUString sManufacturer( wrapConfigurationElementName( rManufacturer ) );
+ const Sequence<OUString> aLabels = GetNodeNames( sManufacturer );
+ for (const OUString& rLabel : aLabels)
+ {
+ OUString sPrefix = sManufacturer + "/" + rLabel + "/";
+ Sequence<OUString> aProperties { sPrefix };
+ aProperties.getArray()[0] += "Name";
+ Sequence<Any> aValues = GetProperties( aProperties );
+ const Any* pValues = aValues.getConstArray();
+ if ( pValues[0].hasValue() )
+ {
+ OUString sTmp;
+ pValues[0] >>= sTmp;
+ if ( rType == sTmp )
+ {
+ sFoundNode = rLabel;
+ break;
+ }
+ }
+ }
+ }
+
+ OUString sPrefix = wrapConfigurationElementName( rManufacturer ) +
+ "/" + sFoundNode + "/";
+ Sequence<OUString> aPropNames = lcl_CreatePropertyNames( sPrefix );
+ OUString sMeasure;
+ Sequence<PropertyValue> aPropValues = lcl_CreateProperties( aPropNames, sMeasure, rRec );
+ SetSetProperties( wrapConfigurationElementName( rManufacturer ), aPropValues );
+
+ //update m_aLabels
+ m_aLabels[rManufacturer][rType].m_aMeasure = sMeasure;
+ m_aLabels[rManufacturer][rType].m_bPredefined = false;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/envelp/labimg.cxx b/sw/source/uibase/envelp/labimg.cxx
new file mode 100644
index 000000000..69099b68a
--- /dev/null
+++ b/sw/source/uibase/envelp/labimg.cxx
@@ -0,0 +1,465 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <sal/config.h>
+
+#include <o3tl/any.hxx>
+#include <osl/diagnose.h>
+#include <tools/UnitConversion.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <unotools/useroptions.hxx>
+#include <swmodule.hxx>
+#include <labimg.hxx>
+#include <cmdid.h>
+
+using namespace utl;
+using namespace ::com::sun::star::uno;
+
+SwLabItem::SwLabItem() :
+
+ SfxPoolItem(FN_LABEL),
+ m_lLeft (0),
+ m_lUpper(0),
+ m_nCols (1),
+ m_nRows (1),
+ m_nCol (1),
+ m_nRow (1)
+{
+ m_bAddr =
+ m_bCont =
+ m_bSynchron = false;
+ m_bPage = true;
+ m_lHDist =
+ m_lVDist =
+ m_lWidth =
+ m_lHeight =
+ m_lPWidth =
+ m_lPHeight = 5669; // 10 cm
+}
+
+SwLabItem& SwLabItem::operator =(const SwLabItem& rItem)
+{
+ m_bAddr = rItem.m_bAddr;
+ m_aWriting = rItem.m_aWriting;
+ m_bCont = rItem.m_bCont;
+ m_sDBName = rItem.m_sDBName;
+ m_aLstMake = rItem.m_aLstMake;
+ m_aLstType = rItem.m_aLstType;
+ m_aMake = rItem.m_aMake;
+ m_aType = rItem.m_aType;
+ m_bPage = rItem.m_bPage;
+ m_bSynchron = rItem.m_bSynchron;
+ m_nCol = rItem.m_nCol;
+ m_nRow = rItem.m_nRow;
+ m_lHDist = rItem.m_lHDist;
+ m_lVDist = rItem.m_lVDist;
+ m_lWidth = rItem.m_lWidth;
+ m_lHeight = rItem.m_lHeight;
+ m_lLeft = rItem.m_lLeft;
+ m_lUpper = rItem.m_lUpper;
+ m_nCols = rItem.m_nCols;
+ m_nRows = rItem.m_nRows;
+ m_lPWidth = rItem.m_lPWidth;
+ m_lPHeight = rItem.m_lPHeight;
+ m_aPrivFirstName = rItem.m_aPrivFirstName;
+ m_aPrivName = rItem.m_aPrivName;
+ m_aPrivShortCut = rItem.m_aPrivShortCut;
+ m_aPrivFirstName2 = rItem.m_aPrivFirstName2;
+ m_aPrivName2 = rItem.m_aPrivName2;
+ m_aPrivShortCut2 = rItem.m_aPrivShortCut2;
+ m_aPrivStreet = rItem.m_aPrivStreet;
+ m_aPrivZip = rItem.m_aPrivZip;
+ m_aPrivCity = rItem.m_aPrivCity;
+ m_aPrivCountry = rItem.m_aPrivCountry;
+ m_aPrivState = rItem.m_aPrivState;
+ m_aPrivTitle = rItem.m_aPrivTitle;
+ m_aPrivProfession = rItem.m_aPrivProfession;
+ m_aPrivPhone = rItem.m_aPrivPhone;
+ m_aPrivMobile = rItem.m_aPrivMobile;
+ m_aPrivFax = rItem.m_aPrivFax;
+ m_aPrivWWW = rItem.m_aPrivWWW;
+ m_aPrivMail = rItem.m_aPrivMail;
+ m_aCompCompany = rItem.m_aCompCompany;
+ m_aCompCompanyExt = rItem.m_aCompCompanyExt;
+ m_aCompSlogan = rItem.m_aCompSlogan;
+ m_aCompStreet = rItem.m_aCompStreet;
+ m_aCompZip = rItem.m_aCompZip;
+ m_aCompCity = rItem.m_aCompCity;
+ m_aCompCountry = rItem.m_aCompCountry;
+ m_aCompState = rItem.m_aCompState;
+ m_aCompPosition = rItem.m_aCompPosition;
+ m_aCompPhone = rItem.m_aCompPhone;
+ m_aCompMobile = rItem.m_aCompMobile;
+ m_aCompFax = rItem.m_aCompFax;
+ m_aCompWWW = rItem.m_aCompWWW;
+ m_aCompMail = rItem.m_aCompMail;
+ m_sGlossaryGroup = rItem.m_sGlossaryGroup;
+ m_sGlossaryBlockName = rItem.m_sGlossaryBlockName;
+ return *this;
+}
+
+bool SwLabItem::operator ==(const SfxPoolItem& rItem) const
+{
+ assert(SfxPoolItem::operator==(rItem));
+ const SwLabItem& rLab = static_cast<const SwLabItem&>( rItem);
+
+ return m_bAddr == rLab.m_bAddr &&
+ m_bCont == rLab.m_bCont &&
+ m_bPage == rLab.m_bPage &&
+ m_bSynchron == rLab.m_bSynchron &&
+ m_nCol == rLab.m_nCol &&
+ m_nRow == rLab.m_nRow &&
+ m_lHDist == rLab.m_lHDist &&
+ m_lVDist == rLab.m_lVDist &&
+ m_lWidth == rLab.m_lWidth &&
+ m_lHeight == rLab.m_lHeight &&
+ m_lLeft == rLab.m_lLeft &&
+ m_lUpper == rLab.m_lUpper &&
+ m_nCols == rLab.m_nCols &&
+ m_nRows == rLab.m_nRows &&
+ m_lPWidth == rLab.m_lPWidth &&
+ m_lPHeight == rLab.m_lPHeight&&
+ m_aWriting == rLab.m_aWriting&&
+ m_aMake == rLab.m_aMake &&
+ m_aType == rLab.m_aType &&
+ m_aLstMake == rLab.m_aLstMake&&
+ m_aLstType == rLab.m_aLstType&&
+ m_sDBName == rLab.m_sDBName &&
+ m_aPrivFirstName == rLab.m_aPrivFirstName&&
+ m_aPrivName == rLab.m_aPrivName&&
+ m_aPrivShortCut == rLab.m_aPrivShortCut&&
+ m_aPrivFirstName2 == rLab.m_aPrivFirstName2&&
+ m_aPrivName2 == rLab.m_aPrivName2&&
+ m_aPrivShortCut2 == rLab.m_aPrivShortCut2&&
+ m_aPrivStreet == rLab.m_aPrivStreet&&
+ m_aPrivZip == rLab.m_aPrivZip&&
+ m_aPrivCity == rLab.m_aPrivCity&&
+ m_aPrivCountry == rLab.m_aPrivCountry&&
+ m_aPrivState == rLab.m_aPrivState&&
+ m_aPrivTitle == rLab.m_aPrivTitle&&
+ m_aPrivProfession == rLab.m_aPrivProfession&&
+ m_aPrivPhone == rLab.m_aPrivPhone&&
+ m_aPrivMobile == rLab.m_aPrivMobile&&
+ m_aPrivFax == rLab.m_aPrivFax&&
+ m_aPrivWWW == rLab.m_aPrivWWW&&
+ m_aPrivMail == rLab.m_aPrivMail&&
+ m_aCompCompany == rLab.m_aCompCompany&&
+ m_aCompCompanyExt == rLab.m_aCompCompanyExt&&
+ m_aCompSlogan == rLab.m_aCompSlogan&&
+ m_aCompStreet == rLab.m_aCompStreet&&
+ m_aCompZip == rLab.m_aCompZip&&
+ m_aCompCity == rLab.m_aCompCity&&
+ m_aCompCountry == rLab.m_aCompCountry&&
+ m_aCompState == rLab.m_aCompState&&
+ m_aCompPosition == rLab.m_aCompPosition&&
+ m_aCompPhone == rLab.m_aCompPhone&&
+ m_aCompMobile == rLab.m_aCompMobile&&
+ m_aCompFax == rLab.m_aCompFax&&
+ m_aCompWWW == rLab.m_aCompWWW&&
+ m_aCompMail == rLab.m_aCompMail &&
+ m_sGlossaryGroup == rLab.m_sGlossaryGroup &&
+ m_sGlossaryBlockName == rLab.m_sGlossaryBlockName;
+}
+
+SwLabItem* SwLabItem::Clone(SfxItemPool*) const
+{
+ return new SwLabItem(*this);
+}
+
+Sequence<OUString> SwLabCfgItem::GetPropertyNames() const
+{
+ static const char* aLabelPropNames[] =
+ {
+ "Medium/Continuous", // 0
+ "Medium/Brand", // 1
+ "Medium/Type", // 2
+ "Format/Column", // 3
+ "Format/Row", // 4
+ "Format/HorizontalDistance",// 5
+ "Format/VerticalDistance", // 6
+ "Format/Width", // 7
+ "Format/Height", // 8
+ "Format/LeftMargin", // 9
+ "Format/TopMargin", //10
+ "Format/PageWidth", //11
+ "Format/PageHeight", //12
+ "Option/Synchronize", //13
+ "Option/Page", //14
+ "Option/Column", //15
+ "Option/Row", //16
+ "Inscription/UseAddress", //17
+ "Inscription/Address", //18
+ "Inscription/Database" //19
+ };
+ static const char* aBusinessPropNames[] =
+ {
+ "PrivateAddress/FirstName", // 0
+ "PrivateAddress/Name", // 1
+ "PrivateAddress/ShortCut", // 2
+ "PrivateAddress/SecondFirstName", // 3
+ "PrivateAddress/SecondName", // 4
+ "PrivateAddress/SecondShortCut", // 5
+ "PrivateAddress/Street", // 6
+ "PrivateAddress/Zip", // 7
+ "PrivateAddress/City", // 8
+ "PrivateAddress/Country", // 9
+ "PrivateAddress/State", // 10
+ "PrivateAddress/Title", // 11
+ "PrivateAddress/Profession", // 12
+ "PrivateAddress/Phone", // 13
+ "PrivateAddress/Mobile", // 14
+ "PrivateAddress/Fax", // 15
+ "PrivateAddress/WebAddress", // 16
+ "PrivateAddress/Email", // 17
+ "BusinessAddress/Company", // 18
+ "BusinessAddress/CompanyExt", // 19
+ "BusinessAddress/Slogan", // 20
+ "BusinessAddress/Street", // 21
+ "BusinessAddress/Zip", // 22
+ "BusinessAddress/City", // 23
+ "BusinessAddress/Country", // 24
+ "BusinessAddress/State", // 25
+ "BusinessAddress/Position", // 26
+ "BusinessAddress/Phone", // 27
+ "BusinessAddress/Mobile", // 28
+ "BusinessAddress/Fax", // 29
+ "BusinessAddress/WebAddress", // 30
+ "BusinessAddress/Email", // 31
+ "AutoText/Group", // 32
+ "AutoText/Block" // 33
+ };
+ const int nBusinessCount = m_bIsLabel ? 0 : 34;
+ const int nLabelCount = m_bIsLabel ? 20 : 17;
+ Sequence<OUString> aNames(nBusinessCount + nLabelCount);
+ OUString* pNames = aNames.getArray();
+ int nIndex = 0;
+ for(int nLabel = 0; nLabel < nLabelCount; nLabel++)
+ pNames[nIndex++] = OUString::createFromAscii(aLabelPropNames[nLabel]);
+ for(int nBusiness = 0; nBusiness < nBusinessCount; nBusiness++)
+ pNames[nIndex++] = OUString::createFromAscii(aBusinessPropNames[nBusiness]);
+ return aNames;
+}
+
+SwLabCfgItem::SwLabCfgItem(bool bLabel) :
+ ConfigItem(bLabel ? OUString("Office.Writer/Label") : OUString("Office.Writer/BusinessCard")),
+ m_bIsLabel(bLabel)
+{
+ Sequence<OUString> aNames = GetPropertyNames();
+ Sequence<Any> aValues = GetProperties(aNames);
+ EnableNotification(aNames);
+ const Any* pValues = aValues.getConstArray();
+ OSL_ENSURE(aValues.getLength() == aNames.getLength(), "GetProperties failed");
+ bool bNoConfigValues = true;
+ if(aValues.getLength() == aNames.getLength())
+ {
+ for(int nProp = 0, nProperty = 0; nProp < aNames.getLength(); nProp++, nProperty++)
+ {
+
+ if(pValues[nProp].hasValue())
+ {
+ //to have a contiuous switch an offset is added
+ if(nProp == 17 && !m_bIsLabel)
+ nProperty += 3;
+ if(nProperty >= 20)
+ bNoConfigValues = false;
+ switch(nProperty)
+ {
+ case 0: m_aItem.m_bCont = *o3tl::doAccess<bool>(pValues[nProp]); break;// "Medium/Continuous",
+ case 1: pValues[nProp] >>= m_aItem.m_aMake; break;// "Medium/Brand",
+ case 2: pValues[nProp] >>= m_aItem.m_aType; break;// "Medium/Type",
+ case 3: pValues[nProp] >>= m_aItem.m_nCols; break;// "Format/Column",
+ case 4: pValues[nProp] >>= m_aItem.m_nRows; break;// "Format/Row",
+ case 5:
+ pValues[nProp] >>= m_aItem.m_lHDist;
+ m_aItem.m_lHDist = o3tl::toTwips(m_aItem.m_lHDist, o3tl::Length::mm100);
+ break;// "Format/HorizontalDistance",
+ case 6:
+ pValues[nProp] >>= m_aItem.m_lVDist;
+ m_aItem.m_lVDist = o3tl::toTwips(m_aItem.m_lVDist, o3tl::Length::mm100);
+ break;// "Format/VerticalDistance",
+ case 7:
+ pValues[nProp] >>= m_aItem.m_lWidth;
+ m_aItem.m_lWidth = o3tl::toTwips(m_aItem.m_lWidth, o3tl::Length::mm100);
+ break;// "Format/Width",
+ case 8:
+ pValues[nProp] >>= m_aItem.m_lHeight;
+ m_aItem.m_lHeight = o3tl::toTwips(m_aItem.m_lHeight, o3tl::Length::mm100);
+ break;// "Format/Height",
+ case 9:
+ pValues[nProp] >>= m_aItem.m_lLeft;
+ m_aItem.m_lLeft = o3tl::toTwips(m_aItem.m_lLeft, o3tl::Length::mm100);
+ break;// "Format/LeftMargin",
+ case 10:
+ pValues[nProp] >>= m_aItem.m_lUpper;
+ m_aItem.m_lUpper = o3tl::toTwips(m_aItem.m_lUpper, o3tl::Length::mm100);
+ break;// "Format/TopMargin",
+ case 11:
+ pValues[nProp] >>= m_aItem.m_lPWidth;
+ m_aItem.m_lPWidth = o3tl::toTwips(m_aItem.m_lPWidth, o3tl::Length::mm100);
+ break;// "Format/PageWidth",
+ case 12:
+ pValues[nProp] >>= m_aItem.m_lPHeight;
+ m_aItem.m_lPHeight = o3tl::toTwips(m_aItem.m_lPHeight, o3tl::Length::mm100);
+ break;// "Format/PageHeight",
+ case 13: m_aItem.m_bSynchron = *o3tl::doAccess<bool>(pValues[nProp]); break;// "Option/Synchronize",
+ case 14: m_aItem.m_bPage = *o3tl::doAccess<bool>(pValues[nProp]); break;// "Option/Page",
+ case 15: pValues[nProp] >>= m_aItem.m_nCol; break;// "Option/Column",
+ case 16: pValues[nProp] >>= m_aItem.m_nRow; break;// "Option/Row"
+ case 17: m_aItem.m_bAddr = *o3tl::doAccess<bool>(pValues[nProp]); break;// "Inscription/UseAddress",
+ case 18: pValues[nProp] >>= m_aItem.m_aWriting; break;// "Inscription/Address",
+ case 19: pValues[nProp] >>= m_aItem.m_sDBName; break;// "Inscription/Database"
+ case 20: pValues[nProp] >>= m_aItem.m_aPrivFirstName; break;// "PrivateAddress/FirstName",
+ case 21: pValues[nProp] >>= m_aItem.m_aPrivName; break;// "PrivateAddress/Name",
+ case 22: pValues[nProp] >>= m_aItem.m_aPrivShortCut; break;// "PrivateAddress/ShortCut",
+ case 23: pValues[nProp] >>= m_aItem.m_aPrivFirstName2; break;// "PrivateAddress/SecondFirstName",
+ case 24: pValues[nProp] >>= m_aItem.m_aPrivName2; break;// "PrivateAddress/SecondName",
+ case 25: pValues[nProp] >>= m_aItem.m_aPrivShortCut2; break;// "PrivateAddress/SecondShortCut",
+ case 26: pValues[nProp] >>= m_aItem.m_aPrivStreet; break;// "PrivateAddress/Street",
+ case 27: pValues[nProp] >>= m_aItem.m_aPrivZip; break;// "PrivateAddress/Zip",
+ case 28: pValues[nProp] >>= m_aItem.m_aPrivCity; break;// "PrivateAddress/City",
+ case 29: pValues[nProp] >>= m_aItem.m_aPrivCountry; break;// "PrivateAddress/Country",
+ case 30: pValues[nProp] >>= m_aItem.m_aPrivState; break;// "PrivateAddress/State",
+ case 31: pValues[nProp] >>= m_aItem.m_aPrivTitle; break;// "PrivateAddress/Title",
+ case 32: pValues[nProp] >>= m_aItem.m_aPrivProfession; break;// "PrivateAddress/Profession",
+ case 33: pValues[nProp] >>= m_aItem.m_aPrivPhone; break;// "PrivateAddress/Phone",
+ case 34: pValues[nProp] >>= m_aItem.m_aPrivMobile; break;// "PrivateAddress/Mobile",
+ case 35: pValues[nProp] >>= m_aItem.m_aPrivFax; break;// "PrivateAddress/Fax",
+ case 36: pValues[nProp] >>= m_aItem.m_aPrivWWW; break;// "PrivateAddress/WebAddress",
+ case 37: pValues[nProp] >>= m_aItem.m_aPrivMail; break;// "PrivateAddress/Email",
+ case 38: pValues[nProp] >>= m_aItem.m_aCompCompany; break;// "BusinessAddress/Company",
+ case 39: pValues[nProp] >>= m_aItem.m_aCompCompanyExt; break;// "BusinessAddress/CompanyExt",
+ case 40: pValues[nProp] >>= m_aItem.m_aCompSlogan; break;// "BusinessAddress/Slogan",
+ case 41: pValues[nProp] >>= m_aItem.m_aCompStreet; break;// "BusinessAddress/Street",
+ case 42: pValues[nProp] >>= m_aItem.m_aCompZip; break;// "BusinessAddress/Zip",
+ case 43: pValues[nProp] >>= m_aItem.m_aCompCity; break;// "BusinessAddress/City",
+ case 44: pValues[nProp] >>= m_aItem.m_aCompCountry; break;// "BusinessAddress/Country",
+ case 45: pValues[nProp] >>= m_aItem.m_aCompState; break;// "BusinessAddress/State",
+ case 46: pValues[nProp] >>= m_aItem.m_aCompPosition; break;// "BusinessAddress/Position",
+ case 47: pValues[nProp] >>= m_aItem.m_aCompPhone; break;// "BusinessAddress/Phone",
+ case 48: pValues[nProp] >>= m_aItem.m_aCompMobile; break;// "BusinessAddress/Mobile",
+ case 49: pValues[nProp] >>= m_aItem.m_aCompFax; break;// "BusinessAddress/Fax",
+ case 50: pValues[nProp] >>= m_aItem.m_aCompWWW; break;// "BusinessAddress/WebAddress",
+ case 51: pValues[nProp] >>= m_aItem.m_aCompMail; break;// "BusinessAddress/Email",
+ case 52: pValues[nProp] >>= m_aItem.m_sGlossaryGroup; break;// "AutoText/Group"
+ case 53: pValues[nProp] >>= m_aItem.m_sGlossaryBlockName; break;// "AutoText/Block"
+ }
+ }
+ }
+ }
+
+ if(m_bIsLabel || !bNoConfigValues)
+ return;
+
+ SvtUserOptions& rUserOpt = SW_MOD()->GetUserOptions();
+ m_aItem.m_aPrivFirstName = rUserOpt.GetFirstName();
+ m_aItem.m_aPrivName = rUserOpt.GetLastName();
+ m_aItem.m_aPrivShortCut = rUserOpt.GetID();
+ m_aItem.m_aCompCompany = rUserOpt.GetCompany();
+ m_aItem.m_aCompStreet = m_aItem.m_aPrivStreet = rUserOpt.GetStreet();
+
+ m_aItem.m_aCompCountry = m_aItem.m_aPrivCountry = rUserOpt.GetCountry();
+ m_aItem.m_aCompZip = m_aItem.m_aPrivZip= rUserOpt.GetZip();
+ m_aItem.m_aCompCity = m_aItem.m_aPrivCity = rUserOpt.GetCity();
+ m_aItem.m_aPrivTitle = rUserOpt.GetTitle();
+ m_aItem.m_aCompPosition = rUserOpt.GetPosition();
+ m_aItem.m_aPrivPhone = rUserOpt.GetTelephoneHome();
+ m_aItem.m_aCompPhone = rUserOpt.GetTelephoneWork();
+ m_aItem.m_aCompFax = m_aItem.m_aPrivFax = rUserOpt.GetFax();
+ m_aItem.m_aCompMail = m_aItem.m_aPrivMail = rUserOpt.GetEmail();
+ m_aItem.m_aCompState = m_aItem.m_aPrivState = rUserOpt.GetState();
+ m_aItem.m_bSynchron = true;
+ SetModified();
+
+}
+
+void SwLabCfgItem::Notify( const css::uno::Sequence< OUString >& ) {}
+
+void SwLabCfgItem::ImplCommit()
+{
+ Sequence<OUString> aNames = GetPropertyNames();
+ Sequence<Any> aValues(aNames.getLength());
+ Any* pValues = aValues.getArray();
+
+ for(int nProp = 0, nProperty = 0; nProp < aNames.getLength(); nProp++, nProperty++)
+ {
+ //to have a contiuous switch an offset is added
+ if(nProp == 17 && !m_bIsLabel)
+ nProperty += 3;
+ switch(nProperty)
+ {
+ case 0: pValues[nProp] <<= m_aItem.m_bCont; break;// "Medium/Continuous",
+ case 1: pValues[nProp] <<= m_aItem.m_aMake; break;// "Medium/Brand",
+ case 2: pValues[nProp] <<= m_aItem.m_aType; break;// "Medium/Type",
+ case 3: pValues[nProp] <<= m_aItem.m_nCols; break;// "Format/Column",
+ case 4: pValues[nProp] <<= m_aItem.m_nRows; break;// "Format/Row",
+ case 5: pValues[nProp] <<= static_cast<sal_Int32>(convertTwipToMm100(m_aItem.m_lHDist));break;// "Format/HorizontalDistance",
+ case 6: pValues[nProp] <<= static_cast<sal_Int32>(convertTwipToMm100(m_aItem.m_lVDist));break;// "Format/VerticalDistance",
+ case 7: pValues[nProp] <<= static_cast<sal_Int32>(convertTwipToMm100(m_aItem.m_lWidth)); break;// "Format/Width",
+ case 8: pValues[nProp] <<= static_cast<sal_Int32>(convertTwipToMm100(m_aItem.m_lHeight)); break;// "Format/Height",
+ case 9: pValues[nProp] <<= static_cast<sal_Int32>(convertTwipToMm100(m_aItem.m_lLeft)); break;// "Format/LeftMargin",
+ case 10: pValues[nProp] <<= static_cast<sal_Int32>(convertTwipToMm100(m_aItem.m_lUpper)); break;// "Format/TopMargin",
+ case 11: pValues[nProp] <<= static_cast<sal_Int32>(convertTwipToMm100(m_aItem.m_lPWidth)); break;// "Format/Page Width",
+ case 12: pValues[nProp] <<= static_cast<sal_Int32>(convertTwipToMm100(m_aItem.m_lPHeight)); break;// "Format/PageHeight",
+ case 13: pValues[nProp] <<= m_aItem.m_bSynchron; break;// "Option/Synchronize",
+ case 14: pValues[nProp] <<= m_aItem.m_bPage; break;// "Option/Page",
+ case 15: pValues[nProp] <<= m_aItem.m_nCol; break;// "Option/Column",
+ case 16: pValues[nProp] <<= m_aItem.m_nRow; break;// "Option/Row"
+ case 17: pValues[nProp] <<= m_aItem.m_bAddr; break;// "Inscription/UseAddress",
+ case 18: pValues[nProp] <<= m_aItem.m_aWriting; break;// "Inscription/Address",
+ case 19: pValues[nProp] <<= m_aItem.m_sDBName; break;// "Inscription/Database"
+ case 20: pValues[nProp] <<= m_aItem.m_aPrivFirstName; break;// "PrivateAddress/FirstName",
+ case 21: pValues[nProp] <<= m_aItem.m_aPrivName; break;// "PrivateAddress/Name",
+ case 22: pValues[nProp] <<= m_aItem.m_aPrivShortCut; break;// "PrivateAddress/ShortCut",
+ case 23: pValues[nProp] <<= m_aItem.m_aPrivFirstName2; break;// "PrivateAddress/SecondFirstName",
+ case 24: pValues[nProp] <<= m_aItem.m_aPrivName2; break;// "PrivateAddress/SecondName",
+ case 25: pValues[nProp] <<= m_aItem.m_aPrivShortCut2; break;// "PrivateAddress/SecondShortCut",
+ case 26: pValues[nProp] <<= m_aItem.m_aPrivStreet; break;// "PrivateAddress/Street",
+ case 27: pValues[nProp] <<= m_aItem.m_aPrivZip; break;// "PrivateAddress/Zip",
+ case 28: pValues[nProp] <<= m_aItem.m_aPrivCity; break;// "PrivateAddress/City",
+ case 29: pValues[nProp] <<= m_aItem.m_aPrivCountry; break;// "PrivateAddress/Country",
+ case 30: pValues[nProp] <<= m_aItem.m_aPrivState; break;// "PrivateAddress/State",
+ case 31: pValues[nProp] <<= m_aItem.m_aPrivTitle; break;// "PrivateAddress/Title",
+ case 32: pValues[nProp] <<= m_aItem.m_aPrivProfession; break;// "PrivateAddress/Profession",
+ case 33: pValues[nProp] <<= m_aItem.m_aPrivPhone; break;// "PrivateAddress/Phone",
+ case 34: pValues[nProp] <<= m_aItem.m_aPrivMobile; break;// "PrivateAddress/Mobile",
+ case 35: pValues[nProp] <<= m_aItem.m_aPrivFax; break;// "PrivateAddress/Fax",
+ case 36: pValues[nProp] <<= m_aItem.m_aPrivWWW; break;// "PrivateAddress/WebAddress",
+ case 37: pValues[nProp] <<= m_aItem.m_aPrivMail; break;// "PrivateAddress/Email",
+ case 38: pValues[nProp] <<= m_aItem.m_aCompCompany; break;// "BusinessAddress/Company",
+ case 39: pValues[nProp] <<= m_aItem.m_aCompCompanyExt; break;// "BusinessAddress/CompanyExt",
+ case 40: pValues[nProp] <<= m_aItem.m_aCompSlogan; break;// "BusinessAddress/Slogan",
+ case 41: pValues[nProp] <<= m_aItem.m_aCompStreet; break;// "BusinessAddress/Street",
+ case 42: pValues[nProp] <<= m_aItem.m_aCompZip; break;// "BusinessAddress/Zip",
+ case 43: pValues[nProp] <<= m_aItem.m_aCompCity; break;// "BusinessAddress/City",
+ case 44: pValues[nProp] <<= m_aItem.m_aCompCountry; break;// "BusinessAddress/Country",
+ case 45: pValues[nProp] <<= m_aItem.m_aCompState; break;// "BusinessAddress/State",
+ case 46: pValues[nProp] <<= m_aItem.m_aCompPosition; break;// "BusinessAddress/Position",
+ case 47: pValues[nProp] <<= m_aItem.m_aCompPhone; break;// "BusinessAddress/Phone",
+ case 48: pValues[nProp] <<= m_aItem.m_aCompMobile; break;// "BusinessAddress/Mobile",
+ case 49: pValues[nProp] <<= m_aItem.m_aCompFax; break;// "BusinessAddress/Fax",
+ case 50: pValues[nProp] <<= m_aItem.m_aCompWWW; break;// "BusinessAddress/WebAddress",
+ case 51: pValues[nProp] <<= m_aItem.m_aCompMail; break;// "BusinessAddress/Email",
+ case 52: pValues[nProp] <<= m_aItem.m_sGlossaryGroup; break;// "AutoText/Group"
+ case 53: pValues[nProp] <<= m_aItem.m_sGlossaryBlockName; break;// "AutoText/Block"
+ }
+ }
+ PutProperties(aNames, aValues);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/envelp/syncbtn.cxx b/sw/source/uibase/envelp/syncbtn.cxx
new file mode 100644
index 000000000..2d829a45b
--- /dev/null
+++ b/sw/source/uibase/envelp/syncbtn.cxx
@@ -0,0 +1,87 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <vcl/windowstate.hxx>
+
+#include <cmdid.h>
+#include <swmodule.hxx>
+#include <view.hxx>
+#include <edtwin.hxx>
+
+#include <syncbtn.hxx>
+
+SFX_IMPL_MODELESSDIALOGCONTOLLER(SwSyncChildWin, FN_SYNC_LABELS)
+
+SwSyncChildWin::SwSyncChildWin(vcl::Window* _pParent,
+ sal_uInt16 nId,
+ SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo)
+ : SfxChildWindow(_pParent, nId)
+{
+ SetController(std::make_shared<SwSyncBtnDlg>(pBindings, this, _pParent->GetFrameWeld()));
+ SwSyncBtnDlg* pBtnDlg = static_cast<SwSyncBtnDlg*>(GetController().get());
+
+ if (!pInfo->aSize.Width() || !pInfo->aSize.Height())
+ {
+ weld::Dialog* pDlg = pBtnDlg->getDialog();
+ Point aPos;
+
+ if (SwView* pActiveView = GetActiveView())
+ {
+ const SwEditWin &rEditWin = pActiveView->GetEditWin();
+ aPos = rEditWin.OutputToScreenPixel(Point(0, 0));
+ }
+ else
+ aPos = _pParent->OutputToScreenPixel(Point(0, 0));
+
+ WindowStateData aState;
+ aState.SetMask(WindowStateMask::Pos);
+ aState.SetX(aPos.X());
+ aState.SetY(aPos.Y());
+ pDlg->set_window_state(aState.ToStr());
+
+ pInfo->aPos = pDlg->get_position();
+ pInfo->aSize = pDlg->get_size();
+ }
+
+ pBtnDlg->Initialize(pInfo);
+}
+
+SwSyncBtnDlg::SwSyncBtnDlg(SfxBindings* pBindings,
+ SfxChildWindow* pChild,
+ weld::Window *pParent)
+ : SfxModelessDialogController(pBindings, pChild, pParent, "modules/swriter/ui/floatingsync.ui", "FloatingSync")
+ , m_xSyncBtn(m_xBuilder->weld_button("sync"))
+{
+ m_xSyncBtn->connect_clicked(LINK(this, SwSyncBtnDlg, BtnHdl));
+}
+
+SwSyncBtnDlg::~SwSyncBtnDlg()
+{
+}
+
+IMPL_STATIC_LINK_NOARG(SwSyncBtnDlg, BtnHdl, weld::Button&, void)
+{
+ if (SfxViewFrame* pViewFrm = SfxViewFrame::Current())
+ pViewFrm->GetDispatcher()->Execute(FN_UPDATE_ALL_LINKS, SfxCallMode::ASYNCHRON);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */