dev/null |binary sw/qa/extras/ww8export/data/fdo59530.doc |binary sw/qa/extras/ww8export/ww8export.cxx | 40 +++++++ sw/qa/extras/ww8import/ww8import.cxx | 25 ---- sw/source/filter/ww8/wrtw8sty.cxx | 159 ++++++++++++++++++++++------ sw/source/filter/ww8/wrtww8.hxx | 9 + sw/source/filter/ww8/ww8atr.cxx | 5 sw/source/filter/ww8/ww8attributeoutput.hxx | 2 sw/source/filter/ww8/ww8par.cxx | 56 ++++++++- 9 files changed, 231 insertions(+), 65 deletions(-)
New commits: commit e0bd7b01f31bfbaeac3bce86403bf25929c61c84 Author: Zolnai Tamás <[email protected]> Date: Fri Jan 3 00:41:56 2014 +0100 cp#2013101510000026: doc import of comments affecting more text nodes Change-Id: I3932d82cb4cd640b19957b93cc7e59711af1b564 (cherry picked from commit f2945255df273404ee2457dcf761cb8f334b732b) diff --git a/sw/qa/extras/ww8export/data/fdo59530.doc b/sw/qa/extras/ww8export/data/fdo59530.doc index 60cfe84..921fbca 100644 Binary files a/sw/qa/extras/ww8export/data/fdo59530.doc and b/sw/qa/extras/ww8export/data/fdo59530.doc differ diff --git a/sw/qa/extras/ww8export/ww8export.cxx b/sw/qa/extras/ww8export/ww8export.cxx index 29e2df5..d34a46d 100644 --- a/sw/qa/extras/ww8export/ww8export.cxx +++ b/sw/qa/extras/ww8export/ww8export.cxx @@ -164,7 +164,6 @@ void Test::testFdo59530() uno::Reference<beans::XPropertySet> xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), getProperty<OUString>(xPropertySet, "TextPortionType")); xRunEnum->nextElement(); - xRunEnum->nextElement(); xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(OUString("TextFieldEnd"), getProperty<OUString>(xPropertySet, "TextPortionType")); @@ -174,6 +173,20 @@ void Test::testFdo59530() uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration()); xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty<OUString>(xPropertySet, "Initials")); + + // Test commented text range which spans over more text nodes + // Comment starts in the second paragraph + xRunEnumAccess.set(xParaEnum->nextElement(), uno::UNO_QUERY); + xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), getProperty<OUString>(xPropertySet, "TextPortionType")); + // Comment ends in the third paragraph + xRunEnumAccess.set(xParaEnum->nextElement(), uno::UNO_QUERY); + xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("TextFieldEnd"), getProperty<OUString>(xPropertySet, "TextPortionType")); } CPPUNIT_TEST_SUITE_REGISTRATION(Test); diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index 30d337c..46fa171 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -1826,11 +1826,50 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) WW8_CP nStart = GetAnnotationStart(nAtnIndex); WW8_CP nEnd = GetAnnotationEnd(nAtnIndex); sal_Int32 nLen = nEnd - nStart; - // Don't support ranges affecting multiple SwTxtNode for now. - if (nLen && pPaM->GetPoint()->nContent.GetIndex() >= nLen) - { - pPaM->SetMark(); - pPaM->GetPoint()->nContent -= nLen; + if( nLen ) + { + if (pPaM->GetPoint()->nContent.GetIndex() >= nLen) + { + pPaM->SetMark(); + pPaM->GetPoint()->nContent -= nLen; + } + else if (pPaM->GetPoint()->nNode.GetNode().IsTxtNode() ) + { + pPaM->SetMark(); + nLen -= pPaM->GetPoint()->nContent.GetIndex(); + + SwTxtNode* pTxtNode = 0; + // Find first text node which affected by the comment + while( pPaM->GetPoint()->nNode >= 0 ) + { + SwNode* pNode = 0; + // Find previous text node + do + { + pPaM->GetPoint()->nNode--; + nLen--; // End line character + pNode = &pPaM->GetPoint()->nNode.GetNode(); + } + while( !pNode->IsTxtNode() && pPaM->GetPoint()->nNode >= 0 ); + + // Subtrackt previous text node's length + if( pNode && pNode->IsTxtNode() ) + { + pTxtNode = pNode->GetTxtNode(); + if( nLen < pTxtNode->Len() ) + break; + else + nLen -= pTxtNode->Len(); + } + } + + // Set postion of the text range's first character + if( pTxtNode ) + { + pTxtNode->MakeStartIndex(&pPaM->GetPoint()->nContent); + pPaM->GetPoint()->nContent += pTxtNode->Len() - nLen; + } + } } } } commit 765d89aa149e9afc78382e24bf7c86f70b1584ff Author: Zolnai Tamás <[email protected]> Date: Fri Jan 3 15:21:32 2014 +0100 cp#2013101510000026: doc export of commented text ranges (cherry picked from commit 5969eec0e998804eba77338b17de90737e2acb43) Conflicts: sw/qa/extras/ww8export/ww8export.cxx sw/qa/extras/ww8import/ww8import.cxx sw/source/filter/ww8/wrtw8sty.cxx sw/source/filter/ww8/ww8attributeoutput.hxx Change-Id: I2d31da5d659edcbebc682d5604d2db24b5e341fb diff --git a/sw/qa/extras/ww8export/data/fdo59530.doc b/sw/qa/extras/ww8export/data/fdo59530.doc new file mode 100644 index 0000000..60cfe84 Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo59530.doc differ diff --git a/sw/qa/extras/ww8export/ww8export.cxx b/sw/qa/extras/ww8export/ww8export.cxx index 0c2f769..29e2df5 100644 --- a/sw/qa/extras/ww8export/ww8export.cxx +++ b/sw/qa/extras/ww8export/ww8export.cxx @@ -26,6 +26,7 @@ public: void test56513(); void testNewPageStylesTable(); void testFdo42144(); + void testFdo59530(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -48,6 +49,7 @@ void Test::run() {"fdo56513.doc", &Test::test56513}, {"new-page-styles.doc", &Test::testNewPageStylesTable}, {"fdo42144.odt", &Test::testFdo42144}, + {"fdo59530.doc", &Test::testFdo59530}, }; header(); for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) @@ -149,6 +151,31 @@ void Test::testFdo42144() CPPUNIT_ASSERT_EQUAL(false, bool(getProperty<sal_Bool>(xStyle, "FooterIsOn"))); } +void Test::testFdo59530() +{ + // See ooxmlexport's testFdo38244(). + // Test comment range feature. + uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + uno::Reference<beans::XPropertySet> xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), getProperty<OUString>(xPropertySet, "TextPortionType")); + xRunEnum->nextElement(); + xRunEnum->nextElement(); + xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("TextFieldEnd"), getProperty<OUString>(xPropertySet, "TextPortionType")); + + // Test initials. + uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration()); + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty<OUString>(xPropertySet, "Initials")); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/qa/extras/ww8import/data/fdo59530.doc b/sw/qa/extras/ww8import/data/fdo59530.doc deleted file mode 100755 index 4e41cb8..0000000 Binary files a/sw/qa/extras/ww8import/data/fdo59530.doc and /dev/null differ diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx index ac2b6f3..4c9fa85 100644 --- a/sw/qa/extras/ww8import/ww8import.cxx +++ b/sw/qa/extras/ww8import/ww8import.cxx @@ -225,30 +225,6 @@ void Test::testAllGapsWord() borderTest.testTheBorders(mxComponent); } -void Test::testFdo59530() -{ - // See ooxmlexport's testFdo38244(). - // Test comment range feature. - uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); - uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); - uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); - uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration(); - xRunEnum->nextElement(); - uno::Reference<beans::XPropertySet> xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), getProperty<OUString>(xPropertySet, "TextPortionType")); - xRunEnum->nextElement(); - xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(OUString("TextFieldEnd"), getProperty<OUString>(xPropertySet, "TextPortionType")); - - // Test initials. - uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields()); - uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration()); - xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty<OUString>(xPropertySet, "Initials")); -} - void Test::testI120158() { // See https://issues.apache.org/ooo/show_bug.cgi?id=120158 diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx index 17aad68..0b5422c 100644 --- a/sw/source/filter/ww8/wrtw8sty.cxx +++ b/sw/source/filter/ww8/wrtw8sty.cxx @@ -1945,9 +1945,11 @@ void WW8_WrPlcFtnEdn::Append( WW8_CP nCp, const SwFmtFtn& rFtn ) aCntnt.push_back( &rFtn ); } -WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt) +WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt, WW8_CP nRangeStart, WW8_CP nRangeEnd) : - maDateTime( DateTime::EMPTY ) + maDateTime( DateTime::EMPTY ), + m_nRangeStart(nRangeStart), + m_nRangeEnd(nRangeEnd) { mpRichText = pPostIt->GetTextObject(); if (!mpRichText) @@ -1960,17 +1962,33 @@ WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt) WW8_Annotation::WW8_Annotation(const SwRedlineData* pRedline) : mpRichText(0), - maDateTime( DateTime::EMPTY ) + maDateTime( DateTime::EMPTY ), + m_nRangeStart(0), + m_nRangeEnd(0) { msSimpleText = pRedline->GetComment(); msOwner = SW_MOD()->GetRedlineAuthor(pRedline->GetAuthor()); maDateTime = pRedline->GetTimeStamp(); } +void WW8_WrPlcAnnotations::AddRangeStartPosition( WW8_CP nStartCp) +{ + m_nLastRangeStartPos = nStartCp; +} + void WW8_WrPlcAnnotations::Append( WW8_CP nCp, const SwPostItField *pPostIt ) { aCps.push_back( nCp ); - WW8_Annotation* p = new WW8_Annotation(pPostIt); + WW8_Annotation* p; + if( m_nLastRangeStartPos != -1 ) + { + p = new WW8_Annotation(pPostIt, m_nLastRangeStartPos, nCp); + m_nLastRangeStartPos = -1; + } + else + { + p = new WW8_Annotation(pPostIt, nCp, nCp); + } aCntnt.push_back( p ); } @@ -2144,11 +2162,19 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, { case TXT_ATN: { + std::vector<WW8_CP> aRangeStartPos; + std::vector<WW8_CP> aRangeEndPos; // then write first the GrpXstAtnOwners for ( i = 0; i < nLen; ++i ) { const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; + aStrArr.push_back(std::pair<String,String>(rAtn.msOwner,rAtn.m_sInitials)); + if( rAtn.m_nRangeStart != rAtn.m_nRangeEnd ) + { + aRangeStartPos.push_back(rAtn.m_nRangeStart); + aRangeEndPos.push_back(rAtn.m_nRangeEnd); + } } //sort and remove duplicates @@ -2181,6 +2207,67 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, nFcStart = rWrt.pTableStrm->Tell(); rFib.lcbGrpStAtnOwners = nFcStart - rFib.fcGrpStAtnOwners; + // Commented text ranges + if ( rWrt.bWrtWW8 ) + { + if( aRangeStartPos.size() > 0 ) + { + // Commented text ranges starting positions (Plcfbkf.aCP) + rFib.fcPlcfAtnbkf = nFcStart; + for ( i = 0; i < aRangeStartPos.size(); ++i ) + { + SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRangeStartPos[i] ); + } + SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRangeStartPos[i-1] + 1); + + // Commented text ranges additional informations (Plcfbkf.aFBKF) + for ( i = 0; i < aRangeStartPos.size(); ++i ) + { + SwWW8Writer::WriteShort( *rWrt.pTableStrm, i ); // FBKF.ibkl + SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); // FBKF.bkc + } + + nFcStart = rWrt.pTableStrm->Tell(); + rFib.lcbPlcfAtnbkf = nFcStart - rFib.fcPlcfAtnbkf; + + // Commented text ranges ending positions (PlcfBkl.aCP) + rFib.fcPlcfAtnbkl = nFcStart; + for ( i = 0; i < aRangeEndPos.size(); ++i ) + { + SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRangeEndPos[i] ); + } + SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRangeEndPos[i-1] + 1); + + // Commented text ranges additional informations (Plcfbkl.aFBKF) + for ( i = 0; i < aRangeEndPos.size(); ++i ) + { + SwWW8Writer::WriteShort( *rWrt.pTableStrm, i ); // FBKF.ibkl + SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); // FBKF.bkc + } + + nFcStart = rWrt.pTableStrm->Tell(); + rFib.lcbPlcfAtnbkl = nFcStart - rFib.fcPlcfAtnbkl; + + // Commented text ranges as bookmarks (SttbfAtnBkmk) + rFib.fcSttbfAtnbkmk = nFcStart; + SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0xFFFF ); // SttbfAtnBkmk.fExtend + SwWW8Writer::WriteShort( *rWrt.pTableStrm, aRangeStartPos.size() ); // SttbfAtnBkmk.cData + SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0xA ); // SttbfAtnBkmk.cbExtra + + for ( i = 0; i < aRangeStartPos.size(); ++i ) + { + SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); // SttbfAtnBkmk.cchData + // One ATNBE structure for all text ranges + SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0x0100 ); // ATNBE.bmc + SwWW8Writer::WriteLong( *rWrt.pTableStrm, i ); // ATNBE.lTag + SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 ); // ATNBE.lTagOld + } + + nFcStart = rWrt.pTableStrm->Tell(); + rFib.lcbSttbfAtnbkmk = nFcStart - rFib.fcSttbfAtnbkmk; + } + } + // Write the extended >= Word XP ATLD records if( rWrt.bWrtWW8 ) { @@ -2265,6 +2352,7 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, if ( TXT_ATN == nTTyp ) { + sal_uInt16 nlTag = 0; for ( i = 0; i < nLen; ++i ) { const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; @@ -2314,7 +2402,13 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, SwWW8Writer::WriteShort( *rWrt.pTableStrm, nFndPos ); SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); - SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 ); + if( rAtn.m_nRangeStart != rAtn.m_nRangeEnd ) + { + SwWW8Writer::WriteLong( *rWrt.pTableStrm, nlTag ); + ++nlTag; + } + else + SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 ); } } else diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx index bfbbe03..9c4b267 100644 --- a/sw/source/filter/ww8/wrtww8.hxx +++ b/sw/source/filter/ww8/wrtww8.hxx @@ -1189,7 +1189,8 @@ struct WW8_Annotation String msOwner; String m_sInitials; DateTime maDateTime; - WW8_Annotation(const SwPostItField* pPostIt); + WW8_CP m_nRangeStart, m_nRangeEnd; + WW8_Annotation(const SwPostItField* pPostIt, WW8_CP nRangeStart, WW8_CP nRangeEnd); WW8_Annotation(const SwRedlineData* pRedline); }; @@ -1200,10 +1201,13 @@ private: WW8_WrPlcAnnotations(const WW8_WrPlcAnnotations&); WW8_WrPlcAnnotations& operator=(WW8_WrPlcAnnotations&); std::set<const SwRedlineData*> maProcessedRedlines; + + WW8_CP m_nLastRangeStartPos; public: - WW8_WrPlcAnnotations() {} + WW8_WrPlcAnnotations(): m_nLastRangeStartPos(-1){} ~WW8_WrPlcAnnotations(); + void AddRangeStartPosition( WW8_CP nStartCp ); void Append( WW8_CP nCp, const SwPostItField* pPostIt ); void Append( WW8_CP nCp, const SwRedlineData* pRedLine ); bool IsNewRedlineComment( const SwRedlineData* pRedLine ); diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index d211344..fa1a3be 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -2465,6 +2465,11 @@ void WW8AttributeOutput::PostitField( const SwField* pFld ) m_rWW8Export.WritePostItBegin( m_rWW8Export.pO ); } +void WW8AttributeOutput::WritePostitFieldStart() +{ + m_rWW8Export.pAtn->AddRangeStartPosition( m_rWW8Export.Fc2Cp( m_rWW8Export.Strm().Tell() ) ); +} + bool WW8AttributeOutput::DropdownField( const SwField* pFld ) { bool bExpand = true; diff --git a/sw/source/filter/ww8/ww8attributeoutput.hxx b/sw/source/filter/ww8/ww8attributeoutput.hxx index 4c64635..a9693ad 100644 --- a/sw/source/filter/ww8/ww8attributeoutput.hxx +++ b/sw/source/filter/ww8/ww8attributeoutput.hxx @@ -393,6 +393,8 @@ protected: virtual bool DropdownField( const SwField* pFld ); virtual bool PlaceholderField( const SwField* pFld ); + virtual void WritePostitFieldStart(); + virtual bool AnalyzeURL( const String& rURL, const String& rTarget, String* pLinkURL, String* pMark ); /// Reference to the export, where to get the data from commit 7d12ed75718fcee74a731113928a12af0bb0e2f5 Author: Zolnai Tamás <[email protected]> Date: Fri Jan 3 15:26:21 2014 +0100 cp#2013101510000026: fix doc export of comments initials It seems comments' authers were exported twice. Once istead of initials. (cherry picked from commit 0127e3dbabaf24c6c0d828e6d26357ff0b63c3fb) Conflicts: sw/source/filter/ww8/wrtw8sty.cxx sw/source/filter/ww8/wrtww8.hxx Change-Id: I082fb5caea99df013922e16c5d8d4ef29e866665 diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx index bc08a72..17aad68 100644 --- a/sw/source/filter/ww8/wrtw8sty.cxx +++ b/sw/source/filter/ww8/wrtw8sty.cxx @@ -1953,6 +1953,7 @@ WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt) if (!mpRichText) msSimpleText = pPostIt->GetTxt(); msOwner = pPostIt->GetPar1(); + m_sInitials = pPostIt->GetInitials(); maDateTime = DateTime(pPostIt->GetDate(), pPostIt->GetTime()); } @@ -2118,11 +2119,14 @@ bool WW8_WrPlcSubDoc::WriteGenericTxt( WW8Export& rWrt, sal_uInt8 nTTyp, return ( rCount != 0 ); } +static bool lcl_AuthorComp( const std::pair<String,String>& aFirst, const std::pair<String,String>& aSecond) +{ + return aFirst.first < aSecond.first; +} + void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, WW8_FC& rTxtStart, sal_Int32& rTxtCount, WW8_FC& rRefStart, sal_Int32& rRefCount ) const { - typedef ::std::vector<String>::iterator myiter; - sal_uLong nFcStart = rWrt.pTableStrm->Tell(); sal_uInt16 nLen = aCps.size(); if ( !nLen ) @@ -2130,7 +2134,8 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, OSL_ENSURE( aCps.size() + 2 == pTxtPos->Count(), "WritePlc: DeSync" ); - ::std::vector<String> aStrArr; + ::std::vector<std::pair<String,String> > aStrArr; + typedef ::std::vector<std::pair<String,String> >::iterator myiter; WW8Fib& rFib = *rWrt.pFib; // n+1-te CP-Pos nach Handbuch sal_uInt16 i; bool bWriteCP = true; @@ -2143,11 +2148,11 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, for ( i = 0; i < nLen; ++i ) { const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; - aStrArr.push_back(rAtn.msOwner); + aStrArr.push_back(std::pair<String,String>(rAtn.msOwner,rAtn.m_sInitials)); } //sort and remove duplicates - ::std::sort(aStrArr.begin(), aStrArr.end()); + ::std::sort(aStrArr.begin(), aStrArr.end(),&lcl_AuthorComp); myiter aIter = ::std::unique(aStrArr.begin(), aStrArr.end()); aStrArr.erase(aIter, aStrArr.end()); @@ -2155,9 +2160,9 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, { for ( i = 0; i < aStrArr.size(); ++i ) { - const String& rStr = aStrArr[i]; - SwWW8Writer::WriteShort(*rWrt.pTableStrm, rStr.Len()); - SwWW8Writer::WriteString16(*rWrt.pTableStrm, rStr, + const String& sAuthor = aStrArr[i].first; + SwWW8Writer::WriteShort(*rWrt.pTableStrm, sAuthor.Len()); + SwWW8Writer::WriteString16(*rWrt.pTableStrm, sAuthor, false); } } @@ -2165,9 +2170,9 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, { for ( i = 0; i < aStrArr.size(); ++i ) { - const String& rStr = aStrArr[i]; - *rWrt.pTableStrm << (sal_uInt8)rStr.Len(); - SwWW8Writer::WriteString8(*rWrt.pTableStrm, rStr, false, + const String& sAuthor = aStrArr[i].first; + *rWrt.pTableStrm << (sal_uInt8)sAuthor.Len(); + SwWW8Writer::WriteString8(*rWrt.pTableStrm, sAuthor, false, RTL_TEXTENCODING_MS_1252); } } @@ -2266,35 +2271,37 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, //aStrArr is sorted myiter aIter = ::std::lower_bound(aStrArr.begin(), - aStrArr.end(), rAtn.msOwner); - OSL_ENSURE(aIter != aStrArr.end() && *aIter == rAtn.msOwner, + aStrArr.end(), std::pair<String,String>(rAtn.msOwner,String()), + &lcl_AuthorComp); + OSL_ENSURE(aIter != aStrArr.end() && aIter->first == rAtn.msOwner, "Impossible"); sal_uInt16 nFndPos = static_cast< sal_uInt16 >(aIter - aStrArr.begin()); - String sAuthor(*aIter); - sal_uInt8 nNameLen = (sal_uInt8)sAuthor.Len(); - if ( nNameLen > 9 ) + + String sInitials( aIter->second ); + sal_uInt8 nInitialsLen = (sal_uInt8)sInitials.Len(); + if ( nInitialsLen > 9 ) { - sAuthor.Erase( 9 ); - nNameLen = 9; + sInitials.Erase( 9 ); + nInitialsLen = 9; } // xstUsrInitl[ 10 ] pascal-style String holding initials // of annotation author if ( rWrt.bWrtWW8 ) { - SwWW8Writer::WriteShort(*rWrt.pTableStrm, nNameLen); - SwWW8Writer::WriteString16(*rWrt.pTableStrm, sAuthor, + SwWW8Writer::WriteShort(*rWrt.pTableStrm, nInitialsLen); + SwWW8Writer::WriteString16(*rWrt.pTableStrm, sInitials, false); SwWW8Writer::FillCount( *rWrt.pTableStrm, - (9 - nNameLen) * 2 ); + (9 - nInitialsLen) * 2 ); } else { - *rWrt.pTableStrm << nNameLen; - SwWW8Writer::WriteString8(*rWrt.pTableStrm, sAuthor, + *rWrt.pTableStrm << nInitialsLen; + SwWW8Writer::WriteString8(*rWrt.pTableStrm, sInitials, false, RTL_TEXTENCODING_MS_1252); - SwWW8Writer::FillCount(*rWrt.pTableStrm, 9 - nNameLen); + SwWW8Writer::FillCount(*rWrt.pTableStrm, 9 - nInitialsLen); } // documents layout of WriteShort's below: diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx index c48e101..bfbbe03 100644 --- a/sw/source/filter/ww8/wrtww8.hxx +++ b/sw/source/filter/ww8/wrtww8.hxx @@ -1187,6 +1187,7 @@ struct WW8_Annotation const OutlinerParaObject* mpRichText; String msSimpleText; String msOwner; + String m_sInitials; DateTime maDateTime; WW8_Annotation(const SwPostItField* pPostIt); WW8_Annotation(const SwRedlineData* pRedline); commit d6fc6624e1319257945f49388d635c36685108d5 Author: Zolnai Tamás <[email protected]> Date: Fri Jan 3 11:38:05 2014 +0100 cp#2013101510000026: wrong highlight of commented text range imported from doc When makeFieldBookmark() method is called with ODF_COMMENTRANGE it will ignore the added field name and generate an own one. We have to set the name of the SwPostItField to this generated name so these two names will match. Note: lTagBkmk is only an identifier but not the exported name of the fieldmark so we don't need to stick to use it as a name. (cherry picked from commit 12e287220ebaf3a8f5eaf7bf526dce2c47f45a20) Conflicts: sw/source/filter/ww8/ww8par.cxx Change-Id: I499abdcce1be0563c308bcf9f5c0a959a07f858b diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx index d8d5e3e..ac2b6f3 100644 --- a/sw/qa/extras/ww8import/ww8import.cxx +++ b/sw/qa/extras/ww8import/ww8import.cxx @@ -246,7 +246,6 @@ void Test::testFdo59530() uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields()); uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration()); xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(OUString("346376201"), getProperty<OUString>(xPropertySet, "Name")); CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty<OUString>(xPropertySet, "Initials")); } diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index 7cbe230..30d337c 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -1791,7 +1791,6 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) String sAuthor; String sInitials; - String sName; if( bVer67 ) { const WW67_ATRD* pDescri = (const WW67_ATRD*)pSD->GetData(); @@ -1821,7 +1820,6 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) sal_uInt32 nTagBkmk = SVBT32ToUInt32(pDescri->ITagBkmk); if (nTagBkmk != 0xFFFFFFFF) { - sName = OUString::valueOf(sal_Int32(nTagBkmk)); int nAtnIndex = GetAnnotationIndex(nTagBkmk); if (nAtnIndex != -1) { @@ -1856,14 +1854,15 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) this->pFmtOfJustInsertedApo = 0; SwPostItField aPostIt( (SwPostItFieldType*)rDoc.GetSysFldType(RES_POSTITFLD), sAuthor, - sTxt, sInitials, sName, aDate ); + sTxt, sInitials, String(), aDate ); aPostIt.SetTextObject(pOutliner); // If this is a range, create the associated fieldmark. if (pPaM->HasMark()) { IDocumentMarkAccess* pMarksAccess = rDoc.getIDocumentMarkAccess(); - pMarksAccess->makeFieldBookmark(*pPaM, aPostIt.GetName(), ODF_COMMENTRANGE); + sw::mark::IFieldmark* pFieldmark = pMarksAccess->makeFieldBookmark(*pPaM, OString(), ODF_COMMENTRANGE); + aPostIt.SetName(pFieldmark->GetName()); pPaM->Exchange(); pPaM->DeleteMark(); }
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
