[Libreoffice-commits] core.git: 11 commits - include/xmloff sw/inc sw/Library_sw.mk sw/qa sw/source writerfilter/source xmloff/source

Miklos Vajna vmiklos at collabora.co.uk
Sat Nov 8 14:07:46 PST 2014


 include/xmloff/xmlnume.hxx                         |   21 
 include/xmloff/xmlnumi.hxx                         |   12 
 sw/Library_sw.mk                                   |    1 
 sw/inc/unosett.hxx                                 |   14 
 sw/qa/extras/rtfimport/data/unbalanced-columns.rtf |    5 
 sw/qa/extras/rtfimport/rtfimport.cxx               |    8 
 sw/source/core/unocore/unosett.cxx                 |  439 +++++++++---------
 sw/source/ui/misc/outline.cxx                      |    4 
 sw/source/uibase/config/StoredChapterNumbering.cxx |  496 +++++++++++++++++++++
 sw/source/uibase/config/uinums.cxx                 |  404 ++---------------
 sw/source/uibase/inc/uinums.hxx                    |   51 +-
 writerfilter/source/rtftok/rtfdocumentimpl.cxx     |    6 
 xmloff/source/draw/XMLShapePropertySetContext.cxx  |    2 
 xmloff/source/draw/XMLShapeStyleContext.cxx        |    2 
 xmloff/source/style/xmlnumi.cxx                    |   20 
 15 files changed, 858 insertions(+), 627 deletions(-)

New commits:
commit f4bb73164a51ec83fe1d5975b1232d35f8a9e88a
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Sat Nov 8 22:47:26 2014 +0100

    fdo#84645 RTF import: set DontBalanceTextColumns=true for the last section ...
    
    ... if it has multiple columns. See commit
    d185204737031955c56a24356ed003d342548434 (DOCX import: set
    DontBalanceTextColumns=true for the last section, 2014-07-17) for the
    DOCX equivalent of this problem; this just adapts the RTF tokenizer to
    dmapper.
    
    Change-Id: Ib30f9b386e204b8b2987832ab17ee0cc53b3f0bc

diff --git a/sw/qa/extras/rtfimport/data/unbalanced-columns.rtf b/sw/qa/extras/rtfimport/data/unbalanced-columns.rtf
new file mode 100644
index 0000000..aa57e38
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/unbalanced-columns.rtf
@@ -0,0 +1,5 @@
+{\rtf1
+\cols2
+\pard\plain First paragraph.\par
+Second paragraph.\par
+}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 46e0843..54334b3 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -2068,6 +2068,14 @@ DECLARE_RTFIMPORT_TEST(testFdo82512, "fdo82512.rtf")
     CPPUNIT_ASSERT_EQUAL(style::BreakType_COLUMN_BEFORE, getProperty<style::BreakType>(getParagraph(2), "BreakType"));
 }
 
+DECLARE_RTFIMPORT_TEST(testUnbalancedColumns, "unbalanced-columns.rtf")
+{
+    uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
+    // This was false, last section was balanced, but it's unbalanced in Word.
+    CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xTextSections->getByIndex(0), "DontBalanceTextColumns"));
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 3c7b5d3..66b9eb3 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -611,6 +611,12 @@ void RTFDocumentImpl::sectBreak(bool bFinal = false)
     writerfilter::Reference<Properties>::Pointer_t const pProperties(
         new RTFReferenceProperties(aAttributes, aSprms)
     );
+
+    if (bFinal && !m_pSuperstream)
+        // This is the end of the document, not just the end of e.g. a header.
+        // This makes sure that dmapper can set DontBalanceTextColumns=true for this section if necessary.
+        Mapper().markLastSectionGroup();
+
     // The trick is that we send properties of the previous section right now, which will be exactly what dmapper expects.
     Mapper().props(pProperties);
     Mapper().endParagraphGroup();
commit 5fea6b760df32297f225b72c9e2c30d975e9142a
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sat Nov 8 22:28:49 2014 +0100

    sw: SwChapterNumRules::sFileName looks pretty constant
    
    Change-Id: Iaecaccab729e22ae9504d01c9974779cf1ab381b

diff --git a/sw/source/uibase/config/uinums.cxx b/sw/source/uibase/config/uinums.cxx
index 449d1df..d48b6cb 100644
--- a/sw/source/uibase/config/uinums.cxx
+++ b/sw/source/uibase/config/uinums.cxx
@@ -46,7 +46,6 @@ using namespace ::com::sun::star;
 */
 
 SwChapterNumRules::SwChapterNumRules()
-    : sFileName(OUString(CHAPTER_FILENAME))
 {
     Init();
 }
@@ -57,14 +56,14 @@ void SwChapterNumRules::Save()
     SvtPathOptions aPathOpt;
     aURL.SetSmartURL( aPathOpt.GetUserConfigPath() );
     aURL.setFinalSlash();
-    aURL.Append(sFileName);
+    aURL.Append(CHAPTER_FILENAME);
 
     SfxMedium aMedium( aURL.GetMainURL(INetURLObject::NO_DECODE), STREAM_WRITE );
     SvStream* pStream = aMedium.GetOutStream();
     bool bRet = (pStream && pStream->GetError() == 0);
     if (bRet)
     {
-        sw::ExportStoredChapterNumberingRules(*this, *pStream, sFileName);
+        sw::ExportStoredChapterNumberingRules(*this, *pStream,CHAPTER_FILENAME);
 
         pStream->Flush();
 
@@ -83,12 +82,13 @@ void  SwChapterNumRules::Init()
     for(sal_uInt16 i = 0; i < nMaxRules; ++i )
         pNumRules[i] = 0;
 
-    OUString sNm( sFileName );
+    OUString sNm(CHAPTER_FILENAME);
     SvtPathOptions aOpt;
     if( aOpt.SearchFile( sNm, SvtPathOptions::PATH_USERCONFIG ))
     {
         SfxMedium aStrm( sNm, STREAM_STD_READ );
-        sw::ImportStoredChapterNumberingRules(*this, *aStrm.GetInStream(), sFileName);
+        sw::ImportStoredChapterNumberingRules(*this, *aStrm.GetInStream(),
+                CHAPTER_FILENAME);
     }
 }
 
diff --git a/sw/source/uibase/inc/uinums.hxx b/sw/source/uibase/inc/uinums.hxx
index 60a9d23..5b2226f 100644
--- a/sw/source/uibase/inc/uinums.hxx
+++ b/sw/source/uibase/inc/uinums.hxx
@@ -85,7 +85,6 @@ public:
     enum { nMaxRules = MAX_NUM_RULES };         // currently 9 defined forms
 protected:
     SwNumRulesWithName   *pNumRules[ MAX_NUM_RULES ];
-    OUString              sFileName;
 
     void                Init();
     void Save();
commit f8482195dfdebc820ea4d4c2a0cb9dc698172efe
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sat Nov 8 22:26:45 2014 +0100

    sw: SwChapterNumRules::bModified has become pointless
    
    Change-Id: I7d4937dab947b14d4885c548cd7a96ebaba23c60

diff --git a/sw/source/uibase/config/uinums.cxx b/sw/source/uibase/config/uinums.cxx
index 025ad2f..449d1df 100644
--- a/sw/source/uibase/config/uinums.cxx
+++ b/sw/source/uibase/config/uinums.cxx
@@ -47,33 +47,28 @@ using namespace ::com::sun::star;
 
 SwChapterNumRules::SwChapterNumRules()
     : sFileName(OUString(CHAPTER_FILENAME))
-    ,
-    bModified( false )
 {
     Init();
 }
 
 void SwChapterNumRules::Save()
 {
-    if( bModified )
+    INetURLObject aURL;
+    SvtPathOptions aPathOpt;
+    aURL.SetSmartURL( aPathOpt.GetUserConfigPath() );
+    aURL.setFinalSlash();
+    aURL.Append(sFileName);
+
+    SfxMedium aMedium( aURL.GetMainURL(INetURLObject::NO_DECODE), STREAM_WRITE );
+    SvStream* pStream = aMedium.GetOutStream();
+    bool bRet = (pStream && pStream->GetError() == 0);
+    if (bRet)
     {
-        INetURLObject aURL;
-        SvtPathOptions aPathOpt;
-        aURL.SetSmartURL( aPathOpt.GetUserConfigPath() );
-        aURL.setFinalSlash();
-        aURL.Append(sFileName);
-
-        SfxMedium aMedium( aURL.GetMainURL(INetURLObject::NO_DECODE), STREAM_WRITE );
-        SvStream* pStream = aMedium.GetOutStream();
-        bool bRet = (pStream && pStream->GetError() == 0);
-        if (bRet)
-        {
-            sw::ExportStoredChapterNumberingRules(*this, *pStream, sFileName);
+        sw::ExportStoredChapterNumberingRules(*this, *pStream, sFileName);
 
-            pStream->Flush();
+        pStream->Flush();
 
-            aMedium.Commit();
-        }
+        aMedium.Commit();
     }
 }
 
