summaryrefslogtreecommitdiff
path: root/writerfilter/source/dmapper/SdtHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/dmapper/SdtHelper.cxx')
-rw-r--r--writerfilter/source/dmapper/SdtHelper.cxx129
1 files changed, 129 insertions, 0 deletions
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx
new file mode 100644
index 000000000000..a1b215b3efaa
--- /dev/null
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -0,0 +1,129 @@
+/* -*- 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 <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/awt/XControlModel.hpp>
+#include <com/sun/star/drawing/XControlShape.hpp>
+#include <com/sun/star/text/VertOrientation.hpp>
+
+#include <vcl/outdev.hxx>
+#include <vcl/svapp.hxx>
+
+#include <DomainMapper_Impl.hxx>
+#include <StyleSheetTable.hxx>
+#include <SdtHelper.hxx>
+
+namespace writerfilter {
+namespace dmapper {
+
+using namespace ::com::sun::star;
+
+/// w:sdt's w:dropDownList doesn't have width, so guess the size based on the longest string.
+awt::Size lcl_getOptimalWidth(StyleSheetTablePtr pStyleSheet, OUString& rDefault, std::vector<OUString>& rItems)
+{
+ OUString aLongest = rDefault;
+ sal_Int32 nHeight = 0;
+ for (size_t i = 0; i < rItems.size(); ++i)
+ if (rItems[i].getLength() > aLongest.getLength())
+ aLongest = rItems[i];
+
+ MapMode aMap(MAP_100TH_MM);
+ OutputDevice* pOut = Application::GetDefaultDevice();
+ pOut->Push(PUSH_FONT | PUSH_MAPMODE);
+
+ PropertyMapPtr pDefaultCharProps = pStyleSheet->GetDefaultCharProps();
+ Font aFont(pOut->GetFont());
+ PropertyMap::iterator aFontName = pDefaultCharProps->find(PropertyDefinition(PROP_CHAR_FONT_NAME, false));
+ if (aFontName != pDefaultCharProps->end())
+ aFont.SetName(aFontName->second.get<OUString>());
+ PropertyMap::iterator aHeight = pDefaultCharProps->find(PropertyDefinition(PROP_CHAR_HEIGHT, false));
+ if (aHeight != pDefaultCharProps->end())
+ {
+ nHeight = aHeight->second.get<double>() * 35; // points -> mm100
+ aFont.SetSize(Size(0, nHeight));
+ }
+ pOut->SetFont(aFont);
+ pOut->SetMapMode(aMap);
+ sal_Int32 nWidth = pOut->GetTextWidth(aLongest);
+
+ pOut->Pop();
+ // Width: space for the text + the square having the dropdown arrow.
+ return awt::Size(nWidth + nHeight, nHeight);
+}
+
+SdtHelper::SdtHelper(DomainMapper_Impl& rDM_Impl):
+ m_rDM_Impl(rDM_Impl)
+{
+}
+
+SdtHelper::~SdtHelper()
+{
+}
+
+void SdtHelper::createDropDownControl()
+{
+ OUString aDefaultText = m_aSdtTexts.makeStringAndClear();
+ uno::Reference<awt::XControlModel> xControlModel(m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.form.component.ComboBox"), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlModel, uno::UNO_QUERY);
+ xPropertySet->setPropertyValue("DefaultText", uno::makeAny(aDefaultText));
+ xPropertySet->setPropertyValue("Dropdown", uno::makeAny(sal_True));
+ uno::Sequence<OUString> aItems(m_aDropDownItems.size());
+ for (size_t i = 0; i < m_aDropDownItems.size(); ++i)
+ aItems[i] = m_aDropDownItems[i];
+ xPropertySet->setPropertyValue("StringItemList", uno::makeAny(aItems));
+
+ createControlShape(lcl_getOptimalWidth(m_rDM_Impl.GetStyleSheetTable(), aDefaultText, m_aDropDownItems), xControlModel);
+ m_aDropDownItems.clear();
+}
+
+void SdtHelper::createDateControl(OUString& rDefaultText)
+{
+ uno::Reference<awt::XControlModel> xControlModel(m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.form.component.DateField"), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlModel, uno::UNO_QUERY);
+ xPropertySet->setPropertyValue("HelpText", uno::makeAny(rDefaultText));
+ xPropertySet->setPropertyValue("Dropdown", uno::makeAny(sal_True));
+ xPropertySet->setPropertyValue("DateFormat", uno::makeAny(*m_oDateFormat));
+ m_oDateFormat.reset();
+
+ std::vector<OUString> aItems;
+ createControlShape(lcl_getOptimalWidth(m_rDM_Impl.GetStyleSheetTable(), rDefaultText, aItems), xControlModel);
+}
+
+void SdtHelper::createControlShape(awt::Size aSize, uno::Reference<awt::XControlModel> xControlModel)
+{
+ uno::Reference<drawing::XControlShape> xControlShape(m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.drawing.ControlShape"), uno::UNO_QUERY);
+ xControlShape->setSize(aSize);
+ xControlShape->setControl(xControlModel);
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape, uno::UNO_QUERY);
+ xPropertySet->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::CENTER));
+
+ uno::Reference<text::XTextContent> xTextContent(xControlShape, uno::UNO_QUERY);
+ m_rDM_Impl.appendTextContent(xTextContent, uno::Sequence< beans::PropertyValue >());
+}
+
+std::vector<OUString>& SdtHelper::getDropDownItems()
+{
+ return m_aDropDownItems;
+}
+
+OUStringBuffer& SdtHelper::getSdtTexts()
+{
+ return m_aSdtTexts;
+}
+
+boost::optional<sal_Int16>& SdtHelper::getDateFormat()
+{
+ return m_oDateFormat;
+}
+
+} // namespace dmapper
+} // namespace writerfilter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */