[Libreoffice-commits] core.git: 6 commits - include/svl offapi/com svl/Library_svl.mk svl/source sw/inc sw/qa sw/source writerfilter/source

Miklos Vajna vmiklos at suse.cz
Wed Jul 24 03:11:55 PDT 2013


 include/svl/grabbagitem.hxx                       |   44 ++++++
 offapi/com/sun/star/style/ParagraphProperties.idl |   10 +
 svl/Library_svl.mk                                |    1 
 svl/source/items/grabbagitem.cxx                  |  100 +++++++++++++++
 sw/inc/hintids.hxx                                |  143 +++++++++++-----------
 sw/inc/unoprnms.hxx                               |    2 
 sw/qa/extras/ooxmlexport/data/grabbag.docx        |binary
 sw/qa/extras/ooxmlexport/ooxmlexport.cxx          |   13 +-
 sw/source/core/bastyp/init.cxx                    |    3 
 sw/source/core/unocore/unomap.cxx                 |    3 
 sw/source/core/unocore/unoprnms.cxx               |    1 
 sw/source/filter/ww8/attributeoutputbase.hxx      |    4 
 sw/source/filter/ww8/docxattributeoutput.cxx      |   13 ++
 sw/source/filter/ww8/docxattributeoutput.hxx      |    3 
 sw/source/filter/ww8/rtfattributeoutput.cxx       |    4 
 sw/source/filter/ww8/rtfattributeoutput.hxx       |    3 
 sw/source/filter/ww8/ww8atr.cxx                   |    8 +
 sw/source/filter/ww8/ww8attributeoutput.hxx       |    3 
 writerfilter/source/dmapper/DomainMapper.cxx      |    3 
 writerfilter/source/dmapper/PropertyIds.cxx       |    1 
 writerfilter/source/dmapper/PropertyIds.hxx       |    1 
 writerfilter/source/dmapper/PropertyMap.cxx       |   39 ++++--
 writerfilter/source/dmapper/PropertyMap.hxx       |    7 -
 23 files changed, 325 insertions(+), 84 deletions(-)

New commits:
commit 00af1f2114d1c8c380ac3d5bc30cddc5f44b8132
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Wed Jul 24 11:51:57 2013 +0200

    sw: update hintids.hxx comments to match reality
    
    Change-Id: Ida2afe0cb37cf5c80bfe76a0f24ce0fb0d690da6

diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
index 403bd74..1cc5857 100644
--- a/sw/inc/hintids.hxx
+++ b/sw/inc/hintids.hxx
@@ -160,7 +160,7 @@ RES_PARATR_BEGIN = RES_TXTATR_END,
     RES_PARATR_CONNECT_BORDER,                      // 73
     RES_PARATR_OUTLINELEVEL,                        // 74
     RES_PARATR_RSID,								// 75
-    RES_PARATR_GRABBAG,
+    RES_PARATR_GRABBAG,                             // 76
 RES_PARATR_END
 };
 