@@ -106,7 +101,6 @@ void SwChapterNumRules::CreateEmptyNumRule(sal_uInt16 const nIndex)
 
 void SwChapterNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx)
 {
-    bModified = true;
     assert(nIdx < nMaxRules);
     if( !pNumRules[nIdx] )
         pNumRules[nIdx] = new SwNumRulesWithName( rCopy );
diff --git a/sw/source/uibase/inc/uinums.hxx b/sw/source/uibase/inc/uinums.hxx
index d01edec9..60a9d23 100644
--- a/sw/source/uibase/inc/uinums.hxx
+++ b/sw/source/uibase/inc/uinums.hxx
@@ -86,7 +86,6 @@ public:
 protected:
     SwNumRulesWithName   *pNumRules[ MAX_NUM_RULES ];
     OUString              sFileName;
-    bool              bModified;
 
     void                Init();
     void Save();
commit 65d762d8ca0545d2f77da24f9cefa5b3148ef384
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sat Nov 8 22:21:12 2014 +0100

    sw: delete the SwChapterNumRules binary Load/Store implementation
    
    Loading the outline formats from a StarOffice 3 user profile went out of
    style.
    
    Change-Id: I4989fa043a616428fea3705a72dee67082bfc226

diff --git a/sw/source/uibase/config/uinums.cxx b/sw/source/uibase/config/uinums.cxx
index d0d872f..025ad2f 100644
--- a/sw/source/uibase/config/uinums.cxx
+++ b/sw/source/uibase/config/uinums.cxx
@@ -17,34 +17,25 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <uinums.hxx>
+
 #include <hintids.hxx>
 #include <svl/urihelper.hxx>
-#include <osl/thread.h>
 #include <unotools/pathoptions.hxx>
 #include <tools/stream.hxx>
 #include <sfx2/docfile.hxx>
 #include <svl/itemiter.hxx>
-#include <editeng/brushitem.hxx>
 
 #include <tools/resid.hxx>
-#include <fmtornt.hxx>
 #include <swtypes.hxx>
 #include <wrtsh.hxx>
-#include <uinums.hxx>
 #include <poolfmt.hxx>
 #include <charfmt.hxx>
-#include <frmatr.hxx>
 
 #include <unomid.h>
 
 using namespace ::com::sun::star;
 
-#define VERSION_30B     ((sal_uInt16)250)
-#define VERSION_31B     ((sal_uInt16)326)
-#define VERSION_40A     ((sal_uInt16)364)
-#define VERSION_53A     ((sal_uInt16)596)
-#define ACT_NUM_VERSION VERSION_53A
-
 #define CHAPTER_FILENAME "chapter.cfg"
 
 /*
@@ -57,7 +48,6 @@ using namespace ::com::sun::star;
 SwChapterNumRules::SwChapterNumRules()
     : sFileName(OUString(CHAPTER_FILENAME))
     ,
-    nVersion(0),
     bModified( false )
 {
     Init();
@@ -125,55 +115,6 @@ void SwChapterNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt1
     Save(); // store it immediately
 }
 
-bool SwChapterNumRules::Store(SvStream &rStream)
-{
-    rStream.WriteUInt16( ACT_NUM_VERSION );
-        // Write, what positions are occupied by a rule
-        // Then write each of the rules
-    for(sal_uInt16 i = 0; i < nMaxRules; ++i)
-    {
-        if(pNumRules[i])
-        {
-            rStream.WriteUChar(  sal_True );
-            pNumRules[i]->Store( rStream );
-        }
-        else
-            rStream.WriteUChar(  sal_False );
-    }
-    return true;
-}
-
-int SwChapterNumRules::Load(SvStream &rStream)
-{
-    int         rc = 0;
-
-    rStream.ReadUInt16( nVersion );
-
-    // due to a small but serious mistake, PreFinal writes the same VERION_40A as SP2
-    // #55402#
-    if(VERSION_40A == nVersion)
-    {
-        OSL_FAIL("Version 364 is not clear #55402#");
-    }
-    else if( VERSION_30B == nVersion || VERSION_31B == nVersion ||
-             ACT_NUM_VERSION >= nVersion )
-    {
-        unsigned char bRule = sal_False;
-        for(sal_uInt16 i = 0; i < nMaxRules; ++i)
-        {
-            rStream.ReadUChar( bRule );
-            if(bRule)
-                pNumRules[i] = new SwNumRulesWithName( rStream, nVersion );
-        }
-    }
-    else
-    {
-        rc = 1;
-    }
-
-    return rc;
-}
-
 SwNumRulesWithName::SwNumRulesWithName( const SwNumRule &rCopy,
                                         const OUString &rName )
     : maName(rName)
@@ -224,30 +165,6 @@ const SwNumRulesWithName& SwNumRulesWithName::operator=(const SwNumRulesWithName
     return *this;
 }
 
-SwNumRulesWithName::SwNumRulesWithName( SvStream &rStream, sal_uInt16 nVersion )
-{
-    rtl_TextEncoding eEncoding = osl_getThreadTextEncoding();
-    maName = rStream.ReadUniOrByteString(eEncoding);
-
-    char c;
-    for(sal_uInt16 n = 0; n < MAXLEVEL; ++n )
-    {
-        if( VERSION_30B == nVersion )
-            c = 1;
-        // due to a small but serious mistake, PreFinal writes the same VERION_40A as SP2
-        // #55402#
-        else if(nVersion < VERSION_40A && n > 5)
-            c = 0;
-        else
-            rStream.ReadChar( c );
-
-        if( c )
-            aFmts[ n ] = new _SwNumFmtGlobal( rStream, nVersion );
-        else
-            aFmts[ n ] = 0;
-    }
-}
-
 void SwNumRulesWithName::MakeNumRule( SwWrtShell& rSh, SwNumRule& rChg ) const
 {
     // #i89178#
@@ -263,24 +180,6 @@ void SwNumRulesWithName::MakeNumRule( SwWrtShell& rSh, SwNumRule& rChg ) const
         }
 }
 
-void SwNumRulesWithName::Store( SvStream &rStream )
-{
-    rtl_TextEncoding eEncoding = osl_getThreadTextEncoding();
-    rStream.WriteUniOrByteString(maName, eEncoding);
-
-    for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
-    {
-        _SwNumFmtGlobal* pFmt = aFmts[ n ];
-        if( pFmt )
-        {
-            rStream.WriteChar( (char)1 );
-            pFmt->Store( rStream );
-        }
-        else
-            rStream.WriteChar( (char)0 );
-    }
-}
-
 void SwNumRulesWithName::GetNumFmt(
     size_t const nIndex, SwNumFmt const*& rpNumFmt, OUString const*& rpName) const
 {
@@ -335,222 +234,10 @@ SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( const _SwNumFmtGlobal& rFm
         aItems.push_back( rFmt.aItems[ --n ].Clone() );
 }
 
-SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( SvStream& rStream,
-                                                        sal_uInt16 nVersion )
-    : nCharPoolId( USHRT_MAX )
-{
-    rtl_TextEncoding eEncoding = osl_getThreadTextEncoding();
-    {
-        sal_uInt16 nUS;
-        short nShort;
-        sal_Char cChar;
-        bool bFlag;
-        OUString sStr;
-
-        rStream.ReadUInt16( nUS );           aFmt.SetNumberingType((sal_Int16)nUS );
-        if( VERSION_53A > nVersion )
-        {
-            rStream.ReadChar( cChar );       aFmt.SetBulletChar( cChar );
-        }
-        else
-        {
-            rStream.ReadUInt16( nUS );       aFmt.SetBulletChar( nUS );
-        }
-
-        rStream.ReadCharAsBool( bFlag );     aFmt.SetIncludeUpperLevels( bFlag );
-
-        if( VERSION_30B == nVersion )
-        {
-            sal_Int32 nL;
-            rStream.ReadChar( cChar );       aFmt.SetStart( (sal_uInt16)cChar );
-
-            sStr = rStream.ReadUniOrByteString(eEncoding);
-            aFmt.SetPrefix( sStr );
-            sStr = rStream.ReadUniOrByteString(eEncoding);
-            aFmt.SetSuffix( sStr );
-            rStream.ReadUInt16( nUS );        aFmt.SetNumAdjust( SvxAdjust( nUS ) );
-            rStream.ReadInt32( nL );          aFmt.SetLSpace( lNumIndent );
-            rStream.ReadInt32( nL );          aFmt.SetFirstLineOffset( (short)nL );
-        }
-        else                // old start-value was a Byte
-        {
-            rStream.ReadUInt16( nUS );         aFmt.SetStart( nUS );
-            sStr = rStream.ReadUniOrByteString(eEncoding);
-            aFmt.SetPrefix( sStr );
-            sStr = rStream.ReadUniOrByteString(eEncoding);
-            aFmt.SetSuffix( sStr );
-            rStream.ReadUInt16( nUS );         aFmt.SetNumAdjust( SvxAdjust( nUS ) );
-            rStream.ReadUInt16( nUS );         aFmt.SetAbsLSpace( nUS );
-            rStream.ReadInt16( nShort );       aFmt.SetFirstLineOffset( nShort );
-            rStream.ReadUInt16( nUS );         aFmt.SetCharTextDistance( nUS );
-            rStream.ReadInt16( nShort );       aFmt.SetLSpace( nShort );
-            rStream.ReadCharAsBool( bFlag );
-        }
-
-        sal_uInt16  nFamily;
-        sal_uInt16  nCharSet;
-        short   nWidth;
-        short   nHeight;
-        sal_uInt16  nPitch;
-        OUString aName;
-
-        aName = rStream.ReadUniOrByteString(eEncoding);
-        rStream.ReadUInt16( nFamily ).ReadUInt16( nCharSet ).ReadInt16( nWidth ).ReadInt16( nHeight ).ReadUInt16( nPitch );
-
-        if( !aName.isEmpty() )
-        {
-            vcl::Font aFont( static_cast<FontFamily>(nFamily), Size( nWidth, nHeight ) );
-            aFont.SetName( aName );
-            aFont.SetCharSet( (rtl_TextEncoding)nCharSet );
-            aFont.SetPitch( (FontPitch)nPitch );
-
-            aFmt.SetBulletFont( &aFont );
-        }
-        else
-            nCharSet = RTL_TEXTENCODING_SYMBOL;
-
-        if( VERSION_53A > nVersion )
-        {
-            sal_Char cEncoded(aFmt.GetBulletChar());
-            aFmt.SetBulletChar(OUString(&cEncoded, 1, nCharSet).toChar());
-        }
-    }
-
-    if( VERSION_30B != nVersion )
-    {
-        sal_uInt16 nItemCount;
-        rStream.ReadUInt16( nCharPoolId );
-        sCharFmtName = rStream.ReadUniOrByteString(eEncoding);
-        rStream.ReadUInt16( nItemCount );
-
-        while( nItemCount-- )
-        {
-            sal_uInt16 nWhich, nVers;
-            rStream.ReadUInt16( nWhich ).ReadUInt16( nVers );
-            if ( ( nWhich >= POOLATTR_BEGIN ) && ( nWhich < POOLATTR_END ) )
-                aItems.push_back( GetDfltAttr( nWhich )->Create( rStream, nVers ) );
-        }
-    }
-
-    if( VERSION_40A == nVersion && SVX_NUM_BITMAP == aFmt.GetNumberingType() )
-    {
-        sal_uInt8 cF;
-        sal_Int32 nWidth(0), nHeight(0);
-
-        rStream.ReadInt32( nWidth ).ReadInt32( nHeight );
-
-        Size aSz(nWidth, nHeight);
-
-        rStream.ReadUChar( cF );
-        if( cF )
-        {
-            SvxBrushItem* pBrush = 0;
-            SwFmtVertOrient* pVOrient = 0;
-            sal_uInt16 nVer;
-
-            if( cF & 1 )
-            {
-                rStream.ReadUInt16( nVer );
-                pBrush = (SvxBrushItem*)GetDfltAttr( RES_BACKGROUND )
-                                        ->Create( rStream, nVer );
-            }
-
-            if( cF & 2 )
-            {
-                rStream.ReadUInt16( nVer );
-                pVOrient = (SwFmtVertOrient*)GetDfltAttr( RES_VERT_ORIENT )
-                                        ->Create( rStream, nVer );
-            }
-            sal_Int16 eOrient = text::VertOrientation::NONE;
-            if(pVOrient)
-                eOrient = (sal_Int16)pVOrient->GetVertOrient();
-            aFmt.SetGraphicBrush( pBrush, &aSz, pVOrient ? &eOrient : 0 );
-        }
-    }
-}
-
 SwNumRulesWithName::_SwNumFmtGlobal::~_SwNumFmtGlobal()
 {
 }
 
-void SwNumRulesWithName::_SwNumFmtGlobal::Store( SvStream& rStream )
-{
-    rtl_TextEncoding eEncoding = osl_getThreadTextEncoding();
-    {
-        OUString aName;
-        sal_uInt16 nFamily = FAMILY_DONTKNOW, nCharSet = 0, nPitch = 0;
-        short  nWidth = 0, nHeight = 0;
-
-        const vcl::Font* pFnt = aFmt.GetBulletFont();
-        if( pFnt )
-        {
-            aName = pFnt->GetName();
-            nFamily = (sal_uInt16)pFnt->GetFamily();
-            nCharSet = (sal_uInt16)pFnt->GetCharSet();
-            nWidth = (short)pFnt->GetSize().Width();
-            nHeight = (short)pFnt->GetSize().Height();
-            nPitch = (sal_uInt16)pFnt->GetPitch();
-        }
-
-        rStream.WriteUInt16( aFmt.GetNumberingType() )
-               .WriteUInt16( aFmt.GetBulletChar() )
-               .WriteUChar( aFmt.GetIncludeUpperLevels() > 0 )
-               .WriteUInt16( aFmt.GetStart() );
-        rStream.WriteUniOrByteString( aFmt.GetPrefix(), eEncoding );
-        rStream.WriteUniOrByteString( aFmt.GetSuffix(), eEncoding );
-        rStream.WriteUInt16( aFmt.GetNumAdjust() )
-               .WriteInt16( aFmt.GetAbsLSpace() )
-               .WriteInt16( aFmt.GetFirstLineOffset() )
-               .WriteInt16( aFmt.GetCharTextDistance() )
-               .WriteInt16( aFmt.GetLSpace() )
-               .WriteUChar( sal_False );//aFmt.IsRelLSpace();
-        rStream.WriteUniOrByteString( aName, eEncoding );
-        rStream.WriteUInt16( nFamily )
-               .WriteUInt16( nCharSet )
-               .WriteInt16( nWidth )
-               .WriteInt16( nHeight )
-               .WriteUInt16( nPitch );
-    }
-    rStream.WriteUInt16( nCharPoolId );
-    rStream.WriteUniOrByteString( sCharFmtName, eEncoding );
-    rStream.WriteUInt16( aItems.size() );
-
-    for( sal_uInt16 n = aItems.size(); n; )
-    {
-        SfxPoolItem* pItem = &aItems[ --n ];
-        sal_uInt16 nIVers = pItem->GetVersion( SOFFICE_FILEFORMAT_50 );
-        OSL_ENSURE( nIVers != USHRT_MAX,
-                "Was'n das: Item-Version USHRT_MAX in der aktuellen Version" );
-        rStream.WriteUInt16( pItem->Which() )
-               .WriteUInt16( nIVers );
-        pItem->Store( rStream, nIVers );
-    }
-
-    // Extensions for 40A
-
-    if( SVX_NUM_BITMAP == aFmt.GetNumberingType() )
-    {
-        rStream.WriteInt32( aFmt.GetGraphicSize().Width() )
-               .WriteInt32( aFmt.GetGraphicSize().Height() );
-        sal_uInt8 cFlg = ( 0 != aFmt.GetBrush() ? 1 : 0 ) +
-                    ( 0 != aFmt.GetGraphicOrientation() ? 2 : 0 );
-        rStream.WriteUChar( cFlg );
-
-        if( aFmt.GetBrush() )
-        {
-            sal_uInt16 nVersion = aFmt.GetBrush()->GetVersion( SOFFICE_FILEFORMAT_50 );
-            rStream.WriteUInt16( nVersion );
-            aFmt.GetBrush()->Store( rStream, nVersion );
-        }
-        if( aFmt.GetGraphicOrientation() )
-        {
-            sal_uInt16 nVersion = aFmt.GetGraphicOrientation()->GetVersion( SOFFICE_FILEFORMAT_50 );
-            rStream.WriteUInt16( nVersion );
-            aFmt.GetGraphicOrientation()->Store( rStream, nVersion );
-        }
-    }
-}
-
 void SwNumRulesWithName::_SwNumFmtGlobal::ChgNumFmt( SwWrtShell& rSh,
                             SwNumFmt& rNew ) const
 {
diff --git a/sw/source/uibase/inc/uinums.hxx b/sw/source/uibase/inc/uinums.hxx
index b593c1b..d01edec9 100644
--- a/sw/source/uibase/inc/uinums.hxx
+++ b/sw/source/uibase/inc/uinums.hxx
@@ -51,10 +51,8 @@ class SW_DLLPUBLIC SwNumRulesWithName
     public:
         _SwNumFmtGlobal( const SwNumFmt& rFmt );
         _SwNumFmtGlobal( const _SwNumFmtGlobal& );
-        _SwNumFmtGlobal( SvStream&, sal_uInt16 nVersion );
         ~_SwNumFmtGlobal();
 
-        void Store( SvStream& );
         void ChgNumFmt( SwWrtShell& rSh, SwNumFmt& rChg ) const;
     };
 
@@ -70,7 +68,6 @@ protected:
 public:
     SwNumRulesWithName(const SwNumRule &, const OUString &);
     SwNumRulesWithName( const SwNumRulesWithName & );
-    SwNumRulesWithName(SvStream &, sal_uInt16 nVersion);
     ~SwNumRulesWithName();
 
     const SwNumRulesWithName &operator=(const SwNumRulesWithName &);
@@ -78,7 +75,6 @@ public:
     const OUString& GetName() const               { return maName; }
     void MakeNumRule( SwWrtShell& rSh, SwNumRule& rChg ) const;
 
-    void Store( SvStream& );
 
     void GetNumFmt(size_t, SwNumFmt const*&, OUString const*&) const;
 };
@@ -90,12 +86,8 @@ public:
 protected:
     SwNumRulesWithName   *pNumRules[ MAX_NUM_RULES ];
     OUString              sFileName;
-    sal_uInt16            nVersion;
     bool              bModified;
 
-    virtual int         Load(SvStream&);
-    virtual bool        Store(SvStream&);
-
     void                Init();
     void Save();
 
commit 79416bdbeded822bf39ac017b5816fa9aa8b359e
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sat Nov 8 22:11:40 2014 +0100

    sw: fix un-safe casts in SwXNumberingRules
    
    At least they check that the pointer they reinterpret-cast without checking
    the type isn't null!
    
    Change-Id: I07770e274598b1c476b4c297ac1d388b7ca576e5

diff --git a/sw/source/core/unocore/unosett.cxx b/sw/source/core/unocore/unosett.cxx
index bd89582..c9b4293 100644
--- a/sw/source/core/unocore/unosett.cxx
+++ b/sw/source/core/unocore/unosett.cxx
@@ -1938,15 +1938,15 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 17: //UNO_NAME_BULLET_FONT,
                 {
                     assert( !pDocShell );
-                    awt::FontDescriptor* pDesc =  (awt::FontDescriptor*)pProp->Value.getValue();
-                    if(pDesc)
+                    awt::FontDescriptor desc;
+                    if (pProp->Value >>= desc)
                     {
                         // #i93725#
                         // do not accept "empty" font
-                        if ( !pDesc->Name.isEmpty() )
+                        if (!desc.Name.isEmpty())
                         {
                             vcl::Font aFont;
-                            SvxUnoFontDescriptor::ConvertToFont( *pDesc, aFont );
+                            SvxUnoFontDescriptor::ConvertToFont(desc, aFont);
                             aFmt.SetBulletFont(&aFont);
                         }
                     }
@@ -2016,8 +2016,8 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 21: //UNO_NAME_GRAPHIC_BITMAP,
                 {
                     assert( !pDocShell );
-                    uno::Reference< awt::XBitmap >* pBitmap = (uno::Reference< awt::XBitmap > *)pProp->Value.getValue();
-                    if(pBitmap)
+                    uno::Reference<awt::XBitmap> xBitmap;
+                    if (pProp->Value >>= xBitmap)
                     {
                         if(!pSetBrush)
                         {
@@ -2030,7 +2030,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                                 pSetBrush = new SvxBrushItem(OUString(), OUString(), GPOS_AREA, RES_BACKGROUND);
                         }
 
-                        BitmapEx aBmp = VCLUnoHelper::GetBitmap( *pBitmap );
+                        BitmapEx aBmp = VCLUnoHelper::GetBitmap(xBitmap);
                         Graphic aNewGr(aBmp);
                         pSetBrush->SetGraphic( aNewGr );
                     }
@@ -2043,13 +2043,13 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                     assert( !pDocShell );
                     if(!pSetSize)
                         pSetSize = new Size;
-                    if(pProp->Value.getValueType() == ::cppu::UnoType<awt::Size>::get())
+                    awt::Size size;
+                    if (pProp->Value >>= size)
                     {
-                         awt::Size* pSize =  (awt::Size*)pProp->Value.getValue();
-                        pSize->Width = convertMm100ToTwip(pSize->Width);
-                        pSize->Height = convertMm100ToTwip(pSize->Height);
-                        pSetSize->Width() = pSize->Width;
-                        pSetSize->Height() = pSize->Height;
+                        size.Width = convertMm100ToTwip(size.Width);
+                        size.Height = convertMm100ToTwip(size.Height);
+                        pSetSize->Width() = size.Width;
+                        pSetSize->Height() = size.Height;
                     }
                     else
                         bWrongArg = true;
commit 7bbda9b227c372898a80f75655a67eee0bdfabf3
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sat Nov 8 21:56:09 2014 +0100

    sw: remove the PropValData abomination
    
    Conciseness and type safety: why try to achieve both when you can settle
    for neither.
    
    Change-Id: I68399395083e3ad927c544700cb37363856b1788

diff --git a/sw/source/core/unocore/unosett.cxx b/sw/source/core/unocore/unosett.cxx
index 687f027..bd89582 100644
--- a/sw/source/core/unocore/unosett.cxx
+++ b/sw/source/core/unocore/unosett.cxx
@@ -64,6 +64,7 @@
 #include <com/sun/star/text/PositionAndSpaceMode.hpp>
 #include <com/sun/star/text/LabelFollow.hpp>
 #include <numrule.hxx>
+#include <comphelper/sequenceasvector.hxx>
 #include <comphelper/servicehelper.hxx>
 #include <cppuhelper/supportsservice.hxx>
 #include <paratr.hxx>
@@ -75,19 +76,11 @@ using namespace ::com::sun::star::beans;
 using namespace ::com::sun::star::text;
 using namespace ::com::sun::star::style;
 
-struct PropValData
-{
-    uno::Any        aVal;
-    OUString            sPropName;
-    PropValData(void* pVal, const char* cPropName, uno::Type aType ) :
-        aVal(pVal, aType),
-        sPropName(OUString::createFromAscii(cPropName))
-        {}
-    PropValData(const uno::Any& rVal, const OUString& rPropName) :
-        aVal(rVal),
-        sPropName(rPropName)
-        {}
-};
+template<typename T>
+PropertyValue makePropertyValue(T const& rValue, OUString const& rName)
+{
+   return PropertyValue(rName, -1, makeAny(rValue), PropertyState_DIRECT_VALUE);
+}
 
 // Constants for the css::text::ColumnSeparatorStyle
 #define API_COL_LINE_NONE               0
@@ -95,8 +88,6 @@ struct PropValData
 #define API_COL_LINE_DOTTED             2
 #define API_COL_LINE_DASHED             3
 
-typedef std::vector<PropValData*> PropValDataArr;
-
 #define WID_PREFIX                      0
 #define WID_SUFFIX                      1
 #define WID_NUMBERING_TYPE              2
@@ -1384,59 +1375,54 @@ uno::Sequence<beans::PropertyValue> SwXNumberingRules::GetPropertiesForNumFmt(
 {
     bool bChapterNum = pHeadingStyleName != 0;
 
-    PropValDataArr  aPropertyValues;
+    ::comphelper::SequenceAsVector<PropertyValue> aPropertyValues;
+    aPropertyValues.reserve(32);
     //fill all properties into the array
 
     //adjust
     SvxAdjust eAdj = rFmt.GetNumAdjust();
     sal_Int16 nINT16 = aSvxToUnoAdjust[eAdj];
-    PropValData* pData = new PropValData((void*)&nINT16, "Adjust", ::cppu::UnoType<sal_Int16>::get() );
-    aPropertyValues.push_back(pData);
+    aPropertyValues.push_back(makePropertyValue(nINT16, "Adjust"));
 
     //parentnumbering
     nINT16 = rFmt.GetIncludeUpperLevels();
-    pData = new PropValData((void*)&nINT16, "ParentNumbering", ::cppu::UnoType<sal_Int16>::get());
-    aPropertyValues.push_back(pData);
+    aPropertyValues.push_back(makePropertyValue(nINT16, "ParentNumbering"));
 
     //prefix
     OUString aUString = rFmt.GetPrefix();
-    pData = new PropValData((void*)&aUString, "Prefix", ::cppu::UnoType<OUString>::get());
-    aPropertyValues.push_back(pData);
+    aPropertyValues.push_back(makePropertyValue(aUString, "Prefix"));
 
     //suffix
     aUString = rFmt.GetSuffix();
-    pData = new PropValData((void*)&aUString, "Suffix", ::cppu::UnoType<OUString>::get());
-    aPropertyValues.push_back(pData);
+    aPropertyValues.push_back(makePropertyValue(aUString, "Suffix"));
 
     //char style name
     OUString CharStyleName(rCharFormatName);
 
     aUString = OUString();
     SwStyleNameMapper::FillProgName( CharStyleName, aUString, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true );
-    pData = new PropValData((void*)&aUString, "CharStyleName", ::cppu::UnoType<OUString>::get());
-    aPropertyValues.push_back(pData);
+    aPropertyValues.push_back(makePropertyValue(aUString, "CharStyleName"));
 
     //startvalue
     nINT16 = rFmt.GetStart();
-    pData = new PropValData((void*)&nINT16, "StartWith", ::cppu::UnoType<sal_Int16>::get());
-    aPropertyValues.push_back(pData);
+    aPropertyValues.push_back(makePropertyValue(nINT16, "StartWith"));
 
     if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
     {
         //leftmargin
         sal_Int32 nINT32 = convertTwipToMm100(rFmt.GetAbsLSpace());
-        pData = new PropValData((void*)&nINT32, UNO_NAME_LEFT_MARGIN, ::cppu::UnoType<sal_Int32>::get());
-        aPropertyValues.push_back(pData);
+        aPropertyValues.push_back(
+                makePropertyValue(nINT32, UNO_NAME_LEFT_MARGIN));
 
         //chartextoffset
         nINT32 = convertTwipToMm100(rFmt.GetCharTextDistance());
-        pData = new PropValData((void*)&nINT32, UNO_NAME_SYMBOL_TEXT_DISTANCE, ::cppu::UnoType<sal_Int32>::get());
-        aPropertyValues.push_back(pData);
+        aPropertyValues.push_back(
+                makePropertyValue(nINT32, UNO_NAME_SYMBOL_TEXT_DISTANCE));
 
         //firstlineoffset
         nINT32 = convertTwipToMm100(rFmt.GetFirstLineOffset());
-        pData = new PropValData((void*)&nINT32, UNO_NAME_FIRST_LINE_OFFSET, ::cppu::UnoType<sal_Int32>::get());
-        aPropertyValues.push_back(pData);
+        aPropertyValues.push_back(
+                makePropertyValue(nINT32, UNO_NAME_FIRST_LINE_OFFSET));
     }
 
     // PositionAndSpaceMode
@@ -1445,10 +1431,8 @@ uno::Sequence<beans::PropertyValue> SwXNumberingRules::GetPropertiesForNumFmt(
     {
         nINT16 = PositionAndSpaceMode::LABEL_ALIGNMENT;
     }
-    pData = new PropValData( (void*)&nINT16,
-                             UNO_NAME_POSITION_AND_SPACE_MODE,
-                             ::cppu::UnoType<sal_Int16>::get() );
-    aPropertyValues.push_back(pData);
+    aPropertyValues.push_back(
+            makePropertyValue(nINT16, UNO_NAME_POSITION_AND_SPACE_MODE));
 
     if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
     {
@@ -1462,37 +1446,28 @@ uno::Sequence<beans::PropertyValue> SwXNumberingRules::GetPropertiesForNumFmt(
         {
             nINT16 = LabelFollow::NOTHING;
         }
-        pData = new PropValData( (void*)&nINT16,
-                                 UNO_NAME_LABEL_FOLLOWED_BY,
-                                 ::cppu::UnoType<sal_Int16>::get() );
-        aPropertyValues.push_back(pData);
+        aPropertyValues.push_back(
+                makePropertyValue(nINT16, UNO_NAME_LABEL_FOLLOWED_BY));
 
         // ListtabStopPosition
         sal_Int32 nINT32 = convertTwipToMm100(rFmt.GetListtabPos());
-        pData = new PropValData( (void*)&nINT32,
-                                 UNO_NAME_LISTTAB_STOP_POSITION,
-                                 ::cppu::UnoType<sal_Int32>::get());
-        aPropertyValues.push_back(pData);
+        aPropertyValues.push_back(
+                makePropertyValue(nINT32, UNO_NAME_LISTTAB_STOP_POSITION));
 
         // FirstLineIndent
         nINT32 = convertTwipToMm100(rFmt.GetFirstLineIndent());
-        pData = new PropValData( (void*)&nINT32,
-                                 UNO_NAME_FIRST_LINE_INDENT,
-                                 ::cppu::UnoType<sal_Int32>::get());
-        aPropertyValues.push_back(pData);
+        aPropertyValues.push_back(
+                makePropertyValue(nINT32, UNO_NAME_FIRST_LINE_INDENT));
 
         // IndentAt
         nINT32 = convertTwipToMm100(rFmt.GetIndentAt());
-        pData = new PropValData( (void*)&nINT32,
-                                 UNO_NAME_INDENT_AT,
-                                 ::cppu::UnoType<sal_Int32>::get());
-        aPropertyValues.push_back(pData);
+        aPropertyValues.push_back(
+                makePropertyValue(nINT32, UNO_NAME_INDENT_AT));
     }
 
     //numberingtype
     nINT16 = rFmt.GetNumberingType();
-    pData = new PropValData((void*)&nINT16, "NumberingType", ::cppu::UnoType<sal_Int16>::get());
-    aPropertyValues.push_back(pData);
+    aPropertyValues.push_back(makePropertyValue(nINT16, "NumberingType"));
 
     if(!bChapterNum)
     {
@@ -1500,28 +1475,25 @@ uno::Sequence<beans::PropertyValue> SwXNumberingRules::GetPropertiesForNumFmt(
         {
             //BulletId
             nINT16 = rFmt.GetBulletChar();
-            pData = new PropValData((void*)&nINT16, "BulletId", ::cppu::UnoType<sal_Int16>::get());
-            aPropertyValues.push_back(pData);
+            aPropertyValues.push_back(makePropertyValue(nINT16, "BulletId"));
 
             const vcl::Font* pFont = rFmt.GetBulletFont();
 
             //BulletChar
             aUString = OUString(rFmt.GetBulletChar());
-            pData = new PropValData((void*)&aUString, "BulletChar", ::cppu::UnoType<OUString>::get());
-            aPropertyValues.push_back(pData);
+            aPropertyValues.push_back(makePropertyValue(aUString, "BulletChar"));
 
             //BulletFontName
             aUString = pFont ? pFont->GetStyleName() : OUString();
-            pData = new PropValData((void*)&aUString, "BulletFontName", ::cppu::UnoType<OUString>::get());
-            aPropertyValues.push_back(pData);
+            aPropertyValues.push_back(makePropertyValue(aUString, "BulletFontName"));
 
             //BulletFont
             if(pFont)
             {
                  awt::FontDescriptor aDesc;
                 SvxUnoFontDescriptor::ConvertFromFont( *pFont, aDesc );
-                pData = new PropValData((void*)&aDesc, UNO_NAME_BULLET_FONT, cppu::UnoType<awt::FontDescriptor>::get());
-                aPropertyValues.push_back(pData);
+                aPropertyValues.push_back(
+                        makePropertyValue(aDesc, UNO_NAME_BULLET_FONT));
             }
         }
         if(SVX_NUM_BITMAP == rFmt.GetNumberingType())
@@ -1536,8 +1508,8 @@ uno::Sequence<beans::PropertyValue> SwXNumberingRules::GetPropertiesForNumFmt(
             }
             else
                 aUString = OUString();
-            pData = new PropValData((void*)&aUString, UNO_NAME_GRAPHIC_URL, ::cppu::UnoType<OUString>::get());
-            aPropertyValues.push_back(pData);
+            aPropertyValues.push_back(
+                    makePropertyValue(aUString, UNO_NAME_GRAPHIC_URL));
 
             //graphicbitmap
             const Graphic* pGraphic = 0;
@@ -1546,56 +1518,44 @@ uno::Sequence<beans::PropertyValue> SwXNumberingRules::GetPropertiesForNumFmt(
             if(pGraphic)
             {
                 uno::Reference<awt::XBitmap> xBmp = VCLUnoHelper::CreateBitmap( pGraphic->GetBitmapEx() );
-                pData = new PropValData((void*)&xBmp, UNO_NAME_GRAPHIC_BITMAP,
-                                cppu::UnoType<awt::XBitmap>::get());
-                aPropertyValues.push_back(pData);
+                aPropertyValues.push_back(
+                        makePropertyValue(xBmp, UNO_NAME_GRAPHIC_BITMAP));
             }
              Size aSize = rFmt.GetGraphicSize();
             // #i101131#
             // adjust conversion due to type mismatch between <Size> and <awt::Size>
             awt::Size aAwtSize(convertTwipToMm100(aSize.Width()), convertTwipToMm100(aSize.Height()));
-            pData = new PropValData((void*)&aAwtSize, UNO_NAME_GRAPHIC_SIZE, ::cppu::UnoType<awt::Size>::get());
-            aPropertyValues.push_back(pData);
+            aPropertyValues.push_back(
+                    makePropertyValue(aAwtSize, UNO_NAME_GRAPHIC_SIZE));
 
             const SwFmtVertOrient* pOrient = rFmt.GetGraphicOrientation();
             if(pOrient)
             {
-                pData = new PropValData((void*)0, UNO_NAME_VERT_ORIENT, ::cppu::UnoType<sal_Int16>::get());
-                ((const SfxPoolItem*)pOrient)->QueryValue(pData->aVal, MID_VERTORIENT_ORIENT);
-                aPropertyValues.push_back(pData);
+                uno::Any any;
+                pOrient->QueryValue(any, MID_VERTORIENT_ORIENT);
+                aPropertyValues.push_back(PropertyValue(
+                    UNO_NAME_VERT_ORIENT, -1, any, PropertyState_DIRECT_VALUE));
             }
         }
     }
     else
     {
         aUString = *pHeadingStyleName;
-        pData = new PropValData((void*)&aUString, UNO_NAME_HEADING_STYLE_NAME, ::cppu::UnoType<OUString>::get());
-        aPropertyValues.push_back(pData);
+        aPropertyValues.push_back(
+                makePropertyValue(aUString, UNO_NAME_HEADING_STYLE_NAME));
     }
 
-    uno::Sequence<beans::PropertyValue> aSeq(aPropertyValues.size());
-    beans::PropertyValue* pArray = aSeq.getArray();
-
-    for(size_t i = 0; i < aPropertyValues.size(); ++i)
-    {
-        pData = aPropertyValues[i];
-        pArray[i].Value = pData->aVal;
-        pArray[i].Name = pData->sPropName;
-        pArray[i].Handle = -1;
-    }
-    for (PropValDataArr::const_iterator it = aPropertyValues.begin(); it != aPropertyValues.end(); ++it)
-      delete *it;
-    aPropertyValues.clear();
-    return aSeq;
+    return aPropertyValues.getAsConstList();
 }
 
-static PropValData* lcl_FindProperty(const char* cName, PropValDataArr&    rPropertyValues)
+static PropertyValue const* lcl_FindProperty(
+    const char* cName, std::vector<PropertyValue const*> const& rPropertyValues)
 {
     const OUString sCmp = OUString::createFromAscii(cName);
     for(size_t i = 0; i < rPropertyValues.size(); ++i)
     {
-        PropValData* pTemp = rPropertyValues[i];
-        if(sCmp == pTemp->sPropName)
+        PropertyValue const*const pTemp = rPropertyValues[i];
+        if (sCmp == pTemp->Name)
             return pTemp;
     }
     return 0;
@@ -1709,7 +1669,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
     };
 
     const beans::PropertyValue* pPropArray = rProperties.getConstArray();
-    PropValDataArr aPropertyValues;
+    ::std::vector<PropertyValue const*> aPropertyValues;
     bool bExcept = false;
     for(sal_Int32 i = 0; i < rProperties.getLength() && !bExcept; i++)
     {
@@ -1732,8 +1692,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
             }
         }
         SAL_WARN_IF( bExcept, "sw.uno", "Unknown/incorrect property " << rProp.Name << ", failing" );
-        PropValData* pData = new PropValData(rProp.Value, rProp.Name );
-        aPropertyValues.push_back(pData);
+        aPropertyValues.push_back(& rProp);
     }
 
     bool bWrongArg = false;
@@ -1746,15 +1705,16 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
 
         for(size_t i = 0; i < SAL_N_ELEMENTS( aNumPropertyNames ) && !bExcept && !bWrongArg; ++i)
         {
-            PropValData* pData = lcl_FindProperty(aNumPropertyNames[i], aPropertyValues);
-            if(!pData)
+            PropertyValue const*const pProp(
+                    lcl_FindProperty(aNumPropertyNames[i], aPropertyValues));
+            if (!pProp)
                 continue;
             switch(i)
             {
                 case 0: //"Adjust"
                 {
                     sal_Int16 nValue = 0;
-                    pData->aVal >>= nValue;
+                    pProp->Value >>= nValue;
                     if(nValue > 0 &&
                         nValue <= text::HoriOrientation::LEFT &&
                             USHRT_MAX != aUnoToSvxAdjust[nValue])
@@ -1768,7 +1728,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 1: //"ParentNumbering",
                 {
                     sal_Int16 nSet = 0;
-                    pData->aVal >>= nSet;
+                    pProp->Value >>= nSet;
                     if(nSet >= 0 && MAXLEVEL >= nSet)
                         aFmt.SetIncludeUpperLevels( static_cast< sal_uInt8 >(nSet) );
                 }
@@ -1776,14 +1736,14 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 2: //"Prefix",
                 {
                     OUString uTmp;
-                    pData->aVal >>= uTmp;
+                    pProp->Value >>= uTmp;
                     aFmt.SetPrefix(uTmp);
                 }
                 break;
                 case 3: //"Suffix",
                 {
                     OUString uTmp;
-                    pData->aVal >>= uTmp;
+                    pProp->Value >>= uTmp;
                     aFmt.SetSuffix(uTmp);
                 }
                 break;
@@ -1791,7 +1751,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 {
                     bCharStyleNameSet = true;
                     OUString uTmp;
-                    pData->aVal >>= uTmp;
+                    pProp->Value >>= uTmp;
                     OUString sCharFmtName;
                     SwStyleNameMapper::FillUIName( uTmp, sCharFmtName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true );
                     if (sCharFmtName == UNO_NAME_CHARACTER_FORMAT_NONE)
@@ -1841,14 +1801,14 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 5: //"StartWith",
                 {
                     sal_Int16 nVal = 0;
-                    pData->aVal >>= nVal;
+                    pProp->Value >>= nVal;
                     aFmt.SetStart(nVal);
                 }
                 break;
                 case 6: //UNO_NAME_LEFT_MARGIN,
                 {
                     sal_Int32 nValue = 0;
-                    pData->aVal >>= nValue;
+                    pProp->Value >>= nValue;
                     // #i23727# nValue can be negative
                     aFmt.SetAbsLSpace((short) convertMm100ToTwip(nValue));
                 }
@@ -1856,7 +1816,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 7: //UNO_NAME_SYMBOL_TEXT_DISTANCE,
                 {
                     sal_Int32 nValue = 0;
-                    pData->aVal >>= nValue;
+                    pProp->Value >>= nValue;
                     if(nValue >= 0)
                         aFmt.SetCharTextDistance((short) convertMm100ToTwip(nValue));
                     else
@@ -1866,7 +1826,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 8: //UNO_NAME_FIRST_LINE_OFFSET,
                 {
                     sal_Int32 nValue = 0;
-                    pData->aVal >>= nValue;
+                    pProp->Value >>= nValue;
                     // #i23727# nValue can be positive
                     nValue = convertMm100ToTwip(nValue);
                     aFmt.SetFirstLineOffset((short)nValue);
@@ -1875,7 +1835,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 9: // UNO_NAME_POSITION_AND_SPACE_MODE
                 {
                     sal_Int16 nValue = 0;
-                    pData->aVal >>= nValue;
+                    pProp->Value >>= nValue;
                     if ( nValue == 0 )
                     {
                         aFmt.SetPositionAndSpaceMode( SvxNumberFormat::LABEL_WIDTH_AND_POSITION );
@@ -1893,7 +1853,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 10: // UNO_NAME_LABEL_FOLLOWED_BY
                 {
                     sal_Int16 nValue = 0;
-                    pData->aVal >>= nValue;
+                    pProp->Value >>= nValue;
                     if ( nValue == 0 )
                     {
                         aFmt.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
@@ -1915,7 +1875,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 11: // UNO_NAME_LISTTAB_STOP_POSITION
                 {
                     sal_Int32 nValue = 0;
-                    pData->aVal >>= nValue;
+                    pProp->Value >>= nValue;
                     nValue = convertMm100ToTwip(nValue);
                     if ( nValue >= 0 )
                     {
@@ -1930,7 +1890,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 12: // UNO_NAME_FIRST_LINE_INDENT
                 {
                     sal_Int32 nValue = 0;
-                    pData->aVal >>= nValue;
+                    pProp->Value >>= nValue;
                     nValue = convertMm100ToTwip(nValue);
                     aFmt.SetFirstLineIndent( nValue );
                 }
@@ -1938,7 +1898,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 13: // UNO_NAME_INDENT_AT
                 {
                     sal_Int32 nValue = 0;
-                    pData->aVal >>= nValue;
+                    pProp->Value >>= nValue;
                     nValue = convertMm100ToTwip(nValue);
                     aFmt.SetIndentAt( nValue );
                 }
@@ -1946,7 +1906,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 14: //"NumberingType"
                 {
                     sal_Int16 nSet = 0;
-                    pData->aVal >>= nSet;
+                    pProp->Value >>= nSet;
                     if(nSet >= 0)
                         aFmt.SetNumberingType(nSet);
                     else
@@ -1958,7 +1918,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                     if (pParagraphStyleName)
                     {
                         OUString uTmp;
-                        pData->aVal >>= uTmp;
+                        pProp->Value >>= uTmp;
                         OUString sStyleName;
                         SwStyleNameMapper::FillUIName(uTmp, sStyleName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true );
                         *pParagraphStyleName = sStyleName;
@@ -1969,7 +1929,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 {
                     assert( !pDocShell );
                     sal_Int16 nSet = 0;
-                    if( pData->aVal >>= nSet )
+                    if( pProp->Value >>= nSet )
                         aFmt.SetBulletChar(nSet);
                     else
                         bWrongArg = true;
@@ -1978,7 +1938,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 case 17: //UNO_NAME_BULLET_FONT,
                 {
                     assert( !pDocShell );
-                    awt::FontDescriptor* pDesc =  (awt::FontDescriptor*)pData->aVal.getValue();
+                    awt::FontDescriptor* pDesc =  (awt::FontDescriptor*)pProp->Value.getValue();
                     if(pDesc)
                     {
                         // #i93725#
@@ -1998,7 +1958,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 {
                     assert( !pDocShell );
                     OUString sBulletFontName;
-                    pData->aVal >>= sBulletFontName;
+                    pProp->Value >>= sBulletFontName;
                     SwDocShell* pLclDocShell = pDocShell ? pDocShell : pDoc ? pDoc->GetDocShell() : 0;
                     if( !sBulletFontName.isEmpty() && pLclDocShell )
                     {
@@ -2019,7 +1979,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 {
                     assert( !pDocShell );
                     OUString aChar;
-                    pData->aVal >>= aChar;
+                    pProp->Value >>= aChar;
                     if(aChar.getLength() == 1)
                     {
                         aFmt.SetBulletChar(aChar.toChar());
@@ -2039,7 +1999,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                 {
                     assert( !pDocShell );
                     OUString sBrushURL;
-                    pData->aVal >>= sBrushURL;
+                    pProp->Value >>= sBrushURL;
                     if(!pSetBrush)
                     {
                         const SvxBrushItem* pOrigBrush = aFmt.GetBrush();
@@ -2050,13 +2010,13 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                         else
                             pSetBrush = new SvxBrushItem(OUString(), OUString(), GPOS_AREA, RES_BACKGROUND);
                     }
-                    pSetBrush->PutValue( pData->aVal, MID_GRAPHIC_URL );
+                    pSetBrush->PutValue( pProp->Value, MID_GRAPHIC_URL );
                 }
                 break;
                 case 21: //UNO_NAME_GRAPHIC_BITMAP,
                 {
                     assert( !pDocShell );
-                    uno::Reference< awt::XBitmap >* pBitmap = (uno::Reference< awt::XBitmap > *)pData->aVal.getValue();
+                    uno::Reference< awt::XBitmap >* pBitmap = (uno::Reference< awt::XBitmap > *)pProp->Value.getValue();
                     if(pBitmap)
                     {
                         if(!pSetBrush)
@@ -2083,9 +2043,9 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                     assert( !pDocShell );
                     if(!pSetSize)
                         pSetSize = new Size;
-                    if(pData->aVal.getValueType() == ::cppu::UnoType<awt::Size>::get())
+                    if(pProp->Value.getValueType() == ::cppu::UnoType<awt::Size>::get())
                     {
-                         awt::Size* pSize =  (awt::Size*)pData->aVal.getValue();
+                         awt::Size* pSize =  (awt::Size*)pProp->Value.getValue();
                         pSize->Width = convertMm100ToTwip(pSize->Width);
                         pSize->Height = convertMm100ToTwip(pSize->Height);
                         pSetSize->Width() = pSize->Width;
@@ -2105,7 +2065,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                         else
                             pSetVOrient = new SwFmtVertOrient;
                     }
-                    ((SfxPoolItem*)pSetVOrient)->PutValue(pData->aVal, MID_VERTORIENT_ORIENT);
+                    pSetVOrient->PutValue(pProp->Value, MID_VERTORIENT_ORIENT);
                 }
                 break;
                 case 24: //"HeadingStyleName"
@@ -2113,7 +2073,7 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
                     if (pHeadingStyleName)
                     {
                         OUString uTmp;
-                        pData->aVal >>= uTmp;
+                        pProp->Value >>= uTmp;
                         OUString sStyleName;
                         SwStyleNameMapper::FillUIName(uTmp, sStyleName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true );
                         *pHeadingStyleName = sStyleName;
@@ -2164,9 +2124,6 @@ void SwXNumberingRules::SetPropertiesToNumFmt(
         delete pSetSize;
         delete pSetVOrient;
       }
-    for (PropValDataArr::const_iterator it = aPropertyValues.begin(); it != aPropertyValues.end(); ++it)
-      delete *it;
-    aPropertyValues.clear();
 
     if(bWrongArg)
         throw lang::IllegalArgumentException();
commit 526d6c96b6e39ed0a126ff6b64f125f082a8abbc
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sat Nov 8 20:41:23 2014 +0100

    sw: these can be asserts
    
    Change-Id: I4ad1ff6fad2f4097c128dcaea5cf6064e2524aad

diff --git a/sw/source/uibase/config/uinums.cxx b/sw/source/uibase/config/uinums.cxx
index 7ccb532..d0d872f 100644
--- a/sw/source/uibase/config/uinums.cxx
+++ b/sw/source/uibase/config/uinums.cxx
@@ -117,7 +117,7 @@ void SwChapterNumRules::CreateEmptyNumRule(sal_uInt16 const nIndex)
 void SwChapterNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx)
 {
     bModified = true;
-    OSL_ENSURE(nIdx < nMaxRules, "Array der NumRules ueberindiziert.");
+    assert(nIdx < nMaxRules);
     if( !pNumRules[nIdx] )
         pNumRules[nIdx] = new SwNumRulesWithName( rCopy );
     else
diff --git a/sw/source/uibase/inc/uinums.hxx b/sw/source/uibase/inc/uinums.hxx
index e95bc9c..b593c1b 100644
--- a/sw/source/uibase/inc/uinums.hxx
+++ b/sw/source/uibase/inc/uinums.hxx
@@ -113,7 +113,7 @@ public:
 
 inline const SwNumRulesWithName *SwChapterNumRules::GetRules(sal_uInt16 nIdx) const
 {
-    OSL_ENSURE(nIdx < nMaxRules, "Array der NumRules ueberindiziert.");
+    assert(nIdx < nMaxRules);
     return pNumRules[nIdx];
 }
 
commit e377a65a1e6acf6241ce0bd2fc35a6a786cd8de9
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sat Nov 8 20:40:19 2014 +0100

    sw: remove pointless inheritance of SwChapterNumRules from SwBaseNumRules
    
    Change-Id: I5426977d4ed5539d79335df0aa4bcccd71dd8966

diff --git a/sw/source/ui/misc/outline.cxx b/sw/source/ui/misc/outline.cxx
index c3eae29..d669783 100644
--- a/sw/source/ui/misc/outline.cxx
+++ b/sw/source/ui/misc/outline.cxx
@@ -91,13 +91,13 @@ IMPL_LINK_INLINE_END( SwNumNamesDlg, SelectHdl, ListBox *, pBox )
 void SwNumNamesDlg::SetUserNames(const OUString *pList[])
 {
     sal_uInt16 nSelect = 0;
-    for(sal_uInt16 i = 0; i < SwBaseNumRules::nMaxRules; ++i)
+    for (sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i)
     {
         if(pList[i])
         {
             m_pFormBox->RemoveEntry(i);
             m_pFormBox->InsertEntry(*pList[i], i);
-            if(i == nSelect && nSelect < SwBaseNumRules::nMaxRules)
+            if (i == nSelect && nSelect < SwChapterNumRules::nMaxRules)
                 nSelect++;
         }
     }
diff --git a/sw/source/uibase/config/StoredChapterNumbering.cxx b/sw/source/uibase/config/StoredChapterNumbering.cxx
index 245e884..eb8ae2f 100644
--- a/sw/source/uibase/config/StoredChapterNumbering.cxx
+++ b/sw/source/uibase/config/StoredChapterNumbering.cxx
@@ -46,7 +46,7 @@ class StoredChapterNumberingRules
 {
 private:
     // TODO in case this ever becomes accessible via api need a invalidate
-    SwBaseNumRules & m_rNumRules;
+    SwChapterNumRules & m_rNumRules;
     sal_uInt16 const m_nIndex;
 
     SwNumRulesWithName * GetOrCreateRules()
@@ -63,11 +63,11 @@ private:
 
 public:
     StoredChapterNumberingRules(
-            SwBaseNumRules & rNumRules, sal_uInt16 const nIndex)
+            SwChapterNumRules & rNumRules, sal_uInt16 const nIndex)
         : m_rNumRules(rNumRules)
         , m_nIndex(nIndex)
     {
-        assert(m_nIndex < SwBaseNumRules::nMaxRules);
+        assert(m_nIndex < SwChapterNumRules::nMaxRules);
     }
 
     // XNamed
@@ -324,13 +324,13 @@ class StoredChapterNumberingRootContext
     : public SvXMLImportContext
 {
 private:
-    SwBaseNumRules & m_rNumRules;
+    SwChapterNumRules & m_rNumRules;
     size_t m_nCounter;
     ::std::vector<tools::SvRef<SvxXMLListStyleContext>> m_Contexts;
 
 public:
     StoredChapterNumberingRootContext(
-            SwBaseNumRules & rNumRules, SvXMLImport & rImport,
+            SwChapterNumRules & rNumRules, SvXMLImport & rImport,
             sal_uInt16 const nPrefix, OUString const& rLocalName)
         : SvXMLImportContext(rImport, nPrefix, rLocalName)
         , m_rNumRules(rNumRules)
@@ -340,7 +340,7 @@ public:
 
     virtual void EndElement() SAL_OVERRIDE
     {
-        assert(m_Contexts.size() < SwBaseNumRules::nMaxRules);
+        assert(m_Contexts.size() < SwChapterNumRules::nMaxRules);
         for (auto iter = m_Contexts.begin(); iter != m_Contexts.end(); ++iter)
         {
             uno::Reference<container::XIndexReplace> const xRule(
@@ -360,7 +360,7 @@ public:
         if (XML_NAMESPACE_TEXT == nPrefix && IsXMLToken(rLocalName, XML_OUTLINE_STYLE))
         {
             ++m_nCounter;
-            if (m_nCounter <= SwBaseNumRules::nMaxRules)
+            if (m_nCounter <= SwChapterNumRules::nMaxRules)
             {
                 SvxXMLListStyleContext *const pContext(
                     new SvxXMLListStyleContext(GetImport(),
@@ -384,12 +384,12 @@ class StoredChapterNumberingImport
     : public SvXMLImport
 {
 private:
-    SwBaseNumRules & m_rNumRules;
+    SwChapterNumRules & m_rNumRules;
 
 public:
     StoredChapterNumberingImport(
             uno::Reference<uno::XComponentContext> const& xContext,
-            SwBaseNumRules & rNumRules)
+            SwChapterNumRules & rNumRules)
         : SvXMLImport(xContext, "sw::StoredChapterNumberingImport", IMPORT_ALL)
         , m_rNumRules(rNumRules)
     {
@@ -408,7 +408,7 @@ public:
     }
 };
 
-void ExportStoredChapterNumberingRules(SwBaseNumRules & rRules,
+void ExportStoredChapterNumberingRules(SwChapterNumRules & rRules,
         SvStream & rStream, OUString const& rFileName)
 {
     uno::Reference<uno::XComponentContext> const xContext(
@@ -432,7 +432,7 @@ void ExportStoredChapterNumberingRules(SwBaseNumRules & rRules,
     // ... and the import needs to map from name to display-name then!
     std::set<OUString> charStyles;
     std::vector<uno::Reference<container::XIndexReplace>> numRules;
-    for (size_t i = 0; i < SwBaseNumRules::nMaxRules; ++i)
+    for (size_t i = 0; i < SwChapterNumRules::nMaxRules; ++i)
     {
         if (SwNumRulesWithName const* pRule = rRules.GetRules(i))
         {
@@ -461,7 +461,7 @@ void ExportStoredChapterNumberingRules(SwBaseNumRules & rRules,
     }
 }
 
-void ImportStoredChapterNumberingRules(SwBaseNumRules & rRules,
+void ImportStoredChapterNumberingRules(SwChapterNumRules & rRules,
         SvStream & rStream, OUString const& rFileName)
 {
     uno::Reference<uno::XComponentContext> const xContext(
diff --git a/sw/source/uibase/config/uinums.cxx b/sw/source/uibase/config/uinums.cxx
index 2d03704..7ccb532 100644
--- a/sw/source/uibase/config/uinums.cxx
+++ b/sw/source/uibase/config/uinums.cxx
@@ -54,16 +54,16 @@ using namespace ::com::sun::star;
                         An old rule at that position will be overwritten.
 */
 
-SwBaseNumRules::SwBaseNumRules( const OUString& rFileName )
-    :
-    sFileName( rFileName ),
+SwChapterNumRules::SwChapterNumRules()
+    : sFileName(OUString(CHAPTER_FILENAME))
+    ,
     nVersion(0),
     bModified( false )
 {
     Init();
 }
 
-void SwBaseNumRules::Save()
+void SwChapterNumRules::Save()
 {
     if( bModified )
     {
@@ -87,13 +87,13 @@ void SwBaseNumRules::Save()
     }
 }
 
-SwBaseNumRules::~SwBaseNumRules()
+SwChapterNumRules::~SwChapterNumRules()
 {
     for( sal_uInt16 i = 0; i < nMaxRules; ++i )
         delete pNumRules[i];
 }
 
-void  SwBaseNumRules::Init()
+void  SwChapterNumRules::Init()
 {
     for(sal_uInt16 i = 0; i < nMaxRules; ++i )
         pNumRules[i] = 0;
@@ -107,15 +107,16 @@ void  SwBaseNumRules::Init()
     }
 }
 
