[Libreoffice-commits] core.git: 2 commits - sd/source sw/CppunitTest_sw_ooxmlimport.mk sw/qa writerfilter/Library_writerfilter.mk writerfilter/source

Miklos Vajna vmiklos at suse.cz
Thu May 2 03:14:57 PDT 2013


 sd/source/core/sdpage.cxx                         |   12 +-
 sw/CppunitTest_sw_ooxmlimport.mk                  |    2 
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx          |    5 
 writerfilter/Library_writerfilter.mk              |    1 
 writerfilter/source/dmapper/DomainMapper.cxx      |   41 ++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   63 ----------
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |    8 -
 writerfilter/source/dmapper/SdtHelper.cxx         |  129 ++++++++++++++++++++++
 writerfilter/source/dmapper/SdtHelper.hxx         |   68 +++++++++++
 writerfilter/source/ooxml/model.xml               |    3 
 10 files changed, 261 insertions(+), 71 deletions(-)

New commits:
commit 3ec2d26dc2017ac4a27483febfc63328632f352d
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Tue Apr 30 17:26:36 2013 +0200

    bnc#779630 initial DOCX import of w:sdt's w:date
    
    Also factor out the w:sdt-related methods to a helper class to avoid
    DomainMapper_Impl become a God object.
    
    Change-Id: Ic1a388940bce89688e8558818f92ce9ac997609c

