From 7a586a9c6bf28088c72f163d724d1cb3259e7920 Mon Sep 17 00:00:00 2001 From: Bernhard Widl Date: Wed, 15 Nov 2017 19:30:28 +0100 Subject: tdf#101856 create bookmarks w/ new hidden/cond attrs, save as odt Committer's note: this is forward ported from 5.2+backports branch, with numerous conflicts. tdf#101856 add new checkbox/editfield for hidden/condition attrs Conflicts: sw/uiconfig/swriter/ui/insertbookmark.ui Author: Bernhard Widl (cherry picked from commit c347e00821791377731ab32acd103ea006f3cc1b) tdf#101856 Fix crash in Insert Bookmark dialog Author: Serge Krot Reviewed-on: https://gerrit.libreoffice.org/50616 Reviewed-by: Thorsten Behrens Tested-by: Thorsten Behrens (cherry picked from commit bcc16920eec647f2a3753d60c4d969862f272942) Change-Id: Ib1df7a4c1477693aa2d0ec067635cdcbd393cebd Reviewed-on: https://gerrit.libreoffice.org/46820 Tested-by: Jenkins Reviewed-by: Michael Stahl --- sw/inc/IMark.hxx | 4 + sw/inc/cmdid.h | 2 + sw/inc/crsrsh.hxx | 5 + sw/inc/strings.hrc | 2 + sw/inc/unoprnms.hxx | 2 + sw/qa/uitest/writer_tests2/bookmark.py | 2 +- sw/source/core/crsr/bookmrk.cxx | 1 + sw/source/core/crsr/crbm.cxx | 25 ++++ sw/source/core/inc/bookmrk.hxx | 10 ++ sw/source/core/unocore/unobkm.cxx | 72 +++++++++- sw/source/core/unocore/unomap1.cxx | 2 + sw/source/ui/misc/bookmark.cxx | 37 ++++- sw/source/uibase/inc/bookmark.hxx | 5 + sw/uiconfig/swriter/ui/insertbookmark.ui | 224 +++++++++++++++++-------------- xmloff/source/text/txtparae.cxx | 24 ++++ 15 files changed, 310 insertions(+), 107 deletions(-) diff --git a/sw/inc/IMark.hxx b/sw/inc/IMark.hxx index 39ff1d7108eb..3761b0ea08fb 100644 --- a/sw/inc/IMark.hxx +++ b/sw/inc/IMark.hxx @@ -90,6 +90,10 @@ namespace sw { namespace mark virtual const vcl::KeyCode& GetKeyCode() const =0; virtual void SetShortName(const OUString&) =0; virtual void SetKeyCode(const vcl::KeyCode&) =0; + virtual bool IsHidden() const =0; + virtual const OUString& GetHideCondition() const =0; + virtual void Hide(bool hide) =0; + virtual void SetHideCondition(const OUString&) =0; private: IBookmark(IBookmark&) = delete; IBookmark &operator =(IBookmark const&) = delete; diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h index fccfd6c87bb9..377cae2b4121 100644 --- a/sw/inc/cmdid.h +++ b/sw/inc/cmdid.h @@ -781,6 +781,8 @@ #define FN_SHAPE_ENDPOSITION_IN_HORI_L2R (FN_PARAM2+26) #define FN_PARAM_PAM (FN_PARAM2+27) /* Point and Mark */ #define FN_TEXT_BOX (FN_PARAM2+28) /* TextBox Property*/ +#define FN_BOOKMARK_HIDDEN (FN_PARAM2+29) /* Hidden Property of bookmarks*/ +#define FN_BOOKMARK_CONDITION (FN_PARAM2+30) /* Condition Property of bookmarks*/ // Status: not more than 19! #define FN_STAT_PAGE (FN_STAT + 1) diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx index 531452561fe9..e57153609256 100644 --- a/sw/inc/crsrsh.hxx +++ b/sw/inc/crsrsh.hxx @@ -533,6 +533,11 @@ public: const vcl::KeyCode&, const OUString& rName, IDocumentMarkAccess::MarkType eMark = IDocumentMarkAccess::MarkType::BOOKMARK); + ::sw::mark::IMark* SetBookmark2( + const vcl::KeyCode&, + const OUString& rName, + bool bHide, + const OUString& rCondition); bool GotoMark( const ::sw::mark::IMark* const pMark ); // sets CurrentCursor.SPoint bool GotoMark( const ::sw::mark::IMark* const pMark, bool bAtStart ); bool GoNextBookmark(); // true, if there was one diff --git a/sw/inc/strings.hrc b/sw/inc/strings.hrc index fef14dcc9307..9be1de51bfe9 100644 --- a/sw/inc/strings.hrc +++ b/sw/inc/strings.hrc @@ -236,6 +236,8 @@ #define STR_BOOKMARK_DEF_NAME NC_("STR_BOOKMARK_DEF_NAME", "Bookmark") #define STR_BOOKMARK_NAME NC_("STR_BOOKMARK_NAME", "Name") #define STR_BOOKMARK_TEXT NC_("STR_BOOKMARK_TEXT", "Text") +#define STR_BOOKMARK_HIDDEN NC_("STR_BOOKMARK_HIDDEN", "Hidden") +#define STR_BOOKMARK_CONDITION NC_("STR_BOOKMARK_CONDITION", "Condition") #define SW_STR_NONE NC_("SW_STR_NONE", "[None]") #define STR_CAPTION_BEGINNING NC_("STR_CAPTION_BEGINNING", "Start") #define STR_CAPTION_END NC_("STR_CAPTION_END", "End") diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx index 714d221d3712..a168bbc38498 100644 --- a/sw/inc/unoprnms.hxx +++ b/sw/inc/unoprnms.hxx @@ -343,6 +343,8 @@ #define UNO_NAME_IS_GLOBAL_DOCUMENT_SECTION "IsGlobalDocumentSection" #define UNO_NAME_TEXT_FIELD "TextField" #define UNO_NAME_BOOKMARK "Bookmark" +#define UNO_NAME_BOOKMARK_HIDDEN "BookmarkHidden" +#define UNO_NAME_BOOKMARK_CONDITION "BookmarkCondition" #define UNO_NAME_TEXT_TABLE "TextTable" #define UNO_NAME_CELL "Cell" #define UNO_NAME_TEXT_FRAME "TextFrame" diff --git a/sw/qa/uitest/writer_tests2/bookmark.py b/sw/qa/uitest/writer_tests2/bookmark.py index 33f88d594c7a..9cbf82c29b41 100644 --- a/sw/qa/uitest/writer_tests2/bookmark.py +++ b/sw/qa/uitest/writer_tests2/bookmark.py @@ -94,7 +94,7 @@ class bookmarkDialog(UITestCase): x1stListEntry = xBmk.getChild("O") # select first bookmark - name "newname" x1stListEntry.executeAction("SELECT", tuple()) - self.assertEqual(get_state_as_dict(x1stListEntry)["Text"], "1\tnewname\t") #check the new name "newname" + self.assertEqual(get_state_as_dict(x1stListEntry)["Text"], "1\tnewname\t\tNo\t") #check the new name "newname" xCloseBtn = xBookDlg.getChild("close") self.ui_test.close_dialog_through_button(xCloseBtn) diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx index 8ea7445ea676..05b999ac8e20 100644 --- a/sw/source/core/crsr/bookmrk.cxx +++ b/sw/source/core/crsr/bookmrk.cxx @@ -287,6 +287,7 @@ namespace sw { namespace mark : DdeBookmark(aPaM) , ::sfx2::Metadatable() , m_aCode(rCode) + , m_bHidden(false) { m_aName = rName; } diff --git a/sw/source/core/crsr/crbm.cxx b/sw/source/core/crsr/crbm.cxx index cae3a0b17fca..7a7f9186ac18 100644 --- a/sw/source/core/crsr/crbm.cxx +++ b/sw/source/core/crsr/crbm.cxx @@ -98,6 +98,31 @@ namespace } // set CurrentCursor.SPoint +// at CurrentCursor.SPoint +::sw::mark::IMark* SwCursorShell::SetBookmark2( + const vcl::KeyCode& rCode, + const OUString& rName, + bool bHide, + const OUString& rCondition) +{ + StartAction(); + ::sw::mark::IMark* pMark = getIDocumentMarkAccess()->makeMark( + *GetCursor(), + rName, + IDocumentMarkAccess::MarkType::BOOKMARK, sw::mark::InsertMode::New); + ::sw::mark::IBookmark* pBookmark = dynamic_cast< ::sw::mark::IBookmark* >(pMark); + if (pBookmark) + { + pBookmark->SetKeyCode(rCode); + pBookmark->SetShortName(OUString()); + pBookmark->Hide(bHide); + pBookmark->SetHideCondition(rCondition); + } + EndAction(); + return pMark; +} +// set CurrentCursor.SPoint + bool SwCursorShell::GotoMark(const ::sw::mark::IMark* const pMark, bool bAtStart) { // watch Cursor-Moves diff --git a/sw/source/core/inc/bookmrk.hxx b/sw/source/core/inc/bookmrk.hxx index 4fa2ef87c772..001f8561b012 100644 --- a/sw/source/core/inc/bookmrk.hxx +++ b/sw/source/core/inc/bookmrk.hxx @@ -175,6 +175,14 @@ namespace sw { { m_sShortName = rShortName; } virtual void SetKeyCode(const vcl::KeyCode& rCode) override { m_aCode = rCode; } + virtual bool IsHidden() const override + { return m_bHidden; } + virtual const OUString& GetHideCondition() const override + { return m_sHideCondition; } + virtual void Hide(bool rHide) override + { m_bHidden = rHide; } + virtual void SetHideCondition(const OUString& rHideCondition) override + { m_sHideCondition = rHideCondition; } // ::sfx2::Metadatable virtual ::sfx2::IXmlIdRegistry& GetRegistry() override; @@ -186,6 +194,8 @@ namespace sw { private: vcl::KeyCode m_aCode; OUString m_sShortName; + bool m_bHidden; + OUString m_sHideCondition; }; class Fieldmark diff --git a/sw/source/core/unocore/unobkm.cxx b/sw/source/core/unocore/unobkm.cxx index 2149ba0614f6..a66247f33fe1 100644 --- a/sw/source/core/unocore/unobkm.cxx +++ b/sw/source/core/unocore/unobkm.cxx @@ -56,11 +56,14 @@ public: SwDoc* m_pDoc; ::sw::mark::IMark* m_pRegisteredBookmark; OUString m_sMarkName; + bool m_bHidden; + OUString m_HideCondition; Impl( SwDoc *const pDoc ) : m_EventListeners(m_Mutex) , m_pDoc(pDoc) , m_pRegisteredBookmark(nullptr) + , m_bHidden(false) { // DO NOT registerInMark here! (because SetXBookmark would delete rThis) } @@ -105,6 +108,14 @@ void SwXBookmark::Impl::registerInMark(SwXBookmark& rThis, else if (m_pRegisteredBookmark) { m_sMarkName = m_pRegisteredBookmark->GetName(); + + // the following applies only to bookmarks (not to fieldmarks) + IBookmark* pBookmark = dynamic_cast(m_pRegisteredBookmark); + if (pBookmark) + { + m_bHidden = pBookmark->IsHidden(); + m_HideCondition = pBookmark->GetHideCondition(); + } EndListeningAll(); } m_pRegisteredBookmark = pBkmk; @@ -394,8 +405,43 @@ SwXBookmark::getPropertySetInfo() void SAL_CALL SwXBookmark::setPropertyValue(const OUString& PropertyName, - const uno::Any& /*rValue*/) + const uno::Any& rValue) { + if (PropertyName == UNO_NAME_BOOKMARK_HIDDEN) + { + bool bNewValue = false; + if (!(rValue >>= bNewValue)) + throw lang::IllegalArgumentException("Property BookmarkHidden requires value of type boolean", nullptr, 0); + + IBookmark* pBookmark = dynamic_cast(m_pImpl->m_pRegisteredBookmark); + if (pBookmark) + { + pBookmark->Hide(bNewValue); + } + else + { + m_pImpl->m_bHidden = bNewValue; + } + return; + } + else if (PropertyName == UNO_NAME_BOOKMARK_CONDITION) + { + OUString newValue; + if (!(rValue >>= newValue)) + throw lang::IllegalArgumentException("Property BookmarkCondition requires value of type string", nullptr, 0); + + IBookmark* pBookmark = dynamic_cast(m_pImpl->m_pRegisteredBookmark); + if (pBookmark) + { + pBookmark->SetHideCondition(newValue); + } + else + { + m_pImpl->m_HideCondition = newValue; + } + return; + } + // nothing to set here throw lang::IllegalArgumentException("Property is read-only: " + PropertyName, static_cast< cppu::OWeakObject * >(this), 0 ); @@ -412,6 +458,30 @@ uno::Any SAL_CALL SwXBookmark::getPropertyValue(const OUString& rPropertyName) { aRet <<= getName(); } + else if (rPropertyName == UNO_NAME_BOOKMARK_HIDDEN) + { + IBookmark* pBookmark = dynamic_cast(m_pImpl->m_pRegisteredBookmark); + if (pBookmark) + { + aRet <<= pBookmark->IsHidden(); + } + else + { + aRet <<= m_pImpl->m_bHidden; + } + } + else if (rPropertyName == UNO_NAME_BOOKMARK_CONDITION) + { + IBookmark* pBookmark = dynamic_cast(m_pImpl->m_pRegisteredBookmark); + if (pBookmark) + { + aRet <<= pBookmark->GetHideCondition(); + } + else + { + aRet <<= m_pImpl->m_HideCondition; + } + } } return aRet; } diff --git a/sw/source/core/unocore/unomap1.cxx b/sw/source/core/unocore/unomap1.cxx index 10365bd83082..6716483ea1a8 100644 --- a/sw/source/core/unocore/unomap1.cxx +++ b/sw/source/core/unocore/unomap1.cxx @@ -988,6 +988,8 @@ const SfxItemPropertyMapEntry* SwUnoPropertyMapProvider::GetBookmarkPropertyMap { { OUString(UNO_LINK_DISPLAY_NAME), FN_PARAM_LINK_DISPLAY_NAME, cppu::UnoType::get(), PropertyAttribute::READONLY, 0xbf}, COMMON_TEXT_CONTENT_PROPERTIES + { OUString(UNO_NAME_BOOKMARK_HIDDEN), FN_BOOKMARK_HIDDEN, cppu::UnoType::get(), PROPERTY_NONE, 0 }, + { OUString(UNO_NAME_BOOKMARK_CONDITION), FN_BOOKMARK_CONDITION, cppu::UnoType::get(), PROPERTY_NONE, 0 }, { OUString(), 0, css::uno::Type(), 0, 0 } }; diff --git a/sw/source/ui/misc/bookmark.cxx b/sw/source/ui/misc/bookmark.cxx index 1b9395d4c1f7..f2eb26d68384 100644 --- a/sw/source/ui/misc/bookmark.cxx +++ b/sw/source/ui/misc/bookmark.cxx @@ -209,7 +209,7 @@ IMPL_LINK_NOARG(SwInsertBookmarkDlg, RenameHdl, Button*, void) IMPL_LINK_NOARG(SwInsertBookmarkDlg, InsertHdl, Button*, void) { OUString sBookmark = m_pEditBox->GetText(); - rSh.SetBookmark(vcl::KeyCode(), sBookmark); + rSh.SetBookmark2(vcl::KeyCode(), sBookmark, m_pHideCB->IsChecked(), m_pConditionED->GetText()); rReq.AppendItem(SfxStringItem(FN_INSERT_BOOKMARK, sBookmark)); rReq.Done(); if (!rReq.IsDone()) @@ -218,6 +218,13 @@ IMPL_LINK_NOARG(SwInsertBookmarkDlg, InsertHdl, Button*, void) EndDialog(RET_OK); } +IMPL_LINK(SwInsertBookmarkDlg, ChangeHideHdl, Button *, pBox, void) +{ + bool bHide = static_cast(pBox)->IsChecked(); + m_pConditionED->Enable(bHide); + m_pConditionFT->Enable(bHide); +} + void SwInsertBookmarkDlg::GotoSelectedBookmark() { if (!ValidateBookmarks()) @@ -303,6 +310,9 @@ SwInsertBookmarkDlg::SwInsertBookmarkDlg(vcl::Window* pParent, SwWrtShell& rS, S get(m_pDeleteBtn, "delete"); get(m_pGotoBtn, "goto"); get(m_pRenameBtn, "rename"); + get(m_pHideCB, "hide"); + get(m_pConditionFT, "condlabel"); + get(m_pConditionED, "withcond"); m_pBookmarksBox = VclPtr::Create(*m_pBookmarksContainer); @@ -314,6 +324,7 @@ SwInsertBookmarkDlg::SwInsertBookmarkDlg(vcl::Window* pParent, SwWrtShell& rS, S m_pDeleteBtn->SetClickHdl(LINK(this, SwInsertBookmarkDlg, DeleteHdl)); m_pGotoBtn->SetClickHdl(LINK(this, SwInsertBookmarkDlg, GotoHdl)); m_pRenameBtn->SetClickHdl(LINK(this, SwInsertBookmarkDlg, RenameHdl)); + m_pHideCB->SetClickHdl(LINK(this, SwInsertBookmarkDlg, ChangeHideHdl)); m_pDeleteBtn->Disable(); m_pGotoBtn->Disable(); @@ -341,35 +352,43 @@ void SwInsertBookmarkDlg::dispose() m_pGotoBtn.clear(); m_pEditBox.clear(); m_pRenameBtn.clear(); + m_pHideCB.clear(); + m_pConditionFT.clear(); + m_pConditionED.clear(); SvxStandardDialog::dispose(); } BookmarkTable::BookmarkTable(SvSimpleTableContainer& rParent) : SvSimpleTable(rParent, 0) { - static long nTabs[] = {0, 40, 150}; + static long nTabs[] = { 0, 40, 150, 300, 340 }; SetTabs(SAL_N_ELEMENTS(nTabs), nTabs, MapUnit::MapPixel); SetSelectionMode(SelectionMode::Multiple); InsertHeaderEntry(SwResId(STR_PAGE)); InsertHeaderEntry(SwResId(STR_BOOKMARK_NAME)); InsertHeaderEntry(SwResId(STR_BOOKMARK_TEXT)); + InsertHeaderEntry(SwResId(STR_BOOKMARK_HIDDEN)); + InsertHeaderEntry(SwResId(STR_BOOKMARK_CONDITION)); rParent.SetTable(this); } void BookmarkTable::InsertBookmark(sw::mark::IMark* pMark) { - OUString sBookmarkNodeText = pMark->GetMarkStart().nNode.GetNode().GetTextNode()->GetText(); - sal_Int32 nBookmarkNodeTextPos = pMark->GetMarkStart().nContent.GetIndex(); + sw::mark::IBookmark* pBookmark = dynamic_cast(pMark); + assert(pBookmark); + + OUString sBookmarkNodeText = pBookmark->GetMarkStart().nNode.GetNode().GetTextNode()->GetText(); + sal_Int32 nBookmarkNodeTextPos = pBookmark->GetMarkStart().nContent.GetIndex(); sal_Int32 nBookmarkTextLen = 0; bool bPulledAll = false; bool bPulling = false; static const sal_Int32 nMaxTextLen = 50; - if (pMark->IsExpanded()) + if (pBookmark->IsExpanded()) { - nBookmarkTextLen = pMark->GetMarkEnd().nContent.GetIndex() - nBookmarkNodeTextPos; + nBookmarkTextLen = pBookmark->GetMarkEnd().nContent.GetIndex() - nBookmarkNodeTextPos; } else { @@ -390,8 +409,12 @@ void BookmarkTable::InsertBookmark(sw::mark::IMark* pMark) else if (bPulling && !bPulledAll) sBookmarkNodeText = "..." + sBookmarkNodeText; + OUString sHidden = "No"; + if (pBookmark->IsHidden()) + sHidden = "Yes"; + OUString sHideCondition = pBookmark->GetHideCondition(); OUString sPageNum = OUString::number(SwPaM(pMark->GetMarkStart()).GetPageNum()); - OUString sColumnData = sPageNum + "\t" + pMark->GetName() + "\t" + sBookmarkNodeText; + OUString sColumnData = sPageNum + "\t" + pBookmark->GetName() + "\t" + sBookmarkNodeText + "\t" + sHidden + "\t" + sHideCondition; InsertEntryToColumn(sColumnData, TREELIST_APPEND, 0xffff, pMark); } diff --git a/sw/source/uibase/inc/bookmark.hxx b/sw/source/uibase/inc/bookmark.hxx index e8554052b9aa..98682a941ffe 100644 --- a/sw/source/uibase/inc/bookmark.hxx +++ b/sw/source/uibase/inc/bookmark.hxx @@ -24,6 +24,7 @@ #include #include +#include "condedit.hxx" #include #include @@ -55,6 +56,9 @@ class SwInsertBookmarkDlg: public SvxStandardDialog VclPtr m_pDeleteBtn; VclPtr m_pGotoBtn; VclPtr m_pRenameBtn; + VclPtr m_pHideCB; + VclPtr m_pConditionFT; + VclPtr m_pConditionED; OUString sRemoveWarning; SwWrtShell& rSh; SfxRequest& rReq; @@ -68,6 +72,7 @@ class SwInsertBookmarkDlg: public SvxStandardDialog DECL_LINK(GotoHdl, Button*, void); DECL_LINK(SelectionChangedHdl, SvTreeListBox*, void); DECL_LINK(DoubleClickHdl, SvTreeListBox*, bool); + DECL_LINK(ChangeHideHdl, Button *, void); // Fill table with bookmarks void PopulateTable(); diff --git a/sw/uiconfig/swriter/ui/insertbookmark.ui b/sw/uiconfig/swriter/ui/insertbookmark.ui index 17c0633459c0..6079aefe7a88 100644 --- a/sw/uiconfig/swriter/ui/insertbookmark.ui +++ b/sw/uiconfig/swriter/ui/insertbookmark.ui @@ -1,7 +1,8 @@ - + + False 6 @@ -26,30 +27,17 @@ True True - start 0 - + + Insert True - False - 6 - - - Insert - True - True - True - True - True - - - False - False - 0 - - + True + True + True + True False @@ -65,17 +53,71 @@ 0 + + + H_ide + True + True + False + start + True + + + False + True + 1 + + + + + True + False + 12 + + + True + False + _With condition + withcond + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + False + True + 2 + + 350 250 True True + + + True True - 1 + 3 @@ -84,92 +126,25 @@ False 6 - + + Go to True - False - 6 - - - gtk-help - 75 - True - True - True - True - - - False - False - 0 - - + True + True False False - start + end 0 - + + Delete True - False - True - 6 - - - Rename - True - True - True - - - False - False - 0 - - - - - Delete - True - True - True - - - False - False - 1 - - - - - Go to - True - True - True - - - False - False - 2 - - - - - gtk-close - True - True - True - True - - - False - False - 3 - - + True + True False @@ -178,11 +153,64 @@ 1 + + + Rename + True + True + True + + + False + False + end + 2 + + False False - 2 + 4 + + + + + False + + + gtk-help + True + True + True + True + + + False + True + 0 + + + + + gtk-close + True + True + True + True + + + False + True + end + 1 + + + + + True + True + 5 diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx index 36c161abc79c..099a7385c1cf 100644 --- a/xmloff/source/text/txtparae.cxx +++ b/xmloff/source/text/txtparae.cxx @@ -2495,6 +2495,30 @@ void XMLTextParagraphExport::exportTextMark( GetExport().AddAttributesRDFa(xTextContent); } + // bookmark-start: add attributes hidden and condition + if (nElement == 1) + { + Reference bkmkProps(rPropSet->getPropertyValue(rProperty), UNO_QUERY); + Reference bkmkPropInfo(bkmkProps->getPropertySetInfo(), UNO_QUERY); + OUString sHidden("BookmarkHidden"); + if (bkmkPropInfo->hasPropertyByName(sHidden)) + { + bool bHidden = false; + bkmkProps->getPropertyValue(sHidden) >>= bHidden; + if (bHidden) + { + GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, "hidden", "true"); + OUString sCondition("BookmarkCondition"); + if (bkmkPropInfo->hasPropertyByName(sCondition)) + { + OUString sBookmarkCondition; + bkmkProps->getPropertyValue(sCondition) >>= sBookmarkCondition; + GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, "condition", sBookmarkCondition); + } + } + } + } + // export element assert(pElements != nullptr); assert(0 <= nElement && nElement <= 2); -- cgit