-void SwBaseNumRules::CreateEmptyNumRule(sal_uInt16 const nIndex)
+void SwChapterNumRules::CreateEmptyNumRule(sal_uInt16 const nIndex)
 {
     assert(nIndex < nMaxRules);
     assert(!pNumRules[nIndex]);
     pNumRules[nIndex] = new SwNumRulesWithName;
 }
 
-void SwBaseNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx)
+void SwChapterNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx)
 {
+    bModified = true;
     OSL_ENSURE(nIdx < nMaxRules, "Array der NumRules ueberindiziert.");
     if( !pNumRules[nIdx] )
         pNumRules[nIdx] = new SwNumRulesWithName( rCopy );
@@ -124,7 +125,7 @@ void SwBaseNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 n
     Save(); // store it immediately
 }
 
-bool SwBaseNumRules::Store(SvStream &rStream)
+bool SwChapterNumRules::Store(SvStream &rStream)
 {
     rStream.WriteUInt16( ACT_NUM_VERSION );
         // Write, what positions are occupied by a rule
@@ -142,7 +143,7 @@ bool SwBaseNumRules::Store(SvStream &rStream)
     return true;
 }
 
-int SwBaseNumRules::Load(SvStream &rStream)
+int SwChapterNumRules::Load(SvStream &rStream)
 {
     int         rc = 0;
 
@@ -173,21 +174,6 @@ int SwBaseNumRules::Load(SvStream &rStream)
     return rc;
 }
 
