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
     {


Reply via email to