using ::std::map; using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Any; using ::com::sun::star::beans::XPropertySet;
template<class A>
XMLPropertyBackpatcher<A>::XMLPropertyBackpatcher(
OUString sPropName)
: sPropertyName(std::move(sPropName))
{
}
template<class A>
XMLPropertyBackpatcher<A>::~XMLPropertyBackpatcher()
{
}
template<class A> void XMLPropertyBackpatcher<A>::ResolveId( const OUString& sName,
A aValue)
{ // insert ID into ID map
aIDMap[sName] = aValue;
// backpatch old references, if backpatch list exists auto it = aBackpatchListMap.find(sName); if (it == aBackpatchListMap.end()) return;
// aah, we have a backpatch list!
std::unique_ptr<BackpatchListType> pList = std::move(it->second);
// a) remove list from list map
aBackpatchListMap.erase(it);
// b) for every item, set SequenceNumber // (and preserve Property, if appropriate)
Any aAny;
aAny <<= aValue; for(constauto& rBackpatch : *pList)
{
rBackpatch->setPropertyValue(sPropertyName, aAny);
} // else: no backpatch list -> then we're finished
}
template<class A> void XMLPropertyBackpatcher<A>::SetProperty( const Reference<XPropertySet> & xPropSet, const OUString& sName)
{ if (aIDMap.count(sName))
{ // we know this ID -> set property
xPropSet->setPropertyValue(sPropertyName, css::uno::Any(aIDMap[sName]));
} else
{ // ID unknown -> into backpatch list for later fixup if (! aBackpatchListMap.count(sName))
{ // create backpatch list for this name
aBackpatchListMap.emplace(sName, new BackpatchListType);
}
// force instantiation of templates templateclass XMLPropertyBackpatcher<sal_Int16>; templateclass XMLPropertyBackpatcher<OUString>;
struct XMLTextImportHelper::BackpatcherImpl
{ /// backpatcher for references to footnotes and endnotes
::std::unique_ptr< XMLPropertyBackpatcher<sal_Int16> >
m_pFootnoteBackpatcher;
/// backpatchers for references to sequences
::std::unique_ptr< XMLPropertyBackpatcher<sal_Int16> >
m_pSequenceIdBackpatcher;
// Code from XMLTextImportHelper using the XMLPropertyBackpatcher is // implemented here. The reason is that in the unxsols2 environment, // all templates are instantiated as file local (switch // -instances=static), and thus are not accessible from the outside.
// The previous solution was to force additional instantiation of // XMLPropertyBackpatcher in txtimp.cxx. This solution combines all // usage of the XMLPropertyBackpatcher in XMLPropertyBackpatcher.cxx // instead.
XMLPropertyBackpatcher<sal_Int16>& XMLTextImportHelper::GetFootnoteBP()
{ if (!m_xBackpatcherImpl->m_pFootnoteBackpatcher)
{
m_xBackpatcherImpl->m_pFootnoteBackpatcher.reset( new XMLPropertyBackpatcher<sal_Int16>(GetSequenceNumber()));
} return *m_xBackpatcherImpl->m_pFootnoteBackpatcher;
}
XMLPropertyBackpatcher<sal_Int16>& XMLTextImportHelper::GetSequenceIdBP()
{ if (!m_xBackpatcherImpl->m_pSequenceIdBackpatcher)
{
m_xBackpatcherImpl->m_pSequenceIdBackpatcher.reset( new XMLPropertyBackpatcher<sal_Int16>(GetSequenceNumber()));
} return *m_xBackpatcherImpl->m_pSequenceIdBackpatcher;
}
XMLPropertyBackpatcher<OUString>& XMLTextImportHelper::GetSequenceNameBP()
{ if (!m_xBackpatcherImpl->m_pSequenceNameBackpatcher)
{
m_xBackpatcherImpl->m_pSequenceNameBackpatcher.reset( new XMLPropertyBackpatcher<OUString>(u"SourceName"_ustr));
} return *m_xBackpatcherImpl->m_pSequenceNameBackpatcher;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.