-SwChapterNumRules::SwChapterNumRules() :
-    SwBaseNumRules(OUString(CHAPTER_FILENAME))
-{
-}
-
- SwChapterNumRules::~SwChapterNumRules()
-{
-}
-
-void SwChapterNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx)
-{
-    bModified = true;
-    SwBaseNumRules::ApplyNumRules(rCopy, nIdx);
-}
-
 SwNumRulesWithName::SwNumRulesWithName( const SwNumRule &rCopy,
                                         const OUString &rName )
     : maName(rName)
diff --git a/sw/source/uibase/inc/uinums.hxx b/sw/source/uibase/inc/uinums.hxx
index bb1627e..e95bc9c 100644
--- a/sw/source/uibase/inc/uinums.hxx
+++ b/sw/source/uibase/inc/uinums.hxx
@@ -62,7 +62,7 @@ class SW_DLLPUBLIC SwNumRulesWithName
 
 protected:
     friend class sw::StoredChapterNumberingRules;
-    friend class SwBaseNumRules;
+    friend class SwChapterNumRules;
     void SetName(const OUString& rSet) {maName = rSet;}
     void SetNumFmt(size_t, SwNumFmt const&, OUString const&);
     SwNumRulesWithName();
@@ -83,7 +83,7 @@ public:
     void GetNumFmt(size_t, SwNumFmt const*&, OUString const*&) const;
 };
 