diff --git a/sw/CppunitTest_sw_ooxmlimport.mk b/sw/CppunitTest_sw_ooxmlimport.mk
index de4e207..b558073 100644
--- a/sw/CppunitTest_sw_ooxmlimport.mk
+++ b/sw/CppunitTest_sw_ooxmlimport.mk
@@ -53,6 +53,7 @@ $(eval $(call gb_CppunitTest_use_components,sw_ooxmlimport,\
     embeddedobj/util/embobj \
     fileaccess/source/fileacc \
     filter/source/config/cache/filterconfig1 \
+    forms/util/frm \
     framework/util/fwk \
     i18npool/util/i18npool \
     linguistic/source/lng \
@@ -66,6 +67,7 @@ $(eval $(call gb_CppunitTest_use_components,sw_ooxmlimport,\
     sw/util/msword \
     sfx2/util/sfx \
     svl/source/fsstor/fsstorage \
+    svl/util/svl \
     svtools/util/svt \
     toolkit/util/tk \
     ucb/source/core/ucb1 \
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 423900f..ccde3ff 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -901,7 +901,10 @@ void Test::testN779627()
      */
     uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
     uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
-    uno::Reference<beans::XPropertySet> xShapeProperties( xDraws->getByIndex(2), uno::UNO_QUERY );
+    uno::Reference<beans::XPropertySet> xShapeProperties( xDraws->getByIndex(3), uno::UNO_QUERY );
+    uno::Reference<drawing::XShapeDescriptor> xShapeDescriptor(xShapeProperties, uno::UNO_QUERY);
+    // If this goes wrong, probably the index of the shape is changed and the test should be adjusted.
+    CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.RectangleShape"), xShapeDescriptor->getShapeType());
     sal_Int16 nValue;
     xShapeProperties->getPropertyValue("HoriOrient") >>= nValue;
     CPPUNIT_ASSERT_EQUAL_MESSAGE("Not centered horizontally", text::HoriOrientation::CENTER, nValue);
diff --git a/writerfilter/Library_writerfilter.mk b/writerfilter/Library_writerfilter.mk
index fdde17f..81d7df2 100644
--- a/writerfilter/Library_writerfilter.mk
+++ b/writerfilter/Library_writerfilter.mk
@@ -106,6 +106,7 @@ $(eval $(call gb_Library_add_exception_objects,writerfilter,\
     writerfilter/source/dmapper/PropertyIds \
     writerfilter/source/dmapper/PropertyMap \
     writerfilter/source/dmapper/PropertyMapHelper \
+    writerfilter/source/dmapper/SdtHelper \
     writerfilter/source/dmapper/SectionColumnHandler \
     writerfilter/source/dmapper/SettingsTable \
     writerfilter/source/dmapper/StyleSheetTable \
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 4d6f905..16ac29c 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -19,6 +19,7 @@
 #include "PageBordersHandler.hxx"
 
 #include <resourcemodel/ResourceModelHelper.hxx>
+#include <SdtHelper.hxx>
 #include <DomainMapper_Impl.hxx>
 #include <ConversionHelper.hxx>
 #include <ModelEventListener.hxx>
@@ -1435,14 +1436,14 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
         break;
         case NS_ooxml::LN_CT_SdtBlock_sdtEndContent:
             m_pImpl->SetSdt(false);
-            if (!m_pImpl->m_aDropDownItems.empty())
-                m_pImpl->createDropDownControl();
+            if (!m_pImpl->m_pSdtHelper->getDropDownItems().empty())
+                m_pImpl->m_pSdtHelper->createDropDownControl();
         break;
         case NS_ooxml::LN_CT_SdtListItem_displayText:
             // TODO handle when this is != value
         break;
         case NS_ooxml::LN_CT_SdtListItem_value:
-            m_pImpl->m_aDropDownItems.push_back(sStringValue);
+            m_pImpl->m_pSdtHelper->getDropDownItems().push_back(sStringValue);
         break;
         default:
             {
@@ -3311,6 +3312,26 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType
             pProperties->resolve(*this);
     }
     break;
+    case NS_ooxml::LN_CT_SdtPr_date:
+    {
+        writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
+        if (pProperties.get() != NULL)
+            pProperties->resolve(*this);
+    }
+    break;
+    case NS_ooxml::LN_CT_SdtDate_dateFormat:
+    {
+        if (sStringValue == "M/d/yyyy")
+            // See com/sun/star/awt/UnoControlDateFieldModel.idl, DateFormat; sadly there are no constants for this.
+            m_pImpl->m_pSdtHelper->getDateFormat().reset(8);
+        else
+        {
+            // Set default format, so at least the date picker is created.
+            m_pImpl->m_pSdtHelper->getDateFormat().reset(0);
+            SAL_WARN("writerfilter", "unhandled w:dateFormat value");
+        }
+    }
+    break;
     default:
         {
 #ifdef DEBUG_DOMAINMAPPER
@@ -3602,9 +3623,19 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
     aBuffer.append( (const sal_Unicode *) data_, len);
     sText = aBuffer.makeStringAndClear();
 
-    if (!m_pImpl->m_aDropDownItems.empty())
+    if (!m_pImpl->m_pSdtHelper->getDropDownItems().empty())
     {
-        m_pImpl->m_aSdtTexts.append(sText);
+        m_pImpl->m_pSdtHelper->getSdtTexts().append(sText);
+        return;
+    }
+    else if (m_pImpl->m_pSdtHelper->getDateFormat())
+    {
+        /*
+         * Here we assume w:sdt only contains a single text token. We need to
+         * create the control early, as in Writer, it's part of the cell, but
+         * in OOXML, the sdt contains the cell.
+         */
+        m_pImpl->m_pSdtHelper->createDateControl(sText);
         return;
     }
 
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 854179f..b5a5baa 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -19,6 +19,7 @@
 
 #include <DomainMapper_Impl.hxx>
 #include <ConversionHelper.hxx>
+#include <SdtHelper.hxx>
 #include <DomainMapperTableHandler.hxx>
 #include <com/sun/star/uno/XComponentContext.hpp>
 #include <com/sun/star/graphic/XGraphic.hpp>
@@ -186,7 +187,8 @@ DomainMapper_Impl::DomainMapper_Impl(
         m_bSdt(false),
         m_xInsertTextRange(xInsertTextRange),
         m_bIsNewDoc(bIsNewDoc),
-        m_bInTableStyleRunProps(false)
+        m_bInTableStyleRunProps(false),
+        m_pSdtHelper(0)
 {
     appendTableManager( );
     GetBodyText();
@@ -203,6 +205,7 @@ DomainMapper_Impl::DomainMapper_Impl(
     getTableManager( ).startLevel();
     m_bUsingEnhancedFields = lcl_IsUsingEnhancedFields( m_xComponentContext );
 
+    m_pSdtHelper = new SdtHelper(*this);
 }
 
 
@@ -211,6 +214,7 @@ DomainMapper_Impl::~DomainMapper_Impl()
     RemoveLastParagraph( );
     getTableManager( ).endLevel();
     popTableManager( );
+    delete m_pSdtHelper;
 }
 
 
@@ -3937,63 +3941,6 @@ bool DomainMapper_Impl::IsNewDoc()
     return m_bIsNewDoc;
 }
 
-/// 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);
-}
-
-void DomainMapper_Impl::createDropDownControl()
-{
-    OUString aDefaultText = m_aSdtTexts.makeStringAndClear();
-    uno::Reference<awt::XControlModel> xControlModel(m_xTextFactory->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));
-
-    uno::Reference<drawing::XControlShape> xControlShape(m_xTextFactory->createInstance("com.sun.star.drawing.ControlShape"), uno::UNO_QUERY);
-    xControlShape->setSize(lcl_getOptimalWidth(GetStyleSheetTable(), aDefaultText, m_aDropDownItems));
-    m_aDropDownItems.clear();
-    xControlShape->setControl(xControlModel);
-
-    xPropertySet.set(xControlShape, uno::UNO_QUERY);
-    xPropertySet->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::CENTER));
-
-    uno::Reference<text::XTextContent> xTextContent(xControlShape, uno::UNO_QUERY);
-    appendTextContent(xTextContent, uno::Sequence< beans::PropertyValue >());
-}
-
 }}
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 68fe0ae..60faa83 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -29,6 +29,7 @@
 #include <com/sun/star/container/XNameContainer.hpp>
 #include <vector>
 #include <stack>
+#include <boost/optional.hpp>
 
 #ifndef INCLUDED_RESOURCESIDS
 #include <doctok/resourceids.hxx>
@@ -71,6 +72,8 @@ namespace dmapper {
 
 using namespace com::sun::star;
 
+class SdtHelper;
+
 struct _PageMar
 {
     sal_Int32 top;
@@ -679,10 +682,7 @@ public:
     /// If we're inside <w:rPr>, inside <w:style w:type="table">
     bool m_bInTableStyleRunProps;
 
-    std::vector<OUString> m_aDropDownItems;
-    OUStringBuffer m_aSdtTexts;
-    /// Create drop-down control from w:sdt's w:dropDownList.
-    void createDropDownControl();
+    SdtHelper* m_pSdtHelper;
 };
 } //namespace dmapper
 } //namespace writerfilter
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx
new file mode 100644
index 0000000..a1b215b
--- /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: */
diff --git a/writerfilter/source/dmapper/SdtHelper.hxx b/writerfilter/source/dmapper/SdtHelper.hxx
new file mode 100644
index 0000000..d2ce372
--- /dev/null
+++ b/writerfilter/source/dmapper/SdtHelper.hxx
@@ -0,0 +1,68 @@
+/* -*- 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_SDTHELPER_HXX
+#define INCLUDED_SDTHELPER_HXX
+
+#include <boost/optional.hpp>
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <rtl/ustrbuf.hxx>
+
+#include <WriterFilterDllApi.hxx>
+
+namespace com { namespace sun { namespace star {
+        namespace awt{
+            struct Size;
+            class XControlModel;
+        }
+}}}
+
+namespace writerfilter {
+    namespace dmapper {
+
+        /**
+         * Helper to create form controls from w:sdt tokens.
+         *
+         * w:sdt tokens can't be imported as form fields, as w:sdt supports
+         * e.g. date picking as well.
+         */
+        class SdtHelper
+        {
+            DomainMapper_Impl& m_rDM_Impl;
+
+            /// Items of the drop-down control.
+            std::vector<OUString> m_aDropDownItems;
+            /// Pieces of the default text -- currently used only by the dropdown control.
+            OUStringBuffer m_aSdtTexts;
+            /// Date format, see com/sun/star/awt/UnoControlDateFieldModel.idl
+            boost::optional<sal_Int16> m_oDateFormat;
+
+            /// Create and append the drawing::XControlShape, containing the various models.
+            void createControlShape(com::sun::star::awt::Size aSize, com::sun::star::uno::Reference<com::sun::star::awt::XControlModel>);
+        public:
+            SdtHelper(DomainMapper_Impl& rDM_Impl);
+            virtual ~SdtHelper();
+
+            std::vector<OUString>& getDropDownItems();
+            OUStringBuffer& getSdtTexts();
+            boost::optional<sal_Int16>& getDateFormat();
+
+            /// Create drop-down control from w:sdt's w:dropDownList.
+            void createDropDownControl();
+            /// Create date control from w:sdt's w:date.
+            void createDateControl(OUString& rDefaultText);
+        };
+
+    } // namespace dmapper
+} // namespace writerfilter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
index 458e26a..0e11017 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -22772,6 +22772,9 @@
     <resource name="CT_SdtDropDownList" resource="Properties" tag="field">
       <element name="listItem" tokenid="ooxml:CT_SdtDropDownList_listItem"/>
     </resource>