@@ -169,101 +169,101 @@ RES_PARATR_END
 enum RES_PARATR_LIST
 {
 RES_PARATR_LIST_BEGIN = RES_PARATR_END,
-    RES_PARATR_LIST_ID = RES_PARATR_LIST_BEGIN,     // 76
-    RES_PARATR_LIST_LEVEL,                          // 77
-    RES_PARATR_LIST_ISRESTART,                      // 78
-    RES_PARATR_LIST_RESTARTVALUE,                   // 79
-    RES_PARATR_LIST_ISCOUNTED,                      // 80
+    RES_PARATR_LIST_ID = RES_PARATR_LIST_BEGIN,     // 77
+    RES_PARATR_LIST_LEVEL,                          // 78
+    RES_PARATR_LIST_ISRESTART,                      // 79
+    RES_PARATR_LIST_RESTARTVALUE,                   // 80
+    RES_PARATR_LIST_ISCOUNTED,                      // 81
 RES_PARATR_LIST_END
 };
 
 enum RES_FRMATR
 {
 RES_FRMATR_BEGIN = RES_PARATR_LIST_END,
-    RES_FILL_ORDER = RES_FRMATR_BEGIN,              // 81
-    RES_FRM_SIZE,                                   // 82
-    RES_PAPER_BIN,                                  // 83
-    RES_LR_SPACE,                                   // 84
-    RES_UL_SPACE,                                   // 85
-    RES_PAGEDESC,                                   // 86
-    RES_BREAK,                                      // 87
-    RES_CNTNT,                                      // 88
-    RES_HEADER,                                     // 89
-    RES_FOOTER,                                     // 90
-    RES_PRINT,                                      // 91
-    RES_OPAQUE,                                     // 92
-    RES_PROTECT,                                    // 93
-    RES_SURROUND,                                   // 94
-    RES_VERT_ORIENT,                                // 95
-    RES_HORI_ORIENT,                                // 96
-    RES_ANCHOR,                                     // 97
-    RES_BACKGROUND,                                 // 98
-    RES_BOX,                                        // 99
-    RES_SHADOW,                                     // 100
-    RES_FRMMACRO,                                   // 101
-    RES_COL,                                        // 102
-    RES_KEEP,                                       // 103
-    RES_URL,                                        // 104
-    RES_EDIT_IN_READONLY,                           // 105
-    RES_LAYOUT_SPLIT,                               // 106
-    RES_CHAIN,                                      // 107
-    RES_TEXTGRID,                                   // 108
-    RES_LINENUMBER  ,                               // 109
-    RES_FTN_AT_TXTEND,                              // 110
-    RES_END_AT_TXTEND,                              // 111
-    RES_COLUMNBALANCE,                              // 112
-    RES_FRAMEDIR,                                   // 113
-    RES_HEADER_FOOTER_EAT_SPACING,                  // 114
-    RES_ROW_SPLIT,                                  // 115
-    RES_FOLLOW_TEXT_FLOW,                           // 116
-    RES_COLLAPSING_BORDERS,                         // 117
-    RES_WRAP_INFLUENCE_ON_OBJPOS,                   // 118
-    RES_AUTO_STYLE,                                 // 119
-    RES_FRMATR_STYLE_NAME,                          // 120
-    RES_FRMATR_CONDITIONAL_STYLE_NAME,              // 121
-    RES_FILL_STYLE,                                 // 122
-    RES_FILL_GRADIENT,                              // 123
+    RES_FILL_ORDER = RES_FRMATR_BEGIN,              // 82
+    RES_FRM_SIZE,                                   // 83
+    RES_PAPER_BIN,                                  // 84
+    RES_LR_SPACE,                                   // 85
+    RES_UL_SPACE,                                   // 86
+    RES_PAGEDESC,                                   // 87
+    RES_BREAK,                                      // 88
+    RES_CNTNT,                                      // 89
+    RES_HEADER,                                     // 90
+    RES_FOOTER,                                     // 91
+    RES_PRINT,                                      // 92
+    RES_OPAQUE,                                     // 93
+    RES_PROTECT,                                    // 94
+    RES_SURROUND,                                   // 95
+    RES_VERT_ORIENT,                                // 96
+    RES_HORI_ORIENT,                                // 97
+    RES_ANCHOR,                                     // 98
+    RES_BACKGROUND,                                 // 99
+    RES_BOX,                                        // 100
+    RES_SHADOW,                                     // 101
+    RES_FRMMACRO,                                   // 102
+    RES_COL,                                        // 103
+    RES_KEEP,                                       // 104
+    RES_URL,                                        // 105
+    RES_EDIT_IN_READONLY,                           // 106
+    RES_LAYOUT_SPLIT,                               // 107
+    RES_CHAIN,                                      // 108
+    RES_TEXTGRID,                                   // 109
+    RES_LINENUMBER  ,                               // 110
+    RES_FTN_AT_TXTEND,                              // 111
+    RES_END_AT_TXTEND,                              // 112
+    RES_COLUMNBALANCE,                              // 113
+    RES_FRAMEDIR,                                   // 114
+    RES_HEADER_FOOTER_EAT_SPACING,                  // 115
+    RES_ROW_SPLIT,                                  // 116
+    RES_FOLLOW_TEXT_FLOW,                           // 117
+    RES_COLLAPSING_BORDERS,                         // 118
+    RES_WRAP_INFLUENCE_ON_OBJPOS,                   // 119
+    RES_AUTO_STYLE,                                 // 120
+    RES_FRMATR_STYLE_NAME,                          // 121
+    RES_FRMATR_CONDITIONAL_STYLE_NAME,              // 122
+    RES_FILL_STYLE,                                 // 123
+    RES_FILL_GRADIENT,                              // 124
 RES_FRMATR_END
 };
 
 enum RES_GRFATR
 {
 RES_GRFATR_BEGIN = RES_FRMATR_END,
-    RES_GRFATR_MIRRORGRF = RES_GRFATR_BEGIN,        // 124
-    RES_GRFATR_CROPGRF,                             // 125
-
-    RES_GRFATR_ROTATION,                            // 126
-    RES_GRFATR_LUMINANCE,                           // 127
-    RES_GRFATR_CONTRAST,                            // 128
-    RES_GRFATR_CHANNELR,                            // 129
-    RES_GRFATR_CHANNELG,                            // 130
-    RES_GRFATR_CHANNELB,                            // 131
-    RES_GRFATR_GAMMA,                               // 132
-    RES_GRFATR_INVERT,                              // 133
-    RES_GRFATR_TRANSPARENCY,                        // 134
-    RES_GRFATR_DRAWMODE,                            // 135
-
-    RES_GRFATR_DUMMY1,                              // 136
-    RES_GRFATR_DUMMY2,                              // 137
-    RES_GRFATR_DUMMY3,                              // 138
-    RES_GRFATR_DUMMY4,                              // 139
-    RES_GRFATR_DUMMY5,                              // 140
+    RES_GRFATR_MIRRORGRF = RES_GRFATR_BEGIN,        // 125
+    RES_GRFATR_CROPGRF,                             // 126
+
+    RES_GRFATR_ROTATION,                            // 127
+    RES_GRFATR_LUMINANCE,                           // 128
+    RES_GRFATR_CONTRAST,                            // 129
+    RES_GRFATR_CHANNELR,                            // 130
+    RES_GRFATR_CHANNELG,                            // 131
+    RES_GRFATR_CHANNELB,                            // 132
+    RES_GRFATR_GAMMA,                               // 133
+    RES_GRFATR_INVERT,                              // 134
+    RES_GRFATR_TRANSPARENCY,                        // 135
+    RES_GRFATR_DRAWMODE,                            // 136
+
+    RES_GRFATR_DUMMY1,                              // 137
+    RES_GRFATR_DUMMY2,                              // 138
+    RES_GRFATR_DUMMY3,                              // 139
+    RES_GRFATR_DUMMY4,                              // 140
+    RES_GRFATR_DUMMY5,                              // 141
 RES_GRFATR_END
 };
 
 enum RES_BOXATR
 {
 RES_BOXATR_BEGIN = RES_GRFATR_END,
-    RES_BOXATR_FORMAT = RES_BOXATR_BEGIN,           // 141
-    RES_BOXATR_FORMULA,                             // 142
-    RES_BOXATR_VALUE,                               // 143
+    RES_BOXATR_FORMAT = RES_BOXATR_BEGIN,           // 142
+    RES_BOXATR_FORMULA,                             // 143
+    RES_BOXATR_VALUE,                               // 144
 RES_BOXATR_END
 };
 
 enum RES_UNKNOWNATR
 {
 RES_UNKNOWNATR_BEGIN = RES_BOXATR_END,
-    RES_UNKNOWNATR_CONTAINER = RES_UNKNOWNATR_BEGIN,// 142
+    RES_UNKNOWNATR_CONTAINER = RES_UNKNOWNATR_BEGIN,// 145
 RES_UNKNOWNATR_END
 };
 
commit afe463fb62225fdc526343fb2020ced790c61251
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Wed Jul 24 11:35:01 2013 +0200

    SfxGrabBagItem testcase
    
    Change-Id: I1386ab7a0680460bd98648d2803b1b7e0326e093

diff --git a/sw/qa/extras/ooxmlexport/data/grabbag.docx b/sw/qa/extras/ooxmlexport/data/grabbag.docx
new file mode 100755
index 0000000..0aca64d
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/grabbag.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index afaa061..24ad76e 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -98,6 +98,7 @@ public:
     void testFdo66929();
     void testFdo66145();
     void testPageBorderSpacingExportCase2();
+    void testGrabBag();
 
     CPPUNIT_TEST_SUITE(Test);
 #if !defined(MACOSX) && !defined(WNT)
@@ -114,7 +115,7 @@ private:
      * xml stream, so that you can do the asserting.
      */
     xmlDocPtr parseExport();
-    void assertXPath(xmlDocPtr pXmlDoc, OString aXPath, OString aAttribute, OUString aExpectedValue);
+    void assertXPath(xmlDocPtr pXmlDoc, OString aXPath, OString aAttribute = OString(), OUString aExpectedValue = OUString());
 };
 
 void Test::run()
@@ -174,6 +175,7 @@ void Test::run()
         {"bnc581614.doc", &Test::testBnc581614},
         {"fdo66929.docx", &Test::testFdo66929},
         {"page-borders-export-case-2.docx", &Test::testPageBorderSpacingExportCase2},
+        {"grabbag.docx", &Test::testGrabBag},
     };
     // Don't test the first import of these, for some reason those tests fail
     const char* aBlacklist[] = {
@@ -227,6 +229,8 @@ void Test::assertXPath(xmlDocPtr pXmlDoc, OString aXPath, OString aAttribute, OU
     xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(aXPath.getStr()), pXmlXpathCtx);
     xmlNodeSetPtr pXmlNodes = pXmlXpathObj->nodesetval;
     CPPUNIT_ASSERT_EQUAL(1, xmlXPathNodeSetGetLength(pXmlNodes));
+    if (aAttribute.isEmpty())
+        return;
     xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0];
     OUString aValue = OUString::createFromAscii((const char*)xmlGetProp(pXmlNode, BAD_CAST(aAttribute.getStr())));
     CPPUNIT_ASSERT_EQUAL(aExpectedValue, aValue);
@@ -1012,6 +1016,13 @@ void Test::testFdo66145()
     CPPUNIT_ASSERT_EQUAL(false, bool(getProperty<sal_Bool>(xPropertySet, "FirstIsShared")));
 }
 
+void Test::testGrabBag()
+{
+    // w:mirrorIndents was lost on roundtrip, now should be handled as a grab bag property
+    xmlDocPtr pXmlDoc = parseExport();
+    assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:pPr/w:mirrorIndents");
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit d978bc31bf821d9698b2fdb5c277b239704d9776
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Wed Jul 24 11:25:16 2013 +0200

    MSWordExportBase: handle SfxGrabBagItem
    
    Change-Id: Iace2abaa0e933d7f4abf2feb146698bbf299be38

diff --git a/sw/source/filter/ww8/attributeoutputbase.hxx b/sw/source/filter/ww8/attributeoutputbase.hxx
index 25ee2a0..cadce5a 100644
--- a/sw/source/filter/ww8/attributeoutputbase.hxx
+++ b/sw/source/filter/ww8/attributeoutputbase.hxx
@@ -102,6 +102,7 @@ class SvxFmtKeepItem;
 class SwTextGridItem;
 class SwFmtLineNumber;
 class SvxFrameDirectionItem;
+class SfxGrabBagItem;
 class SwFmtRuby;
 class SwTxtNode;
 class SwTOXMark;
@@ -560,6 +561,9 @@ protected:
     /// Sfx item RES_FRAMEDIR
     virtual void FormatFrameDirection( const SvxFrameDirectionItem& ) = 0;
 
+    /// Sfx item RES_PARATR_GRABBAG
+    virtual void ParaGrabBag( const SfxGrabBagItem& ) = 0;
+
     /// Write the expanded field
     virtual void WriteExpand( const SwField* pFld ) = 0;
 
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index f4a5608..cf95aa2 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -73,6 +73,7 @@
 #include <svx/svdobj.hxx>
 #include <svx/xfillit0.hxx>
 #include <svx/xflgrit.hxx>
+#include <svl/grabbagitem.hxx>
 #include <sfx2/sfxbasemodel.hxx>
 
 #include <anchoredobject.hxx>
@@ -5221,6 +5222,18 @@ void DocxAttributeOutput::FormatFrameDirection( const SvxFrameDirectionItem& rDi
     }
 }
 