-class SwBaseNumRules
+class SwChapterNumRules
 {
 public:
     enum { nMaxRules = MAX_NUM_RULES };         // currently 9 defined forms
@@ -100,8 +100,8 @@ protected:
     void Save();
 
 public:
-    SwBaseNumRules(const OUString& rFileName);
-    virtual ~SwBaseNumRules();
+    SwChapterNumRules();
+    virtual ~SwChapterNumRules();
 
     inline const SwNumRulesWithName*    GetRules(sal_uInt16 nIdx) const;
     void CreateEmptyNumRule(sal_uInt16 nIdx); // for import
@@ -111,18 +111,7 @@ public:
 
 };
 
-class SwChapterNumRules : public SwBaseNumRules
-{
-
-public:
-    SwChapterNumRules();
-    virtual ~SwChapterNumRules();
-
-    virtual void        ApplyNumRules(  const SwNumRulesWithName &rCopy,
-                                            sal_uInt16 nIdx) SAL_OVERRIDE;
-};
-
-inline const SwNumRulesWithName *SwBaseNumRules::GetRules(sal_uInt16 nIdx) const
+inline const SwNumRulesWithName *SwChapterNumRules::GetRules(sal_uInt16 nIdx) const
 {
     OSL_ENSURE(nIdx < nMaxRules, "Array der NumRules ueberindiziert.");
     return pNumRules[nIdx];
@@ -133,9 +122,9 @@ namespace sw
 {
 
 void ExportStoredChapterNumberingRules(
-        SwBaseNumRules & rRules, SvStream & rStream, OUString const&);
+        SwChapterNumRules & rRules, SvStream & rStream, OUString const&);
 void ImportStoredChapterNumberingRules(
-        SwBaseNumRules & rRules, SvStream & rStream, OUString const&);
+        SwChapterNumRules & rRules, SvStream & rStream, OUString const&);
 
 } // namespace sw
 
