From 4ec2c9816b8f4012bb7a760a85a46d8a1e530089 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Fri, 31 Jan 2020 16:19:21 +0100 Subject: tdf#45589 offapi,officecfg,sw: add option to toggle bookmark display Create specific option to toggle display of the bookmark positions instead of relying on generic IsViewMetaChars(). Add a Bookmarks checkbox to Writer->Formatting Aids page in Options. Add property ShowBookmarks to com::sun::star::text::ViewSettings. Add config setting: org/openoffice/Office/Writer/Content/NonprintingCharacter/Bookmarks Change-Id: I998ecdc16d8e4a5baeeb1bbcff0bf5f1f5636692 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87774 Tested-by: Jenkins Reviewed-by: Michael Stahl (cherry picked from commit 04405edc3fac32938b8940bc767656ea6c7820f9) --- offapi/com/sun/star/text/ViewSettings.idl | 6 +++ .../schema/org/openoffice/Office/Writer.xcs | 8 ++++ sw/inc/viewopt.hxx | 17 ++++++-- sw/source/core/text/porrst.cxx | 2 +- sw/source/ui/config/optpage.cxx | 4 ++ sw/source/uibase/app/appopt.cxx | 1 + sw/source/uibase/config/cfgitems.cxx | 4 ++ sw/source/uibase/config/usrpref.cxx | 47 +++++++++++++--------- sw/source/uibase/inc/cfgitems.hxx | 1 + sw/source/uibase/inc/optpage.hxx | 1 + sw/source/uibase/uiview/pview.cxx | 1 + sw/source/uibase/uiview/view0.cxx | 2 + sw/source/uibase/uno/unomod.cxx | 4 ++ sw/source/uibase/uno/unotxdoc.cxx | 1 + sw/uiconfig/swriter/ui/optformataidspage.ui | 28 ++++++++++++- 15 files changed, 103 insertions(+), 24 deletions(-) diff --git a/offapi/com/sun/star/text/ViewSettings.idl b/offapi/com/sun/star/text/ViewSettings.idl index 5de3bf8d6dd5..b0afa27c46e8 100644 --- a/offapi/com/sun/star/text/ViewSettings.idl +++ b/offapi/com/sun/star/text/ViewSettings.idl @@ -278,6 +278,12 @@ published service ViewSettings */ [optional, property] boolean UseHeaderFooterMenu; + /** If this property is `TRUE`, bookmark positions are displayed. + + @since LibreOffice 7.0 + */ + [optional, property] boolean ShowBookmarks; + }; }; }; }; }; diff --git a/officecfg/registry/schema/org/openoffice/Office/Writer.xcs b/officecfg/registry/schema/org/openoffice/Office/Writer.xcs index 6ba34c5338ff..470d9f81ba8e 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Writer.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Writer.xcs @@ -1172,6 +1172,14 @@ false + + + + Specifies whether bookmark positions are displayed on the screen. + + + true + diff --git a/sw/inc/viewopt.hxx b/sw/inc/viewopt.hxx index c727452685c7..11d2914ed028 100644 --- a/sw/inc/viewopt.hxx +++ b/sw/inc/viewopt.hxx @@ -34,7 +34,7 @@ class OutputDevice; class SwDocShell; namespace svtools{ class ColorConfig;} -enum class ViewOptFlags1 { +enum class ViewOptFlags1 : sal_uInt32 { UseHeaderFooterMenu = 0x00000001, Tab = 0x00000002, Blank = 0x00000004, @@ -44,6 +44,7 @@ enum class ViewOptFlags1 { Pagebreak = 0x00000040, Columnbreak = 0x00000080, SoftHyph = 0x00000100, + Bookmarks = 0x00000200, Ref = 0x00000400, FieldName = 0x00000800, Postits = 0x00004000, @@ -60,10 +61,10 @@ enum class ViewOptFlags1 { OnlineSpell = 0x04000000, ShowInlineTooltips = 0x10000000, //tooltips on tracked changes ViewMetachars = 0x20000000, - Pageback = 0x40000000 + Pageback = 0x40000000, }; namespace o3tl { - template<> struct typed_flags : is_typed_flags {}; + template<> struct typed_flags : is_typed_flags {}; } enum class ViewOptCoreFlags2 { @@ -232,6 +233,16 @@ public: void SetParagraph( bool b ) { SetCoreOption(b, ViewOptFlags1::Paragraph); } + void SetShowBookmarks(bool const b) + { + SetCoreOption(b, ViewOptFlags1::Bookmarks); + } + bool IsShowBookmarks(bool const bHard = false) const + { + return !m_bReadonly && (m_nCoreOptions & ViewOptFlags1::Bookmarks) + && (bHard || (m_nCoreOptions & ViewOptFlags1::ViewMetachars)); + } + bool IsLineBreak(bool bHard = false) const { return !m_bReadonly && (m_nCoreOptions & ViewOptFlags1::Linebreak) && ((m_nCoreOptions & ViewOptFlags1::ViewMetachars)||bHard); } diff --git a/sw/source/core/text/porrst.cxx b/sw/source/core/text/porrst.cxx index 8a7b47b04f68..47d980183c3c 100644 --- a/sw/source/core/text/porrst.cxx +++ b/sw/source/core/text/porrst.cxx @@ -533,7 +533,7 @@ bool SwControlCharPortion::DoPaint(SwTextPaintInfo const&, bool SwBookmarkPortion::DoPaint(SwTextPaintInfo const& rInf, OUString & rOutString, SwFont & rTmpFont, int & rDeltaY) const { - if (!rInf.GetOpt().IsViewMetaChars()) + if (!rInf.GetOpt().IsShowBookmarks()) { return false; } diff --git a/sw/source/ui/config/optpage.cxx b/sw/source/ui/config/optpage.cxx index 7e49ff3dc2a9..fe41aa6dae33 100644 --- a/sw/source/ui/config/optpage.cxx +++ b/sw/source/ui/config/optpage.cxx @@ -1206,6 +1206,7 @@ SwShdwCursorOptionsTabPage::SwShdwCursorOptionsTabPage(weld::Container* pPage, w , m_xTabCB(m_xBuilder->weld_check_button("tabs")) , m_xBreakCB(m_xBuilder->weld_check_button("break")) , m_xCharHiddenCB(m_xBuilder->weld_check_button("hiddentext")) + , m_xBookmarkCB(m_xBuilder->weld_check_button("bookmarks")) , m_xDirectCursorFrame(m_xBuilder->weld_frame("directcrsrframe")) , m_xOnOffCB(m_xBuilder->weld_check_button("cursoronoff")) , m_xFillMarginRB(m_xBuilder->weld_radio_button("fillmargin")) @@ -1241,6 +1242,7 @@ SwShdwCursorOptionsTabPage::SwShdwCursorOptionsTabPage(weld::Container* pPage, w m_xTabCB->hide(); m_xCharHiddenCB->hide(); + m_xBookmarkCB->hide(); m_xDirectCursorFrame->hide(); m_xOnOffCB->hide(); @@ -1320,6 +1322,7 @@ bool SwShdwCursorOptionsTabPage::FillItemSet( SfxItemSet* rSet ) aDisp.bNonbreakingSpace = m_xHSpacesCB->get_active(); aDisp.bSoftHyphen = m_xSHyphCB->get_active(); aDisp.bCharHiddenText = m_xCharHiddenCB->get_active(); + aDisp.bBookmarks = m_xBookmarkCB->get_active(); aDisp.bManualBreak = m_xBreakCB->get_active(); bRet |= (!pOldAttr || aDisp != *pOldAttr); @@ -1372,6 +1375,7 @@ void SwShdwCursorOptionsTabPage::Reset( const SfxItemSet* rSet ) m_xHSpacesCB->set_active( pDocDisplayAttr->bNonbreakingSpace ); m_xSHyphCB->set_active( pDocDisplayAttr->bSoftHyphen ); m_xCharHiddenCB->set_active( pDocDisplayAttr->bCharHiddenText ); + m_xBookmarkCB->set_active(pDocDisplayAttr->bBookmarks); m_xBreakCB->set_active( pDocDisplayAttr->bManualBreak ); } } diff --git a/sw/source/uibase/app/appopt.cxx b/sw/source/uibase/app/appopt.cxx index f071b85997fe..941d15e4302c 100644 --- a/sw/source/uibase/app/appopt.cxx +++ b/sw/source/uibase/app/appopt.cxx @@ -253,6 +253,7 @@ void SwModule::ApplyItemSet( sal_uInt16 nId, const SfxItemSet& rSet ) { if( (!aViewOpt.IsTab( true ) && pDocDispItem->bTab) || (!aViewOpt.IsBlank( true ) && pDocDispItem->bSpace) || + (!aViewOpt.IsShowBookmarks(true) && pDocDispItem->bBookmarks) || (!aViewOpt.IsParagraph( true ) && pDocDispItem->bParagraphEnd) || (!aViewOpt.IsLineBreak( true ) && pDocDispItem->bManualBreak) ) { diff --git a/sw/source/uibase/config/cfgitems.cxx b/sw/source/uibase/config/cfgitems.cxx index 3c6114c9a9a6..efbbdf4154b4 100644 --- a/sw/source/uibase/config/cfgitems.cxx +++ b/sw/source/uibase/config/cfgitems.cxx @@ -39,6 +39,7 @@ SwDocDisplayItem::SwDocDisplayItem() : bNonbreakingSpace = bSoftHyphen = bCharHiddenText = + bBookmarks = bManualBreak = true; }; @@ -52,6 +53,7 @@ SwDocDisplayItem::SwDocDisplayItem(const SwViewOption& rVOpt ) : bNonbreakingSpace = rVOpt.IsHardBlank(); bSoftHyphen = rVOpt.IsSoftHyph(); bCharHiddenText = rVOpt.IsShowHiddenChar(true); + bBookmarks = rVOpt.IsShowBookmarks(true); bManualBreak = rVOpt.IsLineBreak(true); } @@ -72,6 +74,7 @@ bool SwDocDisplayItem::operator==( const SfxPoolItem& rAttr ) const bNonbreakingSpace == rItem.bNonbreakingSpace && bSoftHyphen == rItem.bSoftHyphen && bCharHiddenText == rItem.bCharHiddenText && + bBookmarks == rItem.bBookmarks && bManualBreak == rItem.bManualBreak ); } @@ -83,6 +86,7 @@ void SwDocDisplayItem::FillViewOptions( SwViewOption& rVOpt) const rVOpt.SetHardBlank (bNonbreakingSpace ); rVOpt.SetSoftHyph (bSoftHyphen ); rVOpt.SetShowHiddenChar(bCharHiddenText ); + rVOpt.SetShowBookmarks(bBookmarks ); rVOpt.SetLineBreak (bManualBreak ); } diff --git a/sw/source/uibase/config/usrpref.cxx b/sw/source/uibase/config/usrpref.cxx index 0246b6f039d6..cfc6142314c6 100644 --- a/sw/source/uibase/config/usrpref.cxx +++ b/sw/source/uibase/config/usrpref.cxx @@ -82,9 +82,11 @@ SwMasterUsrPref::~SwMasterUsrPref() { } +static const auto g_UpdateLinkIndex = 17; + Sequence SwContentViewConfig::GetPropertyNames() const { - static const char* aPropNames[] = + static constexpr const char*const aPropNames[] = { "Display/GraphicObject", // 0 "Display/Table", // 1 @@ -102,13 +104,18 @@ Sequence SwContentViewConfig::GetPropertyNames() const "NonprintingCharacter/HiddenText", // 13 "NonprintingCharacter/HiddenParagraph", // 14 "NonprintingCharacter/HiddenCharacter", // 15 - "Update/Link", // 16 - "Update/Field", // 17 - "Update/Chart", // 18 - "Display/ShowInlineTooltips", // 19 - "Display/UseHeaderFooterMenu" // 20 + "NonprintingCharacter/Bookmarks", // 16 + "Update/Link", // 17 + "Update/Field", // 18 + "Update/Chart", // 19 + "Display/ShowInlineTooltips", // 20 + "Display/UseHeaderFooterMenu" // 21 }; - const int nCount = bWeb ? 12 : 21; +#if defined(__GNUC__) && !defined(__clang__) + // clang 8.0.0 says strcmp isn't constexpr + static_assert(std::strcmp("Update/Link", aPropNames[g_UpdateLinkIndex]) == 0); +#endif + const int nCount = bWeb ? 12 : SAL_N_ELEMENTS(aPropNames); Sequence aNames(nCount); OUString* pNames = aNames.getArray(); for(int i = 0; i < nCount; i++) @@ -164,13 +171,14 @@ void SwContentViewConfig::ImplCommit() case 13: bVal = rParent.IsShowHiddenField(); break;// "NonprintingCharacter/Fields: HiddenText", case 14: bVal = rParent.IsShowHiddenPara(); break;// "NonprintingCharacter/Fields: HiddenParagraph", case 15: bVal = rParent.IsShowHiddenChar(true); break;// "NonprintingCharacter/HiddenCharacter", - case 16: pValues[nProp] <<= rParent.GetUpdateLinkMode(); break;// "Update/Link", - case 17: bVal = rParent.IsUpdateFields(); break;// "Update/Field", - case 18: bVal = rParent.IsUpdateCharts(); break;// "Update/Chart" - case 19: bVal = rParent.IsShowInlineTooltips(); break;// "Display/ShowInlineTooltips" - case 20: bVal = rParent.IsUseHeaderFooterMenu(); break;// "Display/UseHeaderFooterMenu" + case 16: bVal = rParent.IsShowBookmarks(true); break;// "NonprintingCharacter/Bookmarks", + case 17: pValues[nProp] <<= rParent.GetUpdateLinkMode(); break;// "Update/Link", + case 18: bVal = rParent.IsUpdateFields(); break;// "Update/Field", + case 19: bVal = rParent.IsUpdateCharts(); break;// "Update/Chart" + case 20: bVal = rParent.IsShowInlineTooltips(); break;// "Display/ShowInlineTooltips" + case 21: bVal = rParent.IsUseHeaderFooterMenu(); break;// "Display/UseHeaderFooterMenu" } - if(nProp != 16) + if (nProp != g_UpdateLinkIndex) pValues[nProp] <<= bVal; } PutProperties(aNames, aValues); @@ -188,7 +196,7 @@ void SwContentViewConfig::Load() { if(pValues[nProp].hasValue()) { - bool bSet = nProp != 16 && *o3tl::doAccess(pValues[nProp]); + bool bSet = nProp != g_UpdateLinkIndex && *o3tl::doAccess(pValues[nProp]); switch(nProp) { case 0: rParent.SetGraphic(bSet); break;// "Display/GraphicObject", @@ -207,17 +215,18 @@ void SwContentViewConfig::Load() case 13: rParent.SetShowHiddenField(bSet); break;// "NonprintingCharacter/Fields: HiddenText", case 14: rParent.SetShowHiddenPara(bSet); break;// "NonprintingCharacter/Fields: HiddenParagraph", case 15: rParent.SetShowHiddenChar(bSet); break;// "NonprintingCharacter/HiddenCharacter", - case 16: + case 16: rParent.SetShowBookmarks(bSet); break;// "NonprintingCharacter/Bookmarks", + case 17: { sal_Int32 nSet = 0; pValues[nProp] >>= nSet; rParent.SetUpdateLinkMode(nSet, true); } break;// "Update/Link", - case 17: rParent.SetUpdateFields(bSet); break;// "Update/Field", - case 18: rParent.SetUpdateCharts(bSet); break;// "Update/Chart" - case 19: rParent.SetShowInlineTooltips(bSet); break;// "Display/ShowInlineTooltips" - case 20: rParent.SetUseHeaderFooterMenu(bSet); break;// "Display/UseHeaderFooterMenu" + case 18: rParent.SetUpdateFields(bSet); break;// "Update/Field", + case 19: rParent.SetUpdateCharts(bSet); break;// "Update/Chart" + case 20: rParent.SetShowInlineTooltips(bSet); break;// "Display/ShowInlineTooltips" + case 21: rParent.SetUseHeaderFooterMenu(bSet); break;// "Display/UseHeaderFooterMenu" } } } diff --git a/sw/source/uibase/inc/cfgitems.hxx b/sw/source/uibase/inc/cfgitems.hxx index db525151a079..297ac1846faa 100644 --- a/sw/source/uibase/inc/cfgitems.hxx +++ b/sw/source/uibase/inc/cfgitems.hxx @@ -49,6 +49,7 @@ class SW_DLLPUBLIC SwDocDisplayItem : public SfxPoolItem bool bNonbreakingSpace :1; bool bSoftHyphen :1; bool bCharHiddenText :1; + bool bBookmarks :1; bool bManualBreak :1; public: diff --git a/sw/source/uibase/inc/optpage.hxx b/sw/source/uibase/inc/optpage.hxx index 13c5d6194aef..955e44c249a5 100644 --- a/sw/source/uibase/inc/optpage.hxx +++ b/sw/source/uibase/inc/optpage.hxx @@ -228,6 +228,7 @@ class SwShdwCursorOptionsTabPage : public SfxTabPage std::unique_ptr m_xTabCB; std::unique_ptr m_xBreakCB; std::unique_ptr m_xCharHiddenCB; + std::unique_ptr m_xBookmarkCB; std::unique_ptr m_xDirectCursorFrame; std::unique_ptr m_xOnOffCB; diff --git a/sw/source/uibase/uiview/pview.cxx b/sw/source/uibase/uiview/pview.cxx index c8a3c398b46b..2a1b16434845 100644 --- a/sw/source/uibase/uiview/pview.cxx +++ b/sw/source/uibase/uiview/pview.cxx @@ -1111,6 +1111,7 @@ void SwPagePreview::Init() aOpt.SetSoftHyph( false ); aOpt.SetFieldName( false ); aOpt.SetPostIts( false ); + aOpt.SetShowBookmarks( false ); aOpt.SetShowHiddenChar( false ); aOpt.SetShowHiddenField( false ); aOpt.SetShowHiddenPara( false ); diff --git a/sw/source/uibase/uiview/view0.cxx b/sw/source/uibase/uiview/view0.cxx index 56f363cc0285..79783e138496 100644 --- a/sw/source/uibase/uiview/view0.cxx +++ b/sw/source/uibase/uiview/view0.cxx @@ -162,6 +162,7 @@ static void lcl_SetViewMetaChars( SwViewOption& rVOpt, bool bOn) rVOpt.IsTab() || rVOpt.IsLineBreak() || rVOpt.IsShowHiddenChar() || + rVOpt.IsShowBookmarks() || rVOpt.IsBlank())) { rVOpt.SetParagraph(bOn); @@ -169,6 +170,7 @@ static void lcl_SetViewMetaChars( SwViewOption& rVOpt, bool bOn) rVOpt.SetLineBreak(bOn); rVOpt.SetBlank(bOn); rVOpt.SetShowHiddenChar(bOn); + rVOpt.SetShowBookmarks(bOn); } } diff --git a/sw/source/uibase/uno/unomod.cxx b/sw/source/uibase/uno/unomod.cxx index 5df0c5af9d89..93b63a0e7d68 100644 --- a/sw/source/uibase/uno/unomod.cxx +++ b/sw/source/uibase/uno/unomod.cxx @@ -95,6 +95,7 @@ enum SwViewSettingsPropertyHandles HANDLE_VIEWSET_INLINECHANGES_TIPS, HANDLE_VIEWSET_HIDE_WHITESPACE, HANDLE_VIEWSET_USE_HEADERFOOTERMENU, + HANDLE_VIEWSET_BOOKMARKS, }; enum SwPrintSettingsPropertyHandles @@ -136,6 +137,7 @@ static ChainablePropertySetInfo * lcl_createViewSettingsInfo() { OUString( "RasterSubdivisionX"), HANDLE_VIEWSET_RASTER_SUBDIVISION_X, cppu::UnoType::get(), PROPERTY_NONE}, { OUString( "RasterSubdivisionY"), HANDLE_VIEWSET_RASTER_SUBDIVISION_Y, cppu::UnoType::get(), PROPERTY_NONE}, { OUString( "ShowAnnotations" ), HANDLE_VIEWSET_ANNOTATIONS , cppu::UnoType::get(), PROPERTY_NONE}, + { OUString( "ShowBookmarks" ), HANDLE_VIEWSET_BOOKMARKS, cppu::UnoType::get(), PROPERTY_NONE }, { OUString( "ShowBreaks"), HANDLE_VIEWSET_BREAKS , cppu::UnoType::get(), PROPERTY_NONE}, { OUString( "ShowDrawings"), HANDLE_VIEWSET_DRAWINGS , cppu::UnoType::get(), PROPERTY_NONE}, { OUString( "ShowFieldCommands"), HANDLE_VIEWSET_FIELD_COMMANDS , cppu::UnoType::get(), PROPERTY_NONE}, @@ -579,6 +581,7 @@ void SwXViewSettings::_setSingleValue( const comphelper::PropertyInfo & rInfo, c case HANDLE_VIEWSET_PROTECTED_SPACES : mpViewOption->SetHardBlank(*o3tl::doAccess(rValue)); break; case HANDLE_VIEWSET_TABSTOPS : mpViewOption->SetTab(*o3tl::doAccess(rValue)); break; case HANDLE_VIEWSET_BREAKS : mpViewOption->SetLineBreak(*o3tl::doAccess(rValue)); break; + case HANDLE_VIEWSET_BOOKMARKS : mpViewOption->SetShowBookmarks(*o3tl::doAccess(rValue)); break; case HANDLE_VIEWSET_HIDDEN_TEXT : mpViewOption->SetShowHiddenField(*o3tl::doAccess(rValue)); break; case HANDLE_VIEWSET_HIDDEN_CHARACTERS : mpViewOption->SetShowHiddenChar(*o3tl::doAccess(rValue)); break; case HANDLE_VIEWSET_HIDDEN_PARAGRAPHS : mpViewOption->SetShowHiddenPara(*o3tl::doAccess(rValue)); break; @@ -820,6 +823,7 @@ void SwXViewSettings::_getSingleValue( const comphelper::PropertyInfo & rInfo, u case HANDLE_VIEWSET_PROTECTED_SPACES : bBoolVal = mpConstViewOption->IsHardBlank(); break; case HANDLE_VIEWSET_TABSTOPS : bBoolVal = mpConstViewOption->IsTab(true); break; case HANDLE_VIEWSET_BREAKS : bBoolVal = mpConstViewOption->IsLineBreak(true); break; + case HANDLE_VIEWSET_BOOKMARKS : bBoolVal = mpConstViewOption->IsShowBookmarks(true); break; case HANDLE_VIEWSET_HIDDEN_TEXT : bBoolVal = mpConstViewOption->IsShowHiddenField(); break; case HANDLE_VIEWSET_HIDDEN_CHARACTERS : bBoolVal = mpConstViewOption->IsShowHiddenChar(true); break; case HANDLE_VIEWSET_HIDE_WHITESPACE : bBoolVal = mpConstViewOption->IsHideWhitespaceMode(); break; diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx index e5ce030ddaac..5e221efa47ea 100644 --- a/sw/source/uibase/uno/unotxdoc.cxx +++ b/sw/source/uibase/uno/unotxdoc.cxx @@ -4418,6 +4418,7 @@ SwViewOptionAdjust_Impl::AdjustViewOptions(SwPrintData const*const pPrtOptions, aRenderViewOptions.SetBlank( false ); // spaces aRenderViewOptions.SetHardBlank( false ); // non-breaking spaces aRenderViewOptions.SetTab( false ); // tabs + aRenderViewOptions.SetShowBookmarks( false ); // bookmarks aRenderViewOptions.SetLineBreak( false ); // breaks (type 1) aRenderViewOptions.SetPageBreak( false ); // breaks (type 2) aRenderViewOptions.SetColumnBreak( false ); // breaks (type 3) diff --git a/sw/uiconfig/swriter/ui/optformataidspage.ui b/sw/uiconfig/swriter/ui/optformataidspage.ui index 209de810ac5b..fb2fa378c4e2 100644 --- a/sw/uiconfig/swriter/ui/optformataidspage.ui +++ b/sw/uiconfig/swriter/ui/optformataidspage.ui @@ -101,7 +101,7 @@ - Ta_bs + Tabs True True False @@ -144,6 +144,21 @@ 6 + + + Bookmarks + True + True + False + True + 0 + True + + + 0 + 7 + + True @@ -199,6 +214,17 @@ 5 + + + True + False + | [ ] + + + 1 + 7 + + -- cgit