+void DocxAttributeOutput::ParaGrabBag(const SfxGrabBagItem& rItem)
+{
+    const std::map<OUString, com::sun::star::uno::Any>& rMap = rItem.GetGrabBag();
+    for (std::map<OUString, com::sun::star::uno::Any>::const_iterator i = rMap.begin(); i != rMap.end(); ++i)
+    {
+        if (i->first == "MirrorIndents")
+            m_pSerializer->singleElementNS(XML_w, XML_mirrorIndents, FSEND);
+        else
+            SAL_INFO("sw.ww8", "DocxAttributeOutput::ParaGrabBag: unhandled grab bag property " << i->first);
+    }
+}
+
 DocxAttributeOutput::DocxAttributeOutput( DocxExport &rExport, FSHelperPtr pSerializer, oox::drawingml::DrawingML* pDrawingML )
     : m_rExport( rExport ),
       m_pSerializer( pSerializer ),
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 316ea6a..2a163a89 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -564,6 +564,9 @@ protected:
     /// Sfx item RES_FRAMEDIR
     virtual void FormatFrameDirection( const SvxFrameDirectionItem& );
 
+    /// Sfx item RES_PARATR_GRABBAG
+    virtual void ParaGrabBag( const SfxGrabBagItem& );
+
     /// Write the expanded field
     virtual void WriteExpand( const SwField* pFld );
 
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx
index 4e16660..70f19c8 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -3116,6 +3116,10 @@ void RtfAttributeOutput::FormatFrameDirection( const SvxFrameDirectionItem& rDir
     }
 }
 
+void RtfAttributeOutput::ParaGrabBag(const SfxGrabBagItem& /*rItem*/)
+{
+}
+
 void RtfAttributeOutput::WriteExpand( const SwField* pFld )
 {
     SAL_INFO("sw.rtf", OSL_THIS_FUNC);
diff --git a/sw/source/filter/ww8/rtfattributeoutput.hxx b/sw/source/filter/ww8/rtfattributeoutput.hxx
index ec5002f..ea115bf 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.hxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.hxx
@@ -402,6 +402,9 @@ protected:
     /// Sfx item RES_FRAMEDIR
     virtual void FormatFrameDirection( const SvxFrameDirectionItem& );
 
+    /// Sfx item RES_PARATR_GRABBAG
+    virtual void ParaGrabBag( const SfxGrabBagItem& );
+
     /// Write the expanded field
     virtual void WriteExpand( const SwField* pFld );
 
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
index 62335b3..f8c6eee 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -30,6 +30,7 @@
 #include <svl/zformat.hxx>
 #include <svl/itemiter.hxx>
 #include <svl/whiter.hxx>
+#include <svl/grabbagitem.hxx>
 #include <editeng/fontitem.hxx>
 #include <editeng/tstpitem.hxx>
 #include <editeng/adjustitem.hxx>
@@ -4708,6 +4709,10 @@ void WW8AttributeOutput::FormatFrameDirection( const SvxFrameDirectionItem& rDir
     }
 }
 
+void WW8AttributeOutput::ParaGrabBag(const SfxGrabBagItem& /*rItem*/)
+{
+}
+
 // "Separate paragraphs"
 void WW8AttributeOutput::ParaSplit( const SvxFmtSplitItem& rSplit )
 {
@@ -5243,6 +5248,9 @@ void AttributeOutputBase::OutputItem( const SfxPoolItem& rHt )
         case RES_FRAMEDIR:
             FormatFrameDirection( static_cast< const SvxFrameDirectionItem& >( rHt ) );
             break;
+        case RES_PARATR_GRABBAG:
+            ParaGrabBag(static_cast<const SfxGrabBagItem&>(rHt));
+            break;
 
         default:
             SAL_INFO("sw.ww8", "Unhandled SfxPoolItem with id " << rHt.Which() );
diff --git a/sw/source/filter/ww8/ww8attributeoutput.hxx b/sw/source/filter/ww8/ww8attributeoutput.hxx
index d471101..97419ba 100644
--- a/sw/source/filter/ww8/ww8attributeoutput.hxx
+++ b/sw/source/filter/ww8/ww8attributeoutput.hxx
@@ -383,6 +383,9 @@ protected:
     /// Sfx item RES_FRAMEDIR
     virtual void FormatFrameDirection( const SvxFrameDirectionItem& );
 
+    /// Sfx item RES_PARATR_GRABBAG
+    virtual void ParaGrabBag( const SfxGrabBagItem& );
+
     /// Write the expanded field
     virtual void WriteExpand( const SwField* pFld );
 
commit 41bf9d4cc32436ab3e43e8905236dd61ba511815
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Wed Jul 24 10:53:29 2013 +0200

    writerfilter: import w:mirrorIndents as a grab bag property
    
    Change-Id: I500c6af08326ea226b3774fb1e02709d278fa509

diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 4fda96b..cab21d8 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3326,6 +3326,9 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType
     case NS_sprm::LN_PContextualSpacing:
         rContext->Insert(PROP_PARA_CONTEXT_MARGIN, uno::makeAny( sal_Bool( nIntValue ) ));
     break;
+    case 0x2470: // mirrorIndents
+        rContext->Insert(PROP_MIRROR_INDENTS, uno::makeAny(sal_Bool(nIntValue)), true, true);
+    break;
     case NS_ooxml::LN_EG_SectPrContents_formProt: //section protection, only form editing is enabled - unsupported
     case NS_ooxml::LN_EG_SectPrContents_vAlign:
     case NS_ooxml::LN_EG_RPrBase_fitText:
diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx
index f71ed96..1d62f00 100644
--- a/writerfilter/source/dmapper/PropertyIds.cxx
+++ b/writerfilter/source/dmapper/PropertyIds.cxx
@@ -328,6 +328,7 @@ const OUString& PropertyNameSupplier::GetName( PropertyIds eId ) const
             case PROP_CHAR_SHADING_VALUE: sName = "CharShadingValue"; break;
             case PROP_LABEL_CATEGORY: sName = "LabelCategory"; break;
             case PROP_FIRST_IS_SHARED : sName = "FirstIsShared"; break;
+            case PROP_MIRROR_INDENTS : sName = "MirrorIndents"; break;
         }
         ::std::pair<PropertyNameMap_t::iterator,bool> aInsertIt =
                 m_pImpl->aNameMap.insert( PropertyNameMap_t::value_type( eId, sName ));
diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx
index 64e81fe..19ee4ff 100644
--- a/writerfilter/source/dmapper/PropertyIds.hxx
+++ b/writerfilter/source/dmapper/PropertyIds.hxx
@@ -299,6 +299,7 @@ enum PropertyIds
         ,PROP_GRAPHIC_BITMAP
         ,PROP_CHAR_SHADING_VALUE
         ,PROP_FIRST_IS_SHARED
+        ,PROP_MIRROR_INDENTS
     };
 struct PropertyNameSupplier_Impl;
 class PropertyNameSupplier
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
index 3a6668e..12380f7 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -64,11 +64,19 @@ uno::Sequence< beans::PropertyValue > PropertyMap::GetPropertyValues()
 {
     if(!m_aValues.getLength() && size())
     {
-        m_aValues.realloc( size() );
+        size_t nGrabBag = 0;
+        for (PropertyMap::iterator i = begin(); i != end(); ++i)
+            if (i->first.m_bGrabBag)
+                nGrabBag++;
+        // If there are any grab bag properties, we need one slot for them.
+        m_aValues.realloc( size() - nGrabBag + (nGrabBag ? 1 : 0));
         ::com::sun::star::beans::PropertyValue* pValues = m_aValues.getArray();
+        uno::Sequence<beans::PropertyValue> aGrabBagValues(nGrabBag);
+        beans::PropertyValue* pGrabBagValues = aGrabBagValues.getArray();
         //style names have to be the first elements within the property sequence
         //otherwise they will overwrite 'hard' attributes
         sal_Int32 nValue = 0;
+        sal_Int32 nGrabBagValue = 0;
         PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
         PropertyMap::iterator aParaStyleIter = find(PropertyDefinition( PROP_PARA_STYLE_NAME ) );
         if( aParaStyleIter != end())
@@ -93,15 +101,30 @@ uno::Sequence< beans::PropertyValue > PropertyMap::GetPropertyValues()
             ++nValue;
         }
         PropertyMap::iterator aMapIter = begin();
-        for( ; nValue < m_aValues.getLength(); ++aMapIter )
+        for( ; aMapIter != end(); ++aMapIter )
         {
             if( aMapIter != aParaStyleIter && aMapIter != aCharStyleIter && aMapIter != aNumRuleIter )
             {
-                pValues[nValue].Name = rPropNameSupplier.GetName( aMapIter->first.eId );
-                pValues[nValue].Value = aMapIter->second;
-                ++nValue;
+                if (!aMapIter->first.m_bGrabBag)
+                {
+                    pValues[nValue].Name = rPropNameSupplier.GetName( aMapIter->first.eId );
+                    pValues[nValue].Value = aMapIter->second;
+                    ++nValue;
+                }
+                else
+                {
+                    pGrabBagValues[nGrabBagValue].Name = rPropNameSupplier.GetName( aMapIter->first.eId );
+                    pGrabBagValues[nGrabBagValue].Value = aMapIter->second;
+                    ++nGrabBagValue;
+                }
             }
         }
+        if (nGrabBag)
+        {
+            pValues[nValue].Name = "ParaInteropGrabBag";
+            pValues[nValue].Value = uno::makeAny(aGrabBagValues);
+            ++nValue;
+        }
     }
     return m_aValues;
 }
@@ -131,7 +154,7 @@ static void lcl_AnyToTag(const uno::Any & rAny)
 }
 #endif
 
