[Libreoffice-commits] core.git: writerfilter/source
Nikhil Walvekar
nikhil.walvekar at synerzip.com
Thu Feb 13 11:19:15 CET 2014
writerfilter/source/dmapper/DomainMapper.cxx | 24 +++--
writerfilter/source/dmapper/DomainMapper_Impl.cxx | 101 ++++++++++++++++++----
writerfilter/source/dmapper/DomainMapper_Impl.hxx | 11 ++
writerfilter/source/dmapper/FieldTypes.hxx | 7 +
4 files changed, 119 insertions(+), 24 deletions(-)
New commits:
commit 07911ac9fd343fd59229b631c0fcf8dd30426b07
Author: Nikhil Walvekar <nikhil.walvekar at synerzip.com>
Date: Fri Feb 7 10:21:33 2014 +0530
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
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 02b234e..61d32d8 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 deb4fdd..d67b9eb 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 e08fa97..c0a47ad 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 35effc3..e61e31e 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
+
};
}}
More information about the Libreoffice-commits
mailing list