Author: orw
Date: Fri Nov 29 14:55:55 2013
New Revision: 1546574
URL: http://svn.apache.org/r1546574
Log:
123771: fix <Fieldmark> implementation for OSBA OOXML improvement use case 4
Modified:
openoffice/branches/ooxml-osba/main/sw/inc/unobookmark.hxx
openoffice/branches/ooxml-osba/main/sw/source/core/crsr/bookmrk.cxx
openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unobkm.cxx
openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unoportenum.cxx
Modified: openoffice/branches/ooxml-osba/main/sw/inc/unobookmark.hxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/ooxml-osba/main/sw/inc/unobookmark.hxx?rev=1546574&r1=1546573&r2=1546574&view=diff
==============================================================================
--- openoffice/branches/ooxml-osba/main/sw/inc/unobookmark.hxx (original)
+++ openoffice/branches/ooxml-osba/main/sw/inc/unobookmark.hxx Fri Nov 29
14:55:55 2013
@@ -81,13 +81,14 @@ protected:
/// @param pDoc and pMark != 0, but not & because of ImplInheritanceHelper
SwXBookmark(::sw::mark::IMark *const pMark, SwDoc *const pDoc);
+ void registerInMark( ::sw::mark::IMark *const pBkmk );
+
public:
/// descriptor
SwXBookmark();
- static ::com::sun::star::uno::Reference<
- ::com::sun::star::text::XTextContent>
+ static
::com::sun::star::uno::Reference<::com::sun::star::text::XTextContent>
CreateXBookmark(SwDoc & rDoc, ::sw::mark::IMark & rBookmark);
/// @return IMark for this, but only if it lives in pDoc
@@ -234,10 +235,21 @@ private:
bool isReplacementObject;
+ SwXFieldmark(
+ bool _isReplacementObject,
+ ::sw::mark::IMark *const pMark,
+ SwDoc *const pDoc );
+
public:
- SwXFieldmark(bool isReplacementObject,
- ::sw::mark::IMark* pBkm = 0, SwDoc* pDoc = 0);
+ // <SwXFieldmark> instance not attached to the document - property
descriptor available
+ SwXFieldmark( bool isReplacementObject );
+
+ // (as the parent class) newly created <SwXFieldmark> instances for an
existing <IMark> instance needs to be registered in the Mark
+ static
::com::sun::star::uno::Reference<::com::sun::star::text::XTextContent>
+ CreateXFieldmark(
+ SwDoc & rDoc,
+ ::sw::mark::IMark & rBookmark );
virtual void attachToRange(
const ::com::sun::star::uno::Reference<
Modified: openoffice/branches/ooxml-osba/main/sw/source/core/crsr/bookmrk.cxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/ooxml-osba/main/sw/source/core/crsr/bookmrk.cxx?rev=1546574&r1=1546573&r2=1546574&view=diff
==============================================================================
--- openoffice/branches/ooxml-osba/main/sw/source/core/crsr/bookmrk.cxx
(original)
+++ openoffice/branches/ooxml-osba/main/sw/source/core/crsr/bookmrk.cxx Fri Nov
29 14:55:55 2013
@@ -87,6 +87,7 @@ namespace
if(ch_start != aStartMark)
{
io_pDoc->InsertString(aStartPaM, aStartMark);
+ rStart.nContent--;
}
if ( aEndMark && ( ch_end != aEndMark ) && ( rStart != rEnd ) )
{
Modified: openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unobkm.cxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unobkm.cxx?rev=1546574&r1=1546573&r2=1546574&view=diff
==============================================================================
--- openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unobkm.cxx
(original)
+++ openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unobkm.cxx Fri
Nov 29 14:55:55 2013
@@ -103,8 +103,9 @@ void SwXBookmark::Impl::Modify(const Sfx
}
}
-void SwXBookmark::Impl::registerInMark(SwXBookmark & rThis,
- ::sw::mark::IMark *const pBkmk)
+void SwXBookmark::Impl::registerInMark(
+ SwXBookmark & rThis,
+ ::sw::mark::IMark *const pBkmk)
{
if (pBkmk)
{
@@ -157,23 +158,23 @@ SwXBookmark::CreateXBookmark(SwDoc & rDo
uno::Reference<text::XTextContent> xBookmark(pMarkBase->GetXBookmark());
if (!xBookmark.is())
{
- // FIXME: These belong in XTextFieldsSupplier
- //if (dynamic_cast< ::sw::mark::TextFieldmark* >(&rBkmk))
- // pXBkmk = new SwXFieldmark(false, &rBkmk, pDoc);
- //else if (dynamic_cast< ::sw::mark::CheckboxFieldmark* >(&rBkmk))
- // pXBkmk = new SwXFieldmark(true, &rBkmk, pDoc);
- //else
OSL_ENSURE(
dynamic_cast< ::sw::mark::IBookmark* >(&rBookmark),
"<SwXBookmark::GetObject(..)>"
"SwXBookmark requested for non-bookmark mark.");
SwXBookmark *const pXBookmark = new SwXBookmark(&rBookmark, &rDoc);
xBookmark.set(pXBookmark);
- pXBookmark->m_pImpl->registerInMark(*pXBookmark, pMarkBase);
+ pXBookmark->registerInMark( pMarkBase);
}
return xBookmark;
}
+
+void SwXBookmark::registerInMark( ::sw::mark::IMark *const pBkmk )
+{
+ m_pImpl->registerInMark( *this, pBkmk );
+}
+
::sw::mark::IMark const* SwXBookmark::GetBookmarkInDoc(SwDoc const*const pDoc,
const uno::Reference< lang::XUnoTunnel> & xUT)
{
@@ -246,10 +247,7 @@ throw (lang::IllegalArgumentException, u
{
eType = IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK;
}
- m_pImpl->registerInMark(*this,
- m_pImpl->m_pDoc->getIDocumentMarkAccess()->makeMark(
- aPam, m_pImpl->m_sMarkName, eType));
- // --> OD 2007-10-23 #i81002#
+ registerInMark( m_pImpl->m_pDoc->getIDocumentMarkAccess()->makeMark( aPam,
m_pImpl->m_sMarkName, eType ) );
// Check, if bookmark has been created.
// E.g., the creation of a cross-reference bookmark is suppress,
// if the PaM isn't a valid one for cross-reference bookmarks.
@@ -260,7 +258,6 @@ throw (lang::IllegalArgumentException, u
" - could not create Mark.");
throw lang::IllegalArgumentException();
}
- // <--
}
void SwXBookmark::attachToRange(
@@ -514,10 +511,53 @@ throw (beans::UnknownPropertyException,
* SwXFieldmark
******************************************************************/
-SwXFieldmark::SwXFieldmark(bool _isReplacementObject, ::sw::mark::IMark* pBkm,
SwDoc* pDc)
- : SwXFieldmark_Base(pBkm, pDc)
+SwXFieldmark::SwXFieldmark( bool _isReplacementObject )
+ : SwXFieldmark_Base()
, isReplacementObject(_isReplacementObject)
-{ }
+{
+}
+
+
+SwXFieldmark::SwXFieldmark(
+ bool _isReplacementObject,
+ ::sw::mark::IMark *const pMark,
+ SwDoc *const pDoc )
+ : SwXFieldmark_Base( pMark, pDoc )
+ , isReplacementObject( _isReplacementObject )
+{
+}
+
+
+uno::Reference<text::XTextContent> SwXFieldmark::CreateXFieldmark(
+ SwDoc & rDoc,
+ ::sw::mark::IMark & rBookmark )
+{
+ // do not iterate over the registered clients: race condition
+ ::sw::mark::MarkBase *const pMarkBase( dynamic_cast< ::sw::mark::MarkBase
* >(&rBookmark));
+ OSL_ENSURE(pMarkBase, "CreateXFieldmark: no MarkBase?");
+ if (!pMarkBase) { return 0; }
+
+ uno::Reference<text::XTextContent> xBookmark(pMarkBase->GetXBookmark());
+ if (!xBookmark.is())
+ {
+ SwXFieldmark* pXFieldmark = NULL;
+ if ( dynamic_cast< ::sw::mark::TextFieldmark* >(&rBookmark) )
+ {
+ pXFieldmark = new SwXFieldmark( false, &rBookmark, &rDoc );
+ }
+ else if ( dynamic_cast< ::sw::mark::CheckboxFieldmark* >(&rBookmark) )
+ {
+ pXFieldmark = new SwXFieldmark( true, &rBookmark, &rDoc );
+ }
+ if ( pXFieldmark != NULL )
+ {
+ xBookmark.set( pXFieldmark );
+ pXFieldmark->registerInMark( pMarkBase );
+ }
+ }
+ return xBookmark;
+}
+
void SwXFieldmarkParameters::insertByName(const OUString& aName, const
uno::Any& aElement)
throw (lang::IllegalArgumentException, container::ElementExistException,
lang::WrappedTargetException, uno::RuntimeException)
Modified:
openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unoportenum.cxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unoportenum.cxx?rev=1546574&r1=1546573&r2=1546574&view=diff
==============================================================================
--- openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unoportenum.cxx
(original)
+++ openoffice/branches/ooxml-osba/main/sw/source/core/unocore/unoportenum.cxx
Fri Nov 29 14:55:55 2013
@@ -399,17 +399,19 @@ lcl_ExportFieldMark(
if (CH_TXT_ATR_FIELDSTART == Char)
{
::sw::mark::IFieldmark* pFieldmark = NULL;
- if (pDoc)
+ if ( pDoc != NULL )
{
pFieldmark =
pDoc->getIDocumentMarkAccess()->getFieldmarkFor(*pUnoCrsr->GetMark());
}
SwXTextPortion* pPortion =
- new SwXTextPortion( pUnoCrsr, i_xParentText, PORTION_FIELD_START);
+ new SwXTextPortion( pUnoCrsr, i_xParentText, PORTION_FIELD_START );
xRef = pPortion;
- if ( pPortion && pFieldmark && pDoc )
+ if ( pPortion != NULL
+ && pFieldmark != NULL
+ && pDoc != NULL )
{
- pPortion->SetBookmark( new SwXFieldmark( false, pFieldmark, pDoc )
);
+ pPortion->SetBookmark( SwXFieldmark::CreateXFieldmark( *pDoc,
*pFieldmark ) );
Reference<XTextField> xField;
const SwFmtFld* pField = lcl_getFieldByName( pDoc,
pFieldmark->GetName() );
if (pField)
@@ -420,30 +422,38 @@ lcl_ExportFieldMark(
else if (CH_TXT_ATR_FIELDEND == Char)
{
::sw::mark::IFieldmark* pFieldmark = NULL;
- if (pDoc)
+ if ( pDoc != NULL )
{
- pFieldmark = pDoc->getIDocumentMarkAccess()->
- getFieldmarkFor(*pUnoCrsr->GetMark());
+ pFieldmark =
+
pDoc->getIDocumentMarkAccess()->getFieldmarkFor(*pUnoCrsr->GetMark());
}
- SwXTextPortion* pPortion = new SwXTextPortion(
- pUnoCrsr, i_xParentText, PORTION_FIELD_END);
+ SwXTextPortion* pPortion =
+ new SwXTextPortion( pUnoCrsr, i_xParentText, PORTION_FIELD_END );
xRef = pPortion;
- if (pPortion && pFieldmark && pDoc)
- pPortion->SetBookmark(new SwXFieldmark(false, pFieldmark, pDoc));
+ if ( pPortion != NULL
+ && pFieldmark != NULL
+ && pDoc != NULL )
+ {
+ pPortion->SetBookmark( SwXFieldmark::CreateXFieldmark( *pDoc,
*pFieldmark ) );
+ }
}
else if (CH_TXT_ATR_FORMELEMENT == Char)
{
::sw::mark::IFieldmark* pFieldmark = NULL;
- if (pDoc)
+ if ( pDoc != NULL )
{
pFieldmark = pDoc->getIDocumentMarkAccess()->
getFieldmarkFor(*pUnoCrsr->GetMark());
}
- SwXTextPortion* pPortion = new SwXTextPortion(
- pUnoCrsr, i_xParentText, PORTION_FIELD_START_END);
+ SwXTextPortion* pPortion =
+ new SwXTextPortion( pUnoCrsr, i_xParentText,
PORTION_FIELD_START_END );
xRef = pPortion;
- if (pPortion && pFieldmark && pDoc)
- pPortion->SetBookmark(new SwXFieldmark(true, pFieldmark, pDoc));
+ if ( pPortion != NULL
+ && pFieldmark != NULL
+ && pDoc != NULL )
+ {
+ pPortion->SetBookmark( SwXFieldmark::CreateXFieldmark( *pDoc,
*pFieldmark ) );
+ }
}
else
{