-void PropertyMap::Insert( PropertyIds eId, const uno::Any& rAny, bool bOverwrite )
+void PropertyMap::Insert( PropertyIds eId, const uno::Any& rAny, bool bOverwrite, bool bGrabBag )
 {
 #ifdef DEBUG_DMAPPER_PROPERTY_MAP
     const OUString& rInsert = PropertyNameSupplier::
@@ -143,7 +166,7 @@ void PropertyMap::Insert( PropertyIds eId, const uno::Any& rAny, bool bOverwrite
     dmapper_logger->endElement();
 #endif
 
-    PropertyMap::iterator aElement = find(PropertyDefinition( eId ) );
+    PropertyMap::iterator aElement = find(PropertyDefinition( eId, bGrabBag ) );
     if( aElement != end())
     {
         if(!bOverwrite)
@@ -151,7 +174,7 @@ void PropertyMap::Insert( PropertyIds eId, const uno::Any& rAny, bool bOverwrite
         erase( aElement );
     }
     _PropertyMap::insert( PropertyMap::value_type
-                          (PropertyDefinition( eId ),
+                          (PropertyDefinition( eId, bGrabBag ),
                            rAny ));
     Invalidate();
 }
diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx
index ba15e89..d5d70d7 100644
--- a/writerfilter/source/dmapper/PropertyMap.hxx
+++ b/writerfilter/source/dmapper/PropertyMap.hxx
@@ -67,9 +67,10 @@ enum BorderPosition
 struct PropertyDefinition
 {
     PropertyIds eId;
+    bool m_bGrabBag;
 
-    PropertyDefinition( PropertyIds _eId ) :
-        eId( _eId ){}
+    PropertyDefinition( PropertyIds _eId, bool bGrabBag = false ) :
+        eId( _eId ), m_bGrabBag(bGrabBag){}
 
     bool    operator== (const PropertyDefinition& rDef) const
             {   return rDef.eId == eId; }
@@ -102,7 +103,7 @@ public:
     bool hasEmptyPropertyValues() const {return !m_aValues.getLength();}
     /** Add property, usually overwrites already available attributes. It shouldn't overwrite in case of default attributes
      */
-    void Insert( PropertyIds eId, const ::com::sun::star::uno::Any& rAny, bool bOverwrite = true );
+    void Insert( PropertyIds eId, const ::com::sun::star::uno::Any& rAny, bool bOverwrite = true, bool bGrabBag = false );
     void InsertProps(const boost::shared_ptr<PropertyMap> pMap);
 
     const ::com::sun::star::uno::Reference< ::com::sun::star::text::XFootnote>&  GetFootnote() const;
commit 288bcd68bdccd7a57b2c6da2c0bb91b71e8fcd3b
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Wed Jul 24 10:52:40 2013 +0200

    sw: add ParaInteropGrabBag uno property to paragraphs
    
    Change-Id: Ic1208f97db31d86bffd71032d6eba1768e929707

diff --git a/offapi/com/sun/star/style/ParagraphProperties.idl b/offapi/com/sun/star/style/ParagraphProperties.idl
index 43e7752..ef73da5 100644
--- a/offapi/com/sun/star/style/ParagraphProperties.idl
+++ b/offapi/com/sun/star/style/ParagraphProperties.idl
@@ -30,6 +30,7 @@
 #include <com/sun/star/table/BorderLine.idl>
 #include <com/sun/star/style/BreakType.idl>
 #include <com/sun/star/container/XNameContainer.idl>
+#include <com/sun/star/beans/PropertyValue.idl>
 
 
  module com {  module sun {  module star {  module style {
@@ -137,6 +138,15 @@ published service ParagraphProperties
      */
     [optional, property] boolean ParaContextMargin;
 
+    /** Grab bag of paragraph properties, used as a string-any map for interim interop purposes.
+
+        @since LibreOffice 4.2
+
+        <p>This property is intentionally not handled by the ODF filter. Any
+        member that should be handled there should be first moved out from this grab
+        bag to a separate property.</p>
+    */
+    [optional, property] sequence<com::sun::star::beans::PropertyValue> ParaInteropGrabBag;
 
     /** determines if the paragraph is included in the
         line numbering.
diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
index 83afbcd..403bd74 100644
--- a/sw/inc/hintids.hxx
+++ b/sw/inc/hintids.hxx
@@ -160,6 +160,7 @@ RES_PARATR_BEGIN = RES_TXTATR_END,
     RES_PARATR_CONNECT_BORDER,                      // 73
     RES_PARATR_OUTLINELEVEL,                        // 74
     RES_PARATR_RSID,								// 75
+    RES_PARATR_GRABBAG,
 RES_PARATR_END
 };
 
diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx
index 68a1f4b..d418a12 100644
--- a/sw/inc/unoprnms.hxx
+++ b/sw/inc/unoprnms.hxx
@@ -824,6 +824,8 @@ enum SwPropNameIds
 
 /* 0761 */  UNO_NAME_CHAR_SHADING_VALUE,
 
+/* 0762 */  UNO_NAME_PARA_INTEROP_GRAB_BAG,
+
 /* 0762 */  SW_PROPNAME_END
 
 // new items in this array must match SwPropNameTab aPropNameTab
diff --git a/sw/source/core/bastyp/init.cxx b/sw/source/core/bastyp/init.cxx
index 4e57193..7d585b7 100644
--- a/sw/source/core/bastyp/init.cxx
+++ b/sw/source/core/bastyp/init.cxx
@@ -59,6 +59,7 @@
 #include <editeng/protitem.hxx>
 #include <editeng/prszitem.hxx>
 #include <editeng/rsiditem.hxx>
+#include <svl/grabbagitem.hxx>
 #include <editeng/scriptspaceitem.hxx>
 #include <editeng/shaditem.hxx>
 #include <editeng/spltitem.hxx>
@@ -328,6 +329,7 @@ SfxItemInfo aSlotTab[] =
 
     { SID_ATTR_PARA_OUTLINE_LEVEL, SFX_ITEM_POOLABLE }, // RES_PARATR_OUTLINELEVEL //#outline level
     { 0, SFX_ITEM_POOLABLE },                           // RES_PARATR_RSID
+    { 0, SFX_ITEM_POOLABLE },                           // RES_PARATR_GRABBAG
     { 0, SFX_ITEM_POOLABLE },                           // RES_PARATR_LIST_ID
     { 0, SFX_ITEM_POOLABLE },                           // RES_PARATR_LIST_LEVEL
     { 0, SFX_ITEM_POOLABLE },                           // RES_PARATR_LIST_ISRESTART
@@ -544,6 +546,7 @@ void _InitCore()
 
     aAttrTab[ RES_PARATR_OUTLINELEVEL - POOLATTR_BEGIN ] =  new SfxUInt16Item( RES_PARATR_OUTLINELEVEL, 0 );
     aAttrTab[ RES_PARATR_RSID - POOLATTR_BEGIN ] =          new SvxRsidItem( 0, RES_PARATR_RSID );
+    aAttrTab[ RES_PARATR_GRABBAG - POOLATTR_BEGIN ] =       new SfxGrabBagItem( RES_PARATR_GRABBAG );
 
     aAttrTab[ RES_PARATR_LIST_ID - POOLATTR_BEGIN ] =       new SfxStringItem( RES_PARATR_LIST_ID, aEmptyStr );
     aAttrTab[ RES_PARATR_LIST_LEVEL - POOLATTR_BEGIN ] =    new SfxInt16Item( RES_PARATR_LIST_LEVEL, 0 );
diff --git a/sw/source/core/unocore/unomap.cxx b/sw/source/core/unocore/unomap.cxx
index da8857c..6b9cadd 100644
--- a/sw/source/core/unocore/unomap.cxx
+++ b/sw/source/core/unocore/unomap.cxx
@@ -235,7 +235,8 @@ SwUnoPropertyMapProvider::~SwUnoPropertyMapProvider()
         { SW_PROP_NMID(UNO_NAME_SNAP_TO_GRID), RES_PARATR_SNAPTOGRID, CPPU_E2T(CPPUTYPE_BOOLEAN), PropertyAttribute::MAYBEVOID, 0 }, \
         { SW_PROP_NMID(UNO_NAME_PARA_IS_CONNECT_BORDER), RES_PARATR_CONNECT_BORDER, CPPU_E2T(CPPUTYPE_BOOLEAN), PropertyAttribute::MAYBEVOID, 0}, \
         { SW_PROP_NMID(UNO_NAME_WRITING_MODE), RES_FRAMEDIR, CPPU_E2T(CPPUTYPE_INT16), PROPERTY_NONE, 0 }, \
-        { SW_PROP_NMID(UNO_NAME_CHAR_SHADING_VALUE), RES_CHRATR_BACKGROUND,      CPPU_E2T(CPPUTYPE_INT32),    PROPERTY_NONE,      MID_SHADING_VALUE },
+        { SW_PROP_NMID(UNO_NAME_CHAR_SHADING_VALUE), RES_CHRATR_BACKGROUND,      CPPU_E2T(CPPUTYPE_INT32),    PROPERTY_NONE,      MID_SHADING_VALUE }, \
+        { SW_PROP_NMID(UNO_NAME_PARA_INTEROP_GRAB_BAG), RES_PARATR_GRABBAG, CPPU_E2T(CPPUTYPE_PROPERTYVALUE), PROPERTY_NONE, 0 }, \
 
 #define COMMON_CRSR_PARA_PROPERTIES_WITHOUT_FN \
         COMMON_CRSR_PARA_PROPERTIES_WITHOUT_FN_01 \
diff --git a/sw/source/core/unocore/unoprnms.cxx b/sw/source/core/unocore/unoprnms.cxx
index 8e1c7ce..b721a3a 100644
--- a/sw/source/core/unocore/unoprnms.cxx
+++ b/sw/source/core/unocore/unoprnms.cxx
@@ -791,6 +791,7 @@ const SwPropNameTab aPropNameTab = {
 /* 0759 UNO_NAME_FILL_GRADIENT_NAME */              {MAP_CHAR_LEN("FillGradientName")},
 /* 0760 UNO_NAME_DEFAULT_PAGE_MODE */    {MAP_CHAR_LEN("DefaultPageMode")},
 /* 0761 UNO_NAME_CHAR_SHADING_VALUE */   {MAP_CHAR_LEN("CharShadingValue")},
+/* 0762 UNO_NAME_PARA_INTEROP_GRAB_BAG */   {MAP_CHAR_LEN("ParaInteropGrabBag")},
 
 // new items in this array must match enum SwPropNameIds
 };
commit f841985d9c80556001fbd6bd856eb84f49e805ab
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Wed Jul 24 10:51:33 2013 +0200

    svl: add an SfxGrabBagItem
    
    The intention is that this can be used as a grab bag of properties which
    are not handled properly, yet we want the roundtrip of them to alien
    formats.
    
    See
    http://lists.freedesktop.org/archives/libreoffice/2013-July/054428.html
    for more details.
    
    Change-Id: I3781b3b3bf1380d30683039f037d9a4292ba2f4a

diff --git a/include/svl/grabbagitem.hxx b/include/svl/grabbagitem.hxx
new file mode 100644
index 0000000..f32e8e5
--- /dev/null
+++ b/include/svl/grabbagitem.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#ifndef _SFXGRABBAGITEM_HXX
+#define _SFXGRABBAGITEM_HXX
+
+#include <map>
+
+#include "svl/svldllapi.h"
+#include <tools/rtti.hxx>
+#include <svl/poolitem.hxx>
+#include <com/sun/star/uno/Any.hxx>
+
+/// Grab bag item provides a string-any map for interim interop purposes.
+class SVL_DLLPUBLIC SfxGrabBagItem : public SfxPoolItem
+{
+private:
+    std::map<OUString, com::sun::star::uno::Any> m_aMap;
+
+public:
+    TYPEINFO();
+
+    SfxGrabBagItem();
+    SfxGrabBagItem(sal_uInt16 nWhich, const std::map<OUString, com::sun::star::uno::Any> *pMap = 0);
+    SfxGrabBagItem(const SfxGrabBagItem& rItem);
+    ~SfxGrabBagItem();
+
+    void SetGrabBag(const std::map<OUString, com::sun::star::uno::Any>& rMap);
+    const std::map<OUString, com::sun::star::uno::Any>& GetGrabBag() const;
+
+    virtual int operator==(const SfxPoolItem&) const;
+    virtual SfxPoolItem* Clone(SfxItemPool *pPool = 0) const;
+
+    virtual bool PutValue(const com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0);
+    virtual bool QueryValue(com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0) const;
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svl/Library_svl.mk b/svl/Library_svl.mk
index 499b105..fd28a7a 100644
--- a/svl/Library_svl.mk
+++ b/svl/Library_svl.mk
@@ -73,6 +73,7 @@ $(eval $(call gb_Library_add_exception_objects,svl,\
     svl/source/items/eitem \
     svl/source/items/flagitem \
     svl/source/items/globalnameitem \
+    svl/source/items/grabbagitem \
     svl/source/items/ilstitem \
     svl/source/items/imageitm \
     svl/source/items/intitem \
diff --git a/svl/source/items/grabbagitem.cxx b/svl/source/items/grabbagitem.cxx
new file mode 100644
index 0000000..23ab2bd
--- /dev/null
+++ b/svl/source/items/grabbagitem.cxx
@@ -0,0 +1,100 @@
+/* -*- 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 <svl/grabbagitem.hxx>
+#include <svl/poolitem.hxx>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <comphelper/sequence.hxx>
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+
+DBG_NAME(SfxGrabBagItem)
+
+TYPEINIT1_AUTOFACTORY(SfxGrabBagItem, SfxPoolItem);
+
+using namespace com::sun::star;
+
+SfxGrabBagItem::SfxGrabBagItem()
+{
+}
+
+SfxGrabBagItem::SfxGrabBagItem(sal_uInt16 nWhich, const std::map<OUString, uno::Any> *pMap) :
+    SfxPoolItem( nWhich )
+{
+    if (pMap)
+        m_aMap = *pMap;
+}
+
+SfxGrabBagItem::SfxGrabBagItem(const SfxGrabBagItem& rItem) :
+    SfxPoolItem(rItem),
+    m_aMap(rItem.m_aMap)
+{
+}
+
+SfxGrabBagItem::~SfxGrabBagItem()
+{
+}
+
+void SfxGrabBagItem::SetGrabBag(const std::map<OUString, uno::Any>& rMap)
+{
+    m_aMap = rMap;
+}
+
+const std::map<OUString, uno::Any>& SfxGrabBagItem::GetGrabBag() const
+{
+    return m_aMap;
+}
+
+int SfxGrabBagItem::operator==(const SfxPoolItem& rItem) const
+{
+    SfxGrabBagItem* pItem = (SfxGrabBagItem*)&rItem;
+
+    return m_aMap == pItem->m_aMap;
+}
+
+SfxPoolItem* SfxGrabBagItem::Clone(SfxItemPool * /*pPool*/) const
+{
+    return new SfxGrabBagItem(*this);
+}
+
+bool SfxGrabBagItem::PutValue(const uno::Any& rVal, sal_uInt8 /*nMemberId*/)
+{
+    uno::Sequence<beans::PropertyValue> aValue;
+    if ( rVal >>= aValue )
+    {
+        m_aMap.clear();
+        comphelper::OSequenceIterator<beans::PropertyValue> i(aValue);
+        while (i.hasMoreElements())
+        {
+            beans::PropertyValue aPropertyValue = i.nextElement().get<beans::PropertyValue>();
+            m_aMap[aPropertyValue.Name] = aPropertyValue.Value;
+        }
+        return true;
+    }
+
+    SAL_WARN("svl", "SfxGrabBagItem::PutValue: wrong type");
+    return false;
+}
+
+bool SfxGrabBagItem::QueryValue(uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
+{
+    uno::Sequence<beans::PropertyValue> aValue(m_aMap.size());
+    beans::PropertyValue* pValue = aValue.getArray();
+    for (std::map<OUString, com::sun::star::uno::Any>::const_iterator i = m_aMap.begin(); i != m_aMap.end(); ++i)
+    {
+        pValue[0].Name = i->first;
+        pValue[0].Value = i->second;
+        ++pValue;
+    }
+    rVal = uno::makeAny(aValue);
+    return true;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list