commit f7c14f57300255bb279ccd95d6b87347b1e0aec2
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sat Nov 8 20:27:51 2014 +0100

    xmloff: remove unused parameter of SvxXMLListStyleContext::FillUnoNumRule()
    
    Change-Id: I359f37ce778d55e6868bd1c78c0ff0d452f36088

diff --git a/include/xmloff/xmlnumi.hxx b/include/xmloff/xmlnumi.hxx
index 413b9ff..c4ef733 100644
--- a/include/xmloff/xmlnumi.hxx
+++ b/include/xmloff/xmlnumi.hxx
@@ -26,7 +26,7 @@
 #include <com/sun/star/style/NumberingType.hpp>
 
 namespace com { namespace sun { namespace star { namespace frame { class XModel; } } } }
-class SvI18NMap;
+
 class SvxXMLListLevelStyleContext_Impl;
 typedef std::vector<SvxXMLListLevelStyleContext_Impl *> SvxXMLListStyle_Impl;
 
@@ -72,9 +72,8 @@ public:
                     ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
 
     void FillUnoNumRule(
-            const ::com::sun::star::uno::Reference<
-                    ::com::sun::star::container::XIndexReplace > & rNumRule,
-            const SvI18NMap *pI18NMap ) const;
+            const css::uno::Reference<
+                    css::container::XIndexReplace> & rNumRule) const;
 
     const ::com::sun::star::uno::Reference <
         ::com::sun::star::container::XIndexReplace >& GetNumRules() const
diff --git a/sw/source/uibase/config/StoredChapterNumbering.cxx b/sw/source/uibase/config/StoredChapterNumbering.cxx
index ee83535..245e884 100644
--- a/sw/source/uibase/config/StoredChapterNumbering.cxx
+++ b/sw/source/uibase/config/StoredChapterNumbering.cxx
@@ -346,7 +346,7 @@ public:
             uno::Reference<container::XIndexReplace> const xRule(
                 new sw::StoredChapterNumberingRules(m_rNumRules,
                     iter - m_Contexts.begin()));
-            (*iter)->FillUnoNumRule(xRule, 0);
+            (*iter)->FillUnoNumRule(xRule);
             // TODO: xmloff's outline-style import seems to ignore this???
             uno::Reference<container::XNamed> const xNamed(xRule, uno::UNO_QUERY);
             xNamed->setName((*iter)->GetDisplayName());
diff --git a/xmloff/source/draw/XMLShapePropertySetContext.cxx b/xmloff/source/draw/XMLShapePropertySetContext.cxx
index e4599f3..f4f9880 100644
--- a/xmloff/source/draw/XMLShapePropertySetContext.cxx
+++ b/xmloff/source/draw/XMLShapePropertySetContext.cxx
@@ -55,7 +55,7 @@ void XMLShapePropertySetContext::EndElement()
         SvxXMLListStyleContext* pBulletStyle = static_cast<SvxXMLListStyleContext*>(&mxBulletStyle);
         xNumRule = SvxXMLListStyleContext::CreateNumRule( GetImport().GetModel() );
         if( xNumRule.is() )
-            pBulletStyle->FillUnoNumRule(xNumRule, NULL /* const SvI18NMap * ??? */ );
+            pBulletStyle->FillUnoNumRule(xNumRule);
     }
 
     Any aAny;