+    <resource name="CT_SdtDate" resource="Properties" tag="field">
+      <element name="dateFormat" tokenid="ooxml:CT_SdtDate_dateFormat"/>
+    </resource>
     <resource name="CT_SdtListItem" resource="Properties" tag="field">
       <attribute name="displayText" tokenid="ooxml:CT_SdtListItem_displayText"/>
       <attribute name="value" tokenid="ooxml:CT_SdtListItem_value"/>
commit 3af051aa4a554c33e146a2329d8d504cf8908022
Author: Andre Fischer <af at apache.org>
Date:   Thu Jun 28 10:26:32 2012 +0000

    Resolves: #i120050# memory leak when SdrObject is removed from master page
    
    Patch by: ChaoHuang
    Review and minor changes by: Andre Fischer
    (cherry picked from commit aee07d48ed6a24ffd4b4dac73236fb3a3ec5e800)
    
    Change-Id: If3735c82dc2d02965fa0403c3adf549e4e6e8c26

diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx
index b9bf6da..8261bf8 100644
--- a/sd/source/core/sdpage.cxx
+++ b/sd/source/core/sdpage.cxx
@@ -774,13 +774,19 @@ void SdPage::CreateTitleAndLayout(sal_Bool bInit, sal_Bool bCreate )
             // handout template
 
             // delete all available handout presentation objects
-            SdrObject* pObj;
+            SdrObject *pObj=NULL;
             while( (pObj = pMasterPage->GetPresObj(PRESOBJ_HANDOUT)) != 0 )
             {
+                pMasterPage->RemoveObject(pObj->GetOrdNum());
+
                 if( bUndo )
+                {
                     pUndoManager->AddUndoAction(pModel->GetSdrUndoFactory().CreateUndoDeleteObject(*pObj));
-
-                pMasterPage->RemoveObject(pObj->GetOrdNum());
+                }
+                else
+                {
+                    SdrObject::Free( pObj );  // memory leak i120050
+                }
             }
 
             std::vector< Rectangle > aAreas;


More information about the Libreoffice-commits mailing list