LCOV - code coverage report
Current view: top level - sw/source/core/crsr - bookmrk.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 145 231 62.8 %
Date: 2015-06-13 12:38:46 Functions: 35 54 64.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <bookmrk.hxx>
      21             : #include <IDocumentMarkAccess.hxx>
      22             : #include <IDocumentUndoRedo.hxx>
      23             : #include <IDocumentLinksAdministration.hxx>
      24             : #include <IDocumentState.hxx>
      25             : #include <doc.hxx>
      26             : #include <ndtxt.hxx>
      27             : #include <pam.hxx>
      28             : #include <swserv.hxx>
      29             : #include <sfx2/linkmgr.hxx>
      30             : #include <swtypes.hxx>
      31             : #include <UndoBookmark.hxx>
      32             : #include <unobookmark.hxx>
      33             : #include <rtl/random.h>
      34             : #include <xmloff/odffields.hxx>
      35             : #include <libxml/xmlwriter.h>
      36             : #include <comphelper/anytostring.hxx>
      37             : 
      38             : using namespace ::sw::mark;
      39             : using namespace ::com::sun::star;
      40             : using namespace ::com::sun::star::uno;
      41             : 
      42             : namespace
      43             : {
      44      165385 :     static void lcl_FixPosition(SwPosition& rPos)
      45             :     {
      46             :         // make sure the position has 1) the proper node, and 2) a proper index
      47      165385 :         SwTextNode* pTextNode = rPos.nNode.GetNode().GetTextNode();
      48      165385 :         if(pTextNode == NULL && rPos.nContent.GetIndex() > 0)
      49             :         {
      50             :             SAL_INFO(
      51             :                 "sw.core",
      52             :                 "illegal position: " << rPos.nContent.GetIndex()
      53             :                     << " without proper TextNode");
      54           0 :             rPos.nContent.Assign(NULL, 0);
      55             :         }
      56      165385 :         else if(pTextNode != NULL && rPos.nContent.GetIndex() > pTextNode->Len())
      57             :         {
      58             :             SAL_INFO(
      59             :                 "sw.core",
      60             :                 "illegal position: " << rPos.nContent.GetIndex()
      61             :                     << " is beyond " << pTextNode->Len());
      62           2 :             rPos.nContent.Assign(pTextNode, pTextNode->Len());
      63             :         }
      64      165385 :     }
      65             : 
      66         138 :     static void lcl_AssureFieldMarksSet(Fieldmark* const pField,
      67             :         SwDoc* const io_pDoc,
      68             :         const sal_Unicode aStartMark,
      69             :         const sal_Unicode aEndMark)
      70             :     {
      71         138 :         io_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_UI_REPLACE, NULL);
      72             : 
      73         138 :         SwPosition rStart = pField->GetMarkStart();
      74         138 :         SwTextNode const*const pStartTextNode = rStart.nNode.GetNode().GetTextNode();
      75         138 :         const sal_Unicode ch_start = ( rStart.nContent.GetIndex() >= pStartTextNode->GetText().getLength() ) ? 0 :
      76         138 :             pStartTextNode->GetText()[rStart.nContent.GetIndex()];
      77         138 :         if( ( ch_start != aStartMark ) && ( aEndMark != CH_TXT_ATR_FORMELEMENT ) )
      78             :         {
      79         100 :             SwPaM aStartPaM(rStart);
      80         100 :             io_pDoc->getIDocumentContentOperations().InsertString(aStartPaM, OUString(aStartMark));
      81         100 :             --rStart.nContent;
      82         100 :             pField->SetMarkStartPos( rStart );
      83             :         }
      84             : 
      85         138 :         SwPosition& rEnd = pField->GetMarkEnd();
      86         138 :         SwTextNode const*const pEndTextNode = rEnd.nNode.GetNode().GetTextNode();
      87         241 :         const sal_Int32 nEndPos = ( rEnd == rStart ||  rEnd.nContent.GetIndex() == 0 ) ?
      88         173 :             rEnd.nContent.GetIndex() : rEnd.nContent.GetIndex() - 1;
      89         138 :         const sal_Unicode ch_end = nEndPos >= pEndTextNode->GetText().getLength() ? 0 : pEndTextNode->GetText()[nEndPos];
      90         138 :         if ( aEndMark && ( ch_end != aEndMark ) )
      91             :         {
      92         136 :             SwPaM aEndPaM(rEnd);
      93         136 :             io_pDoc->getIDocumentContentOperations().InsertString(aEndPaM, OUString(aEndMark));
      94         136 :             ++rEnd.nContent;
      95             :         }
      96             : 
      97         138 :         io_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_UI_REPLACE, NULL);
      98         138 :     };
      99             : 
     100           0 :     static void lcl_RemoveFieldMarks(Fieldmark* const pField,
     101             :         SwDoc* const io_pDoc,
     102             :         const sal_Unicode aStartMark,
     103             :         const sal_Unicode aEndMark)
     104             :     {
     105           0 :         io_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_UI_REPLACE, NULL);
     106             : 
     107           0 :         const SwPosition& rStart = pField->GetMarkStart();
     108           0 :         SwTextNode const*const pStartTextNode = rStart.nNode.GetNode().GetTextNode();
     109             :         const sal_Unicode ch_start =
     110           0 :             pStartTextNode->GetText()[rStart.nContent.GetIndex()];
     111             : 
     112           0 :         if( ch_start == aStartMark )
     113             :         {
     114           0 :             SwPaM aStart(rStart, rStart);
     115           0 :             ++aStart.End()->nContent;
     116           0 :             io_pDoc->getIDocumentContentOperations().DeleteRange(aStart);
     117             :         }
     118             : 
     119           0 :         const SwPosition& rEnd = pField->GetMarkEnd();
     120           0 :         SwTextNode const*const pEndTextNode = rEnd.nNode.GetNode().GetTextNode();
     121           0 :         const sal_Int32 nEndPos = ( rEnd == rStart ||  rEnd.nContent.GetIndex() == 0 )
     122           0 :                                    ? rEnd.nContent.GetIndex()
     123           0 :                                    : rEnd.nContent.GetIndex() - 1;
     124           0 :         const sal_Unicode ch_end = pEndTextNode->GetText()[nEndPos];
     125           0 :         if ( ch_end == aEndMark )
     126             :         {
     127           0 :             SwPaM aEnd(rEnd, rEnd);
     128           0 :             --aEnd.Start()->nContent;
     129           0 :             io_pDoc->getIDocumentContentOperations().DeleteRange(aEnd);
     130             :         }
     131             : 
     132           0 :         io_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_UI_REPLACE, NULL);
     133           0 :     };
     134             : }
     135             : 
     136             : namespace sw { namespace mark
     137             : {
     138      110764 :     MarkBase::MarkBase(const SwPaM& aPaM,
     139             :         const OUString& rName)
     140             :         : SwModify(0)
     141      110764 :         , m_pPos1(new SwPosition(*(aPaM.GetPoint())))
     142      221528 :         , m_aName(rName)
     143             :     {
     144      110764 :         m_pPos1->nContent.SetMark(this);
     145      110764 :         lcl_FixPosition(*m_pPos1);
     146      110764 :         if (aPaM.HasMark() && (*aPaM.GetMark() != *aPaM.GetPoint()))
     147             :         {
     148       54621 :             MarkBase::SetOtherMarkPos(*(aPaM.GetMark()));
     149       54621 :             lcl_FixPosition(*m_pPos2);
     150             :         }
     151      110764 :     }
     152             : 
     153             :     // For fieldmarks, the CH_TXT_ATR_FIELDSTART and CH_TXT_ATR_FIELDEND
     154             :     // themselves are part of the covered range. This is guaranteed by
     155             :     // TextFieldmark::InitDoc/lcl_AssureFieldMarksSet.
     156        1313 :     bool MarkBase::IsCoveringPosition(const SwPosition& rPos) const
     157             :     {
     158        1313 :         return GetMarkStart() <= rPos && rPos < GetMarkEnd();
     159             :     }
     160             : 
     161        2690 :     void MarkBase::SetMarkPos(const SwPosition& rNewPos)
     162             :     {
     163        2690 :         ::boost::scoped_ptr<SwPosition>(new SwPosition(rNewPos)).swap(m_pPos1);
     164        2690 :         m_pPos1->nContent.SetMark(this);
     165        2690 :     }
     166             : 
     167       57526 :     void MarkBase::SetOtherMarkPos(const SwPosition& rNewPos)
     168             :     {
     169       57526 :         ::boost::scoped_ptr<SwPosition>(new SwPosition(rNewPos)).swap(m_pPos2);
     170       57526 :         m_pPos2->nContent.SetMark(this);
     171       57526 :     }
     172             : 
     173           0 :     OUString MarkBase::ToString( ) const
     174             :     {
     175           0 :         return "Mark: ( Name, [ Node1, Index1 ] ): ( " + m_aName + ", [ "
     176           0 :             + OUString::number( GetMarkPos().nNode.GetIndex( ) )  + ", "
     177           0 :             + OUString::number( GetMarkPos().nContent.GetIndex( ) ) + " ] )";
     178             :     }
     179             : 
     180           0 :     void MarkBase::dumpAsXml(xmlTextWriterPtr pWriter) const
     181             :     {
     182           0 :         xmlTextWriterStartElement(pWriter, BAD_CAST("markBase"));
     183           0 :         xmlTextWriterWriteAttribute(pWriter, BAD_CAST("name"), BAD_CAST(m_aName.toUtf8().getStr()));
     184           0 :         xmlTextWriterStartElement(pWriter, BAD_CAST("markPos"));
     185           0 :         GetMarkPos().dumpAsXml(pWriter);
     186           0 :         xmlTextWriterEndElement(pWriter);
     187           0 :         if (IsExpanded())
     188             :         {
     189           0 :             xmlTextWriterStartElement(pWriter, BAD_CAST("otherMarkPos"));
     190           0 :             GetOtherMarkPos().dumpAsXml(pWriter);
     191           0 :             xmlTextWriterEndElement(pWriter);
     192             :         }
     193           0 :         xmlTextWriterEndElement(pWriter);
     194           0 :     }
     195             : 
     196      110762 :     MarkBase::~MarkBase()
     197      110762 :     { }
     198             : 
     199      110748 :     OUString MarkBase::GenerateNewName(const OUString& rPrefix)
     200             :     {
     201      110748 :         static bool bHack = (getenv("LIBO_ONEWAY_STABLE_ODF_EXPORT") != NULL);
     202             : 
     203      110748 :         if (bHack)
     204             :         {
     205             :             static sal_Int64 nIdCounter = SAL_CONST_INT64(6000000000);
     206           0 :             return rPrefix + OUString::number(nIdCounter++);
     207             :         }
     208             :         else
     209             :         {
     210      110748 :             static rtlRandomPool aPool = rtl_random_createPool();
     211      110748 :             static OUString sUniquePostfix;
     212             :             static sal_Int32 nCount = SAL_MAX_INT32;
     213      110748 :             OUStringBuffer aResult(rPrefix);
     214      110748 :             if(nCount == SAL_MAX_INT32)
     215             :             {
     216             :                 sal_Int32 nRandom;
     217          43 :                 rtl_random_getBytes(aPool, &nRandom, sizeof(nRandom));
     218          43 :                 sUniquePostfix = OUStringBuffer(13).append('_').append(static_cast<sal_Int32>(abs(nRandom))).makeStringAndClear();
     219          43 :                 nCount = 0;
     220             :             }
     221             :             // putting the counter in front of the random parts will speed up string comparisons
     222      110748 :             return aResult.append(nCount++).append(sUniquePostfix).makeStringAndClear();
     223             :         }
     224             :     }
     225             : 
     226           0 :     void MarkBase::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew )
     227             :     {
     228           0 :         NotifyClients(pOld, pNew);
     229           0 :         if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which()))
     230             :         {   // invalidate cached uno object
     231           0 :             SetXBookmark(uno::Reference<text::XTextContent>(0));
     232             :         }
     233           0 :     }
     234             : 
     235             :     // TODO: everything else uses MarkBase::GenerateNewName ?
     236           0 :     NavigatorReminder::NavigatorReminder(const SwPaM& rPaM)
     237           0 :         : MarkBase(rPaM, OUString("__NavigatorReminder__"))
     238           0 :     { }
     239             : 
     240      106133 :     UnoMark::UnoMark(const SwPaM& aPaM)
     241      106133 :         : MarkBase(aPaM, MarkBase::GenerateNewName(OUString("__UnoMark__")))
     242      106133 :     { }
     243             : 
     244        4435 :     DdeBookmark::DdeBookmark(const SwPaM& aPaM)
     245             :         : MarkBase(aPaM, MarkBase::GenerateNewName(OUString("__DdeLink__")))
     246        4435 :         , m_aRefObj(NULL)
     247        4435 :     { }
     248             : 
     249           2 :     void DdeBookmark::SetRefObject(SwServerObject* pObj)
     250             :     {
     251           2 :         m_aRefObj = pObj;
     252           2 :     }
     253             : 
     254         455 :     void DdeBookmark::DeregisterFromDoc(SwDoc* const pDoc)
     255             :     {
     256         455 :         if(m_aRefObj.Is())
     257           0 :             pDoc->getIDocumentLinksAdministration().GetLinkManager().RemoveServer(m_aRefObj);
     258         455 :     }
     259             : 
     260        8868 :     DdeBookmark::~DdeBookmark()
     261             :     {
     262        4433 :         if( m_aRefObj.Is() )
     263             :         {
     264           1 :             if(m_aRefObj->HasDataLinks())
     265             :             {
     266           0 :                 ::sfx2::SvLinkSource* p = &m_aRefObj;
     267           0 :                 p->SendDataChanged();
     268             :             }
     269           1 :             m_aRefObj->SetNoServer();
     270             :         }
     271        4435 :     }
     272             : 
     273        4434 :     Bookmark::Bookmark(const SwPaM& aPaM,
     274             :         const vcl::KeyCode& rCode,
     275             :         const OUString& rName,
     276             :         const OUString& rShortName)
     277             :         : DdeBookmark(aPaM)
     278             :         , ::sfx2::Metadatable()
     279             :         , m_aCode(rCode)
     280        4434 :         , m_sShortName(rShortName)
     281             :     {
     282        4434 :         m_aName = rName;
     283        4434 :     }
     284             : 
     285        4434 :     void Bookmark::InitDoc(SwDoc* const io_pDoc)
     286             :     {
     287        4434 :         if (io_pDoc->GetIDocumentUndoRedo().DoesUndo())
     288             :         {
     289        1040 :             io_pDoc->GetIDocumentUndoRedo().AppendUndo(
     290        1040 :                     new SwUndoInsBookmark(*this));
     291             :         }
     292        4434 :         io_pDoc->getIDocumentState().SetModified();
     293        4434 :     }
     294             : 
     295         455 :     void Bookmark::DeregisterFromDoc(SwDoc* const io_pDoc)
     296             :     {
     297         455 :         DdeBookmark::DeregisterFromDoc(io_pDoc);
     298             : 
     299         455 :         if (io_pDoc->GetIDocumentUndoRedo().DoesUndo())
     300             :         {
     301           2 :             io_pDoc->GetIDocumentUndoRedo().AppendUndo(
     302           2 :                     new SwUndoDeleteBookmark(*this));
     303             :         }
     304         455 :         io_pDoc->getIDocumentState().SetModified();
     305         455 :     }
     306             : 
     307          14 :     ::sfx2::IXmlIdRegistry& Bookmark::GetRegistry()
     308             :     {
     309          14 :         SwDoc *const pDoc( GetMarkPos().GetDoc() );
     310             :         assert(pDoc);
     311          14 :         return pDoc->GetXmlIdRegistry();
     312             :     }
     313             : 
     314        1312 :     bool Bookmark::IsInClipboard() const
     315             :     {
     316        1312 :         SwDoc *const pDoc( GetMarkPos().GetDoc() );
     317             :         assert(pDoc);
     318        1312 :         return pDoc->IsClipBoard();
     319             :     }
     320             : 
     321        1312 :     bool Bookmark::IsInUndo() const
     322             :     {
     323        1312 :         return false;
     324             :     }
     325             : 
     326          16 :     bool Bookmark::IsInContent() const
     327             :     {
     328          16 :         SwDoc *const pDoc( GetMarkPos().GetDoc() );
     329             :         assert(pDoc);
     330          16 :         return !pDoc->IsInHeaderFooter( SwNodeIndex(GetMarkPos().nNode) );
     331             :     }
     332             : 
     333           0 :     uno::Reference< rdf::XMetadatable > Bookmark::MakeUnoObject()
     334             :     {
     335           0 :         SwDoc *const pDoc( GetMarkPos().GetDoc() );
     336             :         assert(pDoc);
     337             :         const uno::Reference< rdf::XMetadatable> xMeta(
     338           0 :                 SwXBookmark::CreateXBookmark(*pDoc, this), uno::UNO_QUERY);
     339           0 :         return xMeta;
     340             :     }
     341             : 
     342         138 :     Fieldmark::Fieldmark(const SwPaM& rPaM)
     343         138 :         : MarkBase(rPaM, MarkBase::GenerateNewName(OUString("__Fieldmark__")))
     344             :     {
     345         138 :         if(!IsExpanded())
     346         128 :             SetOtherMarkPos(GetMarkPos());
     347         138 :     }
     348             : 
     349         100 :     void Fieldmark::SetMarkStartPos( const SwPosition& rNewStartPos )
     350             :     {
     351         100 :         if ( GetMarkPos( ) <= GetOtherMarkPos( ) )
     352         100 :             return SetMarkPos( rNewStartPos );
     353             :         else
     354           0 :             return SetOtherMarkPos( rNewStartPos );
     355             :     }
     356             : 
     357          34 :     void Fieldmark::SetMarkEndPos( const SwPosition& rNewEndPos )
     358             :     {
     359          34 :         if ( GetMarkPos( ) <= GetOtherMarkPos( ) )
     360          34 :             return SetOtherMarkPos( rNewEndPos );
     361             :         else
     362           0 :             return SetMarkPos( rNewEndPos );
     363             :     }
     364             : 
     365           0 :     OUString Fieldmark::ToString( ) const
     366             :     {
     367           0 :         return "Fieldmark: ( Name, Type, [ Nd1, Id1 ], [ Nd2, Id2 ] ): ( " + m_aName + ", "
     368           0 :             + m_aFieldname + ", [ " + OUString::number( GetMarkPos().nNode.GetIndex( ) )
     369           0 :             + ", " + OUString::number( GetMarkPos( ).nContent.GetIndex( ) ) + " ], ["
     370           0 :             + OUString::number( GetOtherMarkPos().nNode.GetIndex( ) ) + ", "
     371           0 :             + OUString::number( GetOtherMarkPos( ).nContent.GetIndex( ) ) + " ] ) ";
     372             :     }
     373             : 
     374           0 :     void Fieldmark::Invalidate( )
     375             :     {
     376             :         // TODO: Does exist a better solution to trigger a format of the
     377             :         //       fieldmark portion? If yes, please use it.
     378           0 :         SwPaM aPaM( this->GetMarkPos(), this->GetOtherMarkPos() );
     379           0 :         aPaM.InvalidatePaM();
     380           0 :     }
     381             : 
     382           0 :     void Fieldmark::dumpAsXml(xmlTextWriterPtr pWriter) const
     383             :     {
     384           0 :         xmlTextWriterStartElement(pWriter, BAD_CAST("fieldmark"));
     385           0 :         xmlTextWriterWriteAttribute(pWriter, BAD_CAST("fieldname"), BAD_CAST(m_aFieldname.toUtf8().getStr()));
     386           0 :         xmlTextWriterWriteAttribute(pWriter, BAD_CAST("fieldHelptext"), BAD_CAST(m_aFieldHelptext.toUtf8().getStr()));
     387           0 :         MarkBase::dumpAsXml(pWriter);
     388           0 :         xmlTextWriterStartElement(pWriter, BAD_CAST("parameters"));
     389           0 :         for (auto& rParam : m_vParams)
     390             :         {
     391           0 :             xmlTextWriterStartElement(pWriter, BAD_CAST("parameter"));
     392           0 :             xmlTextWriterWriteAttribute(pWriter, BAD_CAST("name"), BAD_CAST(rParam.first.toUtf8().getStr()));
     393           0 :             xmlTextWriterWriteAttribute(pWriter, BAD_CAST("value"), BAD_CAST(comphelper::anyToString(rParam.second).toUtf8().getStr()));
     394           0 :             xmlTextWriterEndElement(pWriter);
     395             :         }
     396           0 :         xmlTextWriterEndElement(pWriter);
     397           0 :         xmlTextWriterEndElement(pWriter);
     398           0 :     }
     399             : 
     400         104 :     TextFieldmark::TextFieldmark(const SwPaM& rPaM)
     401         104 :         : Fieldmark(rPaM)
     402         104 :     { }
     403             : 
     404         104 :     void TextFieldmark::InitDoc(SwDoc* const io_pDoc)
     405             :     {
     406         104 :         lcl_AssureFieldMarksSet(this, io_pDoc, CH_TXT_ATR_FIELDSTART, CH_TXT_ATR_FIELDEND);
     407         104 :     }
     408             : 
     409           0 :     void TextFieldmark::ReleaseDoc(SwDoc* const pDoc)
     410             :     {
     411           0 :         lcl_RemoveFieldMarks(this, pDoc, CH_TXT_ATR_FIELDSTART, CH_TXT_ATR_FIELDEND);
     412           0 :     }
     413             : 
     414          34 :     CheckboxFieldmark::CheckboxFieldmark(const SwPaM& rPaM)
     415          34 :         : Fieldmark(rPaM)
     416          34 :     { }
     417             : 
     418          34 :     void CheckboxFieldmark::InitDoc(SwDoc* const io_pDoc)
     419             :     {
     420          34 :         lcl_AssureFieldMarksSet(this, io_pDoc, CH_TXT_ATR_FIELDSTART, CH_TXT_ATR_FORMELEMENT);
     421             : 
     422             :         // For some reason the end mark is moved from 1 by the Insert: we don't
     423             :         // want this for checkboxes
     424          34 :         SwPosition aNewEndPos = this->GetMarkEnd();
     425          34 :         aNewEndPos.nContent--;
     426          34 :         SetMarkEndPos( aNewEndPos );
     427          34 :     }
     428             : 
     429           0 :     void CheckboxFieldmark::ReleaseDoc(SwDoc* const pDoc)
     430             :     {
     431             :         lcl_RemoveFieldMarks(this, pDoc,
     432           0 :                 CH_TXT_ATR_FIELDSTART, CH_TXT_ATR_FORMELEMENT);
     433           0 :     }
     434             : 
     435          32 :     void CheckboxFieldmark::SetChecked(bool checked)
     436             :     {
     437          32 :         if ( IsChecked() != checked )
     438             :         {
     439          25 :             (*GetParameters())[OUString(ODF_FORMCHECKBOX_RESULT)] = makeAny(checked);
     440             :             // mark document as modified
     441          25 :             SwDoc *const pDoc( GetMarkPos().GetDoc() );
     442          25 :             if ( pDoc )
     443          25 :                 pDoc->getIDocumentState().SetModified();
     444             :         }
     445          32 :     }
     446             : 
     447          37 :     bool CheckboxFieldmark::IsChecked() const
     448             :     {
     449          37 :         bool bResult = false;
     450          37 :         parameter_map_t::const_iterator pResult = GetParameters()->find(OUString(ODF_FORMCHECKBOX_RESULT));
     451          37 :         if(pResult != GetParameters()->end())
     452           2 :             pResult->second >>= bResult;
     453          37 :         return bResult;
     454             :     }
     455         177 : }}
     456             : 
     457             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11