diff --git a/xmloff/source/draw/XMLShapeStyleContext.cxx b/xmloff/source/draw/XMLShapeStyleContext.cxx
index f3d1d19..720ac4c 100644
--- a/xmloff/source/draw/XMLShapeStyleContext.cxx
+++ b/xmloff/source/draw/XMLShapeStyleContext.cxx
@@ -175,7 +175,7 @@ void XMLShapeStyleContext::FillPropertySet( const Reference< beans::XPropertySet
             if( pListStyle )
             {
                 uno::Reference< container::XIndexReplace > xNumRule( SvxXMLListStyleContext::CreateNumRule( GetImport().GetModel() ) );
-                pListStyle->FillUnoNumRule(xNumRule, NULL /* const SvI18NMap * ??? */ );
+                pListStyle->FillUnoNumRule(xNumRule);
                 property->maValue <<= xNumRule;
             }
             else
diff --git a/xmloff/source/style/xmlnumi.cxx b/xmloff/source/style/xmlnumi.cxx
index 16a7c79..c88c909 100644
--- a/xmloff/source/style/xmlnumi.cxx
+++ b/xmloff/source/style/xmlnumi.cxx
@@ -44,7 +44,6 @@
 #include <xmloff/XMLBase64ImportContext.hxx>
 #include <xmloff/xmltoken.hxx>
 
-#include <xmloff/i18nmap.hxx>
 #include <xmloff/xmluconv.hxx>
 #include "fonthdl.hxx"
 #include <xmloff/XMLFontStylesContext.hxx>
@@ -223,8 +222,7 @@ public:
             const Reference< xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
 
     sal_Int32 GetLevel() const { return nLevel; }
-    Sequence<beans::PropertyValue> GetProperties(
-            const SvI18NMap *pI18NMap=0 );
+    Sequence<beans::PropertyValue> GetProperties();
 
     inline void SetPosAndSpaceMode( sal_Int16 eValue )
     {
@@ -402,8 +400,7 @@ SvXMLImportContext *SvxXMLListLevelStyleContext_Impl::CreateChildContext(
     return pContext;
 }
 
-Sequence<beans::PropertyValue> SvxXMLListLevelStyleContext_Impl::GetProperties(
-        const SvI18NMap *pI18NMap )
+Sequence<beans::PropertyValue> SvxXMLListLevelStyleContext_Impl::GetProperties()
 {
     sal_Int16 eType = NumberingType::NUMBER_NONE;
 
@@ -496,8 +493,6 @@ Sequence<beans::PropertyValue> SvxXMLListLevelStyleContext_Impl::GetProperties(
         OUString sDisplayTextStyleName = GetImport().GetStyleDisplayName(
                                 XML_STYLE_FAMILY_TEXT_TEXT, sTextStyleName  );
         OUString sStyleName = sDisplayTextStyleName;
-        if( !sStyleName.isEmpty() && pI18NMap )
-            sStyleName = pI18NMap->Get( SFX_STYLE_FAMILY_CHAR, sStyleName );
         pProps[nPos].Name = "CharStyleName";
         pProps[nPos++].Value <<= sDisplayTextStyleName;
 
@@ -1087,8 +1082,7 @@ SvXMLImportContext *SvxXMLListStyleContext::CreateChildContext(
 }
 
 void SvxXMLListStyleContext::FillUnoNumRule(
-        const Reference< container::XIndexReplace > & rNumRule,
-        const SvI18NMap *pI18NMap ) const
+        const Reference<container::XIndexReplace> & rNumRule) const
 {
     try
     {
@@ -1104,7 +1098,7 @@ void SvxXMLListStyleContext::FillUnoNumRule(
                 if( nLevel >= 0 && nLevel < l_nLevels )
                 {
                     Sequence<beans::PropertyValue> aProps =
-                        pLevelStyle->GetProperties( pI18NMap );
+                        pLevelStyle->GetProperties();
                     Any aAny;
                     aAny <<= aProps;
                     rNumRule->replaceByIndex( nLevel, aAny );
@@ -1142,7 +1136,7 @@ void SvxXMLListStyleContext::CreateAndInsertLate( bool bOverwrite )
             // We don't set xNumberingRules here, to avoid using them
             // as numbering rules.
             if( rNumRule.is() )
-                FillUnoNumRule( rNumRule, 0 );
+                FillUnoNumRule(rNumRule);
         }
     }
     else
@@ -1212,7 +1206,7 @@ void SvxXMLListStyleContext::CreateAndInsertLate( bool bOverwrite )
         nLevels = xNumRules->getCount();
         if( bOverwrite || bNew )
         {
-            FillUnoNumRule( xNumRules, 0 );
+            FillUnoNumRule(xNumRules);
             aAny <<= xNumRules;
             xPropSet->setPropertyValue( sNumberingRules, aAny );
         }
@@ -1241,7 +1235,7 @@ void SvxXMLListStyleContext::CreateAndInsertAuto() const
         GetImport().GetModel() );
     ((SvxXMLListStyleContext *)this)->nLevels = xNumRules->getCount();
 
-    FillUnoNumRule( xNumRules, 0 );
+    FillUnoNumRule(xNumRules);
 }
 
 Reference < XIndexReplace > SvxXMLListStyleContext::CreateNumRule(
commit 1535f39388223de53e4b923c6f7bb71ee32c1858
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Nov 7 19:11:11 2014 +0100

    sw: store Outline Numbering as ODF fragment instead of SfxPoolItems
    
    This should be less fragile and re-uses some xmloff and unocore code.
    
    Storing from ~SwBaseNumRules() does not work because other gobals that
    the export code relies on are already dead at the time it is called from
    a terminate() listener, so store when the dialog updates a format.
    
    Change-Id: I4e148b82d0a338ec7ffa6429c6e162db79f8c44e

diff --git a/include/xmloff/xmlnume.hxx b/include/xmloff/xmlnume.hxx
index 8418ef2..761872c 100644
--- a/include/xmloff/xmlnume.hxx
+++ b/include/xmloff/xmlnume.hxx
@@ -37,7 +37,7 @@ class SvXMLExportItemMapper;
 class SvXMLExport;
 class XMLTextListAutoStylePool;
 
-class SvxXMLNumRuleExport
+class XMLOFF_DLLPUBLIC SvxXMLNumRuleExport
 {
     SvXMLExport& rExport;
     const OUString sNumberingRules;
@@ -49,12 +49,7 @@ class SvxXMLNumRuleExport
     // to be suppressed on writing ODF 1.0 respectively ODF 1.1
     bool mbExportPositionAndSpaceModeLabelAlignment;
 
-    void exportLevelStyles(
-            const ::com::sun::star::uno::Reference<
-                ::com::sun::star::container::XIndexReplace > & xNumRule,
-            bool bOutline=false );
-
-    void exportLevelStyle(
+    SAL_DLLPRIVATE void exportLevelStyle(
             sal_Int32 nLevel,
             const ::com::sun::star::uno::Sequence<
                 ::com::sun::star::beans::PropertyValue>& rProps,
@@ -64,11 +59,11 @@ protected:
 
     // This method may be overloaded to add attributes to the <list-style>
     // element.
-    virtual void AddListStyleAttributes();
+    SAL_DLLPRIVATE virtual void AddListStyleAttributes();
 
-    bool exportStyle( const ::com::sun::star::uno::Reference<
+    SAL_DLLPRIVATE bool exportStyle( const ::com::sun::star::uno::Reference<
                             ::com::sun::star::style::XStyle >& rStyle );
-    void exportOutline();
+    SAL_DLLPRIVATE void exportOutline();
 
     SvXMLExport& GetExport() { return rExport; }
 
@@ -77,6 +72,12 @@ public:
     SvxXMLNumRuleExport( SvXMLExport& rExport );
     virtual ~SvxXMLNumRuleExport();
 
+    // should be private but sw::StoredChapterNumberingExport needs it
+    void exportLevelStyles(
+            const ::com::sun::star::uno::Reference<
+                ::com::sun::star::container::XIndexReplace > & xNumRule,
+            bool bOutline=false );
+
     void exportStyles( bool bUsed,
                        XMLTextListAutoStylePool *pPool,
                        bool bExportChapterNumbering = true );
diff --git a/include/xmloff/xmlnumi.hxx b/include/xmloff/xmlnumi.hxx
index 4e7bc15..413b9ff 100644
--- a/include/xmloff/xmlnumi.hxx
+++ b/include/xmloff/xmlnumi.hxx
@@ -30,7 +30,8 @@ class SvI18NMap;
 class SvxXMLListLevelStyleContext_Impl;
 typedef std::vector<SvxXMLListLevelStyleContext_Impl *> SvxXMLListStyle_Impl;
 
-class SvxXMLListStyleContext : public SvXMLStyleContext
+class XMLOFF_DLLPUBLIC SvxXMLListStyleContext
+    : public SvXMLStyleContext
 {
     const OUString       sIsPhysical;
     const OUString       sNumberingRules;
@@ -47,7 +48,7 @@ class SvxXMLListStyleContext : public SvXMLStyleContext
 
 protected:
 
-    virtual void SetAttribute( sal_uInt16 nPrefixKey,
+    SAL_DLLPRIVATE virtual void SetAttribute( sal_uInt16 nPrefixKey,
                                const OUString& rLocalName,
                                const OUString& rValue ) SAL_OVERRIDE;
 
diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk
index 09d9b0c..d51615b 100644
--- a/sw/Library_sw.mk
+++ b/sw/Library_sw.mk
@@ -574,6 +574,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\
     sw/source/uibase/cctrl/popbox \
     sw/source/uibase/cctrl/swlbox \
     sw/source/uibase/chrdlg/ccoll \
+    sw/source/uibase/config/StoredChapterNumbering \
     sw/source/uibase/config/barcfg \
     sw/source/uibase/config/caption \
     sw/source/uibase/config/cfgitems \
diff --git a/sw/source/uibase/config/StoredChapterNumbering.cxx b/sw/source/uibase/config/StoredChapterNumbering.cxx
new file mode 100644
index 0000000..ee83535
--- /dev/null
+++ b/sw/source/uibase/config/StoredChapterNumbering.cxx
@@ -0,0 +1,496 @@
+/* -*- 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 <uinums.hxx>
+
+#include <cppuhelper/implbase2.hxx>
+
+#include <com/sun/star/container/XIndexReplace.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/io/XActiveDataSource.hpp>
+#include <com/sun/star/util/MeasureUnit.hpp>
+#include <com/sun/star/xml/sax/Parser.hpp>
+#include <com/sun/star/xml/sax/Writer.hpp>
+
+#include <comphelper/processfactory.hxx>
+
+#include <unotools/streamwrap.hxx>
+
+#include <xmloff/xmlnmspe.hxx>
+#include <xmloff/xmltoken.hxx>
+#include <xmloff/nmspmap.hxx>
+#include <xmloff/xmlexp.hxx>
+#include <xmloff/xmlnume.hxx>
+#include <xmloff/xmlimp.hxx>
+#include <xmloff/xmlictxt.hxx>
+#include <xmloff/xmlnumi.hxx>
+
+#include <vcl/svapp.hxx>
+
+#include <unosett.hxx>
+
+
+using namespace ::com::sun::star;
+using namespace ::xmloff::token;
+
+namespace sw {
+
+class StoredChapterNumberingRules
+    : public ::cppu::WeakImplHelper2<container::XNamed,container::XIndexReplace>
+{
+private:
+    // TODO in case this ever becomes accessible via api need a invalidate
+    SwBaseNumRules & m_rNumRules;
+    sal_uInt16 const m_nIndex;
+
+    SwNumRulesWithName * GetOrCreateRules()
+    {
+        SwNumRulesWithName const* pRules(m_rNumRules.GetRules(m_nIndex));
+        if (!pRules)
+        {
+            m_rNumRules.CreateEmptyNumRule(m_nIndex);
+            pRules = m_rNumRules.GetRules(m_nIndex);
+            assert(pRules);
+        }
+        return const_cast<SwNumRulesWithName*>(pRules);
+    }
+
+public:
+    StoredChapterNumberingRules(
+            SwBaseNumRules & rNumRules, sal_uInt16 const nIndex)
+        : m_rNumRules(rNumRules)
+        , m_nIndex(nIndex)
+    {
+        assert(m_nIndex < SwBaseNumRules::nMaxRules);
+    }
+
+    // XNamed
+    virtual OUString SAL_CALL getName()
+        throw (uno::RuntimeException, std::exception) SAL_OVERRIDE
+    {
+        SolarMutexGuard g;
+        SwNumRulesWithName const* pRules(m_rNumRules.GetRules(m_nIndex));
+        if (!pRules)
+        {
+            return OUString();
+        }
+        return pRules->GetName();
+    }
+
+    virtual void SAL_CALL setName(OUString const& rName)
+        throw (uno::RuntimeException, std::exception) SAL_OVERRIDE
+    {
+        SolarMutexGuard g;
+        SwNumRulesWithName *const pRules(GetOrCreateRules());
+        pRules->SetName(rName);
+    }
+
+    // XElementAccess
+    virtual uno::Type SAL_CALL getElementType()
+        throw (uno::RuntimeException, std::exception) SAL_OVERRIDE
+    {
+        return ::cppu::UnoType<uno::Sequence<beans::PropertyValue>>::get();
+    }
+
+    virtual ::sal_Bool SAL_CALL hasElements()
+        throw (uno::RuntimeException, std::exception) SAL_OVERRIDE
+    {
+        return sal_True;
+    }
+
+    // XIndexAccess
+    virtual sal_Int32 SAL_CALL getCount()
+        throw (uno::RuntimeException, std::exception) SAL_OVERRIDE
+    {
+        return MAXLEVEL;
+    }
+
+    virtual uno::Any SAL_CALL getByIndex(sal_Int32 nIndex)
+        throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException,
+               uno::RuntimeException, std::exception) SAL_OVERRIDE
+    {
+        if (nIndex < 0 || MAXLEVEL <= nIndex)
+            throw lang::IndexOutOfBoundsException();
+
+        SolarMutexGuard g;
+        SwNumRulesWithName const* pRules(m_rNumRules.GetRules(m_nIndex));
+        if (!pRules)
+        {
+            return uno::Any();
+        }
+        SwNumFmt const* pNumFmt(0);
+        OUString const* pCharStyleName(0);
+        pRules->GetNumFmt(nIndex, pNumFmt, pCharStyleName);
+        if (!pNumFmt)
+        {   // the dialog only fills in those levels that are non-default
+            return uno::Any(); // the export will ignore this level, yay
+        }
+        assert(pCharStyleName);
+        OUString dummy; // pass in empty HeadingStyleName - can't import anyway
+        uno::Sequence<beans::PropertyValue> const ret(
+            SwXNumberingRules::GetPropertiesForNumFmt(
+                *pNumFmt, *pCharStyleName, &dummy));
+        return uno::makeAny(ret);
+    }
+
+    // XIndexReplace
+    virtual void SAL_CALL replaceByIndex(
+            sal_Int32 nIndex, uno::Any const& rElement)
+        throw (lang::IllegalArgumentException, lang::IndexOutOfBoundsException,
+               lang::WrappedTargetException, uno::RuntimeException,
+               std::exception) SAL_OVERRIDE
+    {
+        if (nIndex < 0 || MAXLEVEL <= nIndex)
+            throw lang::IndexOutOfBoundsException();
+        uno::Sequence<beans::PropertyValue> props;
+        if (!(rElement >>= props))
+            throw lang::IllegalArgumentException("invalid type",
+                    static_cast< ::cppu::OWeakObject*>(this), 1);
+
+        SolarMutexGuard g;
+        SwNumFmt numFmt;
+        OUString charStyleName;
+        SwXNumberingRules::SetPropertiesToNumFmt(
+            numFmt,
+            charStyleName,
+            0, 0, 0, 0, 0,
+            props);
+        SwNumRulesWithName *const pRules(GetOrCreateRules());
+        pRules->SetNumFmt(nIndex, numFmt, charStyleName);
+    }
+};
+
+class StoredChapterNumberingExport
+    : public SvXMLExport
+{
+public:
+    StoredChapterNumberingExport(
+            uno::Reference<uno::XComponentContext> const& xContext,
+            OUString const& rFileName,
+            uno::Reference<xml::sax::XDocumentHandler> const& xHandler)
+        : SvXMLExport(xContext, "sw::StoredChapterNumberingExport", rFileName,
+            util::MeasureUnit::CM, xHandler)
+    {
+        _GetNamespaceMap().Add(GetXMLToken(XML_NP_OFFICE),
+                               GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE);
+        _GetNamespaceMap().Add(GetXMLToken(XML_NP_TEXT),
+                               GetXMLToken(XML_N_TEXT), XML_NAMESPACE_TEXT);
+        _GetNamespaceMap().Add(GetXMLToken(XML_NP_STYLE),
+                               GetXMLToken(XML_N_STYLE), XML_NAMESPACE_STYLE);
+        _GetNamespaceMap().Add(GetXMLToken(XML_NP_FO),
+                               GetXMLToken(XML_N_FO), XML_NAMESPACE_FO);
+        _GetNamespaceMap().Add(GetXMLToken(XML_NP_SVG),
+                               GetXMLToken(XML_N_SVG), XML_NAMESPACE_SVG);
+    }
+
+    virtual void _ExportAutoStyles() SAL_OVERRIDE {}
+    virtual void _ExportMasterStyles() SAL_OVERRIDE {}
+    virtual void _ExportContent() SAL_OVERRIDE {}
+
+    void ExportRule(SvxXMLNumRuleExport & rExport,
+            uno::Reference<container::XIndexReplace> const& xRule)
+    {
+        uno::Reference<container::XNamed> const xNamed(xRule, uno::UNO_QUERY);
+        OUString const name(xNamed->getName());
+        bool bEncoded(false);
+        AddAttribute( XML_NAMESPACE_STYLE, XML_NAME,
+                      EncodeStyleName(name, &bEncoded) );
+        if (bEncoded)
+        {
+            AddAttribute(XML_NAMESPACE_STYLE, XML_DISPLAY_NAME, name);
+        }
+
+        SvXMLElementExport aElem( *this, XML_NAMESPACE_TEXT,
+                                  XML_OUTLINE_STYLE, true, true );
+        rExport.exportLevelStyles(xRule, true);
+    }
+
+    void ExportRules(
+            std::set<OUString> const& rCharStyles,
+            std::vector<uno::Reference<container::XIndexReplace>> const& rRules)
+    {
+        GetDocHandler()->startDocument();
+
+        AddAttribute(XML_NAMESPACE_NONE,
+                      _GetNamespaceMap().GetAttrNameByKey(XML_NAMESPACE_OFFICE),
+                      _GetNamespaceMap().GetNameByKey(XML_NAMESPACE_OFFICE));
+        AddAttribute(XML_NAMESPACE_NONE,
+                      _GetNamespaceMap().GetAttrNameByKey (XML_NAMESPACE_TEXT),
+                      _GetNamespaceMap().GetNameByKey(XML_NAMESPACE_TEXT));
+        AddAttribute(XML_NAMESPACE_NONE,
+                      _GetNamespaceMap().GetAttrNameByKey(XML_NAMESPACE_STYLE),
+                      _GetNamespaceMap().GetNameByKey(XML_NAMESPACE_STYLE));
+        AddAttribute(XML_NAMESPACE_NONE,
+                      _GetNamespaceMap().GetAttrNameByKey(XML_NAMESPACE_FO),
+                      _GetNamespaceMap().GetNameByKey(XML_NAMESPACE_FO));
+        AddAttribute(XML_NAMESPACE_NONE,
+                      _GetNamespaceMap().GetAttrNameByKey(XML_NAMESPACE_SVG),
+                      _GetNamespaceMap().GetNameByKey(XML_NAMESPACE_SVG));
+
+        {
+            // let's just have a office:styles as a dummy root
+            SvXMLElementExport styles(*this,
+                    XML_NAMESPACE_OFFICE, XML_STYLES, true, true);
+
+            // horrible hack for char styles to get display-name mapping
+            for (auto it = rCharStyles.begin(); it != rCharStyles.end(); ++it)
+            {
+                AddAttribute( XML_NAMESPACE_STYLE, XML_FAMILY, XML_TEXT );
+                bool bEncoded(false);
+                AddAttribute( XML_NAMESPACE_STYLE, XML_NAME,
+                              EncodeStyleName(*it, &bEncoded) );
+                if (bEncoded)
+                {
+                    AddAttribute(XML_NAMESPACE_STYLE, XML_DISPLAY_NAME, *it);
+                }
+
+                SvXMLElementExport style(*this,
+                        XML_NAMESPACE_STYLE, XML_STYLE, true, true);
+            }
+
+            SvxXMLNumRuleExport numRuleExport(*this);
+
+            for (auto it = rRules.begin(); it != rRules.end(); ++it)
+            {
+                ExportRule(numRuleExport, *it);
+            }
+        }
+
+        GetDocHandler()->endDocument();
+    }
+};
+
+/** Dummy import context for style:style element that can just read the
+    attributes needed to map name to display-name.
+    Unfortunately the "real" context for this depends on some other things.
+    The mapping is necessary to import the text:style-name attribute
+    of the text:outline-level-style element.
+ */
+class StoredChapterNumberingDummyStyleContext
+    : public SvXMLImportContext
+{
+public:
+    StoredChapterNumberingDummyStyleContext(
+            SvXMLImport & rImport,
+            sal_uInt16 const nPrefix, OUString const& rLocalName,
+            uno::Reference<xml::sax::XAttributeList> const& xAttrList)
+        : SvXMLImportContext(rImport, nPrefix, rLocalName)
+    {
+        OUString name;
+        OUString displayName;
+        sal_uInt16 nFamily(0);
+        for (sal_Int32 i = 0; i < xAttrList->getLength(); ++i)
+        {
+            OUString localName;
+            sal_uInt16 const prefix(rImport.GetNamespaceMap().GetKeyByAttrName(
+                xAttrList->getNameByIndex(i), &localName));
+            OUString const& rValue = xAttrList->getValueByIndex(i);
+
+            if (XML_NAMESPACE_STYLE == prefix)
+            {
+                if (IsXMLToken(localName, XML_FAMILY))
+                {
+                    if (IsXMLToken(rValue, XML_TEXT))
+                    {
+                        nFamily = XML_STYLE_FAMILY_TEXT_TEXT;
+                    }
+                }
+                else if (IsXMLToken(localName, XML_NAME))
+                {
+                    name = rValue;
+                }
+                else if (IsXMLToken(localName, XML_DISPLAY_NAME))
+                {
+                    displayName = rValue;
+                }
+            }
+        }
+        if (nFamily && !name.isEmpty() && !displayName.isEmpty())
+        {
+            rImport.AddStyleDisplayName(nFamily, name, displayName);
+        }
+    }
+};
+
+class StoredChapterNumberingImport;
+
+class StoredChapterNumberingRootContext
+    : public SvXMLImportContext
+{
+private:
+    SwBaseNumRules & m_rNumRules;
+    size_t m_nCounter;
+    ::std::vector<tools::SvRef<SvxXMLListStyleContext>> m_Contexts;
+
+public:
+    StoredChapterNumberingRootContext(
+            SwBaseNumRules & rNumRules, SvXMLImport & rImport,
+            sal_uInt16 const nPrefix, OUString const& rLocalName)
+        : SvXMLImportContext(rImport, nPrefix, rLocalName)
+        , m_rNumRules(rNumRules)
+        , m_nCounter(0)
+    {
+    }
+
+    virtual void EndElement() SAL_OVERRIDE
+    {
+        assert(m_Contexts.size() < SwBaseNumRules::nMaxRules);
+        for (auto iter = m_Contexts.begin(); iter != m_Contexts.end(); ++iter)
+        {
+            uno::Reference<container::XIndexReplace> const xRule(
+                new sw::StoredChapterNumberingRules(m_rNumRules,
+                    iter - m_Contexts.begin()));
+            (*iter)->FillUnoNumRule(xRule, 0);
+            // TODO: xmloff's outline-style import seems to ignore this???
+            uno::Reference<container::XNamed> const xNamed(xRule, uno::UNO_QUERY);
+            xNamed->setName((*iter)->GetDisplayName());
+        }
+    }
+
+    virtual SvXMLImportContext * CreateChildContext(
+        sal_uInt16 const nPrefix, OUString const& rLocalName,
+        uno::Reference<xml::sax::XAttributeList> const& xAttrList) SAL_OVERRIDE
+    {
+        if (XML_NAMESPACE_TEXT == nPrefix && IsXMLToken(rLocalName, XML_OUTLINE_STYLE))
+        {
+            ++m_nCounter;
+            if (m_nCounter <= SwBaseNumRules::nMaxRules)
+            {
+                SvxXMLListStyleContext *const pContext(
+                    new SvxXMLListStyleContext(GetImport(),
+                                nPrefix, rLocalName, xAttrList, true));
+                m_Contexts.push_back(pContext);
+                return pContext;
+            }
+        }
+        else if (XML_NAMESPACE_STYLE == nPrefix && IsXMLToken(rLocalName, XML_STYLE))
+        {
+            new StoredChapterNumberingDummyStyleContext(
+                    GetImport(), nPrefix, rLocalName, xAttrList);
+        }
+
+        return SvXMLImportContext::CreateChildContext(
+                    nPrefix, rLocalName, xAttrList);
+    }
+};
+
+class StoredChapterNumberingImport
+    : public SvXMLImport
+{
+private:
+    SwBaseNumRules & m_rNumRules;
+
+public:
+    StoredChapterNumberingImport(
+            uno::Reference<uno::XComponentContext> const& xContext,
+            SwBaseNumRules & rNumRules)
+        : SvXMLImport(xContext, "sw::StoredChapterNumberingImport", IMPORT_ALL)
+        , m_rNumRules(rNumRules)
+    {
+    }
+
+    virtual SvXMLImportContext * CreateContext(
+        sal_uInt16 const nPrefix, OUString const& rLocalName,
+        uno::Reference<xml::sax::XAttributeList> const& xAttrList) SAL_OVERRIDE
+    {
+        if (XML_NAMESPACE_OFFICE == nPrefix && IsXMLToken(rLocalName, XML_STYLES))
+        {
+            return new StoredChapterNumberingRootContext(m_rNumRules,
+                    *this, nPrefix, rLocalName);
+        }
+        return SvXMLImport::CreateContext(nPrefix, rLocalName, xAttrList);
+    }
+};
+
+void ExportStoredChapterNumberingRules(SwBaseNumRules & rRules,
+        SvStream & rStream, OUString const& rFileName)
+{
+    uno::Reference<uno::XComponentContext> const xContext(
+            ::comphelper::getProcessComponentContext());
+
+    uno::Reference<io::XOutputStream> const xOutStream(
+            new ::utl::OOutputStreamWrapper(rStream));
+
+    uno::Reference<xml::sax::XWriter> const xWriter(
+            xml::sax::Writer::create(xContext));
+
+    uno::Reference<io::XActiveDataSource> const xADS(xWriter, uno::UNO_QUERY);
+    xADS->setOutputStream(xOutStream);
+
+    uno::Reference<xml::sax::XDocumentHandler> const xHandler(
+            xWriter, uno::UNO_QUERY);
+
+    StoredChapterNumberingExport exp(xContext, rFileName, xWriter);
+
+    // if style name contains a space then name != display-name
+    // ... and the import needs to map from name to display-name then!
+    std::set<OUString> charStyles;
+    std::vector<uno::Reference<container::XIndexReplace>> numRules;
+    for (size_t i = 0; i < SwBaseNumRules::nMaxRules; ++i)
+    {
+        if (SwNumRulesWithName const* pRule = rRules.GetRules(i))
+        {
+            for (size_t j = 0; j < MAXLEVEL; ++j)
+            {
+                SwNumFmt const* pDummy(0);
+                OUString const* pCharStyleName(0);
+                pRule->GetNumFmt(j, pDummy, pCharStyleName);
+                if (pCharStyleName && !pCharStyleName->isEmpty())
+                {
+                    charStyles.insert(*pCharStyleName);
+                }
+            }
+            numRules.push_back(new StoredChapterNumberingRules(rRules, i));
+        }
+    }
+
+    try
+    {
+        exp.ExportRules(charStyles, numRules);
+    }
+    catch (uno::Exception const& e)
+    {
+        SAL_WARN("sw.ui",
+            "ExportStoredChapterNumberingRules: exception: " << e.Message);
+    }
+}
+
+void ImportStoredChapterNumberingRules(SwBaseNumRules & rRules,
+        SvStream & rStream, OUString const& rFileName)
+{
+    uno::Reference<uno::XComponentContext> const xContext(
+            ::comphelper::getProcessComponentContext());
+
+    uno::Reference<io::XInputStream> const xInStream(
+            new ::utl::OInputStreamWrapper(rStream));
+
+    uno::Reference<xml::sax::XParser> const xParser(
+            xml::sax::Parser::create(xContext));
+
+    uno::Reference<xml::sax::XDocumentHandler> const xHandler(
+            new StoredChapterNumberingImport(xContext, rRules));
+
+    xParser->setDocumentHandler(xHandler);
+
+    xml::sax::InputSource const source(xInStream, "", "", rFileName);
+
+    try
+    {
+        xParser->parseStream(source);
+    }
+    catch (uno::Exception const& e)
+    {
+        SAL_WARN("sw.ui",
+            "ImportStoredChapterNumberingRules: exception: " << e.Message);
+    }
+}
+
+} // namespace sw
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/config/uinums.cxx b/sw/source/uibase/config/uinums.cxx
index 0fe448d4..2d03704 100644
--- a/sw/source/uibase/config/uinums.cxx
+++ b/sw/source/uibase/config/uinums.cxx
@@ -63,7 +63,7 @@ SwBaseNumRules::SwBaseNumRules( const OUString& rFileName )
     Init();
 }
 
-SwBaseNumRules::~SwBaseNumRules()
+void SwBaseNumRules::Save()
 {
     if( bModified )
     {
@@ -78,14 +78,17 @@ SwBaseNumRules::~SwBaseNumRules()
         bool bRet = (pStream && pStream->GetError() == 0);
         if (bRet)
         {
-            Store( *pStream );
+            sw::ExportStoredChapterNumberingRules(*this, *pStream, sFileName);
 
             pStream->Flush();
 
             aMedium.Commit();
         }
     }
+}
 
+SwBaseNumRules::~SwBaseNumRules()
+{
     for( sal_uInt16 i = 0; i < nMaxRules; ++i )
         delete pNumRules[i];
 }
@@ -100,10 +103,17 @@ void  SwBaseNumRules::Init()
     if( aOpt.SearchFile( sNm, SvtPathOptions::PATH_USERCONFIG ))
     {
         SfxMedium aStrm( sNm, STREAM_STD_READ );
-        Load( *aStrm.GetInStream() );
+        sw::ImportStoredChapterNumberingRules(*this, *aStrm.GetInStream(), sFileName);
     }
 }
 
+void SwBaseNumRules::CreateEmptyNumRule(sal_uInt16 const nIndex)
+{
+    assert(nIndex < nMaxRules);
+    assert(!pNumRules[nIndex]);
+    pNumRules[nIndex] = new SwNumRulesWithName;
+}
+
 void SwBaseNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx)
 {
     OSL_ENSURE(nIdx < nMaxRules, "Array der NumRules ueberindiziert.");
@@ -111,6 +121,7 @@ void SwBaseNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 n
         pNumRules[nIdx] = new SwNumRulesWithName( rCopy );
     else
         *pNumRules[nIdx] = rCopy;
+    Save(); // store it immediately
 }
 
 bool SwBaseNumRules::Store(SvStream &rStream)
@@ -191,6 +202,11 @@ SwNumRulesWithName::SwNumRulesWithName( const SwNumRule &rCopy,
     }
 }
 
+SwNumRulesWithName::SwNumRulesWithName()
+{
+    memset(aFmts, 0, sizeof(aFmts));
+}
+
 SwNumRulesWithName::SwNumRulesWithName( const SwNumRulesWithName& rCopy )
 {
     memset( aFmts, 0, sizeof( aFmts ));
@@ -279,6 +295,23 @@ void SwNumRulesWithName::Store( SvStream &rStream )
     }
 }
 
+void SwNumRulesWithName::GetNumFmt(
+    size_t const nIndex, SwNumFmt const*& rpNumFmt, OUString const*& rpName) const
+{
+    rpNumFmt = (aFmts[nIndex]) ? &aFmts[nIndex]->aFmt : 0;
+    rpName = (aFmts[nIndex]) ? &aFmts[nIndex]->sCharFmtName : 0;
+}
+
+void SwNumRulesWithName::SetNumFmt(
+        size_t const nIndex, SwNumFmt const& rNumFmt, OUString const& rName)
+{
+    delete aFmts[nIndex];
+    aFmts[nIndex] = new _SwNumFmtGlobal(rNumFmt);
+    aFmts[nIndex]->sCharFmtName = rName;
+    aFmts[nIndex]->nCharPoolId = USHRT_MAX;
+    aFmts[nIndex]->aItems.clear();
+}
+
 SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( const SwNumFmt& rFmt )
     : aFmt( rFmt ), nCharPoolId( USHRT_MAX )
 {
diff --git a/sw/source/uibase/inc/uinums.hxx b/sw/source/uibase/inc/uinums.hxx
index b760957..bb1627e 100644
--- a/sw/source/uibase/inc/uinums.hxx
+++ b/sw/source/uibase/inc/uinums.hxx
@@ -27,6 +27,8 @@ class SfxPoolItem;
 class SwWrtShell;
 class SvStream;
 
+namespace sw { class StoredChapterNumberingRules; }
+
 #define MAX_NUM_RULES 9
 
 typedef boost::ptr_vector<SfxPoolItem> _SwNumFmtsAttrs;
@@ -38,6 +40,7 @@ class SW_DLLPUBLIC SwNumRulesWithName
     // (They should always be there!)
     class SAL_DLLPRIVATE _SwNumFmtGlobal
     {
+        friend class SwNumRulesWithName;
         SwNumFmt aFmt;
         OUString sCharFmtName;
         sal_uInt16 nCharPoolId;
@@ -58,7 +61,11 @@ class SW_DLLPUBLIC SwNumRulesWithName
     _SwNumFmtGlobal* aFmts[ MAXLEVEL ];
 
 protected:
+    friend class sw::StoredChapterNumberingRules;
+    friend class SwBaseNumRules;
     void SetName(const OUString& rSet) {maName = rSet;}
+    void SetNumFmt(size_t, SwNumFmt const&, OUString const&);
+    SwNumRulesWithName();
 
 public:
     SwNumRulesWithName(const SwNumRule &, const OUString &);
@@ -72,6 +79,8 @@ public:
     void MakeNumRule( SwWrtShell& rSh, SwNumRule& rChg ) const;
 
     void Store( SvStream& );
+
+    void GetNumFmt(size_t, SwNumFmt const*&, OUString const*&) const;
 };
 
 class SwBaseNumRules
@@ -88,12 +97,14 @@ protected:
     virtual bool        Store(SvStream&);
 
     void                Init();
+    void Save();
 
 public:
     SwBaseNumRules(const OUString& rFileName);
     virtual ~SwBaseNumRules();
 
     inline const SwNumRulesWithName*    GetRules(sal_uInt16 nIdx) const;
+    void CreateEmptyNumRule(sal_uInt16 nIdx); // for import
     virtual void                        ApplyNumRules(
                                                 const SwNumRulesWithName &rCopy,
                                                 sal_uInt16 nIdx);
@@ -117,6 +128,17 @@ inline const SwNumRulesWithName *SwBaseNumRules::GetRules(sal_uInt16 nIdx) const
     return pNumRules[nIdx];
 }
 
+
+namespace sw
+{
+
+void ExportStoredChapterNumberingRules(
+        SwBaseNumRules & rRules, SvStream & rStream, OUString const&);
+void ImportStoredChapterNumberingRules(
+        SwBaseNumRules & rRules, SvStream & rStream, OUString const&);
+
+} // namespace sw
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 5c3cf76f79a7f0cb5fb09e627cf07195ad5a0ef5
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Nov 7 17:34:54 2014 +0100

    sw: refactor SwXNumberingRules
    
    ... to get some static property getter setter functions.
    
    Change-Id: I3e69c0c01ee7ec2d17edbf06876c17cf4fce3833

diff --git a/sw/inc/unosett.hxx b/sw/inc/unosett.hxx
index 93d0ca4..0e35bec 100644
--- a/sw/inc/unosett.hxx
+++ b/sw/inc/unosett.hxx
@@ -37,6 +37,7 @@ class SwDoc;
 class SwFmtCol;
 class SwDocShell;
 class SwNumRule;
+class SwNumFmt;
 
 class SwXFootnoteProperties : public cppu::WeakAggImplHelper2
 <
@@ -204,6 +205,19 @@ public:
     static bool             isInvalidStyle(const OUString &rName);
     void    Invalidate()    {pDocShell = 0;}
     OUString                GetCreatedNumRuleName() const {return m_sCreatedNumRuleName;}
+
+    static css::uno::Sequence<css::beans::PropertyValue> GetPropertiesForNumFmt(
+            const SwNumFmt& rFmt, OUString const& rCharFormatName,
+            OUString const* pHeadingStyleName);
+    static void SetPropertiesToNumFmt(
+            SwNumFmt & aFmt,
+            OUString & rCharStyleName,
+            OUString *const pBulletFontName,
+            OUString *const pHeadingStyleName,
+            OUString *const pParagraphStyleName,
+            SwDoc *const pDoc, SwDocShell *const pDocShell,
+            css::uno::Sequence<css::beans::PropertyValue> const& rProperties);
+
 };
 
 class SwXChapterNumbering : public SwXNumberingRules
diff --git a/sw/source/core/unocore/unosett.cxx b/sw/source/core/unocore/unosett.cxx
index 9e411bb..687f027 100644
--- a/sw/source/core/unocore/unosett.cxx
+++ b/sw/source/core/unocore/unosett.cxx
@@ -1331,7 +1331,58 @@ uno::Sequence<beans::PropertyValue> SwXNumberingRules::GetNumberingRuleByIndex(
 
     const SwNumFmt& rFmt = rNumRule.Get( (sal_uInt16)nIndex );
 
-    bool bChapterNum = pDocShell != 0;
+    SwCharFmt* pCharFmt = rFmt.GetCharFmt();
+    OUString CharStyleName;
+    if (pCharFmt)
+        CharStyleName = pCharFmt->GetName();
+
+    // Whether or not a style is present: the array entry overwrites this string
+    if (!m_sNewCharStyleNames[nIndex].isEmpty() &&
+        !SwXNumberingRules::isInvalidStyle(m_sNewCharStyleNames[nIndex]))
+    {

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list