diff options
author | Nikhil Walvekar <nikhil.walvekar@synerzip.com> | 2014-02-07 10:21:33 +0530 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-02-13 11:14:19 +0100 |
commit | 07911ac9fd343fd59229b631c0fcf8dd30426b07 (patch) | |
tree | 1b3e1c3e7da6d3827f9d0190242456393ca046b0 | |
parent | e5a891793baafb4504dcedaec82e6827d847ecf1 (diff) |
fdo#73596 Added support to import and export Index from docx.
This currently supports basic import of indexes. Other flags are
still pending. Currently flags are not preserved completely, just
index and xe fields are preserved.
Reviewed on:
https://gerrit.libreoffice.org/7627
Change-Id: I56058df19aa8332fbcccde77fb1f29347264bbc6
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 24 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 101 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 11 | ||||
-rw-r--r-- | writerfilter/source/dmapper/FieldTypes.hxx | 7 |
4 files changed, 119 insertions, 24 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 02b234eb5d25..61d32d80655a 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -2423,19 +2423,25 @@ void DomainMapper::data(const sal_uInt8* /*buf*/, size_t /*len*/, void DomainMapper::lcl_startSectionGroup() { - m_pImpl->PushProperties(CONTEXT_SECTION); + if (!m_pImpl->isInIndexContext()) + { + m_pImpl->PushProperties(CONTEXT_SECTION); + } } void DomainMapper::lcl_endSectionGroup() { - m_pImpl->CheckUnregisteredFrameConversion(); - m_pImpl->ExecuteFrameConversion(); - PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_SECTION); - SectionPropertyMap* pSectionContext = dynamic_cast< SectionPropertyMap* >( pContext.get() ); - OSL_ENSURE(pSectionContext, "SectionContext unavailable!"); - if(pSectionContext) - pSectionContext->CloseSectionGroup( *m_pImpl ); - m_pImpl->PopProperties(CONTEXT_SECTION); + if (!m_pImpl->isInIndexContext()) + { + m_pImpl->CheckUnregisteredFrameConversion(); + m_pImpl->ExecuteFrameConversion(); + PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_SECTION); + SectionPropertyMap* pSectionContext = dynamic_cast< SectionPropertyMap* >( pContext.get() ); + OSL_ENSURE(pSectionContext, "SectionContext unavailable!"); + if(pSectionContext) + pSectionContext->CloseSectionGroup( *m_pImpl ); + m_pImpl->PopProperties(CONTEXT_SECTION); + } } void DomainMapper::lcl_startParagraphGroup() diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index deb4fdd7616b..d67b9eb130e1 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -146,6 +146,7 @@ DomainMapper_Impl::DomainMapper_Impl( m_bIsPageBreakDeferred( false ), m_bStartTOC(false), m_bStartedTOC(false), + m_bStartIndex(false), m_bTOCPageRef(false), m_pLastSectionContext( ), m_pLastCharacterContext(), @@ -172,6 +173,7 @@ DomainMapper_Impl::DomainMapper_Impl( m_aAnnotationPositions(), m_xInsertTextRange(xInsertTextRange), m_bIsNewDoc(bIsNewDoc), + m_bIndexMarkerAdded(false), m_bInTableStyleRunProps(false), m_pSdtHelper(0), m_nTableDepth(0), @@ -1122,7 +1124,7 @@ void DomainMapper_Impl::appendTextPortion( const OUString& rString, PropertyMapP uno::Sequence< beans::PropertyValue > pValues = pPropertyMap->GetPropertyValues(); sal_Int32 len = pValues.getLength(); - if (m_bStartTOC) + if (m_bStartTOC || m_bStartIndex) for( int i =0; i < len; ++i ) { if (pValues[i].Name == "CharHidden") @@ -1133,11 +1135,11 @@ void DomainMapper_Impl::appendTextPortion( const OUString& rString, PropertyMapP if (m_aTextAppendStack.top().xInsertPosition.is()) { xTextRange = xTextAppend->insertTextPortion(rString, pValues, m_aTextAppendStack.top().xInsertPosition); - m_aTextAppendStack.top().xCursor->gotoRange(xTextRange->getEnd(), false); + m_aTextAppendStack.top().xCursor->gotoRange(xTextRange->getEnd(), true); } else { - if (m_bStartTOC) + if (m_bStartTOC || m_bStartIndex) { m_bStartedTOC = true; uno::Reference< text::XTextCursor > xTOCTextCursor; @@ -1145,8 +1147,11 @@ void DomainMapper_Impl::appendTextPortion( const OUString& rString, PropertyMapP xTOCTextCursor->gotoEnd(false); if (xTOCTextCursor.is()) { + if (m_bStartIndex) + xTOCTextCursor->goLeft(1, false); xTextRange = xTextAppend->insertTextPortion(rString, pValues, xTOCTextCursor); xTOCTextCursor->gotoRange(xTextRange->getEnd(), true); + mxTOCTextCursor = xTOCTextCursor; } else { @@ -2318,6 +2323,8 @@ if(!bFilled) {OUString("NUMCHARS"), "CharacterCount", "", FIELD_NUMCHARS}, {OUString("NUMWORDS"), "WordCount", "", FIELD_NUMWORDS}, {OUString("NUMPAGES"), "PageCount", "", FIELD_NUMPAGES}, + {OUString("INDEX"), "com.sun.star.text.DocumentIndex", "", FIELD_INDEX}, + {OUString("XE"), "com.sun.star.text.DocumentIndexMark", "", FIELD_XE}, // {OUString(""), "", "", FIELD_}, @@ -2855,7 +2862,29 @@ void DomainMapper_Impl::handleToc } } } +void DomainMapper_Impl::handleIndex + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & /*xFieldInterface*/, + uno::Reference< beans::XPropertySet > /*xFieldProperties*/, + const OUString & sTOCServiceName) +{ + uno::Reference< beans::XPropertySet > xTOC; + m_bStartTOC = true; + m_bStartIndex = true; + if (m_xTextFactory.is()) + xTOC.set( + m_xTextFactory->createInstance( + sTOCServiceName), + uno::UNO_QUERY_THROW); + if (xTOC.is()) + xTOC->setPropertyValue(rPropNameSupplier.GetName( PROP_TITLE ), uno::makeAny(OUString())); + pContext->SetTOC( xTOC ); + + uno::Reference< text::XTextContent > xToInsert( xTOC, uno::UNO_QUERY ); + appendTextContent(xToInsert, uno::Sequence< beans::PropertyValue >() ); +} /*------------------------------------------------------------------------- //the field command has to be closed (0x14 appeared) @@ -2893,6 +2922,8 @@ void DomainMapper_Impl::CloseFieldCommand() case FIELD_HYPERLINK: case FIELD_DOCPROPERTY: case FIELD_TOC: + case FIELD_INDEX: + case FIELD_XE: case FIELD_TC: case FIELD_EQ: bCreateField = false; @@ -3374,10 +3405,39 @@ void DomainMapper_Impl::CloseFieldCommand() break; case FIELD_USERADDRESS : //todo: user address collects street, city ... break; + case FIELD_INDEX: + handleIndex(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties, + OUString::createFromAscii(aIt->second.cFieldServiceName)); + break; case FIELD_TOC: handleToc(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties, OUString::createFromAscii(aIt->second.cFieldServiceName)); break; + case FIELD_XE: + { + uno::Reference< beans::XPropertySet > xTC( + m_xTextFactory->createInstance( + OUString::createFromAscii(aIt->second.cFieldServiceName)), + uno::UNO_QUERY_THROW); + OUString sTCText = lcl_ExtractParameter(pContext->GetCommand(), sizeof("XE ") ); + if( !sTCText.isEmpty()) + xTC->setPropertyValue("PrimaryKey", + uno::makeAny(sTCText)); + uno::Reference< text::XTextContent > xToInsert( xTC, uno::UNO_QUERY ); + uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend; + if (xTextAppend.is()) + { + uno::Reference< text::XTextCursor > xCrsr = xTextAppend->getText()->createTextCursor(); + + uno::Reference< text::XText > xText = xTextAppend->getText(); + if(xCrsr.is() && xText.is()) + { + xCrsr->gotoEnd(false); + xText->insertTextContent(uno::Reference< text::XTextRange >( xCrsr, uno::UNO_QUERY_THROW ), xToInsert, sal_False); + } + } + } + break; case FIELD_TC : { uno::Reference< beans::XPropertySet > xTC( @@ -3560,26 +3620,39 @@ void DomainMapper_Impl::PopFieldContext() uno::Reference< text::XTextContent > xToInsert( pContext->GetTOC(), uno::UNO_QUERY ); if( xToInsert.is() ) { - m_bStartTOC = false; - if (m_bStartedTOC) + if(xTOCMarkerCursor.is() || m_bStartIndex) { - m_aTextAppendStack.pop(); - m_bStartedTOC = false; + if (m_bStartIndex) + { + if (mxTOCTextCursor.is()) + { + mxTOCTextCursor->goLeft(1,true); + mxTOCTextCursor->setString(OUString()); + } + xTextAppend->finishParagraph( uno::Sequence< beans::PropertyValue >() ); + } + else + { + xTOCMarkerCursor->goLeft(1,sal_True); + xTOCMarkerCursor->setString(OUString()); + xTOCMarkerCursor->goLeft(1,sal_True); + xTOCMarkerCursor->setString(OUString()); + } } - if(xTOCMarkerCursor.is()) + if (m_bStartedTOC || m_bStartIndex) { - xTOCMarkerCursor->goLeft(1,sal_True); - xTOCMarkerCursor->setString(OUString()); - xTOCMarkerCursor->goLeft(1,sal_True); - xTOCMarkerCursor->setString(OUString()); + m_bStartedTOC = false; + m_aTextAppendStack.pop(); } + m_bStartTOC = false; + m_bStartIndex = false; } else { xToInsert = uno::Reference< text::XTextContent >(pContext->GetTC(), uno::UNO_QUERY); - if( !xToInsert.is() && !m_bStartTOC ) + if( !xToInsert.is() && !m_bStartTOC && !m_bStartIndex ) xToInsert = uno::Reference< text::XTextContent >(pContext->GetTextField(), uno::UNO_QUERY); - if( xToInsert.is() && !m_bStartTOC) + if( xToInsert.is() && !m_bStartTOC && !m_bStartIndex) { uno::Sequence<beans::PropertyValue> aValues; // Character properties of the field show up here the diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index e08fa97d329b..c0a47ad43dd5 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -315,6 +315,7 @@ private: bool m_bStartTOC; /// If we got any text that is the pre-rendered result of the TOC field. bool m_bStartedTOC; + bool m_bStartIndex; bool m_bTOCPageRef; LineNumberSettings m_aLineNumberSettings; @@ -379,6 +380,7 @@ private: bool m_bIsFirstRun; uno::Reference< text::XTextCursor > xTOCMarkerCursor; + uno::Reference< text::XTextCursor > mxTOCTextCursor; //annotation import uno::Reference< beans::XPropertySet > m_xAnnotationField; @@ -400,7 +402,7 @@ public: ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > m_xInsertTextRange; private: bool m_bIsNewDoc; - + bool m_bIndexMarkerAdded; public: DomainMapper_Impl( DomainMapper& rDMapper, @@ -583,6 +585,12 @@ public: uno::Reference< uno::XInterface > & xFieldInterface, uno::Reference< beans::XPropertySet > xFieldProperties, const OUString & sTOCServiceName); + void handleIndex + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & xFieldInterface, + uno::Reference< beans::XPropertySet > xFieldProperties, + const OUString & sTOCServiceName); //the field command has to be closed (0x14 appeared) void CloseFieldCommand(); //the _current_ fields require a string type result while TOCs accept richt results @@ -747,6 +755,7 @@ public: /// ST_PositivePercentage values we received std::queue<OUString> m_aPositivePercentages; + bool isInIndexContext() { return m_bStartIndex;} }; } //namespace dmapper } //namespace writerfilter diff --git a/writerfilter/source/dmapper/FieldTypes.hxx b/writerfilter/source/dmapper/FieldTypes.hxx index 35effc319273..e61e31e04eea 100644 --- a/writerfilter/source/dmapper/FieldTypes.hxx +++ b/writerfilter/source/dmapper/FieldTypes.hxx @@ -287,6 +287,13 @@ enum FieldId /* document statistic - number of pages */ ,FIELD_NUMPAGES + /* Document alphabetical index + */ + ,FIELD_INDEX + /* Document alphabetical index marks + */ + ,FIELD_XE + }; }} |