diff options
43 files changed, 3222 insertions, 2904 deletions
diff --git a/include/sfx2/weldutils.hxx b/include/sfx2/weldutils.hxx index 8c577f9a1651..c2e05d54924a 100644 --- a/include/sfx2/weldutils.hxx +++ b/include/sfx2/weldutils.hxx @@ -24,6 +24,7 @@ namespace weld { +class Builder; class Toolbar; } @@ -33,6 +34,7 @@ private: css::uno::Reference<css::frame::XFrame> m_xFrame; SvtMiscOptions m_aToolbarOptions; weld::Toolbar* m_pToolbar; + weld::Builder* m_pBuilder; DECL_LINK(SelectHdl, const OString&, void); DECL_LINK(ToggleMenuHdl, const OString&, void); @@ -47,7 +49,7 @@ private: public: // fill in the label and icons for actions and dispatch the action on item click - ToolbarUnoDispatcher(weld::Toolbar& rToolbar, + ToolbarUnoDispatcher(weld::Toolbar& rToolbar, weld::Builder& rBuilder, const css::uno::Reference<css::frame::XFrame>& rFrame); css::uno::Reference<css::frame::XToolbarController> diff --git a/include/svtools/toolboxcontroller.hxx b/include/svtools/toolboxcontroller.hxx index b97c0e15b11a..bcf688ded0c6 100644 --- a/include/svtools/toolboxcontroller.hxx +++ b/include/svtools/toolboxcontroller.hxx @@ -47,6 +47,7 @@ class ToolBox; namespace weld { + class Builder; class Toolbar; } @@ -184,6 +185,7 @@ class SVT_DLLPUBLIC ToolboxController : css::uno::Reference< css::util::XURLTransformer > m_xUrlTransformer; OUString m_sModuleName; weld::Toolbar* m_pToolbar; + weld::Builder* m_pBuilder; }; } diff --git a/include/vcl/weldutils.hxx b/include/vcl/weldutils.hxx index dc2ca29150ac..fdc9e8cf30d6 100644 --- a/include/vcl/weldutils.hxx +++ b/include/vcl/weldutils.hxx @@ -27,6 +27,7 @@ class VCL_DLLPUBLIC TransportAsXWindow : public TransportAsXWindow_Base private: osl::Mutex m_aHelperMtx; weld::Widget* m_pWeldWidget; + weld::Builder* m_pWeldWidgetBuilder; comphelper::OInterfaceContainerHelper2 m_aWindowListeners; comphelper::OInterfaceContainerHelper2 m_aKeyListeners; @@ -36,9 +37,10 @@ private: comphelper::OInterfaceContainerHelper2 m_aPaintListeners; public: - TransportAsXWindow(weld::Widget* pWeldWidget) + TransportAsXWindow(weld::Widget* pWeldWidget, weld::Builder* pWeldWidgetBuilder = nullptr) : TransportAsXWindow_Base(m_aHelperMtx) , m_pWeldWidget(pWeldWidget) + , m_pWeldWidgetBuilder(pWeldWidgetBuilder) , m_aWindowListeners(m_aHelperMtx) , m_aKeyListeners(m_aHelperMtx) , m_aFocusListeners(m_aHelperMtx) @@ -50,7 +52,13 @@ public: weld::Widget* getWidget() const { return m_pWeldWidget; } - virtual void clear() { m_pWeldWidget = nullptr; } + weld::Builder* getBuilder() const { return m_pWeldWidgetBuilder; } + + virtual void clear() + { + m_pWeldWidget = nullptr; + m_pWeldWidgetBuilder = nullptr; + } // css::awt::XWindow void SAL_CALL setPosSize(sal_Int32, sal_Int32, sal_Int32, sal_Int32, sal_Int16) override diff --git a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx index f5c8f7e4955b..25ad4f1a131b 100644 --- a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx +++ b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx @@ -58,13 +58,13 @@ AlignmentPropertyPanel::AlignmentPropertyPanel( , mxCBStacked(m_xBuilder->weld_check_button("stacked")) , mxTextOrientBox(m_xBuilder->weld_widget("textorientbox")) , mxHorizontalAlign(m_xBuilder->weld_toolbar("horizontalalignment")) - , mxHorizontalAlignDispatch(new ToolbarUnoDispatcher(*mxHorizontalAlign, rxFrame)) + , mxHorizontalAlignDispatch(new ToolbarUnoDispatcher(*mxHorizontalAlign, *m_xBuilder, rxFrame)) , mxVertAlign(m_xBuilder->weld_toolbar("verticalalignment")) - , mxVertAlignDispatch(new ToolbarUnoDispatcher(*mxVertAlign, rxFrame)) + , mxVertAlignDispatch(new ToolbarUnoDispatcher(*mxVertAlign, *m_xBuilder, rxFrame)) , mxWriteDirection(m_xBuilder->weld_toolbar("writedirection")) - , mxWriteDirectionDispatch(new ToolbarUnoDispatcher(*mxWriteDirection, rxFrame)) + , mxWriteDirectionDispatch(new ToolbarUnoDispatcher(*mxWriteDirection, *m_xBuilder, rxFrame)) , mxIndentButtons(m_xBuilder->weld_toolbar("indentbuttons")) - , mxIndentButtonsDispatch(new ToolbarUnoDispatcher(*mxIndentButtons, rxFrame)) + , mxIndentButtonsDispatch(new ToolbarUnoDispatcher(*mxIndentButtons, *m_xBuilder, rxFrame)) , maAlignHorControl(SID_H_ALIGNCELL, *pBindings, *this) , maLeftIndentControl(SID_ATTR_ALIGN_INDENT, *pBindings, *this) , maMergeCellControl(FID_MERGE_TOGGLE, *pBindings, *this) diff --git a/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx b/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx index b7e04177dc1a..b3669f5ce786 100644 --- a/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx +++ b/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx @@ -51,10 +51,10 @@ CellAppearancePropertyPanel::CellAppearancePropertyPanel( mxTBCellBorder(m_xBuilder->weld_toolbar("cellbordertype")), mxTBCellBackground(m_xBuilder->weld_toolbar("cellbackgroundcolor")), - mxBackColorDispatch(new ToolbarUnoDispatcher(*mxTBCellBackground, rxFrame)), + mxBackColorDispatch(new ToolbarUnoDispatcher(*mxTBCellBackground, *m_xBuilder, rxFrame)), mxTBLineStyle(m_xBuilder->weld_toolbar("borderlinestyle")), mxTBLineColor(m_xBuilder->weld_toolbar("borderlinecolor")), - mxLineColorDispatch(new ToolbarUnoDispatcher(*mxTBLineColor, rxFrame)), + mxLineColorDispatch(new ToolbarUnoDispatcher(*mxTBLineColor, *m_xBuilder, rxFrame)), mbCellBorderPopoverCreated(false), mbLinePopoverCreated(false), diff --git a/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx b/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx index 653a6494c2b5..ec9e665287b2 100644 --- a/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx +++ b/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx @@ -37,7 +37,7 @@ NumberFormatPropertyPanel::NumberFormatPropertyPanel( : PanelLayout(pParent,"NumberFormatPropertyPanel", "modules/scalc/ui/sidebarnumberformat.ui", rxFrame, true) , mxLbCategory(m_xBuilder->weld_combo_box("category")) , mxTBCategory(m_xBuilder->weld_toolbar("numberformat")) - , mxCatagoryDispatch(new ToolbarUnoDispatcher(*mxTBCategory, rxFrame)) + , mxCatagoryDispatch(new ToolbarUnoDispatcher(*mxTBCategory, *m_xBuilder, rxFrame)) , mxFtDecimals(m_xBuilder->weld_label("decimalplaceslabel")) , mxEdDecimals(m_xBuilder->weld_spin_button("decimalplaces")) , mxFtDenominator(m_xBuilder->weld_label("denominatorplaceslabel")) diff --git a/sfx2/inc/sidebar/ControllerFactory.hxx b/sfx2/inc/sidebar/ControllerFactory.hxx index 66c3e432aebc..5bfc138c8e70 100644 --- a/sfx2/inc/sidebar/ControllerFactory.hxx +++ b/sfx2/inc/sidebar/ControllerFactory.hxx @@ -28,7 +28,10 @@ namespace com::sun::star::frame { class XToolbarController; } class ToolBox; -namespace weld { class Toolbar; } +namespace weld { + class Builder; + class Toolbar; +} namespace sfx2 { namespace sidebar { @@ -48,6 +51,7 @@ public: static css::uno::Reference<css::frame::XToolbarController> CreateToolBoxController( weld::Toolbar& rToolbar, + weld::Builder& rBuilder, const OUString& rsCommandName, const css::uno::Reference<css::frame::XFrame>& rxFrame); diff --git a/sfx2/source/dialog/recfloat.cxx b/sfx2/source/dialog/recfloat.cxx index 28073a3130b9..18833ea5edfa 100644 --- a/sfx2/source/dialog/recfloat.cxx +++ b/sfx2/source/dialog/recfloat.cxx @@ -100,7 +100,7 @@ SfxRecordingFloat_Impl::SfxRecordingFloat_Impl(SfxBindings* pBind, SfxChildWindo : SfxModelessDialogController(pBind, pChildWin, pParent, "sfx/ui/floatingrecord.ui", "FloatingRecord") , m_xToolbar(m_xBuilder->weld_toolbar("toolbar")) - , m_xDispatcher(new ToolbarUnoDispatcher(*m_xToolbar, pBind->GetActiveFrame())) + , m_xDispatcher(new ToolbarUnoDispatcher(*m_xToolbar, *m_xBuilder, pBind->GetActiveFrame())) { // start recording SfxBoolItem aItem( SID_RECORDMACRO, true ); diff --git a/sfx2/source/sidebar/ControllerFactory.cxx b/sfx2/source/sidebar/ControllerFactory.cxx index ef07c0827f7b..71d5a3649007 100644 --- a/sfx2/source/sidebar/ControllerFactory.cxx +++ b/sfx2/source/sidebar/ControllerFactory.cxx @@ -139,11 +139,11 @@ Reference<frame::XToolbarController> ControllerFactory::CreateToolBoxController( } Reference<frame::XToolbarController> ControllerFactory::CreateToolBoxController( - weld::Toolbar& rToolbar, + weld::Toolbar& rToolbar, weld::Builder& rBuilder, const OUString& rsCommandName, const Reference<frame::XFrame>& rxFrame) { - css::uno::Reference<css::awt::XWindow> xWidget(new weld::TransportAsXWindow(&rToolbar)); + css::uno::Reference<css::awt::XWindow> xWidget(new weld::TransportAsXWindow(&rToolbar, &rBuilder)); Reference<frame::XToolbarController> xController( CreateToolBarController( @@ -188,6 +188,8 @@ Reference<frame::XToolbarController> ControllerFactory::CreateToolBoxController( if (xController.is()) { + xController->createItemWindow(xWidget); + Reference<util::XUpdatable> xUpdatable(xController, UNO_QUERY); if (xUpdatable.is()) xUpdatable->update(); diff --git a/sfx2/source/toolbox/weldutils.cxx b/sfx2/source/toolbox/weldutils.cxx index 1be8559d4d87..c35f9047cf20 100644 --- a/sfx2/source/toolbox/weldutils.cxx +++ b/sfx2/source/toolbox/weldutils.cxx @@ -71,10 +71,11 @@ vcl::ImageType ToolbarUnoDispatcher::GetIconSize() const return eType; } -ToolbarUnoDispatcher::ToolbarUnoDispatcher(weld::Toolbar& rToolbar, +ToolbarUnoDispatcher::ToolbarUnoDispatcher(weld::Toolbar& rToolbar, weld::Builder& rBuilder, const css::uno::Reference<css::frame::XFrame>& rFrame) : m_xFrame(rFrame) , m_pToolbar(&rToolbar) + , m_pBuilder(&rBuilder) { rToolbar.connect_clicked(LINK(this, ToolbarUnoDispatcher, SelectHdl)); rToolbar.connect_menu_toggled(LINK(this, ToolbarUnoDispatcher, ToggleMenuHdl)); @@ -112,7 +113,8 @@ ToolbarUnoDispatcher::ToolbarUnoDispatcher(weld::Toolbar& rToolbar, void ToolbarUnoDispatcher::CreateController(const OUString& rCommand) { css::uno::Reference<css::frame::XToolbarController> xController( - sfx2::sidebar::ControllerFactory::CreateToolBoxController(*m_pToolbar, rCommand, m_xFrame)); + sfx2::sidebar::ControllerFactory::CreateToolBoxController(*m_pToolbar, *m_pBuilder, + rCommand, m_xFrame)); if (xController.is()) maControllers.insert(std::make_pair(rCommand, xController)); @@ -190,6 +192,7 @@ void ToolbarUnoDispatcher::dispose() m_pToolbar->connect_clicked(Link<const OString&, void>()); m_pToolbar = nullptr; + m_pBuilder = nullptr; } ToolbarUnoDispatcher::~ToolbarUnoDispatcher() { dispose(); } diff --git a/solenv/clang-format/blacklist b/solenv/clang-format/blacklist index 3de9010b05b0..1d5f5913fdcc 100644 --- a/solenv/clang-format/blacklist +++ b/solenv/clang-format/blacklist @@ -15343,7 +15343,6 @@ sw/source/uibase/app/swdllimpl.hxx sw/source/uibase/app/swmodul1.cxx sw/source/uibase/app/swmodule.cxx sw/source/uibase/app/swwait.cxx -sw/source/uibase/cctrl/actctrl.cxx sw/source/uibase/chrdlg/ccoll.cxx sw/source/uibase/config/StoredChapterNumbering.cxx sw/source/uibase/config/barcfg.cxx @@ -15424,7 +15423,6 @@ sw/source/uibase/inc/SidebarWindowsConsts.hxx sw/source/uibase/inc/SwSpellDialogChildWindow.hxx sw/source/uibase/inc/SwXFilterOptions.hxx sw/source/uibase/inc/abstract.hxx -sw/source/uibase/inc/actctrl.hxx sw/source/uibase/inc/annotsh.hxx sw/source/uibase/inc/ascfldlg.hxx sw/source/uibase/inc/barcfg.hxx diff --git a/solenv/sanitizers/ui/modules/swriter.suppr b/solenv/sanitizers/ui/modules/swriter.suppr index b9ebbdae2f9d..004fce187e42 100644 --- a/solenv/sanitizers/ui/modules/swriter.suppr +++ b/solenv/sanitizers/ui/modules/swriter.suppr @@ -161,6 +161,8 @@ sw/uiconfig/swriter/ui/mmsendmails.ui://GtkProgressBar[@id='progress'] no-labell sw/uiconfig/swriter/ui/mmsendmails.ui://GtkLabel[@id='errorstatus'] orphan-label sw/uiconfig/swriter/ui/mmsalutationpage.ui://GtkLabel[@id='documentindex'] orphan-label sw/uiconfig/swriter/ui/mmsalutationpage.ui://GtkLabel[@id='femalefi'] orphan-label +sw/uiconfig/swriter/ui/navigatorcontextmenu.ui://GtkMenuItem[@id='800'] button-no-label +sw/uiconfig/swriter/ui/navigatorpanel.ui://GtkSpinButton[@id='spinbutton'] no-labelled-by sw/uiconfig/swriter/ui/notebookbar_groups.ui://GtkLabel[@id='filegrouplabel'] orphan-label sw/uiconfig/swriter/ui/notebookbar_groups.ui://GtkLabel[@id='clipboardgrouplabel'] orphan-label sw/uiconfig/swriter/ui/notebookbar_groups.ui://GtkLabel[@id='formatgrouplabel'] orphan-label @@ -195,7 +197,6 @@ sw/uiconfig/swriter/ui/selectaddressdialog.ui://GtkLabel[@id='connecting'] orpha sw/uiconfig/swriter/ui/selecttabledialog.ui://GtkLabel[@id='select'] orphan-label sw/uiconfig/swriter/ui/spellmenu.ui://GtkMenuItem[@id='spelldialog'] button-no-label sw/uiconfig/swriter/ui/spellmenu.ui://GtkMenuItem[@id='correctdialog'] button-no-label -sw/uiconfig/swriter/ui/spinbox.ui://GtkSpinButton[@id='spin'] no-labelled-by sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='nopages'] orphan-label sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='notables'] orphan-label sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='nogrfs'] orphan-label diff --git a/svtools/source/uno/toolboxcontroller.cxx b/svtools/source/uno/toolboxcontroller.cxx index 3ff118f31bb5..2c0292b26565 100644 --- a/svtools/source/uno/toolboxcontroller.cxx +++ b/svtools/source/uno/toolboxcontroller.cxx @@ -62,6 +62,7 @@ ToolboxController::ToolboxController( , m_aCommandURL( aCommandURL ) , m_aListenerContainer( m_aMutex ) , m_pToolbar(nullptr) + , m_pBuilder(nullptr) { OSL_ASSERT( m_xContext.is() ); registerProperty( TOOLBARCONTROLLER_PROPNAME_SUPPORTSVISIBLE, @@ -87,6 +88,7 @@ ToolboxController::ToolboxController() : , m_nToolBoxId( SAL_MAX_UINT16 ) , m_aListenerContainer( m_aMutex ) , m_pToolbar(nullptr) + , m_pBuilder(nullptr) { registerProperty( TOOLBARCONTROLLER_PROPNAME_SUPPORTSVISIBLE, TOOLBARCONTROLLER_PROPHANDLE_SUPPORTSVISIBLE, @@ -217,6 +219,7 @@ void SAL_CALL ToolboxController::initialize( const Sequence< Any >& aArguments ) { m_pToolbar = dynamic_cast<weld::Toolbar*>(pTunnel->getWidget()); assert(m_pToolbar && "must be a toolbar"); + m_pBuilder = pTunnel->getBuilder(); } } diff --git a/svx/source/dialog/dlgctrl.cxx b/svx/source/dialog/dlgctrl.cxx index c061aa742452..f63196c37e2a 100644 --- a/svx/source/dialog/dlgctrl.cxx +++ b/svx/source/dialog/dlgctrl.cxx @@ -1447,7 +1447,7 @@ void padWidthForSidebar(weld::Toolbar& rToolbar, const css::uno::Reference<css:: // of a "standard" column in a two column panel std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(&rToolbar, "svx/ui/measurewidthbar.ui")); std::unique_ptr<weld::Toolbar> xToolbar(xBuilder->weld_toolbar("measurewidth")); - std::unique_ptr<ToolbarUnoDispatcher> xDispatcher(new ToolbarUnoDispatcher(*xToolbar, rFrame)); + std::unique_ptr<ToolbarUnoDispatcher> xDispatcher(new ToolbarUnoDispatcher(*xToolbar, *xBuilder, rFrame)); nColumnWidth = xToolbar->get_preferred_size().Width(); eSize = rToolbar.get_icon_size(); } diff --git a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx index a08ea54e78fc..270b29be96a2 100644 --- a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx +++ b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx @@ -79,7 +79,7 @@ AreaPropertyPanelBase::AreaPropertyPanelBase( mxLbFillGradFrom(new ColorListBox(m_xBuilder->weld_menu_button("fillgrad1"), GetFrameWeld())), mxLbFillGradTo(new ColorListBox(m_xBuilder->weld_menu_button("fillgrad2"), GetFrameWeld())), mxToolBoxColor(m_xBuilder->weld_toolbar("selectcolor")), - mxColorDispatch(new ToolbarUnoDispatcher(*mxToolBoxColor, rxFrame)), + mxColorDispatch(new ToolbarUnoDispatcher(*mxToolBoxColor, *m_xBuilder, rxFrame)), mxTrspTextFT(m_xBuilder->weld_label("transparencylabel")), mxLBTransType(m_xBuilder->weld_combo_box("transtype")), mxMTRTransparent(m_xBuilder->weld_metric_spin_button("settransparency", FieldUnit::PERCENT)), diff --git a/svx/source/sidebar/line/LinePropertyPanelBase.cxx b/svx/source/sidebar/line/LinePropertyPanelBase.cxx index fe7ff32ea3f4..bdb776decf61 100644 --- a/svx/source/sidebar/line/LinePropertyPanelBase.cxx +++ b/svx/source/sidebar/line/LinePropertyPanelBase.cxx @@ -75,9 +75,9 @@ LinePropertyPanelBase::LinePropertyPanelBase( const uno::Reference<css::frame::XFrame>& rxFrame) : PanelLayout(pParent, "LinePropertyPanel", "svx/ui/sidebarline.ui", rxFrame, true), mxTBColor(m_xBuilder->weld_toolbar("color")), - mxColorDispatch(new ToolbarUnoDispatcher(*mxTBColor, rxFrame)), + mxColorDispatch(new ToolbarUnoDispatcher(*mxTBColor, *m_xBuilder, rxFrame)), mxLineStyleTB(m_xBuilder->weld_toolbar("linestyle")), - mxLineStyleDispatch(new ToolbarUnoDispatcher(*mxLineStyleTB, rxFrame)), + mxLineStyleDispatch(new ToolbarUnoDispatcher(*mxLineStyleTB, *m_xBuilder, rxFrame)), mxFTWidth(m_xBuilder->weld_label("widthlabel")), mxTBWidth(m_xBuilder->weld_toolbar("width")), mxFTTransparency(m_xBuilder->weld_label("translabel")), diff --git a/svx/source/sidebar/lists/ListsPropertyPanel.cxx b/svx/source/sidebar/lists/ListsPropertyPanel.cxx index e82c3adfa274..cf9d94cc42bd 100644 --- a/svx/source/sidebar/lists/ListsPropertyPanel.cxx +++ b/svx/source/sidebar/lists/ListsPropertyPanel.cxx @@ -42,9 +42,9 @@ ListsPropertyPanel::ListsPropertyPanel(vcl::Window* pParent, const css::uno::Reference<css::frame::XFrame>& rxFrame) : PanelLayout(pParent, "ListsPropertyPanel", "svx/ui/sidebarlists.ui", rxFrame, true) , mxTBxNumBullet(m_xBuilder->weld_toolbar("numberbullet")) - , mxNumBulletDispatcher(new ToolbarUnoDispatcher(*mxTBxNumBullet, rxFrame)) + , mxNumBulletDispatcher(new ToolbarUnoDispatcher(*mxTBxNumBullet, *m_xBuilder, rxFrame)) , mxTBxOutline(m_xBuilder->weld_toolbar("outline")) - , mxOutlineDispatcher(new ToolbarUnoDispatcher(*mxTBxOutline, rxFrame)) + , mxOutlineDispatcher(new ToolbarUnoDispatcher(*mxTBxOutline, *m_xBuilder, rxFrame)) { } diff --git a/svx/source/sidebar/paragraph/ParaPropertyPanel.cxx b/svx/source/sidebar/paragraph/ParaPropertyPanel.cxx index 75d376eb2dd6..dd39f050d4bd 100644 --- a/svx/source/sidebar/paragraph/ParaPropertyPanel.cxx +++ b/svx/source/sidebar/paragraph/ParaPropertyPanel.cxx @@ -406,22 +406,22 @@ ParaPropertyPanel::ParaPropertyPanel(vcl::Window* pParent, : PanelLayout(pParent, "ParaPropertyPanel", "svx/ui/sidebarparagraph.ui", rxFrame, true), //Alignment mxTBxHorzAlign(m_xBuilder->weld_toolbar("horizontalalignment")), - mxHorzAlignDispatch(new ToolbarUnoDispatcher(*mxTBxHorzAlign, rxFrame)), + mxHorzAlignDispatch(new ToolbarUnoDispatcher(*mxTBxHorzAlign, *m_xBuilder, rxFrame)), mxTBxVertAlign(m_xBuilder->weld_toolbar("verticalalignment")), - mxVertAlignDispatch(new ToolbarUnoDispatcher(*mxTBxVertAlign, rxFrame)), + mxVertAlignDispatch(new ToolbarUnoDispatcher(*mxTBxVertAlign, *m_xBuilder, rxFrame)), //NumBullet&Backcolor mxTBxNumBullet(m_xBuilder->weld_toolbar("numberbullet")), - mxNumBulletDispatch(new ToolbarUnoDispatcher(*mxTBxNumBullet, rxFrame)), + mxNumBulletDispatch(new ToolbarUnoDispatcher(*mxTBxNumBullet, *m_xBuilder, rxFrame)), mxTBxBackColor(m_xBuilder->weld_toolbar("backgroundcolor")), - mxBackColorDispatch(new ToolbarUnoDispatcher(*mxTBxBackColor, rxFrame)), + mxBackColorDispatch(new ToolbarUnoDispatcher(*mxTBxBackColor, *m_xBuilder, rxFrame)), mxTBxWriteDirection(m_xBuilder->weld_toolbar("writedirection")), - mxWriteDirectionDispatch(new ToolbarUnoDispatcher(*mxTBxWriteDirection, rxFrame)), + mxWriteDirectionDispatch(new ToolbarUnoDispatcher(*mxTBxWriteDirection, *m_xBuilder, rxFrame)), mxTBxParaSpacing(m_xBuilder->weld_toolbar("paraspacing")), - mxParaSpacingDispatch(new ToolbarUnoDispatcher(*mxTBxParaSpacing, rxFrame)), + mxParaSpacingDispatch(new ToolbarUnoDispatcher(*mxTBxParaSpacing, *m_xBuilder, rxFrame)), mxTBxLineSpacing(m_xBuilder->weld_toolbar("linespacing")), - mxLineSpacingDispatch(new ToolbarUnoDispatcher(*mxTBxLineSpacing, rxFrame)), + mxLineSpacingDispatch(new ToolbarUnoDispatcher(*mxTBxLineSpacing, *m_xBuilder, rxFrame)), mxTBxIndent(m_xBuilder->weld_toolbar("indent")), - mxIndentDispatch(new ToolbarUnoDispatcher(*mxTBxIndent, rxFrame)), + mxIndentDispatch(new ToolbarUnoDispatcher(*mxTBxIndent, *m_xBuilder, rxFrame)), //Paragraph spacing mxTopDist(new SvxRelativeField(m_xBuilder->weld_metric_spin_button("aboveparaspacing", FieldUnit::CM))), mxBottomDist(new SvxRelativeField(m_xBuilder->weld_metric_spin_button("belowparaspacing", FieldUnit::CM))), diff --git a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx index 18be1aa4d2c5..0f0697a40452 100644 --- a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx +++ b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx @@ -70,9 +70,9 @@ PosSizePropertyPanel::PosSizePropertyPanel( mxDial(new weld::CustomWeld(*m_xBuilder, "orientationcontrol", *mxCtrlDial)), mxFtFlip(m_xBuilder->weld_label("fliplabel")), mxFlipTbx(m_xBuilder->weld_toolbar("selectrotationtype")), - mxFlipDispatch(new ToolbarUnoDispatcher(*mxFlipTbx, rxFrame)), + mxFlipDispatch(new ToolbarUnoDispatcher(*mxFlipTbx, *m_xBuilder, rxFrame)), mxArrangeTbx(m_xBuilder->weld_toolbar("arrangetoolbar")), - mxArrangeDispatch(new ToolbarUnoDispatcher(*mxArrangeTbx, rxFrame)), + mxArrangeDispatch(new ToolbarUnoDispatcher(*mxArrangeTbx, *m_xBuilder, rxFrame)), mxBtnEditChart(m_xBuilder->weld_button("btnEditChart")), maRect(), mpView(nullptr), diff --git a/svx/source/tbxctrls/fillctrl.cxx b/svx/source/tbxctrls/fillctrl.cxx index 8ae4bf58acb5..8b1339ad3e7b 100644 --- a/svx/source/tbxctrls/fillctrl.cxx +++ b/svx/source/tbxctrls/fillctrl.cxx @@ -560,7 +560,7 @@ FillControl::FillControl(vcl::Window* pParent, const css::uno::Reference<css::fr : InterimItemWindow(pParent, "svx/ui/fillctrlbox.ui", "FillCtrlBox") , mxLbFillType(m_xBuilder->weld_combo_box("type")) , mxToolBoxColor(m_xBuilder->weld_toolbar("color")) - , mxColorDispatch(new ToolbarUnoDispatcher(*mxToolBoxColor, rFrame)) + , mxColorDispatch(new ToolbarUnoDispatcher(*mxToolBoxColor, *m_xBuilder, rFrame)) , mxLbFillAttr(m_xBuilder->weld_combo_box("attr")) , mnTypeCurPos(0) , mnAttrCurPos(0) diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk index ec4c3ebc146e..b6d75fd890bf 100644 --- a/sw/Library_sw.mk +++ b/sw/Library_sw.mk @@ -588,7 +588,6 @@ $(eval $(call gb_Library_add_exception_objects,sw,\ sw/source/uibase/dbui/maildispatcher \ sw/source/uibase/dbui/mailmergehelper \ sw/source/uibase/dbui/mmconfigitem \ - sw/source/uibase/cctrl/actctrl \ sw/source/uibase/chrdlg/ccoll \ sw/source/uibase/config/StoredChapterNumbering \ sw/source/uibase/config/barcfg \ diff --git a/sw/UIConfig_swriter.mk b/sw/UIConfig_swriter.mk index 872de3c9912e..ea417c9bfb65 100644 --- a/sw/UIConfig_swriter.mk +++ b/sw/UIConfig_swriter.mk @@ -209,6 +209,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\ sw/uiconfig/swriter/ui/querysavelabeldialog \ sw/uiconfig/swriter/ui/mailmerge \ sw/uiconfig/swriter/ui/managechangessidebar \ + sw/uiconfig/swriter/ui/mastercontextmenu \ sw/uiconfig/swriter/ui/mmaddressblockpage \ sw/uiconfig/swriter/ui/mmcreatingdialog \ sw/uiconfig/swriter/ui/mmlayoutpage \ @@ -220,6 +221,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\ sw/uiconfig/swriter/ui/mmselectpage \ sw/uiconfig/swriter/ui/mmsendmails \ sw/uiconfig/swriter/ui/mmsalutationpage \ + sw/uiconfig/swriter/ui/navigatorcontextmenu \ sw/uiconfig/swriter/ui/navigatorpanel \ sw/uiconfig/swriter/ui/notebookbar \ sw/uiconfig/swriter/ui/notebookbar_compact \ @@ -266,7 +268,6 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\ sw/uiconfig/swriter/ui/sidebartableedit \ sw/uiconfig/swriter/ui/sidebartheme \ sw/uiconfig/swriter/ui/sortdialog \ - sw/uiconfig/swriter/ui/spinbox \ sw/uiconfig/swriter/ui/spellmenu \ sw/uiconfig/swriter/ui/splittable \ sw/uiconfig/swriter/ui/statisticsinfopage \ diff --git a/sw/inc/pch/precompiled_msword.hxx b/sw/inc/pch/precompiled_msword.hxx index 3e8c55bf5942..7271e76cc75c 100644 --- a/sw/inc/pch/precompiled_msword.hxx +++ b/sw/inc/pch/precompiled_msword.hxx @@ -13,7 +13,7 @@ manual changes will be rewritten by the next run of update_pch.sh (which presumably also fixes all possible problems, so it's usually better to use it). - Generated on 2020-02-17 14:43:22 using: + Generated on 2020-03-04 21:21:56 using: ./bin/update_pch sw msword --cutoff=4 --exclude:system --include:module --include:local If after updating build fails, use the following command to locate conflicting headers: @@ -43,6 +43,7 @@ #include <math.h> #include <memory> #include <new> +#include <optional> #include <ostream> #include <set> #include <stddef.h> @@ -55,6 +56,12 @@ #include <unordered_set> #include <utility> #include <vector> +#include <boost/multi_index/composite_key.hpp> +#include <boost/multi_index/identity.hpp> +#include <boost/multi_index/mem_fun.hpp> +#include <boost/multi_index/ordered_index.hpp> +#include <boost/multi_index/random_access_index.hpp> +#include <boost/multi_index_container.hpp> #include <boost/property_tree/ptree_fwd.hpp> #endif // PCH_LEVEL >= 1 #if PCH_LEVEL >= 2 @@ -340,7 +347,6 @@ #include <i18nutil/transliteration.hxx> #include <o3tl/cow_wrapper.hxx> #include <o3tl/enumarray.hxx> -#include <optional> #include <o3tl/safeint.hxx> #include <o3tl/sorted_vector.hxx> #include <o3tl/strong_int.hxx> diff --git a/sw/inc/pch/precompiled_sw.hxx b/sw/inc/pch/precompiled_sw.hxx index bfd07f24abad..90cb78ee1fa4 100644 --- a/sw/inc/pch/precompiled_sw.hxx +++ b/sw/inc/pch/precompiled_sw.hxx @@ -13,7 +13,7 @@ manual changes will be rewritten by the next run of update_pch.sh (which presumably also fixes all possible problems, so it's usually better to use it). - Generated on 2020-02-17 14:43:31 using: + Generated on 2020-03-04 21:22:05 using: ./bin/update_pch sw sw --cutoff=7 --exclude:system --exclude:module --include:local If after updating build fails, use the following command to locate conflicting headers: @@ -35,6 +35,7 @@ #include <map> #include <memory> #include <new> +#include <optional> #include <ostream> #include <set> #include <stddef.h> @@ -68,6 +69,9 @@ #include <rtl/math.hxx> #include <rtl/ref.hxx> #include <rtl/strbuf.hxx> +#include <rtl/string.h> +#include <rtl/stringconcat.hxx> +#include <rtl/stringutils.hxx> #include <rtl/tencinfo.h> #include <rtl/textenc.h> #include <rtl/unload.h> @@ -103,7 +107,6 @@ #include <vcl/imap.hxx> #include <vcl/imapobj.hxx> #include <vcl/keycod.hxx> -#include <vcl/lstbox.hxx> #include <vcl/metric.hxx> #include <vcl/outdev.hxx> #include <vcl/settings.hxx> @@ -274,7 +277,6 @@ #include <o3tl/any.hxx> #include <o3tl/cow_wrapper.hxx> #include <o3tl/deleter.hxx> -#include <optional> #include <o3tl/safeint.hxx> #include <o3tl/sorted_vector.hxx> #include <o3tl/strong_int.hxx> @@ -365,6 +367,7 @@ #include <svx/svdoutl.hxx> #include <svx/svdpage.hxx> #include <svx/svdpagv.hxx> +#include <svx/svdtypes.hxx> #include <svx/svdview.hxx> #include <svx/svxdlg.hxx> #include <svx/svxdllapi.h> @@ -532,6 +535,7 @@ #include <fmtwrapinfluenceonobjpos.hxx> #include <fntcache.hxx> #include <frame.hxx> +#include <frameformats.hxx> #include <frmatr.hxx> #include <frmfmt.hxx> #include <frmmgr.hxx> diff --git a/sw/inc/pch/precompiled_swui.hxx b/sw/inc/pch/precompiled_swui.hxx index 39909eb342bc..cc71c3c666e1 100644 --- a/sw/inc/pch/precompiled_swui.hxx +++ b/sw/inc/pch/precompiled_swui.hxx @@ -13,7 +13,7 @@ manual changes will be rewritten by the next run of update_pch.sh (which presumably also fixes all possible problems, so it's usually better to use it). - Generated on 2020-02-19 12:45:34 using: + Generated on 2020-03-04 21:22:13 using: ./bin/update_pch sw swui --cutoff=3 --exclude:system --include:module --include:local If after updating build fails, use the following command to locate conflicting headers: @@ -40,6 +40,7 @@ #include <math.h> #include <memory> #include <new> +#include <optional> #include <ostream> #include <set> #include <stack> @@ -52,12 +53,6 @@ #include <unordered_map> #include <utility> #include <vector> -#include <boost/multi_index/composite_key.hpp> -#include <boost/multi_index/identity.hpp> -#include <boost/multi_index/mem_fun.hpp> -#include <boost/multi_index/ordered_index.hpp> -#include <boost/multi_index/random_access_index.hpp> -#include <boost/multi_index_container.hpp> #include <boost/property_tree/ptree_fwd.hpp> #endif // PCH_LEVEL >= 1 #if PCH_LEVEL >= 2 @@ -100,6 +95,7 @@ #include <vcl/GraphicExternalLink.hxx> #include <vcl/GraphicObject.hxx> #include <vcl/IDialogRenderable.hxx> +#include <vcl/ITiledRenderable.hxx> #include <vcl/NotebookBarAddonsMerger.hxx> #include <vcl/Scanline.hxx> #include <vcl/accessibletableprovider.hxx> @@ -312,6 +308,7 @@ #include <com/sun/star/view/XPrintJobBroadcaster.hpp> #include <com/sun/star/view/XPrintable.hpp> #include <comphelper/comphelperdllapi.h> +#include <comphelper/lok.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/servicehelper.hxx> #include <comphelper/string.hxx> @@ -367,7 +364,6 @@ #include <i18nutil/transliteration.hxx> #include <o3tl/cow_wrapper.hxx> #include <o3tl/deleter.hxx> -#include <optional> #include <o3tl/safeint.hxx> #include <o3tl/sorted_vector.hxx> #include <o3tl/strong_int.hxx> @@ -398,6 +394,7 @@ #include <sfx2/shell.hxx> #include <sfx2/tabdlg.hxx> #include <sfx2/viewfrm.hxx> +#include <sfx2/viewsh.hxx> #include <sot/exchange.hxx> #include <sot/formats.hxx> #include <sot/sotdllapi.h> diff --git a/sw/inc/pch/precompiled_vbaswobj.hxx b/sw/inc/pch/precompiled_vbaswobj.hxx index 26ed24e28f76..c32c83ecc235 100644 --- a/sw/inc/pch/precompiled_vbaswobj.hxx +++ b/sw/inc/pch/precompiled_vbaswobj.hxx @@ -13,7 +13,7 @@ manual changes will be rewritten by the next run of update_pch.sh (which presumably also fixes all possible problems, so it's usually better to use it). - Generated on 2020-02-14 09:24:51 using: + Generated on 2020-03-04 21:22:17 using: ./bin/update_pch sw vbaswobj --cutoff=4 --exclude:system --include:module --include:local If after updating build fails, use the following command to locate conflicting headers: @@ -43,6 +43,7 @@ #include <math.h> #include <memory> #include <new> +#include <optional> #include <ostream> #include <set> #include <stack> @@ -55,12 +56,6 @@ #include <unordered_map> #include <utility> #include <vector> -#include <boost/multi_index/composite_key.hpp> -#include <boost/multi_index/identity.hpp> -#include <boost/multi_index/mem_fun.hpp> -#include <boost/multi_index/ordered_index.hpp> -#include <boost/multi_index/random_access_index.hpp> -#include <boost/multi_index_container.hpp> #include <boost/property_tree/ptree_fwd.hpp> #endif // PCH_LEVEL >= 1 #if PCH_LEVEL >= 2 @@ -247,7 +242,6 @@ #include <editeng/svxenum.hxx> #include <i18nlangtag/lang.h> #include <o3tl/cow_wrapper.hxx> -#include <optional> #include <o3tl/sorted_vector.hxx> #include <o3tl/strong_int.hxx> #include <o3tl/typed_flags_set.hxx> diff --git a/sw/inc/strings.hrc b/sw/inc/strings.hrc index 4b5c0d7c17c4..dfb17c43a782 100644 --- a/sw/inc/strings.hrc +++ b/sw/inc/strings.hrc @@ -647,12 +647,7 @@ #define STR_OUTLINE_TRACKING_DEFAULT NC_("STR_OUTLINE_TRACKING_DEFAULT", "Default") #define STR_OUTLINE_TRACKING_FOCUS NC_("STR_OUTLINE_TRACKING_FOCUS", "Focus") #define STR_OUTLINE_TRACKING_OFF NC_("STR_OUTLINE_TRACKING_OFF", "Off") -#define STR_GOTO NC_("STR_GOTO", "Go to") -#define STR_SELECT NC_("STR_SELECT", "Select") -#define STR_DEMOTE_CHAPTER NC_("STR_DEMOTE_CHAPTER", "Demote Chapter") -#define STR_PROMOTE_CHAPTER NC_("STR_PROMOTE_CHAPTER", "Promote Chapter") -#define STR_DEMOTE_LEVEL NC_("STR_DEMOTE_LEVEL", "Demote Level") -#define STR_PROMOTE_LEVEL NC_("STR_PROMOTE_LEVEL", "Promote Level") + #define STR_EXPANDALL NC_("STR_EXPANDALL", "Expand All") #define STR_COLLAPSEALL NC_("STR_COLLAPSEALL", "Collapse All") #define STR_HYPERLINK NC_("STR_HYPERLINK", "Insert as Hyperlink") @@ -678,15 +673,10 @@ #define STR_UPDATE_INDEX NC_("STR_UPDATE_INDEX", "Indexes") #define STR_UPDATE_LINK NC_("STR_UPDATE_LINK", "Links") #define STR_UPDATE_ALL NC_("STR_UPDATE_ALL", "All") -#define STR_REMOVE_INDEX NC_("STR_REMOVE_INDEX", "~Remove Index") -#define STR_REMOVE_TBL_PROTECTION NC_("STR_REMOVE_TBL_PROTECTION", "~Unprotect") + #define STR_INVISIBLE NC_("STR_INVISIBLE", "hidden") #define STR_BROKEN_LINK NC_("STR_BROKEN_LINK", "File not found: ") -#define STR_RENAME NC_("STR_RENAME", "~Rename...") -#define STR_READONLY_IDX NC_("STR_READONLY_IDX", "Read-~only") -#define STR_POSTIT_SHOW NC_("STR_POSTIT_SHOW", "Show All") -#define STR_POSTIT_HIDE NC_("STR_POSTIT_HIDE", "Hide All") -#define STR_POSTIT_DELETE NC_("STR_POSTIT_DELETE", "Delete All") + #define STR_RESOLVED NC_("STR_RESOLVED", "RESOLVED") #define STR_PROTECTED NC_("STR_PROTECTED", "Protected") diff --git a/sw/source/uibase/cctrl/actctrl.cxx b/sw/source/uibase/cctrl/actctrl.cxx deleted file mode 100644 index 62bfe65e7d66..000000000000 --- a/sw/source/uibase/cctrl/actctrl.cxx +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#include <actctrl.hxx> -#include <vcl/event.hxx> -#include <vcl/toolbox.hxx> - -NumEditAction::NumEditAction(vcl::Window* pParent) - : InterimItemWindow(pParent, "modules/swriter/ui/spinbox.ui", "SpinBox") - , m_xWidget(m_xBuilder->weld_spin_button("spin")) -{ - m_xWidget->connect_key_press(LINK(this, NumEditAction, KeyInputHdl)); - limitWidth(); - SetSizePixel(m_xContainer->get_preferred_size()); -} - -void NumEditAction::limitWidth() -{ - m_xWidget->set_width_chars(3); -} - -void NumEditAction::set_max(int nMax) -{ - m_xWidget->set_max(nMax); - limitWidth(); -} - -IMPL_LINK(NumEditAction, KeyInputHdl, const KeyEvent&, rKEvt, bool) -{ - return ChildKeyInput(rKEvt); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/inc/actctrl.hxx b/sw/source/uibase/inc/actctrl.hxx deleted file mode 100644 index fdb2feb7109b..000000000000 --- a/sw/source/uibase/inc/actctrl.hxx +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ -#ifndef INCLUDED_SW_SOURCE_UIBASE_INC_ACTCTRL_HXX -#define INCLUDED_SW_SOURCE_UIBASE_INC_ACTCTRL_HXX - -#include <sfx2/InterimItemWindow.hxx> -#include <vcl/weld.hxx> -#include <swdllapi.h> - -// numerical input -class NumEditAction final : public InterimItemWindow -{ -private: - std::unique_ptr<weld::SpinButton> m_xWidget; - - DECL_LINK(KeyInputHdl, const KeyEvent&, bool); - -public: - NumEditAction(vcl::Window* pParent); - - virtual void dispose() override - { - m_xWidget.reset(); - InterimItemWindow::dispose(); - } - - virtual ~NumEditAction() override - { - disposeOnce(); - } - - virtual void GetFocus() override - { - if (m_xWidget) - m_xWidget->grab_focus(); - InterimItemWindow::GetFocus(); - } - - void connect_value_changed(const Link<weld::SpinButton&, void>& rLink) - { - m_xWidget->connect_value_changed(rLink); - } - - int get_value() const - { - return m_xWidget->get_value(); - } - - void set_value(int nValue) - { - m_xWidget->set_value(nValue); - } - - void set_accessible_name(const OUString& rName) - { - m_xWidget->set_accessible_name(rName); - } - - void set_max(int nMax); - - void limitWidth(); -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/inc/conttree.hxx b/sw/source/uibase/inc/conttree.hxx index 3cb48bc804d2..8df62857115f 100644 --- a/sw/source/uibase/inc/conttree.hxx +++ b/sw/source/uibase/inc/conttree.hxx @@ -20,8 +20,7 @@ #define INCLUDED_SW_SOURCE_UIBASE_INC_CONTTREE_HXX #include <svl/lstner.hxx> -#include <vcl/treelistbox.hxx> -#include <vcl/svlbitm.hxx> +#include <ndarr.hxx> #include "swcont.hxx" #include <map> @@ -67,11 +66,25 @@ namespace o3tl { template<> struct typed_flags<MenuEnableFlags> : is_typed_flags<MenuEnableFlags, 0x00ff> {}; } +class SwContentTree; + +class SwContentTreeDropTarget : public DropTargetHelper +{ +private: + SwContentTree& m_rTreeView; + + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; + +public: + SwContentTreeDropTarget(SwContentTree& rTreeView); +}; + /** TreeListBox for content indicator */ -class SwContentTree final - : public SvTreeListBox - , public SfxListener +class SwContentTree final : public SfxListener { + std::unique_ptr<weld::TreeView> m_xTreeView; + SwContentTreeDropTarget m_aDropTargetHelper; VclPtr<SwNavigationPI> m_xDialog; OUString m_sSpace; AutoTimer m_aUpdTimer; @@ -79,16 +92,7 @@ class SwContentTree final o3tl::enumarray<ContentTypeId,std::unique_ptr<SwContentType>> m_aActiveContentArr; o3tl::enumarray<ContentTypeId,std::unique_ptr<SwContentType>> m_aHiddenContentArr; OUString m_aContextStrings[CONTEXT_COUNT + 1]; - OUString m_sRemoveIdx; - OUString m_sUpdateIdx; - OUString m_sUnprotTable; - OUString m_sRename; - OUString m_sReadonlyIdx; OUString m_sInvisible; - OUString m_sPostItShow; - OUString m_sPostItHide; - OUString m_sPostItDelete; - OUString m_sProtected; SwWrtShell* m_pHiddenShell; // dropped Doc SwWrtShell* m_pActiveShell; // the active or a const. open view @@ -98,6 +102,7 @@ class SwContentTree final sal_Int32 m_nActiveBlock; sal_Int32 m_nHiddenBlock; + size_t m_nEntryCount; ContentTypeId m_nRootType; ContentTypeId m_nLastSelType; sal_uInt8 m_nOutlineLevel; @@ -107,20 +112,14 @@ class SwContentTree final enum class State { ACTIVE, CONSTANT, HIDDEN } m_eState; bool m_bDocChgdInDragging :1; - bool m_bIsInternalDrag :1; bool m_bIsRoot :1; bool m_bIsIdleClear :1; bool m_bIsLastReadOnly :1; bool m_bIsOutlineMoveable :1; bool m_bViewHasChanged :1; - static bool bIsInDrag; - - bool m_bIsKeySpace; - tools::Rectangle m_aOldRectangle; - // outline root mode drag & drop - std::vector< SvTreeListEntry* > m_aDndOutlinesSelected; + std::vector<std::unique_ptr<weld::TreeIter>> m_aDndOutlinesSelected; bool m_bIsInPromoteDemote = false; @@ -130,60 +129,57 @@ class SwContentTree final */ void FindActiveTypeAndRemoveUserData(); - using SvTreeListBox::ExecuteDrop; - using SvTreeListBox::EditEntry; + void insert(const weld::TreeIter* pParent, const OUString& rStr, const OUString& rId, + const OUString* pExpanderName, bool bChildrenOnDemand, weld::TreeIter* pRet); - virtual void RequestHelp( const HelpEvent& rHEvt ) override; - virtual void InitEntry(SvTreeListEntry*, const OUString&, const Image&, const Image&) override; - virtual void DataChanged( const DataChangedEvent& rDCEvt ) override; + void remove(const weld::TreeIter& rIter); SwNavigationPI* GetParentWindow(); - virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel ) override; - virtual void DragFinished( sal_Int8 ) override; - virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; - - virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; - bool FillTransferData( TransferDataContainer& rTransfer, sal_Int8& rDragMode ); /** Check if the displayed content is valid. */ bool HasContentChanged(); - virtual DragDropMode NotifyStartDrag( TransferDataContainer& rData, - SvTreeListEntry* ) override; - virtual bool NotifyAcceptDrop( SvTreeListEntry* ) override; - - virtual TriState NotifyMoving( SvTreeListEntry* pTarget, - SvTreeListEntry* pEntry, - SvTreeListEntry*& rpNewParent, - sal_uLong& rNewChildPos - ) override; - virtual TriState NotifyCopying( SvTreeListEntry* pTarget, - SvTreeListEntry* pEntry, - SvTreeListEntry*& rpNewParent, - sal_uLong& rNewChildPos - ) override; - virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override; - virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; - - void EditEntry( SvTreeListEntry const * pEntry, EditEntryMode nMode ); + size_t GetAbsPos(const weld::TreeIter& rIter); + + void EditEntry(const weld::TreeIter& rEntry, EditEntryMode nMode); void GotoContent(const SwContent* pCnt); - static void SetInDrag(bool bSet) {bIsInDrag = bSet;} - virtual VclPtr<PopupMenu> CreateContextMenu() override; - virtual void ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) override; + void ExecuteContextMenuAction(const OString& rSelectedPopupEntry); void DeleteOutlineSelections(); + size_t GetEntryCount() const; + + size_t GetChildCount(const weld::TreeIter& rParent) const; + + std::unique_ptr<weld::TreeIter> GetEntryAtAbsPos(size_t nAbsPos) const; + + void Expand(const weld::TreeIter& rParent, std::vector<std::unique_ptr<weld::TreeIter>>* pNodesToExpand); + + void MoveOutline(SwOutlineNodes::size_type nTargetPos); + + void UpdateLastSelType(); + + /** Expand - Remember the state for content types */ + DECL_LINK(ExpandHdl, const weld::TreeIter&, bool); + /** Collapse - Remember the state for content types. */ + DECL_LINK(CollapseHdl, const weld::TreeIter&, bool); + DECL_LINK(ContentDoubleClickHdl, weld::TreeView&, bool); + DECL_LINK(SelectHdl, weld::TreeView&, void); + DECL_LINK(FocusHdl, weld::Widget&, void); + DECL_LINK(KeyInputHdl, const KeyEvent&, bool); + DECL_LINK(CommandHdl, const CommandEvent&, bool); + DECL_LINK(QueryTooltipHdl, const weld::TreeIter&, OUString); + DECL_LINK(DragBeginHdl, bool&, bool); + DECL_LINK(TimerUpdate, Timer *, void); + public: - SwContentTree(vcl::Window* pParent, SwNavigationPI* pDialog); - virtual ~SwContentTree() override; - virtual void dispose() override; - OUString GetEntryAltText( SvTreeListEntry* pEntry ) const override; - OUString GetEntryLongDescription( SvTreeListEntry* pEntry ) const override; + SwContentTree(std::unique_ptr<weld::TreeView> xTreeView, SwNavigationPI* pDialog); + ~SwContentTree(); SdrObject* GetDrawingObjectsByContent(const SwContent *pCnt); /** Switch the display to Root */ @@ -192,8 +188,8 @@ public: /** Show the file */ void Display( bool bActiveView ); - /** In the Clear the content types have to be deleted, also. */ - void Clear(); + /** In the clear the content types have to be deleted, also. */ + void clear(); /** After a file is dropped on the Navigator, the new shell will be set */ void SetHiddenShell(SwWrtShell* pSh); @@ -209,18 +205,13 @@ public: SwWrtShell* GetWrtShell() { return State::HIDDEN == m_eState ? m_pHiddenShell : m_pActiveShell; } - static bool IsInDrag() {return bIsInDrag;} + bool IsInDrag() const; sal_uInt8 GetOutlineLevel()const {return m_nOutlineLevel;} void SetOutlineLevel(sal_uInt8 nSet); - /** Expand - Remember the state for content types */ - virtual bool Expand( SvTreeListEntry* pParent ) override; - /** Collapse - Remember the state for content types. */ - virtual bool Collapse( SvTreeListEntry* pParent ) override; - /** Execute commands of the Navigator */ - void ExecCommand(const OUString& rCmd, bool bModifier); + void ExecCommand(const OString& rCmd, bool bModifier); void ShowTree(); void HideTree(); @@ -232,56 +223,79 @@ public: const SwWrtShell* GetActiveWrtShell() const {return m_pActiveShell;} SwWrtShell* GetHiddenWrtShell() {return m_pHiddenShell;} - DECL_LINK( ContentDoubleClickHdl, SvTreeListBox*, bool ); - DECL_LINK( TimerUpdate, Timer *, void ); + void Select(); - virtual sal_IntPtr GetTabPos( SvTreeListEntry*, SvLBoxTab* ) override; - virtual void RequestingChildren( SvTreeListEntry* pParent ) override; - virtual void GetFocus() override; - virtual void KeyInput(const KeyEvent& rKEvt) override; - - virtual bool Select( SvTreeListEntry* pEntry, bool bSelect=true ) override; - virtual Size GetOptimalSize() const override; + // return true if it has any children + bool RequestingChildren(const weld::TreeIter& rParent); virtual void Notify(SfxBroadcaster& rBC, SfxHint const& rHint) override; -}; + sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt); + sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt); -// TreeListBox for global documents + bool IsDropFormatSupported(SotClipboardFormatId nFormat) + { + return m_aDropTargetHelper.IsDropFormatSupported(nFormat); + } -class SwLBoxString : public SvLBoxString -{ -public: + void set_accessible_name(const OUString& rName) + { + m_xTreeView->set_accessible_name(rName); + } - SwLBoxString( const OUString& rStr ) : SvLBoxString(rStr) + void grab_focus() { + m_xTreeView->grab_focus(); } - virtual void Paint(const Point& rPos, SvTreeListBox& rDev, vcl::RenderContext& rRenderContext, - const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) override; + int count_selected_rows() const + { + return m_xTreeView->count_selected_rows(); + } + + void set_selection_mode(SelectionMode eMode) + { + m_xTreeView->set_selection_mode(eMode); + } + + weld::TreeView& get_widget() + { + return *m_xTreeView; + } }; namespace sfx2 { class DocumentInserter; } namespace sfx2 { class FileDialogHelper; } -class SwGlobalTree final : public SvTreeListBox +class SwGlobalTree; + +class SwGlobalTreeDropTarget : public DropTargetHelper +{ +private: + SwGlobalTree& m_rTreeView; + + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; + +public: + SwGlobalTreeDropTarget(SwGlobalTree& rTreeView); +}; + +class SwGlobalTree final { private: + std::unique_ptr<weld::TreeView> m_xTreeView; + SwGlobalTreeDropTarget m_aDropTargetHelper; VclPtr<SwNavigationPI> m_xDialog; AutoTimer m_aUpdateTimer; OUString m_aContextStrings[GLOBAL_CONTEXT_COUNT]; SwWrtShell* m_pActiveShell; - SvTreeListEntry* m_pEmphasisEntry; // Drag'n Drop emphasis - SvTreeListEntry* m_pDDSource; // source for Drag'n Drop std::unique_ptr<SwGlblDocContents> m_pSwGlblDocContents; // array with sorted content std::unique_ptr<SwGlblDocContent> m_pDocContent; std::unique_ptr<sfx2::DocumentInserter> m_pDocInserter; - bool m_bIsInternalDrag :1; - bool m_bLastEntryEmphasis :1; // Drag'n Drop - static const SfxObjectShell* pShowShell; void InsertRegion( const SwGlblDocContent* _pContent, @@ -289,48 +303,15 @@ private: DECL_LINK( DialogClosedHdl, sfx2::FileDialogHelper*, void ); - using SvTreeListBox::DoubleClickHdl; - using SvTreeListBox::ExecuteDrop; - using Window::Update; + void Select(); - virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; - - virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; - - virtual void DataChanged( const DataChangedEvent& rDCEvt ) override; - - virtual void RequestHelp( const HelpEvent& rHEvt ) override; - - virtual sal_IntPtr GetTabPos( SvTreeListEntry*, SvLBoxTab* ) override; - virtual TriState NotifyMoving( SvTreeListEntry* pTarget, - SvTreeListEntry* pEntry, - SvTreeListEntry*& rpNewParent, - sal_uLong& rNewChildPos - ) override; - virtual TriState NotifyCopying( SvTreeListEntry* pTarget, - SvTreeListEntry* pEntry, - SvTreeListEntry*& rpNewParent, - sal_uLong& rNewChildPos - ) override; - - virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel ) override; - virtual void DragFinished( sal_Int8 ) override; - virtual DragDropMode NotifyStartDrag( TransferDataContainer& rData, - SvTreeListEntry* ) override; - virtual bool NotifyAcceptDrop( SvTreeListEntry* ) override; - - virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; - virtual void KeyInput(const KeyEvent& rKEvt) override; - virtual void GetFocus() override; - virtual void SelectHdl() override; - virtual void DeselectHdl() override; - virtual void InitEntry(SvTreeListEntry*, const OUString&, const Image&, const Image&) override; - - void Clear(); - - DECL_LINK( PopupHdl, Menu*, bool ); - DECL_LINK( Timeout, Timer*, void ); - DECL_LINK( DoubleClickHdl, SvTreeListBox*, bool ); + DECL_LINK(Timeout, Timer*, void); + DECL_LINK(DoubleClickHdl, weld::TreeView&, bool); + DECL_LINK(SelectHdl, weld::TreeView&, void); + DECL_LINK(FocusInHdl, weld::Widget&, void); + DECL_LINK(KeyInputHdl, const KeyEvent&, bool); + DECL_LINK(CommandHdl, const CommandEvent&, bool); + DECL_LINK(QueryTooltipHdl, const weld::TreeIter&, OUString); SwNavigationPI* GetParentWindow(); @@ -341,16 +322,40 @@ private: static void SetShowShell(const SfxObjectShell*pSet) {pShowShell = pSet;} DECL_STATIC_LINK(SwGlobalTree, ShowFrameHdl, void*, void); - virtual VclPtr<PopupMenu> CreateContextMenu() override; - virtual void ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) override; - public: - SwGlobalTree(vcl::Window* pParent, SwNavigationPI* pDialog); - virtual ~SwGlobalTree() override; - virtual void dispose() override; - virtual Size GetOptimalSize() const override; + SwGlobalTree(std::unique_ptr<weld::TreeView> xTreeView, SwNavigationPI* pDialog); + ~SwGlobalTree(); - void TbxMenuHdl(sal_uInt16 nTbxId, ToolBox* pBox); + bool get_visible() const { return m_xTreeView->get_visible(); } + + void set_accessible_name(const OUString& rName) + { + m_xTreeView->set_accessible_name(rName); + } + + void grab_focus() + { + m_xTreeView->grab_focus(); + } + + int count_selected_rows() const + { + return m_xTreeView->count_selected_rows(); + } + + void set_selection_mode(SelectionMode eMode) + { + m_xTreeView->set_selection_mode(eMode); + } + + weld::TreeView& get_widget() + { + return *m_xTreeView; + } + + void MoveSelectionTo(weld::TreeIter* pDropTarget); + + void TbxMenuHdl(const OString& rCommand, weld::Menu& rMenu); void InsertRegion( const SwGlblDocContent* pCont, const OUString* pFileName = nullptr ); void EditContent(const SwGlblDocContent* pCont ); @@ -358,11 +363,15 @@ public: void ShowTree(); void HideTree(); - void ExecCommand(const OUString& rCmd); + void ExecCommand(const OString& rCmd); void Display(bool bOnlyUpdateUserData = false); bool Update(bool bHard); + + void ExecuteContextMenuAction(const OString& rSelectedPopupEntry); + + const SwWrtShell* GetActiveWrtShell() const {return m_pActiveShell;} }; #endif diff --git a/sw/source/uibase/inc/navipi.hxx b/sw/source/uibase/inc/navipi.hxx index 1404d826da83..1ae6542fb51b 100644 --- a/sw/source/uibase/inc/navipi.hxx +++ b/sw/source/uibase/inc/navipi.hxx @@ -19,9 +19,6 @@ #ifndef INCLUDED_SW_SOURCE_UIBASE_INC_NAVIPI_HXX #define INCLUDED_SW_SOURCE_UIBASE_INC_NAVIPI_HXX -#include <vcl/lstbox.hxx> -#include <vcl/layout.hxx> -#include <vcl/toolbox.hxx> #include <vcl/idle.hxx> #include <svl/lstner.hxx> #include <vcl/transfer.hxx> @@ -30,6 +27,7 @@ #include <sfx2/tbxctrl.hxx> #include <sfx2/sidebar/ControllerItem.hxx> #include <sfx2/sidebar/SidebarToolBox.hxx> +#include <sfx2/weldutils.hxx> #include <svx/sidebar/PanelLayout.hxx> #include "conttree.hxx" #include <ndarr.hxx> @@ -39,7 +37,6 @@ class SwWrtShell; class SwNavigationPI; class SwNavigationChild; class SfxBindings; -class NumEditAction; class SwNavigationConfig; class SwView; class SfxObjectShellLock; @@ -59,17 +56,23 @@ class SwNavigationPI : public PanelLayout ::sfx2::sidebar::ControllerItem m_aDocFullName; ::sfx2::sidebar::ControllerItem m_aPageStats; - VclPtr<sfx2::sidebar::SidebarToolBox> m_aContentToolBox; - VclPtr<ToolBox> m_aGlobalToolBox; - VclPtr<NumEditAction> m_xEdit; - VclPtr<VclContainer> m_aContentBox; - VclPtr<SwContentTree> m_aContentTree; - VclPtr<VclContainer> m_aGlobalBox; - VclPtr<SwGlobalTree> m_aGlobalTree; - VclPtr<ListBox> m_aDocListBox; + std::unique_ptr<weld::Toolbar> m_xContent1ToolBox; + std::unique_ptr<weld::Toolbar> m_xContent2ToolBox; + std::unique_ptr<weld::Toolbar> m_xContent3ToolBox; + std::unique_ptr<ToolbarUnoDispatcher> m_xContent1Dispatch; + std::unique_ptr<weld::Menu> m_xHeadingsMenu; + std::unique_ptr<weld::Menu> m_xDragModeMenu; + std::unique_ptr<weld::Menu> m_xUpdateMenu; + std::unique_ptr<weld::Menu> m_xInsertMenu; + std::unique_ptr<weld::Toolbar> m_xGlobalToolBox; + std::unique_ptr<weld::SpinButton> m_xEdit; + std::unique_ptr<weld::Widget> m_xContentBox; + std::unique_ptr<SwContentTree> m_xContentTree; + std::unique_ptr<weld::Widget> m_xGlobalBox; + std::unique_ptr<SwGlobalTree> m_xGlobalTree; + std::unique_ptr<weld::ComboBox> m_xDocListBox; Idle m_aPageChgIdle; OUString m_sContentFileName; - OUString m_aContextArr[3]; OUString m_aStatusArr[4]; std::unique_ptr<SfxObjectShellLock> m_pxObjectShell; @@ -93,12 +96,15 @@ class SwNavigationPI : public PanelLayout void FillBox(); - DECL_LINK( DocListBoxSelectHdl, ListBox&, void ); - DECL_LINK( ToolBoxSelectHdl, ToolBox *, void ); - DECL_LINK( ToolBoxClickHdl, ToolBox *, void ); - DECL_LINK( ToolBoxDropdownClickHdl, ToolBox*, void ); + DECL_LINK( DocListBoxSelectHdl, weld::ComboBox&, void ); + DECL_LINK( ToolBoxSelectHdl, const OString&, void ); + DECL_LINK( ToolBoxClickHdl, const OString&, void ); + DECL_LINK( ToolBox2DropdownClickHdl, const OString&, void ); + DECL_LINK( ToolBox3DropdownClickHdl, const OString&, void ); DECL_LINK( DoneLink, SfxPoolItem const *, void ); - DECL_LINK( MenuSelectHdl, Menu *, bool ); + DECL_LINK( DropModeMenuSelectHdl, const OString&, void ); + DECL_LINK( HeadingsMenuSelectHdl, const OString&, void ); + DECL_LINK( GlobalMenuSelectHdl, const OString&, void ); DECL_LINK( ChangePageHdl, Timer*, void ); DECL_LINK( PageEditModifyHdl, weld::SpinButton&, void ); bool EditAction(); @@ -109,7 +115,6 @@ protected: // release ObjectShellLock early enough for app end virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; - NumEditAction& GetPageEdit(); void ToggleTree(); void SetGlobalMode(bool bSet) {m_bGlobalMode = bSet;} diff --git a/sw/source/uibase/ribbar/workctrl.cxx b/sw/source/uibase/ribbar/workctrl.cxx index 90ed663b5952..feb999de7fc4 100644 --- a/sw/source/uibase/ribbar/workctrl.cxx +++ b/sw/source/uibase/ribbar/workctrl.cxx @@ -41,6 +41,7 @@ #include <swabstdlg.hxx> #include <sfx2/zoomitem.hxx> #include <vcl/svapp.hxx> +#include <vcl/weldutils.hxx> #include <svx/dialmgr.hxx> #include <svx/strings.hrc> #include <bitmaps.hlst> @@ -566,7 +567,9 @@ VclPtr<vcl::Window> SwJumpToSpecificPageControl::CreateItemWindow( vcl::Window * namespace { +class NavElementBox_Base; class NavElementBox_Impl; + class NavElementToolBoxControl : public svt::ToolboxController, public lang::XServiceInfo { @@ -601,10 +604,46 @@ class NavElementToolBoxControl : public svt::ToolboxController, using svt::ToolboxController::dispatchCommand; private: - VclPtr<NavElementBox_Impl> m_pBox; + VclPtr<NavElementBox_Impl> m_xVclBox; + std::unique_ptr<NavElementBox_Base> m_xWeldBox; + NavElementBox_Base* m_pBox; +}; + +class NavElementBox_Base +{ +public: + NavElementBox_Base(std::unique_ptr<weld::ComboBox> xWidget, + const uno::Reference<frame::XFrame>& _xFrame, + NavElementToolBoxControl& rCtrl); + + virtual ~NavElementBox_Base() + { + } + + void set_sensitive(bool bSensitive) + { + m_xWidget->set_sensitive(bSensitive); + } + + void UpdateBox(); + +protected: + std::unique_ptr<weld::ComboBox> m_xWidget; + NavElementToolBoxControl* m_pCtrl; + bool m_bRelease; + uno::Reference< frame::XFrame > m_xFrame; + + virtual bool DoKeyInput(const KeyEvent& rKEvt); + + DECL_LINK(SelectHdl, weld::ComboBox&, void); + DECL_LINK(KeyInputHdl, const KeyEvent&, bool); + + void ReleaseFocus_Impl(); }; + class NavElementBox_Impl final : public InterimItemWindow + , public NavElementBox_Base { public: NavElementBox_Impl(vcl::Window* pParent, @@ -624,52 +663,48 @@ public: InterimItemWindow::GetFocus(); } + virtual bool DoKeyInput(const KeyEvent& rKEvt) override; + virtual ~NavElementBox_Impl() override { disposeOnce(); } - - void Update(); - -private: - std::unique_ptr<weld::ComboBox> m_xWidget; - NavElementToolBoxControl* m_pCtrl; - bool m_bRelease; - uno::Reference< frame::XFrame > m_xFrame; - - DECL_LINK(SelectHdl, weld::ComboBox&, void); - DECL_LINK(KeyInputHdl, const KeyEvent&, bool); - - void ReleaseFocus_Impl(); }; } -NavElementBox_Impl::NavElementBox_Impl( - vcl::Window* _pParent, +NavElementBox_Base::NavElementBox_Base( + std::unique_ptr<weld::ComboBox> xWidget, const uno::Reference< frame::XFrame >& _xFrame, NavElementToolBoxControl& _rCtrl ) - : InterimItemWindow(_pParent, "modules/swriter/ui/combobox.ui", "ComboBox") - , m_xWidget(m_xBuilder->weld_combo_box("combobox")) + : m_xWidget(std::move(xWidget)) , m_pCtrl(&_rCtrl) , m_bRelease(true) , m_xFrame(_xFrame) { - m_xWidget->set_size_request(42, -1); // set to something small so the size set at the .ui takes precedence + m_xWidget->set_size_request(150, -1); std::map<OUString, std::pair<sal_uInt16, rtl::OUString> > aStoreSortedNavigationIds; - for(sal_uInt16 i = 0; i < NID_COUNT; i++) + for (sal_uInt16 i = 0; i < NID_COUNT; i++) aStoreSortedNavigationIds[SwResId(aNavigationStrIds[i])] = std::make_pair(aNavigationInsertIds[i], aNavigationImgIds[i]);// for ordering of Navigation Pane for (auto const &itr : aStoreSortedNavigationIds) m_xWidget->append(OUString::number(itr.second.first), itr.first, itr.second.second); - m_xWidget->connect_changed(LINK(this, NavElementBox_Impl, SelectHdl)); - m_xWidget->connect_key_press(LINK(this, NavElementBox_Impl, KeyInputHdl)); + m_xWidget->connect_changed(LINK(this, NavElementBox_Base, SelectHdl)); + m_xWidget->connect_key_press(LINK(this, NavElementBox_Base, KeyInputHdl)); +} +NavElementBox_Impl::NavElementBox_Impl( + vcl::Window* _pParent, + const uno::Reference< frame::XFrame >& _xFrame, + NavElementToolBoxControl& _rCtrl ) + : InterimItemWindow(_pParent, "modules/swriter/ui/combobox.ui", "ComboBox") + , NavElementBox_Base(m_xBuilder->weld_combo_box("combobox"), _xFrame, _rCtrl) +{ SetSizePixel(m_xContainer->get_preferred_size()); } -void NavElementBox_Impl::ReleaseFocus_Impl() +void NavElementBox_Base::ReleaseFocus_Impl() { if ( !m_bRelease ) { @@ -681,7 +716,7 @@ void NavElementBox_Impl::ReleaseFocus_Impl() m_xFrame->getContainerWindow()->setFocus(); } -IMPL_LINK(NavElementBox_Impl, SelectHdl, weld::ComboBox&, rComboBox, void) +IMPL_LINK(NavElementBox_Base, SelectHdl, weld::ComboBox&, rComboBox, void) { if (rComboBox.changed_by_direct_pick()) // only when picked from the list { @@ -701,7 +736,7 @@ IMPL_LINK(NavElementBox_Impl, SelectHdl, weld::ComboBox&, rComboBox, void) } } -void NavElementBox_Impl::Update() +void NavElementBox_Base::UpdateBox() { sal_uInt16 nMoveType = SwView::GetMoveType(); for ( size_t i = 0; i < SAL_N_ELEMENTS( aNavigationInsertIds ); ++i ) @@ -716,7 +751,12 @@ void NavElementBox_Impl::Update() } } -IMPL_LINK(NavElementBox_Impl, KeyInputHdl, const KeyEvent&, rKEvt, bool) +IMPL_LINK(NavElementBox_Base, KeyInputHdl, const KeyEvent&, rKEvt, bool) +{ + return DoKeyInput(rKEvt); +} + +bool NavElementBox_Base::DoKeyInput(const KeyEvent& rKEvt) { bool bHandled = false; @@ -743,9 +783,15 @@ IMPL_LINK(NavElementBox_Impl, KeyInputHdl, const KeyEvent&, rKEvt, bool) break; } - return bHandled || ChildKeyInput(rKEvt); + return bHandled; +} + +bool NavElementBox_Impl::DoKeyInput(const KeyEvent& rKEvt) +{ + return NavElementBox_Base::DoKeyInput(rKEvt) || ChildKeyInput(rKEvt); } + NavElementToolBoxControl::NavElementToolBoxControl( const uno::Reference< uno::XComponentContext >& rxContext ) : svt::ToolboxController( rxContext, uno::Reference< frame::XFrame >(), @@ -796,24 +842,26 @@ void SAL_CALL NavElementToolBoxControl::dispose() svt::ToolboxController::dispose(); SolarMutexGuard aSolarMutexGuard; - m_pBox.disposeAndClear(); + m_xVclBox.disposeAndClear(); + m_xWeldBox.reset(); + m_pBox = nullptr; } // XStatusListener void SAL_CALL NavElementToolBoxControl::statusChanged( const frame::FeatureStateEvent& rEvent ) { - if ( m_pBox ) + if (m_pBox) { SolarMutexGuard aSolarMutexGuard; if ( rEvent.FeatureURL.Path == "NavElement" ) { if ( rEvent.IsEnabled ) { - m_pBox->Enable(); - m_pBox->Update(); + m_pBox->set_sensitive(true); + m_pBox->UpdateBox(); } else - m_pBox->Disable(); + m_pBox->set_sensitive(true); } } } @@ -841,12 +889,27 @@ uno::Reference< awt::XWindow > SAL_CALL NavElementToolBoxControl::createItemWind { uno::Reference< awt::XWindow > xItemWindow; - VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( xParent ); - if ( pParent ) + if (m_pBuilder) { SolarMutexGuard aSolarMutexGuard; - m_pBox = VclPtr<NavElementBox_Impl>::Create( pParent, m_xFrame, *this ); - xItemWindow = VCLUnoHelper::GetInterface( m_pBox ); + + std::unique_ptr<weld::ComboBox> xWidget(m_pBuilder->weld_combo_box("NavElementWidget")); + + xItemWindow = css::uno::Reference<css::awt::XWindow>(new weld::TransportAsXWindow(xWidget.get())); + + m_xWeldBox.reset(new NavElementBox_Base(std::move(xWidget), m_xFrame, *this)); + m_pBox = m_xWeldBox.get(); + } + else + { + VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( xParent ); + if ( pParent ) + { + SolarMutexGuard aSolarMutexGuard; + m_xVclBox = VclPtr<NavElementBox_Impl>::Create( pParent, m_xFrame, *this ); + m_pBox = m_xVclBox.get(); + xItemWindow = VCLUnoHelper::GetInterface(m_xVclBox); + } } uno::Reference< util::XURLTransformer > xURLTransformer = getURLTransformer(); @@ -970,13 +1033,17 @@ void SAL_CALL PrevNextScrollToolboxController::dispose() // XStatusListener void SAL_CALL PrevNextScrollToolboxController::statusChanged( const css::frame::FeatureStateEvent& rEvent ) { - if ( rEvent.FeatureURL.Path == "NavElement" ) + if (rEvent.FeatureURL.Path == "NavElement") { - ToolBox* pToolBox = nullptr; - sal_uInt16 nId = 0; - if ( getToolboxId( nId, &pToolBox ) ) - pToolBox->SetQuickHelpText( nId, ( meType == PrevNextScrollToolboxController::PREVIOUS?lcl_GetScrollToolTip( false ): - lcl_GetScrollToolTip( true ) ) ); + if (m_pToolbar) + m_pToolbar->set_item_tooltip_text(m_aCommandURL.toUtf8(), lcl_GetScrollToolTip(meType != PrevNextScrollToolboxController::PREVIOUS)); + else + { + ToolBox* pToolBox = nullptr; + sal_uInt16 nId = 0; + if (getToolboxId(nId, &pToolBox)) + pToolBox->SetQuickHelpText(nId, lcl_GetScrollToolTip(meType != PrevNextScrollToolboxController::PREVIOUS)); + } } } diff --git a/sw/source/uibase/sidebar/TableEditPanel.cxx b/sw/source/uibase/sidebar/TableEditPanel.cxx index 0dec00ec1613..7f4dadbd308f 100644 --- a/sw/source/uibase/sidebar/TableEditPanel.cxx +++ b/sw/source/uibase/sidebar/TableEditPanel.cxx @@ -101,19 +101,19 @@ TableEditPanel::TableEditPanel(vcl::Window* pParent, , m_xColumnWidthEdit( new SvxRelativeField(m_xBuilder->weld_metric_spin_button("columnwidth", FieldUnit::CM))) , m_xInsert(m_xBuilder->weld_toolbar("insert")) - , m_xInsertDispatch(new ToolbarUnoDispatcher(*m_xInsert, rxFrame)) + , m_xInsertDispatch(new ToolbarUnoDispatcher(*m_xInsert, *m_xBuilder, rxFrame)) , m_xSelect(m_xBuilder->weld_toolbar("select")) - , m_xSelectDispatch(new ToolbarUnoDispatcher(*m_xSelect, rxFrame)) + , m_xSelectDispatch(new ToolbarUnoDispatcher(*m_xSelect, *m_xBuilder, rxFrame)) , m_xRowSizing(m_xBuilder->weld_toolbar("rowsizing")) - , m_xRowSizingDispatch(new ToolbarUnoDispatcher(*m_xRowSizing, rxFrame)) + , m_xRowSizingDispatch(new ToolbarUnoDispatcher(*m_xRowSizing, *m_xBuilder, rxFrame)) , m_xColumnSizing(m_xBuilder->weld_toolbar("columnsizing")) - , m_xColumnSizingDispatch(new ToolbarUnoDispatcher(*m_xColumnSizing, rxFrame)) + , m_xColumnSizingDispatch(new ToolbarUnoDispatcher(*m_xColumnSizing, *m_xBuilder, rxFrame)) , m_xDelete(m_xBuilder->weld_toolbar("delete")) - , m_xDeleteDispatch(new ToolbarUnoDispatcher(*m_xDelete, rxFrame)) + , m_xDeleteDispatch(new ToolbarUnoDispatcher(*m_xDelete, *m_xBuilder, rxFrame)) , m_xSplitMerge(m_xBuilder->weld_toolbar("split_merge")) - , m_xSplitMergeDispatch(new ToolbarUnoDispatcher(*m_xSplitMerge, rxFrame)) + , m_xSplitMergeDispatch(new ToolbarUnoDispatcher(*m_xSplitMerge, *m_xBuilder, rxFrame)) , m_xMisc(m_xBuilder->weld_toolbar("misc")) - , m_xMiscDispatch(new ToolbarUnoDispatcher(*m_xMisc, rxFrame)) + , m_xMiscDispatch(new ToolbarUnoDispatcher(*m_xMisc, *m_xBuilder, rxFrame)) , m_aRowHeightController(SID_ATTR_TABLE_ROW_HEIGHT, *pBindings, *this) , m_aColumnWidthController(SID_ATTR_TABLE_COLUMN_WIDTH, *pBindings, *this) , m_aInsertRowsBeforeController(FN_TABLE_INSERT_ROW_BEFORE, *pBindings, *this) diff --git a/sw/source/uibase/sidebar/WrapPropertyPanel.cxx b/sw/source/uibase/sidebar/WrapPropertyPanel.cxx index e0770cba03d4..feb7abf9fc2d 100644 --- a/sw/source/uibase/sidebar/WrapPropertyPanel.cxx +++ b/sw/source/uibase/sidebar/WrapPropertyPanel.cxx @@ -72,7 +72,7 @@ WrapPropertyPanel::WrapPropertyPanel( , maSwLRSpacingControl(SID_ATTR_LRSPACE, *pBindings, *this) , maSwULSpacingControl(SID_ATTR_ULSPACE, *pBindings, *this) , mxWrapOptions(m_xBuilder->weld_toolbar("wrapoptions")) - , mxWrapOptionsDispatch(new ToolbarUnoDispatcher(*mxWrapOptions, rxFrame)) + , mxWrapOptionsDispatch(new ToolbarUnoDispatcher(*mxWrapOptions, *m_xBuilder, rxFrame)) , mxSpacingLB(m_xBuilder->weld_combo_box("spacingLB")) { FieldUnit eMetric = ::GetDfltMetric(false); diff --git a/sw/source/uibase/uitest/uiobject.cxx b/sw/source/uibase/uitest/uiobject.cxx index ecdfd68ad6a8..a0b8da9e9d97 100644 --- a/sw/source/uibase/uitest/uiobject.cxx +++ b/sw/source/uibase/uitest/uiobject.cxx @@ -138,7 +138,7 @@ StringMap SwNavigationPIUIObject::get_state() { StringMap aMap = WindowUIObject::get_state(); - aMap["selectioncount"] = OUString::number(mxSwNavigationPI->m_aContentTree->GetSelectionCount()); + aMap["selectioncount"] = OUString::number(mxSwNavigationPI->m_xContentTree->count_selected_rows()); return aMap; } @@ -147,9 +147,7 @@ void SwNavigationPIUIObject::execute(const OUString& rAction, const StringMap& rParameters) { if (rAction == "ROOT") - { - mxSwNavigationPI->m_aContentToolBox->TriggerItem(mxSwNavigationPI->m_aContentToolBox->GetItemId("root")); - } + mxSwNavigationPI->ToolBoxSelectHdl("root"); else WindowUIObject::execute(rAction, rParameters); } diff --git a/sw/source/uibase/utlui/content.cxx b/sw/source/uibase/utlui/content.cxx index b7f85297087a..51aeea0d77a5 100644 --- a/sw/source/uibase/utlui/content.cxx +++ b/sw/source/uibase/utlui/content.cxx @@ -28,6 +28,7 @@ #include <sfx2/viewfrm.hxx> #include <o3tl/enumrange.hxx> #include <o3tl/sorted_vector.hxx> +#include <vcl/commandevent.hxx> #include <vcl/help.hxx> #include <vcl/settings.hxx> #include <sot/formats.hxx> @@ -69,7 +70,6 @@ #include <dcontact.hxx> #include <svx/svdpage.hxx> #include <svx/svdview.hxx> -#include <vcl/scrbar.hxx> #include <SwRewriter.hxx> #include <hints.hxx> #include <numrule.hxx> @@ -77,7 +77,6 @@ #include <ndtxt.hxx> #include <PostItMgr.hxx> #include <postithelper.hxx> -#include <vcl/treelistentry.hxx> #include <swabstdlg.hxx> #include <bitmaps.hlst> @@ -107,18 +106,16 @@ class SwContentArr { }; -bool SwContentTree::bIsInDrag = false; - namespace { - bool lcl_IsContent(const SvTreeListEntry* pEntry) + bool lcl_IsContent(const weld::TreeIter& rEntry, const weld::TreeView& rTreeView) { - return static_cast<const SwTypeNumber*>(pEntry->GetUserData())->GetTypeId() == CTYPE_CNT; + return reinterpret_cast<const SwTypeNumber*>(rTreeView.get_id(rEntry).toInt64())->GetTypeId() == CTYPE_CNT; } - bool lcl_IsContentType(const SvTreeListEntry* pEntry) + bool lcl_IsContentType(const weld::TreeIter& rEntry, const weld::TreeView& rTreeView) { - return static_cast<const SwTypeNumber*>(pEntry->GetUserData())->GetTypeId() == CTYPE_CTT; + return reinterpret_cast<const SwTypeNumber*>(rTreeView.get_id(rEntry).toInt64())->GetTypeId() == CTYPE_CTT; } bool lcl_FindShell(SwWrtShell const * pShell) @@ -860,47 +857,48 @@ static const char* STR_CONTEXT_ARY[] = STR_OUTLINE_TRACKING_OFF }; -SwContentTree::SwContentTree(vcl::Window* pParent, SwNavigationPI* pDialog) - : SvTreeListBox(pParent) +SwContentTree::SwContentTree(std::unique_ptr<weld::TreeView> xTreeView, SwNavigationPI* pDialog) + : m_xTreeView(std::move(xTreeView)) + , m_aDropTargetHelper(*this) , m_xDialog(pDialog) , m_sSpace(OUString(" ")) - , m_sRemoveIdx(SwResId(STR_REMOVE_INDEX)) - , m_sUpdateIdx(SwResId(STR_UPDATE)) - , m_sUnprotTable(SwResId(STR_REMOVE_TBL_PROTECTION)) - , m_sRename(SwResId(STR_RENAME)) - , m_sReadonlyIdx(SwResId(STR_READONLY_IDX)) , m_sInvisible(SwResId(STR_INVISIBLE)) - , m_sPostItShow(SwResId(STR_POSTIT_SHOW)) - , m_sPostItHide(SwResId(STR_POSTIT_HIDE)) - , m_sPostItDelete(SwResId(STR_POSTIT_DELETE)) - , m_sProtected(SwResId(STR_PROTECTED)) , m_pHiddenShell(nullptr) , m_pActiveShell(nullptr) , m_pConfig(SW_MOD()->GetNavigationConfig()) , m_nActiveBlock(0) , m_nHiddenBlock(0) + , m_nEntryCount(0) , m_nRootType(ContentTypeId::UNKNOWN) , m_nLastSelType(ContentTypeId::UNKNOWN) , m_nOutlineLevel(MAXLEVEL) , m_eState(State::ACTIVE) , m_bDocChgdInDragging(false) - , m_bIsInternalDrag(false) , m_bIsRoot(false) , m_bIsIdleClear(false) , m_bIsLastReadOnly(false) , m_bIsOutlineMoveable(true) , m_bViewHasChanged(false) - , m_bIsKeySpace(false) { - SetHelpId(HID_NAVIGATOR_TREELIST); + Size aSize(m_xDialog->LogicToPixel(Size(110, 112), MapMode(MapUnit::MapAppFont))); + m_xTreeView->set_size_request(aSize.Width(), aSize.Height()); + + m_xTreeView->set_help_id(HID_NAVIGATOR_TREELIST); + + m_xTreeView->connect_expanding(LINK(this, SwContentTree, ExpandHdl)); + m_xTreeView->connect_collapsing(LINK(this, SwContentTree, CollapseHdl)); + m_xTreeView->connect_row_activated(LINK(this, SwContentTree, ContentDoubleClickHdl)); + m_xTreeView->connect_changed(LINK(this, SwContentTree, SelectHdl)); + m_xTreeView->connect_focus_in(LINK(this, SwContentTree, FocusHdl)); + m_xTreeView->connect_key_press(LINK(this, SwContentTree, KeyInputHdl)); + m_xTreeView->connect_popup_menu(LINK(this, SwContentTree, CommandHdl)); + m_xTreeView->connect_query_tooltip(LINK(this, SwContentTree, QueryTooltipHdl)); + m_xTreeView->connect_drag_begin(LINK(this, SwContentTree, DragBeginHdl)); - SetNodeDefaultImages(); - SetDoubleClickHdl(LINK(this, SwContentTree, ContentDoubleClickHdl)); - SetDragDropMode(DragDropMode::APP_COPY); for (ContentTypeId i : o3tl::enumrange<ContentTypeId>()) { - m_aActiveContentArr[i] = nullptr; - m_aHiddenContentArr[i] = nullptr; + m_aActiveContentArr[i] = nullptr; + m_aHiddenContentArr[i] = nullptr; } for (int i = 0; i < CONTEXT_COUNT; ++i) { @@ -909,275 +907,110 @@ SwContentTree::SwContentTree(vcl::Window* pParent, SwNavigationPI* pDialog) m_nActiveBlock = m_pConfig->GetActiveBlock(); m_aUpdTimer.SetInvokeHandler(LINK(this, SwContentTree, TimerUpdate)); m_aUpdTimer.SetTimeout(1000); - Clear(); - EnableContextMenuHandling(); - SetQuickSearch(true); } SwContentTree::~SwContentTree() { - disposeOnce(); -} - -void SwContentTree::dispose() -{ - Clear(); // If applicable erase content types previously. - bIsInDrag = false; + clear(); // If applicable erase content types previously. m_aUpdTimer.Stop(); SetActiveShell(nullptr); m_xDialog.clear(); - SvTreeListBox::dispose(); -} - -Size SwContentTree::GetOptimalSize() const -{ - return LogicToPixel(Size(110, 112), MapMode(MapUnit::MapAppFont)); } -OUString SwContentTree::GetEntryAltText( SvTreeListEntry* pEntry ) const -{ - if (pEntry == nullptr || !lcl_IsContent(pEntry)) - return OUString(); - - assert(pEntry->GetUserData() == nullptr || dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwContent* pCnt = static_cast<SwContent*>(pEntry->GetUserData()); - if( pCnt == nullptr || pCnt->GetParent() == nullptr) - return OUString(); - - ContentTypeId nJumpType = pCnt->GetParent()->GetType(); - SdrObject* pTemp; - - switch(nJumpType) - { - case ContentTypeId::DRAWOBJECT: - { - SdrView* pDrawView = m_pActiveShell->GetDrawView(); - if (pDrawView) - { - SwDrawModel* pDrawModel = m_pActiveShell->GetDoc()->getIDocumentDrawModelAccess().GetDrawModel(); - SdrPage* pPage = pDrawModel->GetPage(0); - const size_t nCount = pPage->GetObjCount(); - for( size_t i=0; i<nCount; ++i ) - { - pTemp = pPage->GetObj(i); - sal_uInt16 nCmpId; - switch( pTemp->GetObjIdentifier() ) - { - case OBJ_GRUP: - case OBJ_TEXT: - case OBJ_LINE: - case OBJ_RECT: - case OBJ_CUSTOMSHAPE: - case OBJ_CIRC: - case OBJ_SECT: - case OBJ_CARC: - case OBJ_CCUT: - case OBJ_POLY: - case OBJ_PLIN: - case OBJ_PATHLINE: - case OBJ_PATHFILL: - case OBJ_FREELINE: - case OBJ_FREEFILL: - case OBJ_PATHPOLY: - case OBJ_PATHPLIN: - case OBJ_CAPTION: - nCmpId = OBJ_GRUP; - break; - default: - nCmpId = pTemp->GetObjIdentifier(); - } - if(nCmpId == OBJ_GRUP && pTemp->GetName() == pCnt->GetName()) - { - return pTemp->GetTitle(); - } - } - } - } - break; - case ContentTypeId::GRAPHIC : - { - if( m_pActiveShell && m_pActiveShell->GetDoc() ) - { - const SwFlyFrameFormat* pFrameFormat = m_pActiveShell->GetDoc()->FindFlyByName( pCnt->GetName()); - if( pFrameFormat ) - return pFrameFormat->GetObjTitle(); - } - } - break; - case ContentTypeId::OLE : - case ContentTypeId::FRAME : - { - //Can't find the GetAlternateText function. Need to verify again. - const SwFlyFrameFormat* pFlyFormat = m_pActiveShell->GetDoc()->FindFlyByName( pCnt->GetName()); - if( pFlyFormat ) - return pFlyFormat->/*GetAlternateText*/GetName(); - } - break; - default: break; - } - return OUString(); -} - -OUString SwContentTree::GetEntryLongDescription( SvTreeListEntry* pEntry ) const +// Drag&Drop methods +IMPL_LINK(SwContentTree, DragBeginHdl, bool&, rUnsetDragIcon, bool) { - if( pEntry == nullptr) - return OUString(); - - assert(pEntry->GetUserData() == nullptr || dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwContent* pCnt = static_cast<SwContent*>(pEntry->GetUserData()); - if( pCnt == nullptr || pCnt->GetParent() == nullptr) - return OUString(); - - SdrObject* pTemp; - - switch(pCnt->GetParent()->GetType()) - { - case ContentTypeId::DRAWOBJECT: - { - SdrView* pDrawView = m_pActiveShell->GetDrawView(); - if (pDrawView) - { - SwDrawModel* pDrawModel = m_pActiveShell->GetDoc()->getIDocumentDrawModelAccess().GetDrawModel(); - SdrPage* pPage = pDrawModel->GetPage(0); - const size_t nCount = pPage->GetObjCount(); - for( size_t i=0; i<nCount; ++i ) - { - pTemp = pPage->GetObj(i); - sal_uInt16 nCmpId; - switch( pTemp->GetObjIdentifier() ) - { - case OBJ_GRUP: - case OBJ_TEXT: - case OBJ_LINE: - case OBJ_RECT: - case OBJ_CUSTOMSHAPE: - case OBJ_CIRC: - case OBJ_SECT: - case OBJ_CARC: - case OBJ_CCUT: - case OBJ_POLY: - case OBJ_PLIN: - case OBJ_PATHLINE: - case OBJ_PATHFILL: - case OBJ_FREELINE: - case OBJ_FREEFILL: - case OBJ_PATHPOLY: - case OBJ_PATHPLIN: - case OBJ_CAPTION: - nCmpId = OBJ_GRUP; - break; - default: - nCmpId = pTemp->GetObjIdentifier(); - } - if(nCmpId == OBJ_GRUP /*dynamic_cast< const SdrObjGroup *>( pTemp ) != nullptr*/ && pTemp->GetName() == pCnt->GetName()) - { - return pTemp->GetDescription(); - } - } - } - } - break; - case ContentTypeId::GRAPHIC : - case ContentTypeId::OLE : - case ContentTypeId::FRAME : - { - //Can't find the function "GetLongDescription". Need to verify again. - const SwFlyFrameFormat* pFlyFormat = m_pActiveShell->GetDoc()->FindFlyByName( pCnt->GetName()); - if( pFlyFormat ) - return pFlyFormat->GetDescription(); - } - break; - default: break; - } - return OUString(); -} + rUnsetDragIcon = true; -// Drag&Drop methods + bool bDisallow = true; -void SwContentTree::StartDrag( sal_Int8 nAction, const Point& rPosPixel ) -{ - if( !m_bIsRoot || m_nRootType != ContentTypeId::OUTLINE ) - { - ReleaseMouse(); + rtl::Reference<TransferDataContainer> xContainer = new TransferDataContainer; + sal_Int8 nDragMode = DND_ACTION_COPYMOVE | DND_ACTION_LINK; - rtl::Reference<TransferDataContainer> pContainer = new TransferDataContainer; + if (FillTransferData(*xContainer, nDragMode)) + bDisallow = false; - sal_Int8 nDragMode = DND_ACTION_COPYMOVE | DND_ACTION_LINK; - if( FillTransferData( *pContainer, nDragMode )) - { - SwContentTree::SetInDrag(true); - pContainer->StartDrag( this, nDragMode, GetDragFinishedHdl() ); - } - } - else + if (m_bIsRoot && m_nRootType == ContentTypeId::OUTLINE) { - SwWrtShell *const pShell = GetWrtShell(); - pShell->StartAllAction(); - pShell->StartUndo(SwUndoId::OUTLINE_UD); // Only move drag entry and continuous selected siblings: m_aDndOutlinesSelected.clear(); - SvTreeListEntry* pEntry = GetEntry(rPosPixel); + + std::unique_ptr<weld::TreeIter> xScratch(m_xTreeView->make_iterator()); + + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + bool bEntry = m_xTreeView->get_selected(xEntry.get()); + if (!bEntry) + return true; // disallow // Find first selected of continuous siblings - while (pEntry && IsSelected(pEntry->PrevSibling())) + while (true) { - pEntry = pEntry->PrevSibling(); + m_xTreeView->copy_iterator(*xEntry, *xScratch); + if (!m_xTreeView->iter_previous_sibling(*xScratch)) + break; + if (!m_xTreeView->is_selected(*xScratch)) + break; + m_xTreeView->copy_iterator(*xScratch, *xEntry); } // Record continuous selected siblings - if (pEntry) + do { - m_aDndOutlinesSelected.push_back(pEntry); - while (pEntry && IsSelected(pEntry->NextSibling())) - { - pEntry = pEntry->NextSibling(); - m_aDndOutlinesSelected.push_back(pEntry); - } + m_aDndOutlinesSelected.push_back(m_xTreeView->make_iterator(xEntry.get())); } - SvTreeListBox::StartDrag( nAction, rPosPixel ); + while (m_xTreeView->iter_next_sibling(*xEntry) && m_xTreeView->is_selected(*xEntry)); + bDisallow = false; } + + if (!bDisallow) + m_xTreeView->enable_drag_source(xContainer, nDragMode); + return bDisallow; } -void SwContentTree::DragFinished( sal_Int8 nAction ) +SwContentTreeDropTarget::SwContentTreeDropTarget(SwContentTree& rTreeView) + : DropTargetHelper(rTreeView.get_widget().get_drop_target()) + , m_rTreeView(rTreeView) { - if (m_bIsRoot && m_nRootType == ContentTypeId::OUTLINE) +} + +sal_Int8 SwContentTreeDropTarget::AcceptDrop(const AcceptDropEvent& rEvt) +{ + sal_Int8 nAccept = m_rTreeView.AcceptDrop(rEvt); + + if (nAccept != DND_ACTION_NONE) { - SwWrtShell *const pShell = GetWrtShell(); - pShell->EndUndo(); - pShell->EndAllAction(); - m_aActiveContentArr[ContentTypeId::OUTLINE]->Invalidate(); - Display(true); - m_aDndOutlinesSelected.clear(); + // to enable the autoscroll when we're close to the edges + weld::TreeView& rWidget = m_rTreeView.get_widget(); + rWidget.get_dest_row_at_pos(rEvt.maPosPixel, nullptr); } - // To prevent the removing of the selected entry in external drag and drop - // the drag action mustn't be MOVE. - SvTreeListBox::DragFinished( m_bIsInternalDrag ? nAction : DND_ACTION_COPY ); - SwContentTree::SetInDrag(false); - m_bIsInternalDrag = false; + return nAccept; } -// QueryDrop will be executed in the navigator +bool SwContentTree::IsInDrag() const +{ + return m_xTreeView->get_drag_source() == m_xTreeView.get(); +} -sal_Int8 SwContentTree::AcceptDrop( const AcceptDropEvent& rEvt ) +// QueryDrop will be executed in the navigator +sal_Int8 SwContentTree::AcceptDrop(const AcceptDropEvent& rEvt) { sal_Int8 nRet = DND_ACTION_NONE; if( m_bIsRoot ) { if( m_bIsOutlineMoveable ) - nRet = SvTreeListBox::AcceptDrop( rEvt ); + nRet = rEvt.mnAction; } - else if( !bIsInDrag ) + else if (!IsInDrag()) nRet = GetParentWindow()->AcceptDrop(); return nRet; } // Drop will be executed in the navigator - -static void* lcl_GetOutlineKey( SwContentTree* pTree, SwOutlineContent const * pContent) +static void* lcl_GetOutlineKey(SwContentTree& rTree, SwOutlineContent const * pContent) { void* key = nullptr; - if( pTree && pContent ) + if (pContent) { - SwWrtShell* pShell = pTree->GetWrtShell(); + SwWrtShell* pShell = rTree.GetWrtShell(); auto const nPos = pContent->GetOutlinePos(); key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos )); @@ -1185,74 +1018,142 @@ static void* lcl_GetOutlineKey( SwContentTree* pTree, SwOutlineContent const * p return key; } -sal_Int8 SwContentTree::ExecuteDrop( const ExecuteDropEvent& rEvt ) +sal_Int8 SwContentTreeDropTarget::ExecuteDrop(const ExecuteDropEvent& rEvt) { - SvTreeListEntry* pEntry = pTargetEntry; - if( pEntry && ( m_nRootType == ContentTypeId::OUTLINE ) && lcl_IsContent( pEntry ) ) + return m_rTreeView.ExecuteDrop(rEvt); +} + +sal_Int8 SwContentTree::ExecuteDrop(const ExecuteDropEvent& rEvt) +{ + std::unique_ptr<weld::TreeIter> xDropEntry(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_dest_row_at_pos(rEvt.maPosPixel, xDropEntry.get())) + xDropEntry.reset(); + + if (m_nRootType == ContentTypeId::OUTLINE) { - assert(pEntry->GetUserData() == nullptr || dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwOutlineContent* pOutlineContent = static_cast<SwOutlineContent*>(pEntry->GetUserData()); - if( pOutlineContent ) + if (xDropEntry && lcl_IsContent(*xDropEntry, *m_xTreeView)) { - void* key = lcl_GetOutlineKey(this, pOutlineContent); - if( !mOutLineNodeMap[key] ) + assert(dynamic_cast<SwContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xDropEntry).toInt64()))); + SwOutlineContent* pOutlineContent = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xDropEntry).toInt64()); + assert(pOutlineContent); + + void* key = lcl_GetOutlineKey(*this, pOutlineContent); + assert(key); + if (!mOutLineNodeMap[key]) { - while( pEntry->HasChildren() ) + while (m_xTreeView->iter_has_child(*xDropEntry)) { - SvTreeListEntry* pChildEntry = FirstChild( pEntry ); - while( pChildEntry ) + std::unique_ptr<weld::TreeIter> xChildEntry(m_xTreeView->make_iterator(xDropEntry.get())); + bool bChildEntry = m_xTreeView->iter_children(*xChildEntry); + while (bChildEntry) { - pEntry = pChildEntry; - pChildEntry = pChildEntry->NextSibling(); + m_xTreeView->copy_iterator(*xChildEntry, *xDropEntry); + bChildEntry = m_xTreeView->iter_next_sibling(*xChildEntry); } } - pTargetEntry = pEntry; } } + + SwOutlineNodes::size_type nTargetPos = 0; + if (!xDropEntry) + { + // dropped in blank space -> move to bottom + nTargetPos = GetWrtShell()->getIDocumentOutlineNodesAccess()->getOutlineNodesCount() - 1; + } + else if (!lcl_IsContent(*xDropEntry, *m_xTreeView)) + { + // dropped on "heading" parent -> move to start + nTargetPos = SwOutlineNodes::npos; + } + else + { + assert(dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xDropEntry).toInt64()))); + nTargetPos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xDropEntry).toInt64())->GetOutlinePos(); + } + + if( MAXLEVEL > m_nOutlineLevel && // Not all layers are displayed. + nTargetPos != SwOutlineNodes::npos) + { + std::unique_ptr<weld::TreeIter> xNext(m_xTreeView->make_iterator(xDropEntry.get())); + bool bNext = m_xTreeView->iter_next(*xNext); + if (bNext) + { + assert(dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xNext).toInt64()))); + nTargetPos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xNext).toInt64())->GetOutlinePos() - 1; + } + else + nTargetPos = GetWrtShell()->getIDocumentOutlineNodesAccess()->getOutlineNodesCount() - 1; + } + + MoveOutline(nTargetPos); + } - if( m_bIsRoot ) - return SvTreeListBox::ExecuteDrop( rEvt ); - return bIsInDrag ? DND_ACTION_NONE : GetParentWindow()->ExecuteDrop(rEvt); + return IsInDrag() ? DND_ACTION_NONE : GetParentWindow()->ExecuteDrop(rEvt); } -// Handler for Dragging and ContextMenu +namespace +{ + bool IsAllExpanded(const weld::TreeView& rContentTree, const weld::TreeIter& rEntry) + { + if (!rContentTree.get_row_expanded(rEntry)) + return false; + + if (!rContentTree.iter_has_child(rEntry)) + return false; + + std::unique_ptr<weld::TreeIter> xChild(rContentTree.make_iterator(&rEntry)); + rContentTree.iter_children(*xChild); + + do + { + if (rContentTree.iter_has_child(*xChild) || rContentTree.get_children_on_demand(*xChild)) + { + if (!IsAllExpanded(rContentTree, *xChild)) + return false; + } + } + while (rContentTree.iter_next_sibling(*xChild)); + return true; + } +} -static void lcl_InsertExpandCollapseAllItem(SwContentTree* pContentTree, SvTreeListEntry* pEntry, PopupMenu* pPop) +// Handler for Dragging and ContextMenu +static bool lcl_InsertExpandCollapseAllItem(weld::TreeView& rContentTree, weld::TreeIter& rEntry, weld::Menu& rPop) { - if(pEntry->HasChildren() || pEntry->HasChildrenOnDemand()) + if (rContentTree.iter_has_child(rEntry) || rContentTree.get_children_on_demand(rEntry)) { - pPop->InsertSeparator(); - pPop->InsertItem(800, pContentTree->IsAllExpanded(pEntry) ? SwResId(STR_COLLAPSEALL) : SwResId(STR_EXPANDALL)); - pPop->SetAccelKey(800, vcl::KeyCode(KEY_MULTIPLY, false, true, false, false)); + rPop.set_label(OString::number(800), IsAllExpanded(rContentTree, rEntry) ? SwResId(STR_COLLAPSEALL) : SwResId(STR_EXPANDALL)); + return false; } + return true; } -VclPtr<PopupMenu> SwContentTree::CreateContextMenu() +IMPL_LINK(SwContentTree, CommandHdl, const CommandEvent&, rCEvt, bool) { - bool bOutline(false); + if (rCEvt.GetCommand() != CommandEventId::ContextMenu) + return false; - auto pPop = VclPtr<PopupMenu>::Create(); - VclPtrInstance<PopupMenu> pSubPop1; - VclPtrInstance<PopupMenu> pSubPop2; - VclPtrInstance<PopupMenu> pSubPop3; - VclPtrInstance<PopupMenu> pSubPopOutlineTracking; + std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xTreeView.get(), "modules/swriter/ui/navigatorcontextmenu.ui")); + std::unique_ptr<weld::Menu> xPop = xBuilder->weld_menu("navmenu"); + + bool bOutline(false); + std::unique_ptr<weld::Menu> xSubPop1 = xBuilder->weld_menu("outlinelevel"); + std::unique_ptr<weld::Menu> xSubPop2 = xBuilder->weld_menu("dragmodemenu"); + std::unique_ptr<weld::Menu> xSubPop3 = xBuilder->weld_menu("displaymenu"); + std::unique_ptr<weld::Menu> xSubPopOutlineTracking = xBuilder->weld_menu("outlinetracking"); for(int i = 1; i <= 3; ++i) - { - pSubPopOutlineTracking->InsertItem(i + 10, m_aContextStrings[i + IDX_STR_OUTLINE_TRACKING], MenuItemBits::AUTOCHECK | MenuItemBits::RADIOCHECK); - } - pSubPopOutlineTracking->CheckItem(10 + m_nOutlineTracking); - for(int i = 1; i <= MAXLEVEL; ++i) - { - pSubPop1->InsertItem(i + 100, OUString::number(i), MenuItemBits::AUTOCHECK | MenuItemBits::RADIOCHECK); - } - pSubPop1->CheckItem(100 + m_nOutlineLevel); - for(int i=0; i < 3; ++i) - { - pSubPop2->InsertItem(i + 201, m_aContextStrings[ - IDX_STR_HYPERLINK + i], MenuItemBits::AUTOCHECK | MenuItemBits::RADIOCHECK); - } - pSubPop2->CheckItem(201 + static_cast<int>(GetParentWindow()->GetRegionDropMode())); + xSubPopOutlineTracking->append_radio(OUString::number(i + 10), m_aContextStrings[IDX_STR_OUTLINE_TRACKING + i]); + xSubPopOutlineTracking->set_active(OString::number(10 + m_nOutlineTracking), true); + + for (int i = 1; i <= MAXLEVEL; ++i) + xSubPop1->append_radio(OUString::number(i + 100), OUString::number(i)); + xSubPop1->set_active(OString::number(100 + m_nOutlineLevel), true); + + for (int i=0; i < 3; ++i) + xSubPop2->append_radio(OUString::number(i + 201), m_aContextStrings[IDX_STR_HYPERLINK + i]); + xSubPop2->set_active(OString::number(201 + static_cast<int>(GetParentWindow()->GetRegionDropMode())), true); + // Insert the list of the open files sal_uInt16 nId = 301; const SwView* pActiveView = ::GetActiveView(); @@ -1260,49 +1161,61 @@ VclPtr<PopupMenu> SwContentTree::CreateContextMenu() while (pView) { OUString sInsert = pView->GetDocShell()->GetTitle(); - if(pView == pActiveView) + if (pView == pActiveView) { sInsert += "(" + m_aContextStrings[IDX_STR_ACTIVE] + ")"; } - pSubPop3->InsertItem(nId, sInsert, MenuItemBits::AUTOCHECK | MenuItemBits::RADIOCHECK); + xSubPop3->append_radio(OUString::number(nId), sInsert); if (State::CONSTANT == m_eState && m_pActiveShell == &pView->GetWrtShell()) - pSubPop3->CheckItem(nId); + xSubPop3->set_active(OString::number(nId), true); pView = SwModule::GetNextView(pView); nId++; } - pSubPop3->InsertItem(nId++, m_aContextStrings[IDX_STR_ACTIVE_VIEW], MenuItemBits::AUTOCHECK | MenuItemBits::RADIOCHECK); - if(m_pHiddenShell) + xSubPop3->append_radio(OUString::number(nId++), m_aContextStrings[IDX_STR_ACTIVE_VIEW]); + if (m_pHiddenShell) { OUString sHiddenEntry = m_pHiddenShell->GetView().GetDocShell()->GetTitle() + " ( " + m_aContextStrings[IDX_STR_HIDDEN] + " )"; - pSubPop3->InsertItem(nId, sHiddenEntry, MenuItemBits::AUTOCHECK | MenuItemBits::RADIOCHECK); + xSubPop3->append_radio(OUString::number(nId), sHiddenEntry); } if (State::ACTIVE == m_eState) - pSubPop3->CheckItem( --nId ); + xSubPop3->set_active(OString::number(--nId), true); else if (State::HIDDEN == m_eState) - pSubPop3->CheckItem( nId ); + xSubPop3->set_active(OString::number(nId), true); + + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_selected(xEntry.get())) + xEntry.reset(); + + if (!xEntry || !lcl_IsContent(*xEntry, *m_xTreeView)) + xPop->remove(OString::number(900)); // go to + + bool bRemovePostItEntries = true; + bool bRemoveIndexEntries = true; + bool bRemoveEditEntry = true; + bool bRemoveUnprotectEntry = true; + bool bRemoveDeleteEntry = true; + bool bRemoveRenameEntry = true; + bool bRemoveSelectEntry = true; + bool bRemoveToggleExpandEntry = true; + bool bRemoveChapterEntries = true; + bool bRemoveSendOutlineEntry = true; - SvTreeListEntry* pEntry = FirstSelected(); - if (pEntry && lcl_IsContent(pEntry)) - { - pPop->InsertItem(900, SwResId(STR_GOTO)); - pPop->SetAccelKey(900, vcl::KeyCode(KEY_RETURN, false, false, false, false)); - } // Edit only if the shown content is coming from the current view. if ((State::ACTIVE == m_eState || m_pActiveShell == pActiveView->GetWrtShellPtr()) - && pEntry && lcl_IsContent(pEntry)) + && xEntry && lcl_IsContent(*xEntry, *m_xTreeView)) { - assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - const SwContentType* pContType = static_cast<SwContent*>(pEntry->GetUserData())->GetParent(); + assert(dynamic_cast<SwContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + const SwContentType* pContType = reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetParent(); const ContentTypeId nContentType = pContType->GetType(); const bool bReadonly = m_pActiveShell->GetView().GetDocShell()->IsReadOnly(); - const bool bVisible = !static_cast<SwContent*>(pEntry->GetUserData())->IsInvisible(); - const bool bProtected = static_cast<SwContent*>(pEntry->GetUserData())->IsProtect(); + const bool bVisible = !reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xEntry).toInt64())->IsInvisible(); + const bool bProtected = reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xEntry).toInt64())->IsProtect(); const bool bProtectBM = (ContentTypeId::BOOKMARK == nContentType) && m_pActiveShell->getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_BOOKMARKS); const bool bEditable = pContType->IsEditable() && @@ -1319,214 +1232,264 @@ VclPtr<PopupMenu> SwContentTree::CreateContextMenu() ContentTypeId::INDEX == nContentType || ContentTypeId::DRAWOBJECT == nContentType); - if(!bReadonly && (bEditable || bDeletable)) + if (!bReadonly && (bEditable || bDeletable)) { if(ContentTypeId::INDEX == nContentType) { - pPop->InsertItem(401, m_sRemoveIdx); - pPop->InsertItem(402, m_sUpdateIdx); + bRemoveIndexEntries = false; - const SwTOXBase* pBase = static_cast<SwTOXBaseContent*>(pEntry->GetUserData())->GetTOXBase(); - if(!pBase->IsTOXBaseInReadonly()) - pPop->InsertItem(403, m_aContextStrings[IDX_STR_EDIT_ENTRY]); - pPop->InsertItem(405, m_sReadonlyIdx); + const SwTOXBase* pBase = reinterpret_cast<SwTOXBaseContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetTOXBase(); + if (!pBase->IsTOXBaseInReadonly()) + bRemoveEditEntry = false; - pPop->CheckItem( 405, SwEditShell::IsTOXBaseReadonly(*pBase)); - pPop->InsertItem(501, m_aContextStrings[IDX_STR_DELETE_ENTRY]); + xPop->set_active(OString::number(405), SwEditShell::IsTOXBaseReadonly(*pBase)); + bRemoveDeleteEntry = false; } else if(ContentTypeId::TABLE == nContentType) { - pPop->InsertItem(805, SwResId(STR_SELECT)); - pPop->InsertItem(403, m_aContextStrings[IDX_STR_EDIT_ENTRY]); - pPop->InsertItem(404, m_sUnprotTable); + bRemoveSelectEntry = false; + bRemoveEditEntry = false; + bRemoveUnprotectEntry = false; bool bFull = false; - OUString sTableName = static_cast<SwContent*>(pEntry->GetUserData())->GetName(); + OUString sTableName = reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetName(); bool bProt = m_pActiveShell->HasTableAnyProtection( &sTableName, &bFull ); - pPop->EnableItem(403, !bFull ); - pPop->EnableItem(404, bProt ); - pPop->InsertItem(501, m_aContextStrings[IDX_STR_DELETE_ENTRY]); + xPop->set_sensitive(OString::number(403), !bFull); + xPop->set_sensitive(OString::number(404), bProt); + bRemoveDeleteEntry = false; } else if(ContentTypeId::OUTLINE == nContentType) { bOutline = true; - lcl_InsertExpandCollapseAllItem(this, pEntry, pPop); - pPop->InsertSeparator(); - pPop->InsertItem(805, SwResId(STR_SELECT)); - pPop->InsertItem(806, SwResId(STR_DELETE)); - pPop->InsertItem(801, SwResId(STR_PROMOTE_CHAPTER)); - pPop->InsertItem(802, SwResId(STR_DEMOTE_CHAPTER)); - pPop->InsertItem(803, SwResId(STR_PROMOTE_LEVEL)); - pPop->InsertItem(804, SwResId(STR_DEMOTE_LEVEL)); - pPop->SetAccelKey(806, vcl::KeyCode(KEY_DELETE, false, false, false, false)); - pPop->SetAccelKey(801, vcl::KeyCode(KEY_UP, false, true, false, false)); - pPop->SetAccelKey(802, vcl::KeyCode(KEY_DOWN, false, true, false, false)); - pPop->SetAccelKey(803, vcl::KeyCode(KEY_LEFT, false, true, false, false)); - pPop->SetAccelKey(804, vcl::KeyCode(KEY_RIGHT, false, true, false, false)); + bRemoveToggleExpandEntry = lcl_InsertExpandCollapseAllItem(*m_xTreeView, *xEntry, *xPop); + bRemoveSelectEntry = false; + bRemoveChapterEntries = false; } else if(ContentTypeId::DRAWOBJECT == nContentType) { - pPop->InsertItem(501, SwResId(STR_DELETE_ENTRY)); + bRemoveDeleteEntry = false; } else if(ContentTypeId::REGION == nContentType) { - pPop->InsertItem(805, SwResId(STR_SELECT)); - pPop->InsertItem(403, m_aContextStrings[IDX_STR_EDIT_ENTRY]); + bRemoveSelectEntry = false; + bRemoveEditEntry = false; } else { - if(bEditable && bDeletable) + if (bEditable && bDeletable) { - pPop->InsertItem(403, m_aContextStrings[IDX_STR_EDIT_ENTRY]); - pPop->InsertItem(501, m_aContextStrings[IDX_STR_DELETE_ENTRY]); + bRemoveEditEntry = false; + bRemoveDeleteEntry = false; } - else if(bEditable) - pPop->InsertItem(403, m_aContextStrings[IDX_STR_EDIT_ENTRY]); - else if(bDeletable) + else if (bEditable) + bRemoveEditEntry = false; + else if (bDeletable) { - pPop->InsertItem(501, m_aContextStrings[IDX_STR_DELETE_ENTRY]); + bRemoveDeleteEntry = false; } } //Rename object - if(bRenamable) - pPop->InsertItem(502, m_sRename); + if (bRenamable) + bRemoveRenameEntry = false; } - else if (bProtectBM) - { - pPop->InsertItem(503, m_sProtected); - pPop->EnableItem(503, false); - } - pPop->SetAccelKey(501, vcl::KeyCode(KEY_DELETE, false, false, false, false)); } - else if( pEntry ) + else if (xEntry) { - assert(dynamic_cast<SwContentType*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwContentType* pType = static_cast<SwContentType*>(pEntry->GetUserData()); - if(ContentTypeId::OUTLINE == pType->GetType()) + assert(dynamic_cast<SwContentType*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + SwContentType* pType = reinterpret_cast<SwContentType*>(m_xTreeView->get_id(*xEntry).toInt64()); + if (ContentTypeId::OUTLINE == pType->GetType()) { bOutline = true; - lcl_InsertExpandCollapseAllItem(this, pEntry, pPop); - pPop->InsertSeparator(); - pPop->InsertItem(700, m_aContextStrings[IDX_STR_SEND_OUTLINE_TO_CLIPBOARD_ENTRY]); + bRemoveToggleExpandEntry = lcl_InsertExpandCollapseAllItem(*m_xTreeView, *xEntry, *xPop); + bRemoveSendOutlineEntry = false; } if ( (pType->GetType() == ContentTypeId::POSTIT) && (!m_pActiveShell->GetView().GetDocShell()->IsReadOnly()) && ( pType->GetMemberCount() > 0) ) - { - pPop->InsertItem(600, m_sPostItShow ); - pPop->InsertItem(601, m_sPostItHide ); - pPop->InsertItem(602, m_sPostItDelete ); - } + bRemovePostItEntries = false; } - pPop->InsertSeparator(); - if (bOutline) + if (bRemoveToggleExpandEntry) { - pPop->InsertItem(4, m_aContextStrings[IDX_STR_OUTLINE_TRACKING]); - pPop->SetPopupMenu(4, pSubPopOutlineTracking); - pPop->InsertItem(1, m_aContextStrings[IDX_STR_OUTLINE_LEVEL]); - pPop->SetPopupMenu(1, pSubPop1); + xPop->remove("separator3"); + xPop->remove(OString::number(800)); } - else + + if (bRemoveSelectEntry) + xPop->remove(OString::number(805)); + + if (bRemoveChapterEntries) + { + xPop->remove("separator2"); + xPop->remove(OString::number(806)); + xPop->remove(OString::number(801)); + xPop->remove(OString::number(802)); + xPop->remove(OString::number(803)); + xPop->remove(OString::number(804)); + } + + if (bRemoveSendOutlineEntry) + xPop->remove(OString::number(700)); + + if (bRemovePostItEntries) { - pSubPopOutlineTracking.disposeAndClear(); - pSubPop1.disposeAndClear(); + xPop->remove(OString::number(600)); + xPop->remove(OString::number(601)); + xPop->remove(OString::number(602)); } - pPop->InsertItem(2, m_aContextStrings[IDX_STR_DRAGMODE]); - pPop->SetPopupMenu(2, pSubPop2); - pPop->InsertItem(3, m_aContextStrings[IDX_STR_DISPLAY]); - pPop->SetPopupMenu(3, pSubPop3); - return pPop; + if (bRemoveDeleteEntry) + xPop->remove(OString::number(501)); + + if (bRemoveRenameEntry) + xPop->remove(OString::number(502)); + + if (bRemoveIndexEntries) + { + xPop->remove(OString::number(401)); + xPop->remove(OString::number(402)); + xPop->remove(OString::number(405)); + } + + if (bRemoveUnprotectEntry) + xPop->remove(OString::number(404)); + + if (bRemoveEditEntry) + xPop->remove(OString::number(403)); + + if (bRemoveToggleExpandEntry && + bRemoveSelectEntry && + bRemoveChapterEntries && + bRemoveSendOutlineEntry && + bRemovePostItEntries && + bRemoveDeleteEntry && + bRemoveRenameEntry && + bRemoveIndexEntries && + bRemoveUnprotectEntry && + bRemoveEditEntry) + { + xPop->remove("separator1"); + } + + if (!bOutline) + { + xSubPop1.reset(); + xPop->remove(OString::number(1)); // outline level menu + xSubPopOutlineTracking.reset(); + xPop->remove(OString::number(4)); // outline tracking menu + } + + OString sCommand = xPop->popup_at_rect(m_xTreeView.get(), tools::Rectangle(rCEvt.GetMousePosPixel(), Size(1,1))); + if (!sCommand.isEmpty()) + ExecuteContextMenuAction(sCommand); + + return true; } -// Indentation for outlines (and sections) +void SwContentTree::insert(const weld::TreeIter* pParent, const OUString& rStr, const OUString& rId, + const OUString* pExpanderName, bool bChildrenOnDemand, weld::TreeIter* pRet) +{ + m_xTreeView->insert(pParent, -1, &rStr, &rId, nullptr, nullptr, pExpanderName, bChildrenOnDemand, pRet); + ++m_nEntryCount; +} -sal_IntPtr SwContentTree::GetTabPos( SvTreeListEntry* pEntry, SvLBoxTab* pTab) +void SwContentTree::remove(const weld::TreeIter& rIter) { - sal_IntPtr nLevel = 0; - if(lcl_IsContent(pEntry)) + if (m_xTreeView->iter_has_child(rIter)) { - nLevel++; - assert(pEntry->GetUserData() == nullptr || dynamic_cast<SwContent *>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwContent* pCnt = static_cast<SwContent *>(pEntry->GetUserData()); - const SwContentType* pParent; - if(pCnt && nullptr != (pParent = pCnt->GetParent())) - { - if(pParent->GetType() == ContentTypeId::OUTLINE) - nLevel = nLevel + static_cast<SwOutlineContent*>(pCnt)->GetOutlineLevel(); - else if(pParent->GetType() == ContentTypeId::REGION) - nLevel = nLevel + static_cast<SwRegionContent*>(pCnt)->GetRegionLevel(); - } + std::unique_ptr<weld::TreeIter> xChild = m_xTreeView->make_iterator(&rIter); + m_xTreeView->iter_children(*xChild); + remove(*xChild); } - return nLevel * 10 + (m_bIsRoot ? 0 : 5) + pTab->GetPos(); //determined empirically + m_xTreeView->remove(rIter); + --m_nEntryCount; } // Content will be integrated into the Box only on demand. - -void SwContentTree::RequestingChildren( SvTreeListEntry* pParent ) +bool SwContentTree::RequestingChildren(const weld::TreeIter& rParent) { + bool bChild = m_xTreeView->iter_has_child(rParent); + if (bChild || !m_xTreeView->get_children_on_demand(rParent)) + return bChild; + // Is this a content type? - if(lcl_IsContentType(pParent)) + if (lcl_IsContentType(rParent, *m_xTreeView)) { - if(!pParent->HasChildren()) - { - assert(dynamic_cast<SwContentType*>(static_cast<SwTypeNumber*>(pParent->GetUserData()))); - SwContentType* pCntType = static_cast<SwContentType*>(pParent->GetUserData()); + std::unique_ptr<weld::TreeIter> xChild = m_xTreeView->make_iterator(); - const size_t nCount = pCntType->GetMemberCount(); - // Add for outline plus/minus - if(pCntType->GetType() == ContentTypeId::OUTLINE) + assert(dynamic_cast<SwContentType*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(rParent).toInt64()))); + SwContentType* pCntType = reinterpret_cast<SwContentType*>(m_xTreeView->get_id(rParent).toInt64()); + + const size_t nCount = pCntType->GetMemberCount(); + // Add for outline plus/minus + if (pCntType->GetType() == ContentTypeId::OUTLINE) + { + for(size_t i = 0; i < nCount; ++i) { - SvTreeListEntry* pChild = nullptr; - for(size_t i = 0; i < nCount; ++i) + const SwContent* pCnt = pCntType->GetMember(i); + if(pCnt) { - const SwContent* pCnt = pCntType->GetMember(i); - if(pCnt) + const auto nLevel = static_cast<const SwOutlineContent*>(pCnt)->GetOutlineLevel(); + OUString sEntry = pCnt->GetName(); + if(sEntry.isEmpty()) + sEntry = m_sSpace; + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pCnt))); + if (!bChild || (nLevel == 0)) { - const auto nLevel = static_cast<const SwOutlineContent*>(pCnt)->GetOutlineLevel(); - OUString sEntry = pCnt->GetName(); - if(sEntry.isEmpty()) - sEntry = m_sSpace; - if(!pChild || (nLevel == 0)) - pChild = InsertEntry(sEntry, pParent, false, TREELIST_APPEND,const_cast<SwContent *>(pCnt)); + insert(&rParent, sEntry, sId, nullptr, false, xChild.get()); + m_xTreeView->set_sensitive(*xChild, !pCnt->IsInvisible()); + m_xTreeView->set_extra_row_indent(*xChild, nLevel + 1 - m_xTreeView->get_iter_depth(*xChild)); + bChild = true; + } + else + { + //back search parent. + if(static_cast<const SwOutlineContent*>(pCntType->GetMember(i-1))->GetOutlineLevel() < nLevel) + { + insert(xChild.get(), sEntry, sId, nullptr, false, xChild.get()); + m_xTreeView->set_sensitive(*xChild, !pCnt->IsInvisible()); + m_xTreeView->set_extra_row_indent(*xChild, nLevel + 1 - m_xTreeView->get_iter_depth(*xChild)); + bChild = true; + } else { - //back search parent. - if(static_cast<const SwOutlineContent*>(pCntType->GetMember(i-1))->GetOutlineLevel() < nLevel) - pChild = InsertEntry(sEntry, pChild, false, TREELIST_APPEND, const_cast<SwContent *>(pCnt)); - else + bChild = m_xTreeView->iter_previous(*xChild); + assert(!bChild || lcl_IsContentType(*xChild, *m_xTreeView) || dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xChild).toInt64()))); + while (bChild && + lcl_IsContent(*xChild, *m_xTreeView) && + (reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xChild).toInt64())->GetOutlineLevel() >= nLevel) + ) { - pChild = Prev(pChild); - assert(!pChild || lcl_IsContentType(pChild) || dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pChild->GetUserData()))); - while(pChild && - lcl_IsContent(pChild) && - (static_cast<SwOutlineContent*>(pChild->GetUserData())->GetOutlineLevel() >= nLevel) - ) - { - pChild = Prev(pChild); - } - if(pChild) - pChild = InsertEntry(sEntry, pChild, - false, TREELIST_APPEND, const_cast<SwContent *>(pCnt)); + bChild = m_xTreeView->iter_previous(*xChild); + } + if (bChild) + { + insert(xChild.get(), sEntry, sId, nullptr, false, xChild.get()); + m_xTreeView->set_sensitive(*xChild, !pCnt->IsInvisible()); + m_xTreeView->set_extra_row_indent(*xChild, nLevel + 1 - m_xTreeView->get_iter_depth(*xChild)); } } } } } - else + } + else + { + for(size_t i = 0; i < nCount; ++i) { - for(size_t i = 0; i < nCount; ++i) + const SwContent* pCnt = pCntType->GetMember(i); + if (pCnt) { - const SwContent* pCnt = pCntType->GetMember(i); - if (pCnt) - { - OUString sEntry = pCnt->GetName(); - if (sEntry.isEmpty()) - sEntry = m_sSpace; - InsertEntry(sEntry, pParent, false, TREELIST_APPEND, const_cast<SwContent *>(pCnt)); - } + OUString sEntry = pCnt->GetName(); + if (sEntry.isEmpty()) + sEntry = m_sSpace; + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pCnt))); + insert(&rParent, sEntry, sId, nullptr, false, xChild.get()); + m_xTreeView->set_sensitive(*xChild, !pCnt->IsInvisible()); + bChild = true; } } } } + + return bChild; } SdrObject* SwContentTree::GetDrawingObjectsByContent(const SwContent *pCnt) @@ -1561,18 +1524,19 @@ SdrObject* SwContentTree::GetDrawingObjectsByContent(const SwContent *pCnt) return pRetObj; } -bool SwContentTree::Expand( SvTreeListEntry* pParent ) +void SwContentTree::Expand(const weld::TreeIter& rParent, std::vector<std::unique_ptr<weld::TreeIter>>* pNodesToExpand) { - if (!(pParent->HasChildren() || pParent->HasChildrenOnDemand())) - return SvTreeListBox::Expand(pParent); + if (!(m_xTreeView->iter_has_child(rParent) || m_xTreeView->get_children_on_demand(rParent))) + return; if (!m_bIsRoot - || (lcl_IsContentType(pParent) && static_cast<SwContentType*>(pParent->GetUserData())->GetType() == ContentTypeId::OUTLINE) + || (lcl_IsContentType(rParent, *m_xTreeView) && + reinterpret_cast<SwContentType*>(m_xTreeView->get_id(rParent).toInt64())->GetType() == ContentTypeId::OUTLINE) || (m_nRootType == ContentTypeId::OUTLINE)) { - if(lcl_IsContentType(pParent)) + if (lcl_IsContentType(rParent, *m_xTreeView)) { - SwContentType* pCntType = static_cast<SwContentType*>(pParent->GetUserData()); + SwContentType* pCntType = reinterpret_cast<SwContentType*>(m_xTreeView->get_id(rParent).toInt64()); const sal_Int32 nOr = 1 << static_cast<int>(pCntType->GetType()); //linear -> Bitposition if (State::HIDDEN != m_eState) { @@ -1581,65 +1545,90 @@ bool SwContentTree::Expand( SvTreeListEntry* pParent ) } else m_nHiddenBlock |= nOr; - if(pCntType->GetType() == ContentTypeId::OUTLINE) + if (pCntType->GetType() == ContentTypeId::OUTLINE) { std::map< void*, bool > aCurrOutLineNodeMap; SwWrtShell* pShell = GetWrtShell(); - bool bBool = SvTreeListBox::Expand(pParent); - SvTreeListEntry* pChild = Next(pParent); - while(pChild && lcl_IsContent(pChild) && pParent->HasChildren()) + bool bParentHasChild = RequestingChildren(rParent); + if (pNodesToExpand) + pNodesToExpand->emplace_back(m_xTreeView->make_iterator(&rParent)); + if (bParentHasChild) { - if(pChild->HasChildren()) + std::unique_ptr<weld::TreeIter> xChild(m_xTreeView->make_iterator(&rParent)); + bool bChild = m_xTreeView->iter_next(*xChild); + while (bChild && lcl_IsContent(*xChild, *m_xTreeView)) { - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pChild->GetUserData()))); - auto const nPos = static_cast<SwOutlineContent*>(pChild->GetUserData())->GetOutlinePos(); - void* key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos )); - aCurrOutLineNodeMap.emplace( key, false ); - std::map<void*, bool>::iterator iter = mOutLineNodeMap.find( key ); - if( iter != mOutLineNodeMap.end() && mOutLineNodeMap[key]) + if (m_xTreeView->iter_has_child(*xChild)) { - aCurrOutLineNodeMap[key] = true; - SvTreeListBox::Expand(pChild); + assert(dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xChild).toInt64()))); + auto const nPos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xChild).toInt64())->GetOutlinePos(); + void* key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos )); + aCurrOutLineNodeMap.emplace( key, false ); + std::map<void*, bool>::iterator iter = mOutLineNodeMap.find( key ); + if( iter != mOutLineNodeMap.end() && mOutLineNodeMap[key]) + { + aCurrOutLineNodeMap[key] = true; + RequestingChildren(*xChild); + if (pNodesToExpand) + pNodesToExpand->emplace_back(m_xTreeView->make_iterator(xChild.get())); + m_xTreeView->set_children_on_demand(*xChild, false); + } } + bChild = m_xTreeView->iter_next(*xChild); } - pChild = Next(pChild); } mOutLineNodeMap = aCurrOutLineNodeMap; - return bBool; + return; } - } - else if( lcl_IsContent(pParent) && static_cast<SwContentType*>(pParent->GetUserData())->GetType() == ContentTypeId::OUTLINE) + else { - SwWrtShell* pShell = GetWrtShell(); - // paranoid assert now that outline type is checked - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pParent->GetUserData()))); - auto const nPos = static_cast<SwOutlineContent*>(pParent->GetUserData())->GetOutlinePos(); - void* key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos )); - mOutLineNodeMap[key] = true; + if (lcl_IsContent(rParent, *m_xTreeView)) + { + SwWrtShell* pShell = GetWrtShell(); + // paranoid assert now that outline type is checked + assert(dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(rParent).toInt64()))); + auto const nPos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(rParent).toInt64())->GetOutlinePos(); + void* key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos )); + mOutLineNodeMap[key] = true; + } } } - return SvTreeListBox::Expand(pParent); + + RequestingChildren(rParent); + if (pNodesToExpand) + pNodesToExpand->emplace_back(m_xTreeView->make_iterator(&rParent)); } -bool SwContentTree::Collapse( SvTreeListEntry* pParent ) +IMPL_LINK(SwContentTree, ExpandHdl, const weld::TreeIter&, rParent, bool) { - if (!pParent->HasChildren() || pParent->HasChildrenOnDemand()) - return SvTreeListBox::Collapse(pParent); + Expand(rParent, nullptr); + return true; +} - if(lcl_IsContentType(pParent)) +IMPL_LINK(SwContentTree, CollapseHdl, const weld::TreeIter&, rParent, bool) +{ + if (!m_xTreeView->iter_has_child(rParent) || m_xTreeView->get_children_on_demand(rParent)) + return true; + + if (lcl_IsContentType(rParent, *m_xTreeView)) { - if(m_bIsRoot) + if (m_bIsRoot) { // collapse to children of root node - for (SvTreeListEntry* pEntry = FirstChild(pParent); pEntry; pEntry = Next(pEntry)) + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator(&rParent)); + if (m_xTreeView->iter_children(*xEntry)) { - Collapse(pEntry); + do + { + m_xTreeView->collapse_row(*xEntry); + } + while (m_xTreeView->iter_next(*xEntry)); } return true; } - SwContentType* pCntType = static_cast<SwContentType*>(pParent->GetUserData()); + SwContentType* pCntType = reinterpret_cast<SwContentType*>(m_xTreeView->get_id(rParent).toInt64()); const sal_Int32 nAnd = ~(1 << static_cast<int>(pCntType->GetType())); if (State::HIDDEN != m_eState) { @@ -1649,54 +1638,59 @@ bool SwContentTree::Collapse( SvTreeListEntry* pParent ) else m_nHiddenBlock &= nAnd; } - else if( lcl_IsContent(pParent) ) + else if (lcl_IsContent(rParent, *m_xTreeView)) { SwWrtShell* pShell = GetWrtShell(); - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pParent->GetUserData()))); - auto const nPos = static_cast<SwOutlineContent*>(pParent->GetUserData())->GetOutlinePos(); + assert(dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(rParent).toInt64()))); + auto const nPos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(rParent).toInt64())->GetOutlinePos(); void* key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos )); mOutLineNodeMap[key] = false; } - return SvTreeListBox::Collapse(pParent); + return true; } // Also on double click will be initially opened only. - -IMPL_LINK_NOARG(SwContentTree, ContentDoubleClickHdl, SvTreeListBox*, bool) +IMPL_LINK_NOARG(SwContentTree, ContentDoubleClickHdl, weld::TreeView&, bool) { - SvTreeListEntry* pEntry = GetCurEntry(); + bool bConsumed = false; + + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + bool bEntry = m_xTreeView->get_cursor(xEntry.get()); // Is it a content type? - OSL_ENSURE(pEntry, "no current entry!"); - if(pEntry) + OSL_ENSURE(bEntry, "no current entry!"); + if (bEntry) { - if(lcl_IsContentType(pEntry) && !pEntry->HasChildren()) + if (lcl_IsContentType(*xEntry, *m_xTreeView) && !m_xTreeView->iter_has_child(*xEntry)) { - RequestingChildren(pEntry); + RequestingChildren(*xEntry); + m_xTreeView->set_children_on_demand(*xEntry, false); } - else if (!lcl_IsContentType(pEntry) && (State::HIDDEN != m_eState)) + else if (!lcl_IsContentType(*xEntry, *m_xTreeView) && (State::HIDDEN != m_eState)) { if (State::CONSTANT == m_eState) { m_pActiveShell->GetView().GetViewFrame()->GetWindow().ToTop(); } //Jump to content type: - assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwContent* pCnt = static_cast<SwContent*>(pEntry->GetUserData()); - OSL_ENSURE( pCnt, "no UserData"); + assert(dynamic_cast<SwContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + SwContent* pCnt = reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xEntry).toInt64()); + assert(pCnt && "no UserData"); GotoContent(pCnt); - if(pCnt->GetParent()->GetType() == ContentTypeId::FRAME) + const ContentTypeId nActType = pCnt->GetParent()->GetType(); + if (nActType == ContentTypeId::FRAME) m_pActiveShell->EnterStdMode(); - return false; // treelist processing finished + // fdo#36308 don't expand outlines on double-click + bConsumed = nActType == ContentTypeId::OUTLINE; } - return true; // signal more to be done, i.e. expand/collapse children } - return false; + + return bConsumed; // false/true == allow/disallow more to be done, i.e. expand/collapse children } namespace { - BitmapEx GetBitmapForContentTypeId(ContentTypeId eType) + OUString GetImageIdForContentTypeId(ContentTypeId eType) { OUString sResId; @@ -1743,37 +1737,97 @@ namespace break; } - return BitmapEx(sResId); + return sResId; }; } +size_t SwContentTree::GetAbsPos(const weld::TreeIter& rIter) +{ + size_t nAbsPos = 0; + + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator(&rIter)); + if (!m_xTreeView->get_iter_first(*xEntry)) + xEntry.reset(); + + while (xEntry && m_xTreeView->iter_compare(*xEntry, rIter) != 0) + { + if (!m_xTreeView->iter_next(*xEntry)) + xEntry.reset(); + nAbsPos++; + } + + return nAbsPos; +} + +size_t SwContentTree::GetEntryCount() const +{ + return m_nEntryCount; +} + +size_t SwContentTree::GetChildCount(const weld::TreeIter& rParent) const +{ + if (!m_xTreeView->iter_has_child(rParent)) + return 0; + + std::unique_ptr<weld::TreeIter> xParent(m_xTreeView->make_iterator(&rParent)); + + size_t nCount = 0; + auto nRefDepth = m_xTreeView->get_iter_depth(*xParent); + auto nActDepth = nRefDepth; + do + { + if (!m_xTreeView->iter_next(*xParent)) + xParent.reset(); + else + nActDepth = m_xTreeView->get_iter_depth(*xParent); + nCount++; + } while(xParent && nRefDepth < nActDepth); + + nCount--; + return nCount; +} + +std::unique_ptr<weld::TreeIter> SwContentTree::GetEntryAtAbsPos(size_t nAbsPos) const +{ + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_iter_first(*xEntry)) + xEntry.reset(); + + while (nAbsPos && xEntry) + { + if (!m_xTreeView->iter_next(*xEntry)) + xEntry.reset(); + nAbsPos--; + } + return xEntry; +} + void SwContentTree::Display( bool bActive ) { // First read the selected entry to select it later again if necessary // -> the user data here are no longer valid! - SvTreeListEntry* pOldSelEntry = FirstSelected(); + std::unique_ptr<weld::TreeIter> xOldSelEntry(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_selected(xOldSelEntry.get())) + xOldSelEntry.reset(); OUString sEntryName; // Name of the entry - sal_uLong nEntryRelPos = 0; // relative position to their parent - sal_uInt32 nOldEntryCount = GetEntryCount(); + size_t nEntryRelPos = 0; // relative position to their parent + size_t nOldEntryCount = GetEntryCount(); sal_Int32 nOldScrollPos = 0; - if(pOldSelEntry) + if (xOldSelEntry) { - ScrollBar* pVScroll = GetVScroll(); - if(pVScroll && pVScroll->IsVisible()) - nOldScrollPos = pVScroll->GetThumbPos(); + UpdateLastSelType(); - sEntryName = GetEntryText(pOldSelEntry); - SvTreeListEntry* pParentEntry = pOldSelEntry; - while( GetParent(pParentEntry)) - { - pParentEntry = GetParent(pParentEntry); - } - if(GetParent(pOldSelEntry)) - { - nEntryRelPos = GetModel()->GetAbsPos(pOldSelEntry) - GetModel()->GetAbsPos(pParentEntry); - } + nOldScrollPos = m_xTreeView->vadjustment_get_value(); + sEntryName = m_xTreeView->get_text(*xOldSelEntry); + std::unique_ptr<weld::TreeIter> xParentEntry = m_xTreeView->make_iterator(xOldSelEntry.get()); + while (m_xTreeView->get_iter_depth(*xParentEntry)) + m_xTreeView->iter_parent(*xParentEntry); + if (m_xTreeView->get_iter_depth(*xOldSelEntry)) + nEntryRelPos = GetAbsPos(*xOldSelEntry) - GetAbsPos(*xParentEntry); } - SvTreeListBox::Clear(); + + clear(); + if (!bActive) m_eState = State::HIDDEN; else if (State::HIDDEN == m_eState) @@ -1785,18 +1839,24 @@ void SwContentTree::Display( bool bActive ) m_bIsLastReadOnly = bReadOnly; bool bDisable = pShell == nullptr || bReadOnly; SwNavigationPI* pNavi = GetParentWindow(); - pNavi->m_aContentToolBox->EnableItem(pNavi->m_aContentToolBox->GetItemId("up"), !bDisable); - pNavi->m_aContentToolBox->EnableItem(pNavi->m_aContentToolBox->GetItemId("down"), !bDisable); - pNavi->m_aContentToolBox->EnableItem(pNavi->m_aContentToolBox->GetItemId("promote"), !bDisable); - pNavi->m_aContentToolBox->EnableItem(pNavi->m_aContentToolBox->GetItemId("demote"), !bDisable); - pNavi->m_aContentToolBox->EnableItem(pNavi->m_aContentToolBox->GetItemId("reminder"), !bDisable); + pNavi->m_xContent3ToolBox->set_item_sensitive("chapterup", !bDisable); + pNavi->m_xContent3ToolBox->set_item_sensitive("chapterdown", !bDisable); + pNavi->m_xContent3ToolBox->set_item_sensitive("promote", !bDisable); + pNavi->m_xContent3ToolBox->set_item_sensitive("demote", !bDisable); + pNavi->m_xContent2ToolBox->set_item_sensitive("reminder", !bDisable); } - if(pShell) + + if (pShell) { - SvTreeListEntry* pSelEntry = nullptr; + std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator(); + std::unique_ptr<weld::TreeIter> xSelEntry; // all content navigation view if(m_nRootType == ContentTypeId::UNKNOWN) { + m_xTreeView->freeze(); + + std::vector<std::unique_ptr<weld::TreeIter>> aNodesToExpand; + for( ContentTypeId nCntType : o3tl::enumrange<ContentTypeId>() ) { std::unique_ptr<SwContentType>& rpContentT = bActive ? @@ -1806,141 +1866,181 @@ void SwContentTree::Display( bool bActive ) rpContentT.reset(new SwContentType(pShell, nCntType, m_nOutlineLevel )); OUString sEntry = rpContentT->GetName(); - Image aImage(GetBitmapForContentTypeId(nCntType)); + OUString aImage(GetImageIdForContentTypeId(nCntType)); bool bChOnDemand = 0 != rpContentT->GetMemberCount(); - SvTreeListEntry* pEntry = InsertEntry(sEntry, aImage, aImage, - nullptr, bChOnDemand, TREELIST_APPEND, rpContentT.get()); - if (!pEntry->HasChildren() && !pEntry->HasChildrenOnDemand()) + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(rpContentT.get()))); + insert(nullptr, sEntry, sId, &aImage, bChOnDemand, xEntry.get()); + + m_xTreeView->set_sensitive(*xEntry, bChOnDemand); + + if (nCntType == m_nLastSelType) + xSelEntry = m_xTreeView->make_iterator(xEntry.get()); + sal_Int32 nExpandOptions = (State::HIDDEN == m_eState) + ? m_nHiddenBlock + : m_nActiveBlock; + if (nExpandOptions & (1 << static_cast<int>(nCntType))) { - pEntry->SetFlags(pEntry->GetFlags() | SvTLEntryFlags::SEMITRANSPARENT); - pEntry->SetTextColor(COL_GRAY); + // fill contents of to-be expanded entries while frozen + Expand(*xEntry, &aNodesToExpand); + m_xTreeView->set_children_on_demand(*xEntry, false); } - if(nCntType == m_nLastSelType) - pSelEntry = pEntry; + } + + m_xTreeView->thaw(); + + // restore visual expanded tree state + for (const auto& rNode : aNodesToExpand) + m_xTreeView->expand_row(*rNode); + + m_xTreeView->get_iter_first(*xEntry); + for (ContentTypeId nCntType : o3tl::enumrange<ContentTypeId>()) + { sal_Int32 nExpandOptions = (State::HIDDEN == m_eState) ? m_nHiddenBlock : m_nActiveBlock; - if(nExpandOptions & (1 << static_cast<int>(nCntType))) + if (nExpandOptions & (1 << static_cast<int>(nCntType))) { - Expand(pEntry); - if(nEntryRelPos && nCntType == m_nLastSelType) + if (nEntryRelPos && nCntType == m_nLastSelType) { // reselect the entry - SvTreeListEntry* pChild = pEntry; - SvTreeListEntry* pTemp = nullptr; + std::unique_ptr<weld::TreeIter> xChild(m_xTreeView->make_iterator(xEntry.get())); + std::unique_ptr<weld::TreeIter> xTemp; sal_uLong nPos = 1; - while(nullptr != (pChild = Next(pChild))) + while (m_xTreeView->iter_next(*xChild)) { // The old text will be slightly favored - if(sEntryName == GetEntryText(pChild) || - nPos == nEntryRelPos ) + if (sEntryName == m_xTreeView->get_text(*xChild) || + nPos == nEntryRelPos) { - pSelEntry = pChild; + m_xTreeView->copy_iterator(*xChild, *xSelEntry); break; } - pTemp = pChild; + xTemp = m_xTreeView->make_iterator(xChild.get()); nPos++; } - if(!pSelEntry || lcl_IsContentType(pSelEntry)) - pSelEntry = pTemp; + if (!xSelEntry || lcl_IsContentType(*xSelEntry, *m_xTreeView)) + xSelEntry = std::move(xTemp); } } + + m_xTreeView->iter_next_sibling(*xEntry); } - if(pSelEntry) + + if (!xSelEntry) { - Select(pSelEntry); - } - else nOldScrollPos = 0; + xSelEntry = m_xTreeView->make_iterator(); + if (!m_xTreeView->get_iter_first(*xSelEntry)) + xSelEntry.reset(); + } + + if (xSelEntry) + { + m_xTreeView->set_cursor(*xSelEntry); + Select(); + } } // root content navigation view else { + m_xTreeView->freeze(); + std::unique_ptr<SwContentType>& rpRootContentT = bActive ? m_aActiveContentArr[m_nRootType] : m_aHiddenContentArr[m_nRootType]; if(!rpRootContentT) rpRootContentT.reset(new SwContentType(pShell, m_nRootType, m_nOutlineLevel )); - Image aImage(GetBitmapForContentTypeId(m_nRootType)); - SvTreeListEntry* pParent = InsertEntry( - rpRootContentT->GetName(), aImage, aImage, - nullptr, false, TREELIST_APPEND, rpRootContentT.get()); + OUString aImage(GetImageIdForContentTypeId(m_nRootType)); + bool bChOnDemand = m_nRootType == ContentTypeId::OUTLINE; + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(rpRootContentT.get()))); + insert(nullptr, rpRootContentT->GetName(), sId, &aImage, bChOnDemand, xEntry.get()); - if(m_nRootType != ContentTypeId::OUTLINE) + if (!bChOnDemand) { - for(size_t i = 0; i < rpRootContentT->GetMemberCount(); ++i) + std::unique_ptr<weld::TreeIter> xChild = m_xTreeView->make_iterator(); + for (size_t i = 0; i < rpRootContentT->GetMemberCount(); ++i) { const SwContent* pCnt = rpRootContentT->GetMember(i); - if(pCnt) + if (pCnt) { OUString sEntry = pCnt->GetName(); if(sEntry.isEmpty()) sEntry = m_sSpace; - InsertEntry( sEntry, pParent, - false, TREELIST_APPEND, const_cast<SwContent *>(pCnt)); + OUString sSubId(OUString::number(reinterpret_cast<sal_Int64>(pCnt))); + insert(xEntry.get(), sEntry, sSubId, nullptr, false, xChild.get()); + m_xTreeView->set_sensitive(*xChild, !pCnt->IsInvisible()); } } } else - RequestingChildren(pParent); - Expand(pParent); + { + RequestingChildren(*xEntry); + m_xTreeView->set_children_on_demand(*xEntry, false); + } + + m_xTreeView->set_sensitive(*xEntry, m_xTreeView->iter_has_child(*xEntry)); + + m_xTreeView->thaw(); + + m_xTreeView->expand_row(*xEntry); // reselect the entry if (nEntryRelPos) { - SvTreeListEntry* pChild = pParent; + std::unique_ptr<weld::TreeIter> xChild(m_xTreeView->make_iterator(xEntry.get())); sal_uLong nPos = 1; - while(nullptr != (pChild = Next(pChild))) + while (m_xTreeView->iter_next(*xChild)) { // The old text will be slightly favored - if(sEntryName == GetEntryText(pChild) || - nPos == nEntryRelPos) + if (sEntryName == m_xTreeView->get_text(*xChild) || nPos == nEntryRelPos) { - pSelEntry = pChild; + xSelEntry = std::move(xChild); break; } nPos++; } - if(pSelEntry) + if (xSelEntry) { - SetCurEntry(pSelEntry); // unselect all entries, make pSelEntry visible, and select + m_xTreeView->set_cursor(*xSelEntry); // unselect all entries, make pSelEntry visible, and select + Select(); } } else - SetCurEntry(pParent); + { + m_xTreeView->set_cursor(*xEntry); + Select(); + } } } - if (!m_bIsInPromoteDemote) + + if (!m_bIsInPromoteDemote && GetEntryCount() == nOldEntryCount) { - ScrollBar* pVScroll = GetVScroll(); - if(GetEntryCount() == nOldEntryCount && - nOldScrollPos && pVScroll && pVScroll->IsVisible() - && pVScroll->GetThumbPos() != nOldScrollPos) - { - sal_Int32 nDelta = pVScroll->GetThumbPos() - nOldScrollPos; - ScrollOutputArea( static_cast<short>(nDelta) ); - } + m_xTreeView->vadjustment_set_value(nOldScrollPos); } } -void SwContentTree::Clear() +void SwContentTree::clear() { - SetUpdateMode(false); - SvTreeListBox::Clear(); - SetUpdateMode(true); + m_xTreeView->freeze(); + m_xTreeView->clear(); + m_nEntryCount = 0; + m_xTreeView->thaw(); } bool SwContentTree::FillTransferData( TransferDataContainer& rTransfer, sal_Int8& rDragMode ) { + bool bRet = false; SwWrtShell* pWrtShell = GetWrtShell(); OSL_ENSURE(pWrtShell, "no Shell!"); - SvTreeListEntry* pEntry = GetCurEntry(); - if(!pEntry || lcl_IsContentType(pEntry) || !pWrtShell) + + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + bool bEntry = m_xTreeView->get_cursor(xEntry.get()); + if (!bEntry || lcl_IsContentType(*xEntry, *m_xTreeView) || !pWrtShell) return false; OUString sEntry; - assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwContent* pCnt = static_cast<SwContent*>(pEntry->GetUserData()); + assert(dynamic_cast<SwContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + SwContent* pCnt = reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xEntry).toInt64()); const ContentTypeId nActType = pCnt->GetParent()->GetType(); OUString sUrl; @@ -1995,10 +2095,9 @@ bool SwContentTree::FillTransferData( TransferDataContainer& rTransfer, rDragMode &= ~( DND_ACTION_MOVE | DND_ACTION_LINK ); [[fallthrough]]; default: - sEntry = GetEntryText(pEntry); + sEntry = m_xTreeView->get_text(*xEntry); } - bool bRet = false; if(!sEntry.isEmpty()) { const SwDocShell* pDocShell = pWrtShell->GetView().GetDocShell(); @@ -2070,53 +2169,46 @@ void SwContentTree::ToggleToRoot() { if(!m_bIsRoot) { - SvTreeListEntry* pEntry = GetCurEntry(); + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + bool bEntry = m_xTreeView->get_cursor(xEntry.get()); const SwContentType* pCntType; - if(pEntry) + if (bEntry) { - if(lcl_IsContentType(pEntry)) + if (lcl_IsContentType(*xEntry, *m_xTreeView)) { - assert(dynamic_cast<SwContentType*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - pCntType = static_cast<SwContentType*>(pEntry->GetUserData()); + assert(dynamic_cast<SwContentType*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + pCntType = reinterpret_cast<SwContentType*>(m_xTreeView->get_id(*xEntry).toInt64()); } else { - assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - pCntType = static_cast<SwContent*>(pEntry->GetUserData())->GetParent(); + assert(dynamic_cast<SwContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + pCntType = reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetParent(); } m_nRootType = pCntType->GetType(); m_bIsRoot = true; Display(State::HIDDEN != m_eState); if (m_nRootType == ContentTypeId::OUTLINE) { - SetSelectionMode(SelectionMode::Multiple); - SetDragDropMode(DragDropMode::CTRL_MOVE | - DragDropMode::CTRL_COPY | - DragDropMode::ENABLE_TOP); + m_xTreeView->set_selection_mode(SelectionMode::Multiple); } } } else { - SetSelectionMode(SelectionMode::Single); + m_xTreeView->set_selection_mode(SelectionMode::Single); m_nRootType = ContentTypeId::UNKNOWN; m_bIsRoot = false; FindActiveTypeAndRemoveUserData(); Display(State::HIDDEN != m_eState); - if( m_bIsKeySpace ) - { - HideFocus(); - ShowFocus( m_aOldRectangle); - m_bIsKeySpace = false; - } } m_pConfig->SetRootType( m_nRootType ); - VclPtr<ToolBox> xBox = GetParentWindow()->m_aContentToolBox; - xBox->CheckItem(xBox->GetItemId("root"), m_bIsRoot); + weld::Toolbar* pBox = GetParentWindow()->m_xContent2ToolBox.get(); + pBox->set_item_active("root", m_bIsRoot); } bool SwContentTree::HasContentChanged() { + bool bContentChanged = false; // - Run through the local array and the Treelistbox in parallel. // - Are the records not expanded, they are discarded only in the array @@ -2129,8 +2221,10 @@ bool SwContentTree::HasContentChanged() // at the same time. Once a difference occurs it will be only replenished // no longer checked. Finally, the box is filled again. - bool bRepaint = false; - bool bInvalidate = false; + // bVisibilityChanged gets set to true if some element, like a section, + // changed visibility and should have its name rerendered with a new + // grayed-out state + bool bVisibilityChanged = false; if (State::HIDDEN == m_eState) { @@ -2143,54 +2237,58 @@ bool SwContentTree::HasContentChanged() // root content navigation view else if(m_bIsRoot) { - SvTreeListEntry* pRootEntry = First(); - if(!pRootEntry) - bRepaint = true; + std::unique_ptr<weld::TreeIter> xRootEntry(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_iter_first(*xRootEntry)) + bContentChanged = true; else { - assert(dynamic_cast<SwContentType*>(static_cast<SwTypeNumber*>(pRootEntry->GetUserData()))); - const ContentTypeId nType = static_cast<SwContentType*>(pRootEntry->GetUserData())->GetType(); + assert(dynamic_cast<SwContentType*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xRootEntry).toInt64()))); + const ContentTypeId nType = reinterpret_cast<SwContentType*>(m_xTreeView->get_id(*xRootEntry).toInt64())->GetType(); SwContentType* pArrType = m_aActiveContentArr[nType].get(); - if(!pArrType) - bRepaint = true; + if (!pArrType) + bContentChanged = true; else { // start check if first selected outline level has changed - SvTreeListEntry* pFirstSel; - if(m_nRootType == ContentTypeId::OUTLINE && !HasFocus() && - nullptr != (pFirstSel = FirstSelected()) && - lcl_IsContent(pFirstSel)) + bool bCheckChanged = m_nRootType == ContentTypeId::OUTLINE && !m_xTreeView->has_focus(); + if (bCheckChanged) { - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pFirstSel->GetUserData()))); - const auto nSelLevel = static_cast<SwOutlineContent*>(pFirstSel->GetUserData())->GetOutlineLevel(); - SwWrtShell* pSh = GetWrtShell(); - const SwOutlineNodes::size_type nOutlinePos = pSh->GetOutlinePos(MAXLEVEL); - if (nOutlinePos != SwOutlineNodes::npos && pSh->getIDocumentOutlineNodesAccess()->getOutlineLevel(nOutlinePos) != nSelLevel) - bRepaint = true; + std::unique_ptr<weld::TreeIter> xFirstSel(m_xTreeView->make_iterator()); + bool bFirstSel = m_xTreeView->get_selected(xFirstSel.get()); + if (bFirstSel && lcl_IsContent(*xFirstSel, *m_xTreeView)) + { + assert(dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xFirstSel).toInt64()))); + const auto nSelLevel = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xFirstSel).toInt64())->GetOutlineLevel(); + SwWrtShell* pSh = GetWrtShell(); + const SwOutlineNodes::size_type nOutlinePos = pSh->GetOutlinePos(MAXLEVEL); + if (nOutlinePos != SwOutlineNodes::npos && pSh->getIDocumentOutlineNodesAccess()->getOutlineLevel(nOutlinePos) != nSelLevel) + bContentChanged = true; + } } // end check if first selected outline level has changed - pArrType->Init(&bInvalidate); + pArrType->Init(&bVisibilityChanged); pArrType->FillMemberList(); - pRootEntry->SetUserData(static_cast<void*>(pArrType)); - if(!bRepaint) + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pArrType))); + m_xTreeView->set_id(*xRootEntry, sId); + if (!bContentChanged) { - if(GetChildCount(pRootEntry) != pArrType->GetMemberCount()) - bRepaint = true; + const size_t nChildCount = GetChildCount(*xRootEntry); + if (nChildCount != pArrType->GetMemberCount()) + bContentChanged = true; else { - const size_t nChildCount = GetChildCount(pRootEntry); - SvTreeListEntry* pEntry = pRootEntry; - for(size_t j = 0; j < nChildCount; ++j) + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator(xRootEntry.get())); + for (size_t j = 0; j < nChildCount; ++j) { - pEntry = Next(pEntry); - assert(pEntry); + m_xTreeView->iter_next(*xEntry); const SwContent* pCnt = pArrType->GetMember(j); - pEntry->SetUserData(const_cast<SwContent *>(pCnt)); - OUString sEntryText = GetEntryText(pEntry); + OUString sSubId(OUString::number(reinterpret_cast<sal_Int64>(pCnt))); + m_xTreeView->set_id(*xEntry, sSubId); + OUString sEntryText = m_xTreeView->get_text(*xEntry); if( sEntryText != pCnt->GetName() && !(sEntryText == m_sSpace && pCnt->GetName().isEmpty())) - bRepaint = true; + bContentChanged = true; } } } @@ -2200,54 +2298,59 @@ bool SwContentTree::HasContentChanged() // all content navigation view else { - SvTreeListEntry* pEntry = First(); - while ( pEntry ) + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + bool bEntry = m_xTreeView->get_iter_first(*xEntry); + while (bEntry) { bool bNext = true; // at least a next must be - assert(dynamic_cast<SwContentType*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwContentType* pCntType = static_cast<SwContentType*>(pEntry->GetUserData()); + assert(dynamic_cast<SwContentType*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + SwContentType* pCntType = reinterpret_cast<SwContentType*>(m_xTreeView->get_id(*xEntry).toInt64()); const size_t nCntCount = pCntType->GetMemberCount(); const ContentTypeId nType = pCntType->GetType(); SwContentType* pArrType = m_aActiveContentArr[nType].get(); - if(!pArrType) - bRepaint = true; + if (!pArrType) + bContentChanged = true; else { - pArrType->Init(&bInvalidate); - pEntry->SetUserData(static_cast<void*>(pArrType)); - if(IsExpanded(pEntry)) + pArrType->Init(&bVisibilityChanged); + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pArrType))); + m_xTreeView->set_id(*xEntry, sId); + if (m_xTreeView->get_row_expanded(*xEntry)) { bool bLevelOrVisibilityChanged = false; // bLevelOrVisibilityChanged is set if outlines have changed their level // or if the visibility of objects (frames, sections, tables) has changed // i.e. in header/footer pArrType->FillMemberList(&bLevelOrVisibilityChanged); - const size_t nChildCount = GetChildCount(pEntry); - if((nType == ContentTypeId::OUTLINE) && bLevelOrVisibilityChanged) - bRepaint = true; - if(bLevelOrVisibilityChanged) - bInvalidate = true; + const size_t nChildCount = GetChildCount(*xEntry); + if (bLevelOrVisibilityChanged) + { + if (nType == ContentTypeId::OUTLINE) + bContentChanged = true; + else + bVisibilityChanged = true; + } if(nChildCount != pArrType->GetMemberCount()) - bRepaint = true; + bContentChanged = true; else { for(size_t j = 0; j < nChildCount; ++j) { - pEntry = Next(pEntry); - assert(pEntry); + bEntry = m_xTreeView->iter_next(*xEntry); bNext = false; const SwContent* pCnt = pArrType->GetMember(j); - pEntry->SetUserData(const_cast<SwContent *>(pCnt)); - OUString sEntryText = GetEntryText(pEntry); + OUString sSubId(OUString::number(reinterpret_cast<sal_Int64>(pCnt))); + m_xTreeView->set_id(*xEntry, sSubId); + OUString sEntryText = m_xTreeView->get_text(*xEntry); if( sEntryText != pCnt->GetName() && !(sEntryText == m_sSpace && pCnt->GetName().isEmpty())) - bRepaint = true; + bContentChanged = true; } } } // not expanded and has children - else if(pEntry->HasChildren()) + else if (m_xTreeView->iter_has_child(*xEntry)) { // was the entry once opened, then must also the // invisible records be examined. @@ -2258,79 +2361,85 @@ bool SwContentTree::HasContentChanged() // i.e. in header/footer pArrType->FillMemberList(&bLevelOrVisibilityChanged); bool bRemoveChildren = false; - const size_t nChildCount = GetChildCount(pEntry); - if( nChildCount != pArrType->GetMemberCount() ) + const size_t nChildCount = GetChildCount(*xEntry); + if (nChildCount != pArrType->GetMemberCount()) { bRemoveChildren = true; } else { - SvTreeListEntry* pChild = FirstChild(pEntry); - for(size_t j = 0; j < nChildCount; ++j) + std::unique_ptr<weld::TreeIter> xChild(m_xTreeView->make_iterator(xEntry.get())); + m_xTreeView->iter_children(*xChild); + for (size_t j = 0; j < nChildCount; ++j) { const SwContent* pCnt = pArrType->GetMember(j); - assert(pChild); - pChild->SetUserData(const_cast<SwContent *>(pCnt)); - OUString sEntryText = GetEntryText(pChild); + OUString sSubId(OUString::number(reinterpret_cast<sal_Int64>(pCnt))); + m_xTreeView->set_id(*xChild, sSubId); + OUString sEntryText = m_xTreeView->get_text(*xChild); if( sEntryText != pCnt->GetName() && !(sEntryText == m_sSpace && pCnt->GetName().isEmpty())) bRemoveChildren = true; - pChild = Next(pChild); + m_xTreeView->iter_next(*xChild); } } - if(bRemoveChildren) - { - while (SvTreeListEntry *const pRemove = FirstChild(pEntry)) - RemoveEntry(pRemove); - } - if(!nChildCount) + if (bRemoveChildren) { - pEntry->EnableChildrenOnDemand(false); - InvalidateEntry(pEntry); + std::unique_ptr<weld::TreeIter> xRemove(m_xTreeView->make_iterator(xEntry.get())); + while (m_xTreeView->iter_children(*xRemove)) + { + remove(*xRemove); + m_xTreeView->copy_iterator(*xEntry, *xRemove); + } } - + m_xTreeView->set_children_on_demand(*xEntry, !nChildCount); } else if((nCntCount != 0) != (pArrType->GetMemberCount()!=0)) { - bRepaint = true; + bContentChanged = true; } } // The Root-Entry has to be found now - while( pEntry && (bNext || GetParent(pEntry ) )) + while (bEntry && (bNext || m_xTreeView->get_iter_depth(*xEntry))) { - pEntry = Next(pEntry); + bEntry = m_xTreeView->iter_next(*xEntry); bNext = false; } } } - if(!bRepaint && bInvalidate) - Invalidate(); - return bRepaint; + + if (!bContentChanged && bVisibilityChanged) + m_aUpdTimer.Start(); + + return bContentChanged || bVisibilityChanged; } -void SwContentTree::FindActiveTypeAndRemoveUserData() +void SwContentTree::UpdateLastSelType() { - SvTreeListEntry* pEntry = FirstSelected(); - if(pEntry) + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + if (m_xTreeView->get_selected(xEntry.get())) { - // If clear is called by TimerUpdate: - // Only for root can the validity of the UserData be guaranteed. - SvTreeListEntry* pParent; - while(nullptr != (pParent = GetParent(pEntry))) - pEntry = pParent; - if(pEntry->GetUserData() && lcl_IsContentType(pEntry)) + while (m_xTreeView->get_iter_depth(*xEntry)) + m_xTreeView->iter_parent(*xEntry); + sal_Int64 nId = m_xTreeView->get_id(*xEntry).toInt64(); + if (nId && lcl_IsContentType(*xEntry, *m_xTreeView)) { - assert(dynamic_cast<SwContentType*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - m_nLastSelType = static_cast<SwContentType*>(pEntry->GetUserData())->GetType(); + assert(dynamic_cast<SwContentType*>(reinterpret_cast<SwTypeNumber*>(nId))); + m_nLastSelType = reinterpret_cast<SwContentType*>(nId)->GetType(); } } - pEntry = First(); - while(pEntry) - { - pEntry->SetUserData(nullptr); - pEntry = Next(pEntry); - } +} + +void SwContentTree::FindActiveTypeAndRemoveUserData() +{ + UpdateLastSelType(); + + // If clear is called by TimerUpdate: + // Only for root can the validity of the UserData be guaranteed. + m_xTreeView->all_foreach([this](weld::TreeIter& rEntry){ + m_xTreeView->set_id(rEntry, ""); + return false; + }); } void SwContentTree::SetHiddenShell(SwWrtShell* pSh) @@ -2349,7 +2458,7 @@ void SwContentTree::SetHiddenShell(SwWrtShell* pSh) void SwContentTree::SetActiveShell(SwWrtShell* pSh) { - if(m_bIsInternalDrag) + if (IsInDrag()) m_bDocChgdInDragging = true; bool bClear = m_pActiveShell != pSh; if (State::ACTIVE == m_eState && bClear) @@ -2358,7 +2467,7 @@ void SwContentTree::SetActiveShell(SwWrtShell* pSh) EndListening(*m_pActiveShell->GetView().GetDocShell()); m_pActiveShell = pSh; FindActiveTypeAndRemoveUserData(); - Clear(); + clear(); } else if (State::CONSTANT == m_eState) { @@ -2428,7 +2537,15 @@ void SwContentTree::Notify(SfxBroadcaster & rBC, SfxHint const& rHint) if (bReadOnly != m_bIsLastReadOnly) { m_bIsLastReadOnly = bReadOnly; - Select(GetCurEntry()); + + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + if (m_xTreeView->get_cursor(xEntry.get())) + { + m_xTreeView->select(*xEntry); + Select(); + } + else + m_xTreeView->unselect_all(); } } break; @@ -2437,10 +2554,10 @@ void SwContentTree::Notify(SfxBroadcaster & rBC, SfxHint const& rHint) } } -void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) +void SwContentTree::ExecCommand(const OString& rCmd, bool bOutlineWithChildren) { - const bool bUp = rCmd == "up"; - const bool bUpDown = bUp || rCmd == "down"; + const bool bUp = rCmd == "chapterup"; + const bool bUpDown = bUp || rCmd == "chapterdown"; const bool bLeft = rCmd == "promote"; const bool bLeftRight = bLeft || rCmd == "demote"; if (!bUpDown && !bLeftRight) @@ -2459,19 +2576,20 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) SwOutlineNodes::size_type nActPos = pShell->GetOutlinePos(nActOutlineLevel); std::vector<SwTextNode*> selectedOutlineNodes; - std::vector<SvTreeListEntry*> selected; - for (SvTreeListEntry * pEntry = FirstSelected(); pEntry; pEntry = NextSelected(pEntry)) - { + std::vector<std::unique_ptr<weld::TreeIter>> selected; + + m_xTreeView->selected_foreach([this, pShell, &bLeftRight, &bOutlineWithChildren, &selected, &selectedOutlineNodes](weld::TreeIter& rEntry){ // it's possible to select the root node too which is a really bad idea - bool bSkip = lcl_IsContentType(pEntry); + bool bSkip = lcl_IsContentType(rEntry, *m_xTreeView); // filter out children of selected parents so they don't get promoted // or moved twice (except if there is Ctrl modifier, since in that // case children are re-parented) if ((bLeftRight || bOutlineWithChildren) && !selected.empty()) { - for (auto pParent = GetParent(pEntry); pParent; pParent = GetParent(pParent)) + std::unique_ptr<weld::TreeIter> xParent(m_xTreeView->make_iterator(&rEntry)); + for (bool bParent = m_xTreeView->iter_parent(*xParent); bParent; bParent = m_xTreeView->iter_parent(*xParent)) { - if (selected.back() == pParent) + if (m_xTreeView->iter_compare(*selected.back(), *xParent) == 0) { bSkip = true; break; @@ -2480,9 +2598,9 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) } if (!bSkip) { - selected.push_back(pEntry); + selected.emplace_back(m_xTreeView->make_iterator(&rEntry)); const SwNodes& rNodes = pShell->GetNodes(); - const sal_uLong nPos = GetAbsPos(pEntry) - 1; + const size_t nPos = GetAbsPos(rEntry) - 1; if (nPos < rNodes.GetOutLineNds().size()) { SwNode* pNode = rNodes.GetOutLineNds()[ nPos ]; @@ -2492,7 +2610,9 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) } } } - } + return false; + }); + if (bUpDown && !bUp) { // to move down, start at the end! std::reverse(selected.begin(), selected.end()); @@ -2500,17 +2620,17 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) SwOutlineNodes::difference_type nDirLast = bUp ? -1 : 1; bool bStartedAction = false; - for (auto const pCurrentEntry : selected) + for (auto const& pCurrentEntry : selected) { - assert(pCurrentEntry && lcl_IsContent(pCurrentEntry)); - if (lcl_IsContent(pCurrentEntry)) + assert(pCurrentEntry && lcl_IsContent(*pCurrentEntry, *m_xTreeView)); + if (lcl_IsContent(*pCurrentEntry, *m_xTreeView)) { - assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pCurrentEntry->GetUserData()))); + assert(dynamic_cast<SwContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*pCurrentEntry).toInt64()))); if ((m_bIsRoot && m_nRootType == ContentTypeId::OUTLINE) || - static_cast<SwContent*>(pCurrentEntry->GetUserData())->GetParent()->GetType() + reinterpret_cast<SwContent*>(m_xTreeView->get_id(*pCurrentEntry).toInt64())->GetParent()->GetType() == ContentTypeId::OUTLINE) { - nActPos = static_cast<SwOutlineContent*>(pCurrentEntry->GetUserData())->GetOutlinePos(); + nActPos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*pCurrentEntry).toInt64())->GetOutlinePos(); } } if (nActPos == SwOutlineNodes::npos || (bUpDown && !pShell->IsOutlineMovable(nActPos))) @@ -2529,7 +2649,7 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) pShell->MakeOutlineSel(nActPos, nActPos, bOutlineWithChildren); if (bUpDown) { - sal_uLong const nEntryAbsPos(GetModel()->GetAbsPos(pCurrentEntry)); + const size_t nEntryAbsPos(GetAbsPos(*pCurrentEntry)); SwOutlineNodes::difference_type nDir = bUp ? -1 : 1; if (!bOutlineWithChildren && ((nDir == -1 && nActPos > 0) || (nDir == 1 && nEntryAbsPos < GetEntryCount() - 2))) @@ -2541,66 +2661,70 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) else if (bOutlineWithChildren) { SwOutlineNodes::size_type nActEndPos = nActPos; - SvTreeListEntry* pEntry = pCurrentEntry; - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pCurrentEntry->GetUserData()))); - const auto nActLevel = static_cast<SwOutlineContent*>( - pCurrentEntry->GetUserData())->GetOutlineLevel(); - pEntry = Next(pEntry); - while (pEntry && lcl_IsContent(pEntry)) + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator(pCurrentEntry.get())); + assert(dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*pCurrentEntry).toInt64()))); + const auto nActLevel = reinterpret_cast<SwOutlineContent*>( + m_xTreeView->get_id(*pCurrentEntry).toInt64())->GetOutlineLevel(); + bool bEntry = m_xTreeView->iter_next(*xEntry); + while (bEntry && lcl_IsContent(*xEntry, *m_xTreeView)) { - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - if (nActLevel >= static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlineLevel()) + assert(dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + if (nActLevel >= reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetOutlineLevel()) break; - nActEndPos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos(); - pEntry = Next(pEntry); + nActEndPos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetOutlinePos(); + bEntry = m_xTreeView->iter_next(*xEntry); } if (nDir == 1) // move down { - if (IsSelected(pCurrentEntry->NextSibling())) + std::unique_ptr<weld::TreeIter> xNextSibling(m_xTreeView->make_iterator(pCurrentEntry.get())); + if (m_xTreeView->iter_next_sibling(*xNextSibling) && m_xTreeView->is_selected(*xNextSibling)) nDir = nDirLast; else { // If the last entry is to be moved we're done - if (pEntry && lcl_IsContent(pEntry)) + if (bEntry && lcl_IsContent(*xEntry, *m_xTreeView)) { - // pEntry now points to the entry following the last + // xEntry now points to the entry following the last // selected entry. - SwOutlineNodes::size_type nDest = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos(); + SwOutlineNodes::size_type nDest = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetOutlinePos(); // here needs to found the next entry after next. // The selection must be inserted in front of that. - while (pEntry) + while (bEntry) { - pEntry = Next(pEntry); - assert(pEntry == nullptr || !lcl_IsContent(pEntry) || dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - // nDest++ may only executed if pEntry != 0 - if (pEntry) + bEntry = m_xTreeView->iter_next(*xEntry); + assert(!bEntry || !lcl_IsContent(*xEntry, *m_xTreeView)|| + dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + // nDest++ may only executed if bEntry + if (bEntry) { - if (!lcl_IsContent(pEntry)) + if (!lcl_IsContent(*xEntry, *m_xTreeView)) break; - else if (nActLevel >= static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlineLevel()) + else if (nActLevel >= reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetOutlineLevel()) { // nDest needs adjusted if there are selected entries (including ancestral lineage) // immediately before the current moved entry. - SvTreeListEntry* pTmp = Prev(pEntry); - while (pTmp && lcl_IsContent(pTmp) && - nActLevel < static_cast<SwOutlineContent*>(pTmp->GetUserData())->GetOutlineLevel()) + std::unique_ptr<weld::TreeIter> xTmp(m_xTreeView->make_iterator(xEntry.get())); + bool bTmp = m_xTreeView->iter_previous(*xTmp); + while (bTmp && lcl_IsContent(*xTmp, *m_xTreeView) && + nActLevel < reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xTmp).toInt64())->GetOutlineLevel()) { - while (pTmp && lcl_IsContent(pTmp) && !IsSelected(pTmp) && - nActLevel < static_cast<SwOutlineContent*>(pTmp->GetUserData())->GetOutlineLevel()) + while (bTmp && lcl_IsContent(*xTmp, *m_xTreeView) && !m_xTreeView->is_selected(*xTmp) && + nActLevel < reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xTmp).toInt64())->GetOutlineLevel()) { - pTmp = GetParent(pTmp); + bTmp = m_xTreeView->iter_parent(*xTmp); } - if (!IsSelected(pTmp)) + if (!bTmp || !m_xTreeView->is_selected(*xTmp)) break; - pTmp = Prev(pTmp); - nDest = static_cast<SwOutlineContent*>(pTmp->GetUserData())->GetOutlinePos(); + bTmp = m_xTreeView->iter_previous(*xTmp); + nDest = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xTmp).toInt64())->GetOutlinePos(); } - if (!IsSelected(pEntry->PrevSibling())) + std::unique_ptr<weld::TreeIter> xPrevSibling(m_xTreeView->make_iterator(xEntry.get())); + if (!m_xTreeView->iter_previous_sibling(*xPrevSibling) || !m_xTreeView->is_selected(*xPrevSibling)) break; } else { - nDest = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos(); + nDest = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetOutlinePos(); } } } @@ -2614,46 +2738,50 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) } else // move up { - if (IsSelected(pCurrentEntry->PrevSibling())) + std::unique_ptr<weld::TreeIter> xPrevSibling(m_xTreeView->make_iterator(pCurrentEntry.get())); + if (m_xTreeView->iter_previous_sibling(*xPrevSibling) && m_xTreeView->is_selected(*xPrevSibling)) nDir = nDirLast; else { SwOutlineNodes::size_type nDest = nActPos; - pEntry = pCurrentEntry; - while (pEntry && nDest) + bEntry = true; + m_xTreeView->copy_iterator(*pCurrentEntry, *xEntry); + while (bEntry && nDest) { - pEntry = Prev(pEntry); - assert(pEntry == nullptr || !lcl_IsContent(pEntry) || dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - if (pEntry && lcl_IsContent(pEntry)) + bEntry = m_xTreeView->iter_previous(*xEntry); + assert(!bEntry || !lcl_IsContent(*xEntry, *m_xTreeView) || + dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + if (bEntry && lcl_IsContent(*xEntry, *m_xTreeView)) { - nDest = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos(); + nDest = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetOutlinePos(); } else { nDest = 0; // presumably? } - if (pEntry) + if (bEntry) { - if (!lcl_IsContent(pEntry)) + if (!lcl_IsContent(*xEntry, *m_xTreeView)) break; - else if (nActLevel >= static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlineLevel()) + else if (nActLevel >= reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetOutlineLevel()) { // nDest needs adjusted if there are selected entries immediately // after the level change. - SvTreeListEntry* pTmp = Next(pEntry); - while (pTmp && lcl_IsContent(pTmp) && - nActLevel < static_cast<SwOutlineContent*>(pTmp->GetUserData())->GetOutlineLevel() && - IsSelected(pTmp)) + std::unique_ptr<weld::TreeIter> xTmp(m_xTreeView->make_iterator(xEntry.get())); + bool bTmp = m_xTreeView->iter_next(*xTmp); + while (bTmp && lcl_IsContent(*xTmp, *m_xTreeView) && + nActLevel < reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xTmp).toInt64())->GetOutlineLevel() && + m_xTreeView->is_selected(*xTmp)) { - nDest = static_cast<SwOutlineContent*>(pTmp->GetUserData())->GetOutlinePos(); - const auto nLevel = static_cast<SwOutlineContent*>(pTmp->GetUserData())->GetOutlineLevel(); + nDest = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xTmp).toInt64())->GetOutlinePos(); + const auto nLevel = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xTmp).toInt64())->GetOutlineLevel(); // account for selected entries' descendent lineage - pTmp = Next(pTmp); - while (pTmp && lcl_IsContent(pTmp) && - nLevel < static_cast<SwOutlineContent*>(pTmp->GetUserData())->GetOutlineLevel()) + bTmp = m_xTreeView->iter_next(*xTmp); + while (bTmp && lcl_IsContent(*xTmp, *m_xTreeView) && + nLevel < reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xTmp).toInt64())->GetOutlineLevel()) { - nDest = static_cast<SwOutlineContent*>(pTmp->GetUserData())->GetOutlinePos(); - pTmp = Next(pTmp); + nDest = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xTmp).toInt64())->GetOutlinePos(); + bTmp = m_xTreeView->iter_next(*xTmp); } } break; @@ -2689,23 +2817,27 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) m_aActiveContentArr[ContentTypeId::OUTLINE]->Invalidate(); // clear all selections to prevent the Display function from trying to reselect selected entries - SelectAll(false); + m_xTreeView->unselect_all(); Display(true); // reselect entries const SwOutlineNodes::size_type nCurrPos = pShell->GetOutlinePos(MAXLEVEL); - SvTreeListEntry* pListEntry = First(); - while (nullptr != (pListEntry = Next(pListEntry)) && lcl_IsContent(pListEntry)) - { - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pListEntry->GetUserData()))); - if (static_cast<SwOutlineContent*>(pListEntry->GetUserData())->GetOutlinePos() == nCurrPos) - { - if (!IsExpanded(pListEntry->GetParent())) - Expand(pListEntry->GetParent()); - SetCurEntry(pListEntry); // unselect all entries, make entry visible, set focus, and select + std::unique_ptr<weld::TreeIter> xListEntry(m_xTreeView->make_iterator()); + bool bListEntry = m_xTreeView->get_iter_first(*xListEntry); + while ((bListEntry = m_xTreeView->iter_next(*xListEntry)) && lcl_IsContent(*xListEntry, *m_xTreeView)) + { + assert(dynamic_cast<SwOutlineContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xListEntry).toInt64()))); + if (reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*xListEntry).toInt64())->GetOutlinePos() == nCurrPos) + { + std::unique_ptr<weld::TreeIter> xParent(m_xTreeView->make_iterator(xListEntry.get())); + if (m_xTreeView->iter_parent(*xParent) && !m_xTreeView->get_row_expanded(*xParent)) + m_xTreeView->expand_row(*xParent); + m_xTreeView->set_cursor(*xListEntry); // unselect all entries, make entry visible, set focus, and select + Select(); break; } } + if (m_bIsRoot) { const SwOutlineNodes& rOutLineNds = pShell->GetNodes().GetOutLineNds(); @@ -2715,12 +2847,13 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) if(aFndIt == rOutLineNds.end()) continue; const size_t nFndPos = aFndIt - rOutLineNds.begin(); - SvTreeListEntry* pEntry = GetEntryAtAbsPos(nFndPos + 1); - if (pEntry) + std::unique_ptr<weld::TreeIter> xEntry = GetEntryAtAbsPos(nFndPos + 1); + if (xEntry) { - SvTreeListBox::SelectListEntry(pEntry, true); - if (!IsExpanded(pEntry->GetParent())) - Expand(pEntry->GetParent()); + m_xTreeView->select(*xEntry); + std::unique_ptr<weld::TreeIter> xParent(m_xTreeView->make_iterator(xEntry.get())); + if (m_xTreeView->iter_parent(*xParent) && !m_xTreeView->get_row_expanded(*xParent)) + m_xTreeView->expand_row(*xParent); } } } @@ -2730,42 +2863,27 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren) void SwContentTree::ShowTree() { - SvTreeListBox::Show(); -} - -void SwContentTree::Paint( vcl::RenderContext& rRenderContext, - const tools::Rectangle& rRect ) -{ - // prevent focus rect from flashing when tree is cleared - // SvTreeListBox::Paint shows focus rectangle when tree is empty - if (!GetEntryCount()) - return; - // Start the update timer on the first paint; avoids - // flicker on the first reveal. + m_xTreeView->show(); m_aUpdTimer.Start(); - SvTreeListBox::Paint( rRenderContext, rRect ); } void SwContentTree::HideTree() { // folded together will not be idled m_aUpdTimer.Stop(); - SvTreeListBox::Hide(); + m_xTreeView->hide(); } /** No idle with focus or while dragging */ IMPL_LINK_NOARG(SwContentTree, TimerUpdate, Timer *, void) { - if (IsDisposed()) - return; - // No update while focus is not in document. // No update while drag and drop. // Query view because the Navigator is cleared too late. SwView* pView = GetParentWindow()->GetCreateView(); if(pView && pView->GetWrtShellPtr() && pView->GetWrtShellPtr()->GetWin() && (pView->GetWrtShellPtr()->GetWin()->HasFocus() || m_bViewHasChanged) && - !bIsInDrag && !m_bIsInternalDrag && !pView->GetWrtShellPtr()->ActionPend()) + !IsInDrag() && !pView->GetWrtShellPtr()->ActionPend()) { m_bViewHasChanged = false; m_bIsIdleClear = false; @@ -2796,50 +2914,63 @@ IMPL_LINK_NOARG(SwContentTree, TimerUpdate, Timer *, void) return; // only track if selection is already an outline - SvTreeListEntry* pFirstSelected = FirstSelected(); - if (pFirstSelected && lcl_IsContent(pFirstSelected) && - static_cast<SwContent*>(pFirstSelected->GetUserData())->GetParent()->GetType() != ContentTypeId::OUTLINE) + std::unique_ptr<weld::TreeIter> xFirstSelected(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_selected(xFirstSelected.get())) + xFirstSelected.reset(); + if (xFirstSelected && lcl_IsContent(*xFirstSelected, *m_xTreeView) && + reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xFirstSelected).toInt64())->GetParent()->GetType() != ContentTypeId::OUTLINE) return; - if (pFirstSelected && lcl_IsContentType(pFirstSelected) && - static_cast<SwContentType*>(pFirstSelected->GetUserData())->GetType() != ContentTypeId::OUTLINE) + if (xFirstSelected && lcl_IsContentType(*xFirstSelected, *m_xTreeView) && + reinterpret_cast<SwContentType*>(m_xTreeView->get_id(*xFirstSelected).toInt64())->GetType() != ContentTypeId::OUTLINE) return; + int nSelectedRows = m_xTreeView->count_selected_rows(); + // find the outline in the tree and select it - for (SvTreeListEntry* pEntry = First(); pEntry; pEntry = Next(pEntry)) - { - if (lcl_IsContent(pEntry) && - static_cast<SwContent*>(pEntry->GetUserData())->GetParent()->GetType() == ContentTypeId::OUTLINE) + m_xTreeView->all_foreach([this, nSelectedRows, nActPos, &xFirstSelected](weld::TreeIter& rEntry){ + bool bRet = false; + + if (lcl_IsContent(rEntry, *m_xTreeView) && + reinterpret_cast<SwContent*>(m_xTreeView->get_id(rEntry).toInt64())->GetParent()->GetType() == ContentTypeId::OUTLINE) { // might have been scrolled out of view by the user so leave it that way - if (static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos() == nActPos) + if (reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(rEntry).toInt64())->GetOutlinePos() == nActPos) { // only select if not already selected or tree has multiple entries selected - if (pEntry != pFirstSelected || GetSelectionCount() > 1) + if (nSelectedRows != 1 || m_xTreeView->iter_compare(rEntry, *xFirstSelected) != 0) { if (m_nOutlineTracking == 2) // focused outline tracking { // collapse to children of root node - for (SvTreeListEntry* pChildEntry = FirstChild(First()); pChildEntry; pChildEntry = Next(pChildEntry)) + std::unique_ptr<weld::TreeIter> xChildEntry(m_xTreeView->make_iterator()); + if (m_xTreeView->get_iter_first(*xChildEntry) && m_xTreeView->iter_children(*xChildEntry)) { - if (static_cast<SwContent*>(pChildEntry->GetUserData())->GetParent()->GetType() == ContentTypeId::OUTLINE) - Collapse(pChildEntry); - else - break; + do + { + if (reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xChildEntry).toInt64())->GetParent()->GetType() == ContentTypeId::OUTLINE) + m_xTreeView->collapse_row(*xChildEntry); + else + break; + } + while (m_xTreeView->iter_next(*xChildEntry)); } } - SetCurEntry(pEntry); // unselect all entries, make pEntry visible, and select + m_xTreeView->set_cursor(rEntry); // unselect all entries, make pEntry visible, and select + Select(); } - break; + bRet = true; } } else { // use of this break assumes outline content type is first in tree - if (lcl_IsContentType(pEntry) && - static_cast<SwContentType*>(pEntry->GetUserData())->GetType() != ContentTypeId::OUTLINE) - break; + if (lcl_IsContentType(rEntry, *m_xTreeView) && + reinterpret_cast<SwContentType*>(m_xTreeView->get_id(rEntry).toInt64())->GetType() != ContentTypeId::OUTLINE) + bRet = true; } - } + + return bRet; + }); } else if (!pView && State::ACTIVE == m_eState && !m_bIsIdleClear) { @@ -2847,188 +2978,73 @@ IMPL_LINK_NOARG(SwContentTree, TimerUpdate, Timer *, void) { SetActiveShell(nullptr); } - Clear(); + clear(); m_bIsIdleClear = true; } } -DragDropMode SwContentTree::NotifyStartDrag( - TransferDataContainer& rContainer, - SvTreeListEntry* pEntry ) +void SwContentTree::MoveOutline(SwOutlineNodes::size_type nTargetPos) { - DragDropMode eMode = DragDropMode(0); - if (State::ACTIVE == m_eState && m_nRootType == ContentTypeId::OUTLINE && - GetModel()->GetAbsPos( pEntry ) > 0 - && !GetWrtShell()->GetView().GetDocShell()->IsReadOnly()) - { - eMode = GetDragDropMode(); - if (m_bIsRoot) - { - // Restore selection for multiple selected outlines. - for (const auto pSelected : m_aDndOutlinesSelected) - SelectListEntry(pSelected, true); - } - } - else if (State::ACTIVE != m_eState && GetWrtShell()->GetView().GetDocShell()->HasName()) - eMode = DragDropMode::APP_COPY; + SwWrtShell *const pShell = GetWrtShell(); + pShell->StartAllAction(); + pShell->StartUndo(SwUndoId::OUTLINE_UD); - sal_Int8 nDragMode; - FillTransferData( rContainer, nDragMode ); - m_bDocChgdInDragging = false; - m_bIsInternalDrag = true; - return eMode; -} -// After the drag the current paragraph will be moved w i t h the children. + SwOutlineNodes::size_type nPrevSourcePos = SwOutlineNodes::npos; + SwOutlineNodes::size_type nPrevTargetPosOrOffset = SwOutlineNodes::npos; -TriState SwContentTree::NotifyMoving( SvTreeListEntry* pTarget, - SvTreeListEntry* pEntry, SvTreeListEntry*& , sal_uLong& ) -{ - static SwOutlineNodes::size_type nStaticSourcePos = SwOutlineNodes::npos; - static SwOutlineNodes::size_type nStaticTargetPosOrOffset = SwOutlineNodes::npos; - if(!m_bDocChgdInDragging) - { - SwOutlineNodes::size_type nTargetPos = 0; - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwOutlineNodes::size_type nSourcePos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos(); - if(!lcl_IsContent(pTarget)) - nTargetPos = SwOutlineNodes::npos; - else - { - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pTarget->GetUserData()))); - nTargetPos = static_cast<SwOutlineContent*>(pTarget->GetUserData())->GetOutlinePos(); - } - if( MAXLEVEL > m_nOutlineLevel && // Not all layers are displayed. - nTargetPos != SwOutlineNodes::npos) - { - SvTreeListEntry* pNext = Next(pTarget); - if(pNext) - { - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pNext->GetUserData()))); - nTargetPos = static_cast<SwOutlineContent*>(pNext->GetUserData())->GetOutlinePos() - 1; - } - else - nTargetPos = GetWrtShell()->getIDocumentOutlineNodesAccess()->getOutlineNodesCount() - 1; - } + bool bFirstMove = true; - OSL_ENSURE( pEntry && - lcl_IsContent(pEntry),"Source == 0 or Source has no Content" ); + for (const auto& source : m_aDndOutlinesSelected) + { + SwOutlineNodes::size_type nSourcePos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(*source).toInt64())->GetOutlinePos(); - if (nStaticTargetPosOrOffset != SwOutlineNodes::npos) + // Done on the first selection move + if (bFirstMove) // only do once { if (nTargetPos == SwOutlineNodes::npos || nSourcePos > nTargetPos) { - // Move up - nTargetPos = nSourcePos - nStaticTargetPosOrOffset; + // Up moves + // The first up move sets the up move amount for the remaining selected outlines to be moved + if (nTargetPos != SwOutlineNodes::npos) + nPrevTargetPosOrOffset = nSourcePos - nTargetPos; + else + nPrevTargetPosOrOffset = nSourcePos + 1; } else if (nSourcePos < nTargetPos) { - // Move down - nSourcePos = nStaticSourcePos; - nTargetPos = nStaticTargetPosOrOffset; + // Down moves + // The first down move sets the source and target positions for the remaining selected outlines to be moved + nPrevSourcePos = nSourcePos; + nPrevTargetPosOrOffset = nTargetPos; } + bFirstMove = false; } - // Done on the first selection move - if (nTargetPos == SwOutlineNodes::npos || (nStaticTargetPosOrOffset == SwOutlineNodes::npos && nSourcePos > nTargetPos)) // only do once - { - // Up moves - // The first up move sets the up move amount for the remaining selected outlines to be moved - if (nTargetPos != SwOutlineNodes::npos) - nStaticTargetPosOrOffset = nSourcePos - nTargetPos; - else - nStaticTargetPosOrOffset = nSourcePos + 1; - } - else if (nStaticTargetPosOrOffset == SwOutlineNodes::npos && nSourcePos < nTargetPos) - { - // Down moves - // The first down move sets the source and target positions for the remaining selected outlines to be moved - nStaticSourcePos = nSourcePos; - nStaticTargetPosOrOffset = nTargetPos; - } - // Done on the last selection move - if (!IsSelected(pEntry->NextSibling())) - nStaticTargetPosOrOffset = SwOutlineNodes::npos; - - GetParentWindow()->MoveOutline( nSourcePos, - nTargetPos, - true); - } - //TreeListBox will be reloaded from the document - return TRISTATE_FALSE; -} - -// After the drag the current paragraph will be moved w i t h o u t the children. - -TriState SwContentTree::NotifyCopying( SvTreeListEntry* pTarget, - SvTreeListEntry* pEntry, SvTreeListEntry*& , sal_uLong& ) -{ - if(!m_bDocChgdInDragging) - { - SwOutlineNodes::size_type nTargetPos = 0; - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - SwOutlineNodes::size_type nSourcePos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos(); - if(!lcl_IsContent(pTarget)) - nTargetPos = SwOutlineNodes::npos; else { - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pTarget->GetUserData()))); - nTargetPos = static_cast<SwOutlineContent*>(pTarget->GetUserData())->GetOutlinePos(); - } - - if( MAXLEVEL > m_nOutlineLevel && // Not all layers are displayed. - nTargetPos != SwOutlineNodes::npos) - { - SvTreeListEntry* pNext = Next(pTarget); - if(pNext) + if (nTargetPos == SwOutlineNodes::npos || nSourcePos > nTargetPos) { - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pNext->GetUserData()))); - nTargetPos = static_cast<SwOutlineContent*>(pNext->GetUserData())->GetOutlinePos() - 1; + // Move up + nTargetPos = nSourcePos - nPrevTargetPosOrOffset; + } + else if (nSourcePos < nTargetPos) + { + // Move down + nSourcePos = nPrevSourcePos; + nTargetPos = nPrevTargetPosOrOffset; } - else - nTargetPos = GetWrtShell()->getIDocumentOutlineNodesAccess()->getOutlineNodesCount() - 1; } - - OSL_ENSURE( pEntry && - lcl_IsContent(pEntry),"Source == 0 or Source has no Content" ); - GetParentWindow()->MoveOutline( nSourcePos, nTargetPos, false); - - //TreeListBox will be reloaded from the document - m_aActiveContentArr[ContentTypeId::OUTLINE]->Invalidate(); - Display(true); + GetParentWindow()->MoveOutline(nSourcePos, nTargetPos, true); } - return TRISTATE_FALSE; -} - -// No drop before the first entry - it's a SwContentType - -bool SwContentTree::NotifyAcceptDrop( SvTreeListEntry* pEntry) -{ - return pEntry != nullptr; -} - -// If a Ctrl + DoubleClick are executed in an open area, -// then the base function of the control is to be called. -void SwContentTree::MouseButtonDown( const MouseEvent& rMEvt ) -{ - Point aPos( rMEvt.GetPosPixel()); - SvTreeListEntry* pEntry = GetEntry( aPos, true ); - if( !pEntry && rMEvt.IsLeft() && rMEvt.IsMod1() && (rMEvt.GetClicks() % 2) == 0) - Control::MouseButtonDown( rMEvt ); - else - { - if( pEntry && (rMEvt.GetClicks() % 2) == 0) - { - SwContent* pCnt = static_cast<SwContent*>(pEntry->GetUserData()); - const ContentTypeId nActType = pCnt->GetParent()->GetType(); - SetSublistDontOpenWithDoubleClick( nActType == ContentTypeId::OUTLINE ); - } - SvTreeListBox::MouseButtonDown( rMEvt ); - } + pShell->EndUndo(); + pShell->EndAllAction(); + m_aActiveContentArr[ContentTypeId::OUTLINE]->Invalidate(); + Display(true); + m_aDndOutlinesSelected.clear(); } // Update immediately - -void SwContentTree::GetFocus() +IMPL_LINK_NOARG(SwContentTree, FocusHdl, weld::Widget&, void) { SwView* pActView = GetParentWindow()->GetCreateView(); if(pActView) @@ -3048,17 +3064,18 @@ void SwContentTree::GetFocus() } } else if (State::ACTIVE == m_eState) - Clear(); - SvTreeListBox::GetFocus(); + clear(); } -void SwContentTree::KeyInput(const KeyEvent& rEvent) +IMPL_LINK(SwContentTree, KeyInputHdl, const KeyEvent&, rEvent, bool) { + bool bConsumed = true; + const vcl::KeyCode aCode = rEvent.GetKeyCode(); - if(aCode.GetCode() == KEY_RETURN) + if (aCode.GetCode() == KEY_RETURN) { - SvTreeListEntry* pEntry = FirstSelected(); - if ( pEntry ) + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + if (m_xTreeView->get_selected(xEntry.get())) { switch(aCode.GetModifier()) { @@ -3071,41 +3088,37 @@ void SwContentTree::KeyInput(const KeyEvent& rEvent) ToggleToRoot(); break; case 0: - if(lcl_IsContentType(pEntry)) + if (lcl_IsContentType(*xEntry, *m_xTreeView)) { - IsExpanded(pEntry) ? Collapse(pEntry) : Expand(pEntry); + m_xTreeView->get_row_expanded(*xEntry) ? m_xTreeView->collapse_row(*xEntry) + : m_xTreeView->expand_row(*xEntry); } else - ContentDoubleClickHdl(nullptr); + ContentDoubleClickHdl(*m_xTreeView); break; } } } else if(aCode.GetCode() == KEY_DELETE && 0 == aCode.GetModifier()) { - SvTreeListEntry* pEntry = FirstSelected(); - if(pEntry && lcl_IsContent(pEntry)) + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + if (m_xTreeView->get_selected(xEntry.get()) && lcl_IsContent(*xEntry, *m_xTreeView)) { - assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData()))); - if (static_cast<SwContent*>(pEntry->GetUserData())->GetParent()->IsDeletable() && + assert(dynamic_cast<SwContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64()))); + if (reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetParent()->IsDeletable() && !m_pActiveShell->GetView().GetDocShell()->IsReadOnly()) { - EditEntry(pEntry, EditEntryMode::DELETE); + EditEntry(*xEntry, EditEntryMode::DELETE); } } } //Make KEY_SPACE has same function as DoubleClick , //and realize multi-selection . - else if(aCode.GetCode() == KEY_SPACE && 0 == aCode.GetModifier()) + else if (aCode.GetCode() == KEY_SPACE && 0 == aCode.GetModifier()) { - SvTreeListEntry* pEntry = GetCurEntry(); - if(pEntry) + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + if (m_xTreeView->get_cursor(xEntry.get())) { - if( GetChildCount( pEntry ) == 0 ) - m_bIsKeySpace = true; - Point tempPoint = GetEntryPosition( pEntry );//Change from "GetEntryPos" to "GetEntryPosition" for acc migration - m_aOldRectangle = GetFocusRect(pEntry, tempPoint.Y()); - if (State::HIDDEN != m_eState) { if (State::CONSTANT == m_eState) @@ -3113,7 +3126,7 @@ void SwContentTree::KeyInput(const KeyEvent& rEvent) m_pActiveShell->GetView().GetViewFrame()->GetWindow().ToTop(); } - SwContent* pCnt = dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData())); + SwContent* pCnt = dynamic_cast<SwContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64())); if (pCnt && pCnt->GetParent()->GetType() == ContentTypeId::DRAWOBJECT) { @@ -3189,20 +3202,19 @@ void SwContentTree::KeyInput(const KeyEvent& rEvent) m_bViewHasChanged = true; } } - } else { - SvTreeListEntry* pEntry = GetCurEntry(); - if (pEntry) + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + if (m_xTreeView->get_cursor(xEntry.get())) { - SwContent* pCnt = dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData())); + SwContent* pCnt = dynamic_cast<SwContent*>(reinterpret_cast<SwTypeNumber*>(m_xTreeView->get_id(*xEntry).toInt64())); if (pCnt && pCnt->GetParent()->GetType() == ContentTypeId::OUTLINE) { if (m_bIsRoot && aCode.GetCode() == KEY_LEFT && aCode.GetModifier() == 0) { - SelectAll(false); - SvTreeListBox::KeyInput(rEvent); + m_xTreeView->unselect_all(); + bConsumed = false; } else if (aCode.IsMod1()) { @@ -3211,135 +3223,91 @@ void SwContentTree::KeyInput(const KeyEvent& rEvent) else if (aCode.GetCode() == KEY_RIGHT) ExecCommand("demote", !aCode.IsShift()); else if (aCode.GetCode() == KEY_UP) - ExecCommand("up", !aCode.IsShift()); + ExecCommand("chapterup", !aCode.IsShift()); else if (aCode.GetCode() == KEY_DOWN) - ExecCommand("down", !aCode.IsShift()); + ExecCommand("chapterdown", !aCode.IsShift()); else - SvTreeListBox::KeyInput(rEvent); + bConsumed = false; } else - SvTreeListBox::KeyInput(rEvent); + bConsumed = false; } else - SvTreeListBox::KeyInput(rEvent); + bConsumed = false; } + else + bConsumed = false; } + return bConsumed; } -void SwContentTree::RequestHelp( const HelpEvent& rHEvt ) +IMPL_LINK(SwContentTree, QueryTooltipHdl, const weld::TreeIter&, rEntry, OUString) { - bool bCallBase = true; - if( rHEvt.GetMode() & HelpEventMode::QUICK ) + ContentTypeId nType; + bool bContent = false; + void* pUserData = reinterpret_cast<void*>(m_xTreeView->get_id(rEntry).toInt64()); + if (lcl_IsContentType(rEntry, *m_xTreeView)) { - Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() )); - SvTreeListEntry* pEntry = GetEntry( aPos ); - if( pEntry ) + assert(dynamic_cast<SwContentType*>(static_cast<SwTypeNumber*>(pUserData))); + nType = static_cast<SwContentType*>(pUserData)->GetType(); + } + else + { + assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pUserData))); + nType = static_cast<SwContent*>(pUserData)->GetParent()->GetType(); + bContent = true; + } + OUString sEntry; + if(bContent) + { + switch( nType ) { - ContentTypeId nType; - bool bBalloon = false; - bool bContent = false; - void* pUserData = pEntry->GetUserData(); - if(lcl_IsContentType(pEntry)) - { - assert(dynamic_cast<SwContentType*>(static_cast<SwTypeNumber*>(pUserData))); - nType = static_cast<SwContentType*>(pUserData)->GetType(); - } - else - { - assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pUserData))); - nType = static_cast<SwContent*>(pUserData)->GetParent()->GetType(); - bContent = true; - } - OUString sEntry; - bool bRet = false; - if(bContent) - { - switch( nType ) - { - case ContentTypeId::URLFIELD: - assert(dynamic_cast<SwURLFieldContent*>(static_cast<SwTypeNumber*>(pUserData))); - sEntry = static_cast<SwURLFieldContent*>(pUserData)->GetURL(); - bRet = true; - break; - - case ContentTypeId::POSTIT: - assert(dynamic_cast<SwPostItContent*>(static_cast<SwTypeNumber*>(pUserData))); - sEntry = static_cast<SwPostItContent*>(pUserData)->GetName(); - bRet = true; - if(Help::IsBalloonHelpEnabled()) - bBalloon = true; - break; - case ContentTypeId::OUTLINE: - assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pUserData))); - sEntry = static_cast<SwOutlineContent*>(pUserData)->GetName(); - bRet = true; - break; - case ContentTypeId::GRAPHIC: - assert(dynamic_cast<SwGraphicContent*>(static_cast<SwTypeNumber*>(pUserData))); - sEntry = static_cast<SwGraphicContent*>(pUserData)->GetLink(); - bRet = true; - break; - default: break; - } - if(static_cast<SwContent*>(pUserData)->IsInvisible()) - { - if(!sEntry.isEmpty()) - sEntry += ", "; - sEntry += m_sInvisible; - bRet = true; - } - } - else - { - const size_t nMemberCount = static_cast<SwContentType*>(pUserData)->GetMemberCount(); - sEntry = OUString::number(nMemberCount) + " " + - (nMemberCount == 1 - ? static_cast<SwContentType*>(pUserData)->GetSingleName() - : static_cast<SwContentType*>(pUserData)->GetName()); - bRet = true; - } - if(bRet) - { - SvLBoxTab* pTab; - SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab ); - if (pItem && SvLBoxItemType::String == pItem->GetType()) - { - aPos = GetEntryPosition( pEntry ); - - aPos.setX( GetTabPos( pEntry, pTab ) ); - Size aSize(pItem->GetWidth(this, pEntry), pItem->GetHeight(this, pEntry)); - - if((aPos.X() + aSize.Width()) > GetSizePixel().Width()) - aSize.setWidth( GetSizePixel().Width() - aPos.X() ); + case ContentTypeId::URLFIELD: + assert(dynamic_cast<SwURLFieldContent*>(static_cast<SwTypeNumber*>(pUserData))); + sEntry = static_cast<SwURLFieldContent*>(pUserData)->GetURL(); + break; - aPos = OutputToScreenPixel(aPos); - tools::Rectangle aItemRect( aPos, aSize ); - if(bBalloon) - { - aPos.AdjustX(aSize.Width() ); - Help::ShowBalloon( this, aPos, aItemRect, sEntry ); - } - else - Help::ShowQuickHelp( this, aItemRect, sEntry, - QuickHelpFlags::Left|QuickHelpFlags::VCenter ); - bCallBase = false; - } - } - else - { - Help::ShowQuickHelp( this, tools::Rectangle(), OUString() ); - bCallBase = false; - } + case ContentTypeId::POSTIT: + assert(dynamic_cast<SwPostItContent*>(static_cast<SwTypeNumber*>(pUserData))); + sEntry = static_cast<SwPostItContent*>(pUserData)->GetName(); + break; + case ContentTypeId::OUTLINE: + assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pUserData))); + sEntry = static_cast<SwOutlineContent*>(pUserData)->GetName(); + break; + case ContentTypeId::GRAPHIC: + assert(dynamic_cast<SwGraphicContent*>(static_cast<SwTypeNumber*>(pUserData))); + sEntry = static_cast<SwGraphicContent*>(pUserData)->GetLink(); + break; + default: break; } + if(static_cast<SwContent*>(pUserData)->IsInvisible()) + { + if(!sEntry.isEmpty()) + sEntry += ", "; + sEntry += m_sInvisible; + } + } + else + { + const size_t nMemberCount = static_cast<SwContentType*>(pUserData)->GetMemberCount(); + sEntry = OUString::number(nMemberCount) + " " + + (nMemberCount == 1 + ? static_cast<SwContentType*>(pUserData)->GetSingleName() + : static_cast<SwContentType*>(pUserData)->GetName()); } - if( bCallBase ) - Window::RequestHelp( rHEvt ); + + return sEntry; } -void SwContentTree::ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) +void SwContentTree::ExecuteContextMenuAction(const OString& rSelectedPopupEntry) { - SvTreeListEntry* pFirst = FirstSelected(); - switch( nSelectedPopupEntry ) + std::unique_ptr<weld::TreeIter> xFirst(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_selected(xFirst.get())) + xFirst.reset(); + + auto nSelectedPopupEntry = rSelectedPopupEntry.toUInt32(); + switch (nSelectedPopupEntry) { case 11: case 12: @@ -3370,18 +3338,18 @@ void SwContentTree::ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) break; case 401: case 402: - EditEntry(pFirst, nSelectedPopupEntry == 401 ? EditEntryMode::RMV_IDX : EditEntryMode::UPD_IDX); + EditEntry(*xFirst, nSelectedPopupEntry == 401 ? EditEntryMode::RMV_IDX : EditEntryMode::UPD_IDX); break; // Edit entry case 403: - EditEntry(pFirst, EditEntryMode::EDIT); + EditEntry(*xFirst, EditEntryMode::EDIT); break; case 404: - EditEntry(pFirst, EditEntryMode::UNPROTECT_TABLE); + EditEntry(*xFirst, EditEntryMode::UNPROTECT_TABLE); break; case 405 : { - const SwTOXBase* pBase = static_cast<SwTOXBaseContent*>(pFirst->GetUserData()) + const SwTOXBase* pBase = reinterpret_cast<SwTOXBaseContent*>(m_xTreeView->get_id(*xFirst).toInt64()) ->GetTOXBase(); m_pActiveShell->SetTOXBaseReadonly(*pBase, !SwEditShell::IsTOXBaseReadonly(*pBase)); } @@ -3389,10 +3357,10 @@ void SwContentTree::ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) case 4: break; case 501: - EditEntry(pFirst, EditEntryMode::DELETE); + EditEntry(*xFirst, EditEntryMode::DELETE); break; case 502 : - EditEntry(pFirst, EditEntryMode::RENAME); + EditEntry(*xFirst, EditEntryMode::RENAME); break; case 600: m_pActiveShell->GetView().GetPostItMgr()->Show(); @@ -3412,13 +3380,13 @@ void SwContentTree::ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) break; } case 800: - KeyInput(KeyEvent(0, KEY_MOD1|KEY_MULTIPLY)); + KeyInputHdl(KeyEvent(0, KEY_MOD1|KEY_MULTIPLY)); break; case 801: - ExecCommand("up", true); + ExecCommand("chapterup", true); break; case 802: - ExecCommand("down", true); + ExecCommand("chapterdown", true); break; case 803: ExecCommand("promote", true); @@ -3431,17 +3399,17 @@ void SwContentTree::ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) m_pActiveShell->KillPams(); m_pActiveShell->ClearMark(); m_pActiveShell->EnterAddMode(); - SwContent* pCnt = static_cast<SwContent*>(pFirst->GetUserData()); + SwContent* pCnt = reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xFirst).toInt64()); const ContentTypeId eTypeId = pCnt->GetParent()->GetType(); if (eTypeId == ContentTypeId::OUTLINE) { - for (SvTreeListEntry* pEntry = FirstSelected(); pEntry; pEntry = NextSelected(pEntry)) - { + m_xTreeView->selected_foreach([this](weld::TreeIter& rEntry){ m_pActiveShell->SttSelect(); - SwOutlineNodes::size_type nActPos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos(); - m_pActiveShell->MakeOutlineSel(nActPos, nActPos, !IsExpanded(pEntry), false); // select children if not expanded + SwOutlineNodes::size_type nActPos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(rEntry).toInt64())->GetOutlinePos(); + m_pActiveShell->MakeOutlineSel(nActPos, nActPos, !m_xTreeView->get_row_expanded(rEntry), false); // select children if not expanded m_pActiveShell->EndSelect(); - } + return false; + }); } else if (eTypeId == ContentTypeId::TABLE) { @@ -3463,11 +3431,11 @@ void SwContentTree::ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) break; case 806: // Delete outline selections - EditEntry(pFirst, EditEntryMode::DELETE); + EditEntry(*xFirst, EditEntryMode::DELETE); break; case 900: { - SwContent* pCnt = static_cast<SwContent*>(pFirst->GetUserData()); + SwContent* pCnt = reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xFirst).toInt64()); GotoContent(pCnt); } break; @@ -3503,16 +3471,20 @@ void SwContentTree::DeleteOutlineSelections() m_pActiveShell->StartAction(); m_pActiveShell->EnterAddMode(); auto nChapters(0); - for (SvTreeListEntry* pEntry = FirstSelected(); pEntry; pEntry = NextSelected(pEntry)) - { + + m_xTreeView->selected_foreach([this, &nChapters](weld::TreeIter& rEntry){ ++nChapters; - if ((pEntry->HasChildren() || pEntry->HasChildrenOnDemand()) && !IsExpanded(pEntry)) // only count children if not expanded - nChapters += pEntry->GetChildEntries().size(); + if (m_xTreeView->iter_has_child(rEntry) && + !m_xTreeView->get_row_expanded(rEntry)) // only count children if not expanded + { + nChapters += m_xTreeView->iter_n_children(rEntry); + } m_pActiveShell->SttSelect(); - SwOutlineNodes::size_type nActPos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos(); - m_pActiveShell->MakeOutlineSel(nActPos, nActPos, !IsExpanded(pEntry), false); // select children if not expanded + SwOutlineNodes::size_type nActPos = reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(rEntry).toInt64())->GetOutlinePos(); + m_pActiveShell->MakeOutlineSel(nActPos, nActPos, !m_xTreeView->get_row_expanded(rEntry), false); // select children if not expanded m_pActiveShell->EndSelect(); - } + return false; + }); m_pActiveShell->LeaveAddMode(); SwRewriter aRewriter; aRewriter.AddRule(UndoArg1, SwResId(STR_CHAPTERS, nChapters)); @@ -3540,7 +3512,6 @@ void SwContentTree::SetOutlineLevel(sal_uInt8 nSet) } // Mode Change: Show dropped Doc - void SwContentTree::ShowHiddenShell() { if(m_pHiddenShell) @@ -3551,7 +3522,6 @@ void SwContentTree::ShowHiddenShell() } // Mode Change: Show active view - void SwContentTree::ShowActualView() { m_eState = State::ACTIVE; @@ -3559,38 +3529,42 @@ void SwContentTree::ShowActualView() GetParentWindow()->UpdateListBox(); } +IMPL_LINK_NOARG(SwContentTree, SelectHdl, weld::TreeView&, void) +{ + Select(); +} + // Here the buttons for moving outlines are en-/disabled. -bool SwContentTree::Select( SvTreeListEntry* pEntry, bool bSelect ) +void SwContentTree::Select() { - if(!pEntry) - return false; + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_selected(xEntry.get())) + return; + bool bEnable = false; - SvTreeListEntry* pParentEntry = GetParent(pEntry); - while(pParentEntry && (!lcl_IsContentType(pParentEntry))) - { - pParentEntry = GetParent(pParentEntry); - } + std::unique_ptr<weld::TreeIter> xParentEntry(m_xTreeView->make_iterator(xEntry.get())); + bool bParentEntry = m_xTreeView->iter_parent(*xParentEntry); + while (bParentEntry && (!lcl_IsContentType(*xParentEntry, *m_xTreeView))) + bParentEntry = m_xTreeView->iter_parent(*xParentEntry); if (!m_bIsLastReadOnly) { - if (!IsVisible()) + if (!m_xTreeView->get_visible()) bEnable = true; - else if (pParentEntry) + else if (bParentEntry) { if ((m_bIsRoot && m_nRootType == ContentTypeId::OUTLINE) || - (lcl_IsContent(pEntry) && - static_cast<SwContentType*>(pParentEntry->GetUserData())->GetType() == ContentTypeId::OUTLINE)) + (lcl_IsContent(*xEntry, *m_xTreeView) && + reinterpret_cast<SwContentType*>(m_xTreeView->get_id(*xParentEntry).toInt64())->GetType() == ContentTypeId::OUTLINE)) { bEnable = true; } } } SwNavigationPI* pNavi = GetParentWindow(); - pNavi->m_aContentToolBox->EnableItem(pNavi->m_aContentToolBox->GetItemId("up"), bEnable); - pNavi->m_aContentToolBox->EnableItem(pNavi->m_aContentToolBox->GetItemId("down"), bEnable); - pNavi->m_aContentToolBox->EnableItem(pNavi->m_aContentToolBox->GetItemId("promote"), bEnable); - pNavi->m_aContentToolBox->EnableItem(pNavi->m_aContentToolBox->GetItemId("demote"), bEnable); - - return SvTreeListBox::Select(pEntry, bSelect); + pNavi->m_xContent3ToolBox->set_item_sensitive("chapterup", bEnable); + pNavi->m_xContent3ToolBox->set_item_sensitive("chapterdown", bEnable); + pNavi->m_xContent3ToolBox->set_item_sensitive("promote", bEnable); + pNavi->m_xContent3ToolBox->set_item_sensitive("demote", bEnable); } void SwContentTree::SetRootType(ContentTypeId nType) @@ -3613,9 +3587,9 @@ OUString SwContentType::RemoveNewline(const OUString& rEntry) return aEntry.makeStringAndClear(); } -void SwContentTree::EditEntry(SvTreeListEntry const * pEntry, EditEntryMode nMode) +void SwContentTree::EditEntry(const weld::TreeIter& rEntry, EditEntryMode nMode) { - SwContent* pCnt = static_cast<SwContent*>(pEntry->GetUserData()); + SwContent* pCnt = reinterpret_cast<SwContent*>(m_xTreeView->get_id(rEntry).toInt64()); GotoContent(pCnt); const ContentTypeId nType = pCnt->GetParent()->GetType(); sal_uInt16 nSlot = 0; @@ -3822,7 +3796,7 @@ void SwContentTree::EditEntry(SvTreeListEntry const * pEntry, EditEntryMode nMod aObj >>= xTmp; uno::Reference< container::XNamed > xNamed(xTmp, uno::UNO_QUERY); SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); - ScopedVclPtr<AbstractSwRenameXNamedDlg> pDlg(pFact->CreateSwRenameXNamedDlg(GetFrameWeld(), xNamed, xNameAccess)); + ScopedVclPtr<AbstractSwRenameXNamedDlg> pDlg(pFact->CreateSwRenameXNamedDlg(GetParentWindow()->GetFrameWeld(), xNamed, xNameAccess)); if(xSecond.is()) pDlg->SetAlternativeAccess( xSecond, xThird); @@ -3843,7 +3817,7 @@ void SwContentTree::EditEntry(SvTreeListEntry const * pEntry, EditEntryMode nMod m_bViewHasChanged = true; GetParentWindow()->UpdateListBox(); TimerUpdate(&m_aUpdTimer); - GrabFocus(); + grab_focus(); } } @@ -4004,59 +3978,6 @@ bool NaviContentBookmark::Paste( TransferableDataHelper& rData ) return bRet; } -namespace { - -class SwContentLBoxString : public SvLBoxString -{ -public: - explicit SwContentLBoxString(const OUString& rStr) : SvLBoxString(rStr) {} - - virtual void Paint(const Point& rPos, SvTreeListBox& rDev, vcl::RenderContext& rRenderContext, - const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) override; -}; - -} - -void SwContentTree::InitEntry(SvTreeListEntry* pEntry, - const OUString& rStr ,const Image& rImg1,const Image& rImg2) -{ - const size_t nColToHilite = 1; //0==Bitmap;1=="Column1";2=="Column2" - SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2 ); - SvLBoxString& rCol = static_cast<SvLBoxString&>(pEntry->GetItem( nColToHilite )); - pEntry->ReplaceItem(std::make_unique<SwContentLBoxString>(rCol.GetText()), nColToHilite); -} - -void SwContentLBoxString::Paint(const Point& rPos, SvTreeListBox& rDev, vcl::RenderContext& rRenderContext, - const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) -{ - if (lcl_IsContent(&rEntry) && static_cast<SwContent *>(rEntry.GetUserData())->IsInvisible()) - { - vcl::Font aOldFont(rRenderContext.GetFont()); - vcl::Font aFont(aOldFont); - aFont.SetColor(COL_LIGHTGRAY); - rRenderContext.SetFont(aFont ); - rRenderContext.DrawText(rPos, GetText()); - rRenderContext.SetFont(aOldFont); - } - else - { - SvLBoxString::Paint(rPos, rDev, rRenderContext, pView, rEntry); - } -} - -void SwContentTree::DataChanged(const DataChangedEvent& rDCEvt) -{ - if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) && - (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) ) - { - FindActiveTypeAndRemoveUserData(); - - Display(true); - } - - SvTreeListBox::DataChanged( rDCEvt ); -} - SwNavigationPI* SwContentTree::GetParentWindow() { return m_xDialog; diff --git a/sw/source/uibase/utlui/glbltree.cxx b/sw/source/uibase/utlui/glbltree.cxx index 43fd340f482f..77ca2543ccb5 100644 --- a/sw/source/uibase/utlui/glbltree.cxx +++ b/sw/source/uibase/utlui/glbltree.cxx @@ -17,6 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include <o3tl/safeint.hxx> #include <svl/stritem.hxx> #include <sfx2/fcontnr.hxx> #include <sfx2/linkmgr.hxx> @@ -24,13 +25,14 @@ #include <sfx2/viewfrm.hxx> #include <sfx2/docfile.hxx> #include <sfx2/docfilt.hxx> +#include <vcl/commandevent.hxx> +#include <vcl/event.hxx> #include <vcl/help.hxx> #include <sot/filelist.hxx> #include <svl/eitem.hxx> #include <vcl/graphicfilter.hxx> #include <vcl/settings.hxx> -#include <vcl/treelistentry.hxx> #include <sfx2/docinsert.hxx> #include <sfx2/filedlghelper.hxx> @@ -53,56 +55,9 @@ using namespace ::com::sun::star::uno; -// Context menu for GlobalTree -#define CTX_INSERT_ANY_INDEX 10 -#define CTX_INSERT_FILE 11 -#define CTX_INSERT_NEW_FILE 12 -#define CTX_INSERT_TEXT 13 - -#define CTX_UPDATE_SEL 20 -#define CTX_UPDATE_INDEX 21 -#define CTX_UPDATE_LINK 22 -#define CTX_UPDATE_ALL 23 - -#define CTX_UPDATE 1 -#define CTX_INSERT 2 -#define CTX_EDIT 3 -#define CTX_DELETE 4 -#define CTX_EDIT_LINK 5 - #define GLOBAL_UPDATE_TIMEOUT 2000 -// TabPos: push to left -#define GLBL_TABPOS_SUB 5 - const SfxObjectShell* SwGlobalTree::pShowShell = nullptr; -static const char* aHelpForMenu[] = -{ - nullptr, - HID_GLBLTREE_UPDATE, //CTX_UPDATE - HID_GLBLTREE_INSERT, //CTX_INSERT - HID_GLBLTREE_EDIT, //CTX_EDIT - HID_GLBLTREE_DEL, //CTX_DELETE - HID_GLBLTREE_EDIT_LINK, //CTX_EDIT_LINK - nullptr, - nullptr, - nullptr, - nullptr, - HID_GLBLTREE_INS_IDX, //CTX_INSERT_ANY_INDEX - HID_GLBLTREE_INS_FILE, //CTX_INSERT_FILE - HID_GLBLTREE_INS_NEW_FILE, //CTX_INSERT_NEW_FILE - HID_GLBLTREE_INS_TEXT, //CTX_INSERT_TEXT - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - HID_GLBLTREE_UPD_SEL, //CTX_UPDATE_SEL - HID_GLBLTREE_UPD_IDX, //CTX_UPDATE_INDEX - HID_GLBLTREE_UPD_LINK, //CTX_UPDATE_LINK - HID_GLBLTREEUPD_ALL //CTX_UPDATE_ALL -}; namespace { @@ -169,18 +124,14 @@ static const char* GLOBAL_CONTEXT_ARY[] = STR_EDIT_LINK }; -SwGlobalTree::SwGlobalTree(vcl::Window* pParent, SwNavigationPI* pDialog) - : SvTreeListBox(pParent) +SwGlobalTree::SwGlobalTree(std::unique_ptr<weld::TreeView> xTreeView, SwNavigationPI* pDialog) + : m_xTreeView(std::move(xTreeView)) + , m_aDropTargetHelper(*this) , m_xDialog(pDialog) , m_pActiveShell(nullptr) - , m_pEmphasisEntry(nullptr) - , m_pDDSource(nullptr) - , m_bIsInternalDrag(false) - , m_bLastEntryEmphasis(false) { - SetDragDropMode(DragDropMode::APP_COPY | - DragDropMode::CTRL_MOVE | - DragDropMode::ENABLE_TOP ); + Size aSize(m_xDialog->LogicToPixel(Size(110, 112), MapMode(MapUnit::MapAppFont)));; + m_xTreeView->set_size_request(aSize.Width(), aSize.Height()); m_aUpdateTimer.SetTimeout(GLOBAL_UPDATE_TIMEOUT); m_aUpdateTimer.SetInvokeHandler(LINK(this, SwGlobalTree, Timeout)); @@ -189,68 +140,57 @@ SwGlobalTree::SwGlobalTree(vcl::Window* pParent, SwNavigationPI* pDialog) { m_aContextStrings[i] = SwResId(GLOBAL_CONTEXT_ARY[i]); } - SetHelpId(HID_NAVIGATOR_GLOB_TREELIST); - SelectHdl(); - SetDoubleClickHdl(LINK(this, SwGlobalTree, DoubleClickHdl)); - EnableContextMenuHandling(); + m_xTreeView->set_help_id(HID_NAVIGATOR_GLOB_TREELIST); + Select(); + m_xTreeView->connect_row_activated(LINK(this, SwGlobalTree, DoubleClickHdl)); + m_xTreeView->connect_changed(LINK(this, SwGlobalTree, SelectHdl)); + m_xTreeView->connect_focus_in(LINK(this, SwGlobalTree, FocusInHdl)); + m_xTreeView->connect_key_press(LINK(this, SwGlobalTree, KeyInputHdl)); + m_xTreeView->connect_popup_menu(LINK(this, SwGlobalTree, CommandHdl)); + m_xTreeView->connect_query_tooltip(LINK(this, SwGlobalTree, QueryTooltipHdl)); } SwGlobalTree::~SwGlobalTree() { - disposeOnce(); -} - -void SwGlobalTree::dispose() -{ m_pSwGlblDocContents.reset(); m_pDocInserter.reset(); m_aUpdateTimer.Stop(); m_xDialog.clear(); - SvTreeListBox::dispose(); } -Size SwGlobalTree::GetOptimalSize() const +SwGlobalTreeDropTarget::SwGlobalTreeDropTarget(SwGlobalTree& rTreeView) + : DropTargetHelper(rTreeView.get_widget().get_drop_target()) + , m_rTreeView(rTreeView) { - return LogicToPixel(Size(110, 112), MapMode(MapUnit::MapAppFont)); } -sal_Int8 SwGlobalTree::ExecuteDrop( const ExecuteDropEvent& rEvt ) +sal_Int8 SwGlobalTreeDropTarget::ExecuteDrop( const ExecuteDropEvent& rEvt ) { sal_Int8 nRet = DND_ACTION_NONE; - SvTreeListEntry* pLast = LastVisible(); - if(m_pEmphasisEntry) - { - ImplShowTargetEmphasis( Prev(m_pEmphasisEntry), false ); - m_pEmphasisEntry = nullptr; - } - else if(m_bLastEntryEmphasis && pLast) - { - ImplShowTargetEmphasis( pLast, false); - } - SvTreeListEntry* pDropEntry = m_bLastEntryEmphasis ? nullptr : GetEntry(rEvt.maPosPixel); - if( m_bIsInternalDrag ) - { - SvTreeListEntry* pDummy = nullptr; - sal_uLong nInsertionPos = TREELIST_APPEND; - NotifyMoving( pDropEntry, m_pDDSource, pDummy, nInsertionPos ); - } + weld::TreeView& rWidget = m_rTreeView.get_widget(); + std::unique_ptr<weld::TreeIter> xDropEntry(rWidget.make_iterator()); + if (!rWidget.get_dest_row_at_pos(rEvt.maPosPixel, xDropEntry.get())) + xDropEntry.reset(); + + if (rWidget.get_drag_source() == &rWidget) // internal drag + m_rTreeView.MoveSelectionTo(xDropEntry.get()); else { TransferableDataHelper aData( rEvt.maDropEvent.Transferable ); OUString sFileName; - const SwGlblDocContent* pCnt = pDropEntry ? - static_cast<const SwGlblDocContent*>(pDropEntry->GetUserData()) : + const SwGlblDocContent* pCnt = xDropEntry ? + reinterpret_cast<const SwGlblDocContent*>(rWidget.get_id(*xDropEntry).toInt64()) : nullptr; if( aData.HasFormat( SotClipboardFormatId::FILE_LIST )) { nRet = rEvt.mnAction; std::unique_ptr<SwGlblDocContents> pTempContents(new SwGlblDocContents); - int nAbsContPos = pDropEntry ? - static_cast<int>(GetModel()->GetAbsPos(pDropEntry)): + int nAbsContPos = xDropEntry ? + rWidget.get_iter_index_in_parent(*xDropEntry): - 1; - sal_uLong nEntryCount = GetEntryCount(); + size_t nEntryCount = rWidget.n_children(); // Get data FileList aFileList; @@ -258,12 +198,12 @@ sal_Int8 SwGlobalTree::ExecuteDrop( const ExecuteDropEvent& rEvt ) for ( size_t n = aFileList.Count(); n--; ) { sFileName = aFileList.GetFile(n); - InsertRegion(pCnt, &sFileName); + m_rTreeView.InsertRegion(pCnt, &sFileName); // The list of contents must be newly fetched after inserting, // to not work on an old content. if(n) { - m_pActiveShell->GetGlobalDocContent(*pTempContents); + m_rTreeView.GetActiveWrtShell()->GetGlobalDocContent(*pTempContents); // If the file was successfully inserted, // then the next content must also be fetched. if(nEntryCount < pTempContents->size()) @@ -283,178 +223,105 @@ sal_Int8 SwGlobalTree::ExecuteDrop( const ExecuteDropEvent& rEvt ) if( !aDesc.Detect() ) // accept no graphics { nRet = rEvt.mnAction; - InsertRegion(pCnt, &sFileName); + m_rTreeView.InsertRegion(pCnt, &sFileName); } } } - m_bLastEntryEmphasis = false; return nRet; - } -sal_Int8 SwGlobalTree::AcceptDrop( const AcceptDropEvent& rEvt ) +sal_Int8 SwGlobalTreeDropTarget::AcceptDrop( const AcceptDropEvent& rEvt ) { + // to enable the autoscroll when we're close to the edges + weld::TreeView& rWidget = m_rTreeView.get_widget(); + rWidget.get_dest_row_at_pos(rEvt.maPosPixel, nullptr); + sal_Int8 nRet = rEvt.mnAction; - //initiate scrolling - GetDropTarget( rEvt.maPosPixel ); - SvTreeListEntry* pLast = LastVisible(); - if( rEvt.mbLeaving ) + if (rWidget.get_drag_source() == &rWidget) // internal drag + return nRet; + + if (IsDropFormatSupported( SotClipboardFormatId::SIMPLE_FILE) || + IsDropFormatSupported( SotClipboardFormatId::STRING) || + IsDropFormatSupported( SotClipboardFormatId::FILE_LIST) || + IsDropFormatSupported( SotClipboardFormatId::SOLK) || + IsDropFormatSupported( SotClipboardFormatId::NETSCAPE_BOOKMARK )|| + IsDropFormatSupported( SotClipboardFormatId::FILECONTENT) || + IsDropFormatSupported( SotClipboardFormatId::FILEGRPDESCRIPTOR) || + IsDropFormatSupported( SotClipboardFormatId::UNIFORMRESOURCELOCATOR) || + IsDropFormatSupported( SotClipboardFormatId::FILENAME)) { - if( m_pEmphasisEntry ) - { - ImplShowTargetEmphasis( Prev(m_pEmphasisEntry), false ); - m_pEmphasisEntry = nullptr; - } - else if(m_bLastEntryEmphasis && pLast) - { - ImplShowTargetEmphasis( pLast, false); - } - m_bLastEntryEmphasis = false; + nRet = DND_ACTION_LINK; } - else - { - SvTreeListEntry* pDropEntry = GetEntry( rEvt.maPosPixel ); - if(m_bIsInternalDrag) - { - if( m_pDDSource != pDropEntry ) - nRet = rEvt.mnAction; - } - else if( IsDropFormatSupported( SotClipboardFormatId::SIMPLE_FILE ) || - IsDropFormatSupported( SotClipboardFormatId::STRING ) || - IsDropFormatSupported( SotClipboardFormatId::FILE_LIST ) || - IsDropFormatSupported( SotClipboardFormatId::SOLK ) || - IsDropFormatSupported( SotClipboardFormatId::NETSCAPE_BOOKMARK )|| - IsDropFormatSupported( SotClipboardFormatId::FILECONTENT ) || - IsDropFormatSupported( SotClipboardFormatId::FILEGRPDESCRIPTOR ) || - IsDropFormatSupported( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) || - IsDropFormatSupported( SotClipboardFormatId::FILENAME )) - nRet = DND_ACTION_LINK; - - if(m_pEmphasisEntry && m_pEmphasisEntry != pDropEntry) - ImplShowTargetEmphasis( Prev(m_pEmphasisEntry), false ); - else if(pLast && m_bLastEntryEmphasis && pDropEntry) - { - ImplShowTargetEmphasis( pLast, false); - m_bLastEntryEmphasis = false; - } - if(pDropEntry) - ImplShowTargetEmphasis( Prev(pDropEntry), DND_ACTION_NONE != nRet ); - else if(pLast) - { - ImplShowTargetEmphasis( pLast, DND_ACTION_NONE != nRet ); - m_bLastEntryEmphasis = true; - } - m_pEmphasisEntry = pDropEntry; - } return nRet; } -VclPtr<PopupMenu> SwGlobalTree::CreateContextMenu() +IMPL_LINK(SwGlobalTree, CommandHdl, const CommandEvent&, rCEvt, bool) { - VclPtr<PopupMenu> pPop; - if(m_pActiveShell && - !m_pActiveShell->GetView().GetDocShell()->IsReadOnly()) + if (rCEvt.GetCommand() != CommandEventId::ContextMenu) + return false; + + bool bPop = false; + if (m_pActiveShell && !m_pActiveShell->GetView().GetDocShell()->IsReadOnly()) { + std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xTreeView.get(), "modules/swriter/ui/mastercontextmenu.ui")); + std::unique_ptr<weld::Menu> xPopup = xBuilder->weld_menu("navmenu"); + const MenuEnableFlags nEnableFlags = GetEnableFlags(); - pPop = VclPtr<PopupMenu>::Create(); - VclPtrInstance<PopupMenu> pSubPop1; - VclPtrInstance<PopupMenu> pSubPop2; - for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++) - { - pSubPop2->InsertItem( i, m_aContextStrings[IDX_STR_UPDATE_SEL + i - CTX_UPDATE_SEL] ); - pSubPop2->SetHelpId(i, aHelpForMenu[i]); - } - pSubPop2->EnableItem(CTX_UPDATE_SEL, bool(nEnableFlags & MenuEnableFlags::UpdateSel)); - - pSubPop1->InsertItem(CTX_INSERT_ANY_INDEX, m_aContextStrings[IDX_STR_INDEX]); - pSubPop1->SetHelpId(CTX_INSERT_ANY_INDEX, aHelpForMenu[CTX_INSERT_ANY_INDEX]); - pSubPop1->InsertItem(CTX_INSERT_FILE, m_aContextStrings[IDX_STR_FILE]); - pSubPop1->SetHelpId(CTX_INSERT_FILE, aHelpForMenu[CTX_INSERT_FILE]); - pSubPop1->InsertItem(CTX_INSERT_NEW_FILE, m_aContextStrings[IDX_STR_NEW_FILE]); - pSubPop1->SetHelpId(CTX_INSERT_NEW_FILE, aHelpForMenu[CTX_INSERT_NEW_FILE]); - pSubPop1->InsertItem(CTX_INSERT_TEXT, m_aContextStrings[IDX_STR_INSERT_TEXT]); - pSubPop1->SetHelpId(CTX_INSERT_TEXT, aHelpForMenu[CTX_INSERT_TEXT]); - - pPop->InsertItem(CTX_UPDATE, m_aContextStrings[IDX_STR_UPDATE]); - pPop->SetHelpId(CTX_UPDATE, aHelpForMenu[CTX_UPDATE]); - pPop->InsertItem(CTX_EDIT, m_aContextStrings[IDX_STR_EDIT_CONTENT]); - pPop->SetHelpId(CTX_EDIT, aHelpForMenu[CTX_EDIT]); - if(nEnableFlags&MenuEnableFlags::EditLink) - { - pPop->InsertItem(CTX_EDIT_LINK, m_aContextStrings[IDX_STR_EDIT_LINK]); - pPop->SetHelpId(CTX_EDIT_LINK, aHelpForMenu[CTX_EDIT_LINK]); - } - pPop->InsertItem(CTX_INSERT, m_aContextStrings[IDX_STR_EDIT_INSERT]); - pPop->SetHelpId(CTX_INSERT, aHelpForMenu[CTX_INSERT]); - pPop->InsertSeparator() ; - pPop->InsertItem(CTX_DELETE, m_aContextStrings[IDX_STR_DELETE]); - pPop->SetHelpId(CTX_DELETE, aHelpForMenu[CTX_DELETE]); + xPopup->set_sensitive("updatesel", bool(nEnableFlags & MenuEnableFlags::UpdateSel)); + + xPopup->set_sensitive("editlink", bool(nEnableFlags & MenuEnableFlags::EditLink)); //disabling if applicable - pSubPop1->EnableItem(CTX_INSERT_ANY_INDEX, bool(nEnableFlags & MenuEnableFlags::InsertIdx )); - pSubPop1->EnableItem(CTX_INSERT_TEXT, bool(nEnableFlags & MenuEnableFlags::InsertText)); - pSubPop1->EnableItem(CTX_INSERT_FILE, bool(nEnableFlags & MenuEnableFlags::InsertFile)); - pSubPop1->EnableItem(CTX_INSERT_NEW_FILE, bool(nEnableFlags & MenuEnableFlags::InsertFile)); - - pPop->EnableItem(CTX_UPDATE, bool(nEnableFlags & MenuEnableFlags::Update)); - pPop->EnableItem(CTX_INSERT, bool(nEnableFlags & MenuEnableFlags::InsertIdx)); - pPop->EnableItem(CTX_EDIT, bool(nEnableFlags & MenuEnableFlags::Edit)); - pPop->EnableItem(CTX_DELETE, bool(nEnableFlags & MenuEnableFlags::Delete)); - - pPop->SetPopupMenu( CTX_INSERT, pSubPop1 ); - pPop->SetPopupMenu( CTX_UPDATE, pSubPop2 ); + xPopup->set_sensitive("insertindex", bool(nEnableFlags & MenuEnableFlags::InsertIdx )); + xPopup->set_sensitive("insertfile", bool(nEnableFlags & MenuEnableFlags::InsertFile)); + xPopup->set_sensitive("insertnewfile", bool(nEnableFlags & MenuEnableFlags::InsertFile)); + xPopup->set_sensitive("inserttext", bool(nEnableFlags & MenuEnableFlags::InsertText)); + + xPopup->set_sensitive("update", bool(nEnableFlags & MenuEnableFlags::Update)); + xPopup->set_sensitive("insert", bool(nEnableFlags & MenuEnableFlags::InsertIdx)); + xPopup->set_sensitive("editcontent", bool(nEnableFlags & MenuEnableFlags::Edit)); + xPopup->set_sensitive("deleteentry", bool(nEnableFlags & MenuEnableFlags::Delete)); + + OString sCommand = xPopup->popup_at_rect(m_xTreeView.get(), tools::Rectangle(rCEvt.GetMousePosPixel(), Size(1,1))); + if (!sCommand.isEmpty()) + ExecuteContextMenuAction(sCommand); } - return pPop; + return bPop; } -void SwGlobalTree::TbxMenuHdl(sal_uInt16 nTbxId, ToolBox* pBox) +void SwGlobalTree::TbxMenuHdl(const OString& rCommand, weld::Menu& rMenu) { const MenuEnableFlags nEnableFlags = GetEnableFlags(); - const OUString sCommand(pBox->GetItemCommand(nTbxId)); - if (sCommand == "insert") + if (rCommand == "insert") { - ScopedVclPtrInstance<PopupMenu> pMenu; - for (sal_uInt16 i = CTX_INSERT_ANY_INDEX; i <= CTX_INSERT_TEXT; ++i) - { - pMenu->InsertItem( i, m_aContextStrings[IDX_STR_INDEX + i - CTX_INSERT_ANY_INDEX] ); - pMenu->SetHelpId(i, aHelpForMenu[i] ); - } - pMenu->EnableItem(CTX_INSERT_ANY_INDEX, bool(nEnableFlags & MenuEnableFlags::InsertIdx )); - pMenu->EnableItem(CTX_INSERT_TEXT, bool(nEnableFlags & MenuEnableFlags::InsertText)); - pMenu->EnableItem(CTX_INSERT_FILE, bool(nEnableFlags & MenuEnableFlags::InsertFile)); - pMenu->EnableItem(CTX_INSERT_NEW_FILE, bool(nEnableFlags & MenuEnableFlags::InsertFile)); - pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl)); - pMenu->Execute(pBox, pBox->GetItemRect(nTbxId)); - pMenu.disposeAndClear(); - pBox->EndSelection(); - pBox->Invalidate(); + rMenu.set_sensitive("insertindex", bool(nEnableFlags & MenuEnableFlags::InsertIdx)); + rMenu.set_sensitive("insertfile", bool(nEnableFlags & MenuEnableFlags::InsertFile)); + rMenu.set_sensitive("insertnewfile", bool(nEnableFlags & MenuEnableFlags::InsertFile)); + rMenu.set_sensitive("inserttext", bool(nEnableFlags & MenuEnableFlags::InsertText)); } - else if (sCommand == "update") + else if (rCommand == "update") { - ScopedVclPtrInstance<PopupMenu> pMenu; - for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++) - { - pMenu->InsertItem( i, m_aContextStrings[IDX_STR_UPDATE_SEL + i - CTX_UPDATE_SEL] ); - pMenu->SetHelpId(i, aHelpForMenu[i] ); - } - pMenu->EnableItem(CTX_UPDATE_SEL, bool(nEnableFlags & MenuEnableFlags::UpdateSel)); - pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl)); - pMenu->Execute(pBox, pBox->GetItemRect(nTbxId)); - pMenu.disposeAndClear(); - pBox->EndSelection(); - pBox->Invalidate(); + rMenu.set_sensitive("updatesel", bool(nEnableFlags & MenuEnableFlags::UpdateSel)); } } -MenuEnableFlags SwGlobalTree::GetEnableFlags() const +MenuEnableFlags SwGlobalTree::GetEnableFlags() const { - SvTreeListEntry* pEntry = FirstSelected(); - sal_uLong nSelCount = GetSelectionCount(); - sal_uLong nEntryCount = GetEntryCount(); - SvTreeListEntry* pPrevEntry = pEntry ? Prev(pEntry) : nullptr; + std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator()); + bool bEntry = m_xTreeView->get_selected(xEntry.get()); + + sal_uLong nSelCount = m_xTreeView->count_selected_rows(); + size_t nEntryCount = m_xTreeView->n_children(); + std::unique_ptr<weld::TreeIter> xPrevEntry; + bool bPrevEntry = false; + if (bEntry) + { + xPrevEntry = m_xTreeView->make_iterator(xEntry.get()); + bPrevEntry = m_xTreeView->iter_previous(*xPrevEntry); + } MenuEnableFlags nRet = MenuEnableFlags::NONE; if(nSelCount == 1 || !nEntryCount) @@ -462,10 +329,10 @@ MenuEnableFlags SwGlobalTree::GetEnableFlags() const if(nSelCount == 1) { nRet |= MenuEnableFlags::Edit; - if (pEntry && static_cast<SwGlblDocContent*>(pEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN && - (!pPrevEntry || static_cast<SwGlblDocContent*>(pPrevEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN)) + if (bEntry && reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetType() != GLBLDOC_UNKNOWN && + (!bPrevEntry || reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(*xPrevEntry).toInt64())->GetType() != GLBLDOC_UNKNOWN)) nRet |= MenuEnableFlags::InsertText; - if (pEntry && GLBLDOC_SECTION == static_cast<SwGlblDocContent*>(pEntry->GetUserData())->GetType()) + if (bEntry && GLBLDOC_SECTION == reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetType()) nRet |= MenuEnableFlags::EditLink; } else if(!nEntryCount) @@ -479,255 +346,165 @@ MenuEnableFlags SwGlobalTree::GetEnableFlags() const return nRet; } -void SwGlobalTree::RequestHelp( const HelpEvent& rHEvt ) +IMPL_LINK(SwGlobalTree, QueryTooltipHdl, const weld::TreeIter&, rIter, OUString) { - bool bParent = true; - Update(true); - Display(true); - if( rHEvt.GetMode() & HelpEventMode::QUICK ) - { - Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() )); - SvTreeListEntry* pEntry = GetEntry( aPos ); - const SwGlblDocContent* pCont = pEntry ? - static_cast<const SwGlblDocContent*>(pEntry->GetUserData()) : nullptr; - if( pCont && GLBLDOC_SECTION == pCont->GetType()) - { - bParent = false; - SvLBoxTab* pTab; - SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab ); - if (pItem && SvLBoxItemType::String == pItem->GetType()) - { - const SwSection* pSect = pCont->GetSection(); - OUString sEntry = pSect->GetLinkFileName().getToken(0, sfx2::cTokenSeparator); - if(!pSect->IsConnectFlag()) - sEntry = m_aContextStrings[IDX_STR_BROKEN_LINK] + sEntry; - Point aEntryPos = GetEntryPosition( pEntry ); - - aEntryPos.setX( GetTabPos( pEntry, pTab ) ); - Size aSize(pItem->GetWidth(this, pEntry), pItem->GetHeight(this, pEntry)); - - if((aEntryPos.X() + aSize.Width()) > GetSizePixel().Width()) - aSize.setWidth( GetSizePixel().Width() - aEntryPos.X() ); + OUString sEntry; - aEntryPos = OutputToScreenPixel(aEntryPos); - tools::Rectangle aItemRect( aEntryPos, aSize ); - if(Help::IsBalloonHelpEnabled()) - { - aEntryPos.AdjustX(aSize.Width() ); - Help::ShowBalloon( this, aEntryPos, aItemRect, sEntry ); - } - else - Help::ShowQuickHelp( this, aItemRect, sEntry, - QuickHelpFlags::Left|QuickHelpFlags::VCenter ); - } - } + const SwGlblDocContent* pCont = reinterpret_cast<const SwGlblDocContent*>(m_xTreeView->get_id(rIter).toInt64()); + if (pCont && GLBLDOC_SECTION == pCont->GetType()) + { + const SwSection* pSect = pCont->GetSection(); + sEntry = pSect->GetLinkFileName().getToken(0, sfx2::cTokenSeparator); + if (!pSect->IsConnectFlag()) + sEntry = m_aContextStrings[IDX_STR_BROKEN_LINK] + sEntry; } - if(bParent) - SvTreeListBox::RequestHelp(rHEvt); + return sEntry; } -void SwGlobalTree::SelectHdl() +IMPL_LINK_NOARG(SwGlobalTree, SelectHdl, weld::TreeView&, void) { + Select(); +} - sal_uLong nSelCount = GetSelectionCount(); - SvTreeListEntry* pSel = FirstSelected(); - sal_uLong nAbsPos = pSel ? GetModel()->GetAbsPos(pSel) : 0; +void SwGlobalTree::Select() +{ + int nSelCount = m_xTreeView->count_selected_rows(); + int nSel = m_xTreeView->get_selected_index(); + int nAbsPos = nSel != -1 ? nSel : 0; SwNavigationPI* pNavi = GetParentWindow(); bool bReadonly = !m_pActiveShell || m_pActiveShell->GetView().GetDocShell()->IsReadOnly(); - pNavi->m_aGlobalToolBox->EnableItem(pNavi->m_aGlobalToolBox->GetItemId("edit"), nSelCount == 1 && !bReadonly); - pNavi->m_aGlobalToolBox->EnableItem(pNavi->m_aGlobalToolBox->GetItemId("insert"), nSelCount <= 1 && !bReadonly); - pNavi->m_aGlobalToolBox->EnableItem(pNavi->m_aGlobalToolBox->GetItemId("update"), GetEntryCount() > 0 && !bReadonly); - pNavi->m_aGlobalToolBox->EnableItem(pNavi->m_aGlobalToolBox->GetItemId("up"), + pNavi->m_xGlobalToolBox->set_item_sensitive("edit", nSelCount == 1 && !bReadonly); + pNavi->m_xGlobalToolBox->set_item_sensitive("insert", nSelCount <= 1 && !bReadonly); + pNavi->m_xGlobalToolBox->set_item_sensitive("update", m_xTreeView->n_children() > 0 && !bReadonly); + pNavi->m_xGlobalToolBox->set_item_sensitive("moveup", nSelCount == 1 && nAbsPos && !bReadonly); - pNavi->m_aGlobalToolBox->EnableItem(pNavi->m_aGlobalToolBox->GetItemId("down"), - nSelCount == 1 && nAbsPos < GetEntryCount() - 1 && !bReadonly); + pNavi->m_xGlobalToolBox->set_item_sensitive("movedown", + nSelCount == 1 && nAbsPos < m_xTreeView->n_children() - 1 && !bReadonly); } -void SwGlobalTree::DeselectHdl() +void SwGlobalTree::MoveSelectionTo(weld::TreeIter* pDropEntry) { - SelectHdl(); -} + int nSource = m_xTreeView->get_selected_index(); -DragDropMode SwGlobalTree::NotifyStartDrag( TransferDataContainer& , - SvTreeListEntry* pEntry ) -{ - m_bIsInternalDrag = true; - m_pDDSource = pEntry; - return DragDropMode::CTRL_MOVE; -} + int nDest = pDropEntry ? m_xTreeView->get_iter_index_in_parent(*pDropEntry) + : m_pSwGlblDocContents->size(); -sal_IntPtr SwGlobalTree::GetTabPos( SvTreeListEntry*, SvLBoxTab* pTab) -{ - return pTab->GetPos() - GLBL_TABPOS_SUB; -} - -TriState SwGlobalTree::NotifyMoving( SvTreeListEntry* pTarget, - SvTreeListEntry* pSource, - SvTreeListEntry*&, - sal_uLong& - ) -{ - SvTreeList* _pModel = GetModel(); - sal_uLong nSource = _pModel->GetAbsPos(pSource); - sal_uLong nDest = pTarget ? _pModel->GetAbsPos(pTarget) : m_pSwGlblDocContents->size(); - - if( m_pActiveShell->MoveGlobalDocContent( + if (m_pActiveShell->MoveGlobalDocContent( *m_pSwGlblDocContents, nSource, nSource + 1, nDest ) && Update( false )) Display(); - - return TRISTATE_FALSE; -} - -TriState SwGlobalTree::NotifyCopying( SvTreeListEntry* /*pTarget*/, - SvTreeListEntry* /*pEntry*/, - SvTreeListEntry*& /*rpNewParent*/, - sal_uLong& /*rNewChildPos*/ - ) -{ - return TRISTATE_FALSE; -} - -bool SwGlobalTree::NotifyAcceptDrop( SvTreeListEntry* pEntry) -{ - return pEntry != nullptr; } -void SwGlobalTree::StartDrag( sal_Int8 nAction, const Point& rPt ) +IMPL_LINK_NOARG(SwGlobalTree, FocusInHdl, weld::Widget&, void) { - if( 1 == GetSelectionCount() ) - SvTreeListBox::StartDrag( nAction, rPt ); -} - -void SwGlobalTree::DragFinished( sal_Int8 nAction ) -{ - SvTreeListBox::DragFinished( nAction ); - m_bIsInternalDrag = false; -} - -// If a Ctrl+DoubleClick is executed in an empty area, -// then the base function of the control should be called. - -void SwGlobalTree::MouseButtonDown( const MouseEvent& rMEvt ) -{ - Point aPos( rMEvt.GetPosPixel()); - SvTreeListEntry* pEntry = GetEntry( aPos, true ); - if( !pEntry && rMEvt.IsLeft() && rMEvt.IsMod1() && (rMEvt.GetClicks() % 2) == 0) - Control::MouseButtonDown( rMEvt ); - else - SvTreeListBox::MouseButtonDown( rMEvt ); -} - -void SwGlobalTree::GetFocus() -{ - if(Update( false )) + if (Update(false)) Display(); - SvTreeListBox::GetFocus(); } -void SwGlobalTree::KeyInput(const KeyEvent& rKEvt) +IMPL_LINK(SwGlobalTree, KeyInputHdl, const KeyEvent&, rKEvt, bool) { + bool bHandled = false; const vcl::KeyCode aCode = rKEvt.GetKeyCode(); - if(aCode.GetCode() == KEY_RETURN) + if (aCode.GetCode() == KEY_RETURN) { - switch(aCode.GetModifier()) + switch (aCode.GetModifier()) { case KEY_MOD2: // Switch boxes GetParentWindow()->ToggleTree(); + bHandled = true; break; } } - else - SvTreeListBox::KeyInput(rKEvt); -} - -void SwGlobalTree::Clear() -{ - m_pEmphasisEntry = nullptr; - SvTreeListBox::Clear(); + return bHandled; } void SwGlobalTree::Display(bool bOnlyUpdateUserData) { size_t nCount = m_pSwGlblDocContents->size(); - if(bOnlyUpdateUserData && GetEntryCount() == m_pSwGlblDocContents->size()) + size_t nChildren = m_xTreeView->n_children(); + if (bOnlyUpdateUserData && nChildren == m_pSwGlblDocContents->size()) { - SvTreeListEntry* pEntry = First(); - for (size_t i = 0; i < nCount && pEntry; i++) + std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator(); + bool bEntry = m_xTreeView->get_iter_first(*xEntry); + for (size_t i = 0; i < nCount && bEntry; i++) { - SwGlblDocContent* pCont = (*m_pSwGlblDocContents)[i].get(); - pEntry->SetUserData(pCont); - pEntry = Next(pEntry); - assert(pEntry || i == nCount - 1); + const SwGlblDocContent* pCont = (*m_pSwGlblDocContents)[i].get(); + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pCont))); + m_xTreeView->set_id(*xEntry, sId); + if (pCont->GetType() == GLBLDOC_SECTION && !pCont->GetSection()->IsConnectFlag()) + m_xTreeView->set_font_color(*xEntry, COL_LIGHTRED); + else + m_xTreeView->set_font_color(*xEntry, COL_AUTO); + bEntry = m_xTreeView->iter_next(*xEntry); + assert(bEntry || i == nCount - 1); } } else { - SetUpdateMode( false ); - SvTreeListEntry* pOldSelEntry = FirstSelected(); + int nOldSelEntry = m_xTreeView->get_selected_index(); OUString sEntryName; // Name of the entry - sal_uLong nSelPos = TREELIST_ENTRY_NOTFOUND; - if(pOldSelEntry) + int nSelPos = -1; + if (nOldSelEntry != -1) { - sEntryName = GetEntryText(pOldSelEntry); - nSelPos = GetModel()->GetAbsPos(pOldSelEntry); + sEntryName = m_xTreeView->get_text(nOldSelEntry); + nSelPos = nOldSelEntry; } - Clear(); - if(!m_pSwGlblDocContents) + m_xTreeView->freeze(); + m_xTreeView->clear(); + if (!m_pSwGlblDocContents) Update( false ); - SvTreeListEntry* pSelEntry = nullptr; - for( size_t i = 0; i < nCount; i++) + int nSelEntry = -1; + for (size_t i = 0; i < nCount; ++i) { - SwGlblDocContent* pCont = (*m_pSwGlblDocContents)[i].get(); + const SwGlblDocContent* pCont = (*m_pSwGlblDocContents)[i].get(); + + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pCont))); OUString sEntry; - Image aImage; - switch( pCont->GetType() ) + OUString aImage; + switch (pCont->GetType()) { case GLBLDOC_UNKNOWN: - { sEntry = m_aContextStrings[IDX_STR_INSERT_TEXT]; - } break; case GLBLDOC_TOXBASE: { const SwTOXBase* pBase = pCont->GetTOX(); sEntry = pBase->GetTitle(); - aImage = Image(StockImage::Yes, RID_BMP_NAVI_INDEX); + aImage = RID_BMP_NAVI_INDEX; } break; case GLBLDOC_SECTION: { const SwSection* pSect = pCont->GetSection(); sEntry = pSect->GetSectionName(); - aImage = Image(StockImage::Yes, RID_BMP_DROP_REGION); + aImage = RID_BMP_DROP_REGION; } break; } - SvTreeListEntry* pEntry = InsertEntry(sEntry, aImage, aImage, - nullptr, false, TREELIST_APPEND, pCont); - if(sEntry == sEntryName) - { - pSelEntry = pEntry; - } - } - if(pSelEntry) - { - Select(pSelEntry); - } - else if(nSelPos != TREELIST_ENTRY_NOTFOUND && nSelPos < nCount) - { - Select(GetEntry(nSelPos)); + + m_xTreeView->append(sId, sEntry); + if (!aImage.isEmpty()) + m_xTreeView->set_image(i, aImage); + + if (pCont->GetType() == GLBLDOC_SECTION && !pCont->GetSection()->IsConnectFlag()) + m_xTreeView->set_font_color(i, COL_LIGHTRED); + + if (sEntry == sEntryName) + nSelEntry = i; } - else if(nCount) - Select(First()); - else - SelectHdl(); - SetUpdateMode( true ); + m_xTreeView->thaw(); + if (nSelEntry != -1) + m_xTreeView->select(nSelEntry); + else if (nSelPos != -1 && o3tl::make_unsigned(nSelPos) < nCount) + m_xTreeView->select(nSelPos); + else if (nCount) + m_xTreeView->select(0); + Select(); } } @@ -736,7 +513,7 @@ void SwGlobalTree::InsertRegion( const SwGlblDocContent* pCont, const OUString* Sequence< OUString > aFileNames; if ( !pFileName ) { - m_pDocInserter.reset(new ::sfx2::DocumentInserter(GetFrameWeld(), "swriter", sfx2::DocumentInserter::Mode::InsertMulti)); + m_pDocInserter.reset(new ::sfx2::DocumentInserter(GetParentWindow()->GetFrameWeld(), "swriter", sfx2::DocumentInserter::Mode::InsertMulti)); m_pDocInserter->StartExecuteModal( LINK( this, SwGlobalTree, DialogClosedHdl ) ); } else if ( !pFileName->isEmpty() ) @@ -749,7 +526,7 @@ void SwGlobalTree::InsertRegion( const SwGlblDocContent* pCont, const OUString* } } -void SwGlobalTree::EditContent(const SwGlblDocContent* pCont ) +void SwGlobalTree::EditContent(const SwGlblDocContent* pCont ) { sal_uInt16 nSlot = 0; switch( pCont->GetType() ) @@ -783,18 +560,12 @@ void SwGlobalTree::EditContent(const SwGlblDocContent* pCont ) } } -IMPL_LINK( SwGlobalTree, PopupHdl, Menu* , pMenu, bool) -{ - ExecuteContextMenuAction( pMenu->GetCurItemId()); - return true; -} - -void SwGlobalTree::ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) +void SwGlobalTree::ExecuteContextMenuAction(const OString& rSelectedPopupEntry) { bool bUpdateHard = false; - SvTreeListEntry* pEntry = FirstSelected(); - SwGlblDocContent* pCont = pEntry ? static_cast<SwGlblDocContent*>(pEntry->GetUserData()) : nullptr; + int nEntry = m_xTreeView->get_selected_index(); + SwGlblDocContent* pCont = nEntry != -1 ? reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(nEntry).toInt64()) : nullptr; // If a RequestHelp is called during the dialogue, // then the content gets lost. Because of that a copy // is created in which only the DocPos is set correctly. @@ -803,218 +574,195 @@ void SwGlobalTree::ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) pContCopy.reset(new SwGlblDocContent(pCont->GetDocPos())); SfxDispatcher& rDispatch = *m_pActiveShell->GetView().GetViewFrame()->GetDispatcher(); sal_uInt16 nSlot = 0; - switch( nSelectedPopupEntry ) + if (rSelectedPopupEntry == "updatesel") { - case CTX_UPDATE_SEL: - { - // Two passes: first update the areas, then the directories. - SvTreeListEntry* pSelEntry = FirstSelected(); - while( pSelEntry ) - { - SwGlblDocContent* pContent = static_cast<SwGlblDocContent*>(pSelEntry->GetUserData()); - if(GLBLDOC_SECTION == pContent->GetType() && - pContent->GetSection()->IsConnected()) - { - const_cast<SwSection*>(pContent->GetSection())->UpdateNow(); - } - - pSelEntry = NextSelected(pSelEntry); - } - pSelEntry = FirstSelected(); - while( pSelEntry ) + // Two passes: first update the areas, then the directories. + m_xTreeView->selected_foreach([this](weld::TreeIter& rSelEntry){ + SwGlblDocContent* pContent = reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(rSelEntry).toInt64()); + if (GLBLDOC_SECTION == pContent->GetType() && + pContent->GetSection()->IsConnected()) { - SwGlblDocContent* pContent = static_cast<SwGlblDocContent*>(pSelEntry->GetUserData()); - if(GLBLDOC_TOXBASE == pContent->GetType()) - m_pActiveShell->UpdateTableOf(*pContent->GetTOX()); - pSelEntry = NextSelected(pSelEntry); + const_cast<SwSection*>(pContent->GetSection())->UpdateNow(); } - bUpdateHard = true; - } - break; - case CTX_UPDATE_INDEX: - { + return false; + }); + m_xTreeView->selected_foreach([this](weld::TreeIter& rSelEntry){ + SwGlblDocContent* pContent = reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(rSelEntry).toInt64()); + if (GLBLDOC_TOXBASE == pContent->GetType()) + m_pActiveShell->UpdateTableOf(*pContent->GetTOX()); + return false; + }); + + bUpdateHard = true; + } + else if (rSelectedPopupEntry == "updateindex") + { + nSlot = FN_UPDATE_TOX; + bUpdateHard = true; + } + else if (rSelectedPopupEntry == "updatelinks" || rSelectedPopupEntry == "updateall") + { + m_pActiveShell->GetLinkManager().UpdateAllLinks(true, false, nullptr); + if (rSelectedPopupEntry == "updateall") nSlot = FN_UPDATE_TOX; - bUpdateHard = true; - } - break; - case CTX_UPDATE_LINK: - case CTX_UPDATE_ALL: + pCont = nullptr; + bUpdateHard = true; + } + else if (rSelectedPopupEntry == "edit") + { + OSL_ENSURE(pCont, "edit without entry ? " ); + if (pCont) { - m_pActiveShell->GetLinkManager().UpdateAllLinks(true, false, nullptr); - if(CTX_UPDATE_ALL == nSelectedPopupEntry) - nSlot = FN_UPDATE_TOX; - pCont = nullptr; - bUpdateHard = true; + EditContent(pCont); } - break; - case CTX_EDIT: + } + else if (rSelectedPopupEntry == "editlink") + { + OSL_ENSURE(pCont, "edit without entry ? " ); + if (pCont) { - OSL_ENSURE(pCont, "edit without entry ? " ); - if (pCont) - { - EditContent(pCont); - } + SfxStringItem aName(FN_EDIT_REGION, + pCont->GetSection()->GetSectionName()); + rDispatch.ExecuteList(FN_EDIT_REGION, SfxCallMode::ASYNCHRON, + { &aName }); } - break; - case CTX_EDIT_LINK: + } + else if (rSelectedPopupEntry == "deleteentry") + { + // If several entries selected, then after each delete the array + // must be refilled. So you do not have to remember anything, + // deleting begins at the end. + std::vector<int> aRows = m_xTreeView->get_selected_rows(); + std::sort(aRows.begin(), aRows.end()); + + std::unique_ptr<SwGlblDocContents> pTempContents; + m_pActiveShell->StartAction(); + for (auto iter = aRows.rbegin(); iter != aRows.rend(); ++iter) { - OSL_ENSURE(pCont, "edit without entry ? " ); - if (pCont) - { - SfxStringItem aName(FN_EDIT_REGION, - pCont->GetSection()->GetSectionName()); - rDispatch.ExecuteList(FN_EDIT_REGION, SfxCallMode::ASYNCHRON, - { &aName }); - } + m_pActiveShell->DeleteGlobalDocContent( + pTempContents ? *pTempContents : *m_pSwGlblDocContents, + *iter); + pTempContents.reset(new SwGlblDocContents); + m_pActiveShell->GetGlobalDocContent(*pTempContents); } - break; - case CTX_DELETE: + pTempContents.reset(); + m_pActiveShell->EndAction(); + pCont = nullptr; + } + else if (rSelectedPopupEntry == "insertindex") + { + if(pContCopy) { - // If several entries selected, then after each delete the array - // must be refilled. So you do not have to remember anything, - // deleting begins at the end. - SvTreeListEntry* pSelEntry = LastSelected(); - std::unique_ptr<SwGlblDocContents> pTempContents; - m_pActiveShell->StartAction(); - while(pSelEntry) + SfxItemSet aSet( + m_pActiveShell->GetView().GetPool(), + svl::Items< + RES_FRM_SIZE, RES_FRM_SIZE, + RES_LR_SPACE, RES_LR_SPACE, + RES_BACKGROUND, RES_BACKGROUND, + RES_COL, RES_COL, + SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE, + FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE>{}); + + SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); + ScopedVclPtr<AbstractMultiTOXTabDialog> pDlg(pFact->CreateMultiTOXTabDialog( + m_xDialog->GetFrameWeld(), aSet, + *m_pActiveShell, + nullptr, + true)); + if(RET_OK == pDlg->Execute()) { - m_pActiveShell->DeleteGlobalDocContent( - pTempContents ? *pTempContents : *m_pSwGlblDocContents, - GetModel()->GetAbsPos(pSelEntry)); - pSelEntry = PrevSelected(pSelEntry); - if(pSelEntry) - { - pTempContents.reset(new SwGlblDocContents); - m_pActiveShell->GetGlobalDocContent(*pTempContents); - } + SwTOXDescription& rDesc = pDlg->GetTOXDescription( + pDlg->GetCurrentTOXType()); + SwTOXMgr aMgr(m_pActiveShell); + SwTOXBase* pToInsert = nullptr; + if(aMgr.UpdateOrInsertTOX(rDesc, &pToInsert, pDlg->GetOutputItemSet())) + m_pActiveShell->InsertGlobalDocContent( *pContCopy, *pToInsert ); } - pTempContents.reset(); - m_pActiveShell->EndAction(); pCont = nullptr; } - break; - case CTX_INSERT_ANY_INDEX: + } + else if (rSelectedPopupEntry == "insertfile") + { + m_pDocContent = std::move(pContCopy); + InsertRegion( m_pDocContent.get() ); + pCont = nullptr; + } + else if (rSelectedPopupEntry == "insertnewfile") + { + SfxViewFrame* pGlobFrame = m_pActiveShell->GetView().GetViewFrame(); + SwGlobalFrameListener_Impl aFrameListener(*pGlobFrame); + + // Creating a new doc + SfxStringItem aFactory(SID_NEWDOCDIRECT, + SwDocShell::Factory().GetFilterContainer()->GetName()); + + const SfxFrameItem* pItem = static_cast<const SfxFrameItem*>( + rDispatch.ExecuteList(SID_NEWDOCDIRECT, + SfxCallMode::SYNCHRON, { &aFactory })); + + // save at + SfxFrame* pFrame = pItem ? pItem->GetFrame() : nullptr; + SfxViewFrame* pViewFrame = pFrame ? pFrame->GetCurrentViewFrame() : nullptr; + if (pViewFrame) { - if(pContCopy) + const SfxBoolItem* pBool = static_cast<const SfxBoolItem*>( + pViewFrame->GetDispatcher()->Execute( + SID_SAVEASDOC, SfxCallMode::SYNCHRON )); + SfxObjectShell& rObj = *pViewFrame->GetObjectShell(); + const SfxMedium* pMedium = rObj.GetMedium(); + OUString sNewFile(pMedium->GetURLObject().GetMainURL(INetURLObject::DecodeMechanism::ToIUri)); + // Insert the area with the Doc-Name + // Bring the own Doc in the foreground + if(aFrameListener.IsValid() && !sNewFile.isEmpty()) { - SfxItemSet aSet( - m_pActiveShell->GetView().GetPool(), - svl::Items< - RES_FRM_SIZE, RES_FRM_SIZE, - RES_LR_SPACE, RES_LR_SPACE, - RES_BACKGROUND, RES_BACKGROUND, - RES_COL, RES_COL, - SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE, - FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE>{}); - - SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); - ScopedVclPtr<AbstractMultiTOXTabDialog> pDlg(pFact->CreateMultiTOXTabDialog( - GetFrameWeld(), aSet, - *m_pActiveShell, - nullptr, - true)); - if(RET_OK == pDlg->Execute()) + pGlobFrame->ToTop(); + // Due to the update the entries are invalid + if (nEntry != -1) { - SwTOXDescription& rDesc = pDlg->GetTOXDescription( - pDlg->GetCurrentTOXType()); - SwTOXMgr aMgr(m_pActiveShell); - SwTOXBase* pToInsert = nullptr; - if(aMgr.UpdateOrInsertTOX(rDesc, &pToInsert, pDlg->GetOutputItemSet())) - m_pActiveShell->InsertGlobalDocContent( *pContCopy, *pToInsert ); + Update( false ); + Display(); + m_xTreeView->select(nEntry); + Select(); + nEntry = m_xTreeView->get_selected_index(); + pCont = nEntry != -1 ? reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(nEntry).toInt64()) : nullptr; } - pCont = nullptr; - } - } - break; - case CTX_INSERT_FILE: - { - m_pDocContent = std::move(pContCopy); - InsertRegion( m_pDocContent.get() ); - pCont = nullptr; - } - break; - case CTX_INSERT_NEW_FILE: - { - SfxViewFrame* pGlobFrame = m_pActiveShell->GetView().GetViewFrame(); - SwGlobalFrameListener_Impl aFrameListener(*pGlobFrame); - - sal_uLong nEntryPos = pEntry ? GetModel()->GetAbsPos(pEntry) : sal_uLong(-1); - // Creating a new doc - SfxStringItem aFactory(SID_NEWDOCDIRECT, - SwDocShell::Factory().GetFilterContainer()->GetName()); - - const SfxFrameItem* pItem = static_cast<const SfxFrameItem*>( - rDispatch.ExecuteList(SID_NEWDOCDIRECT, - SfxCallMode::SYNCHRON, { &aFactory })); - - // save at - SfxFrame* pFrame = pItem ? pItem->GetFrame() : nullptr; - SfxViewFrame* pViewFrame = pFrame ? pFrame->GetCurrentViewFrame() : nullptr; - if (pViewFrame) - { - const SfxBoolItem* pBool = static_cast<const SfxBoolItem*>( - pViewFrame->GetDispatcher()->Execute( - SID_SAVEASDOC, SfxCallMode::SYNCHRON )); - SfxObjectShell& rObj = *pViewFrame->GetObjectShell(); - const SfxMedium* pMedium = rObj.GetMedium(); - OUString sNewFile(pMedium->GetURLObject().GetMainURL(INetURLObject::DecodeMechanism::ToIUri)); - // Insert the area with the Doc-Name - // Bring the own Doc in the foreground - if(aFrameListener.IsValid() && !sNewFile.isEmpty()) + else { - pGlobFrame->ToTop(); - // Due to the update the entries are invalid - if(nEntryPos != sal_uLong(-1)) - { - Update( false ); - Display(); - Select(GetModel()->GetEntryAtAbsPos(nEntryPos)); - pEntry = FirstSelected(); - pCont = pEntry ? static_cast<SwGlblDocContent*>(pEntry->GetUserData()) : nullptr; - } - else - { - pEntry = nullptr; - pCont = nullptr; - } - if(pBool->GetValue()) - { - InsertRegion(pCont, &sNewFile); - pViewFrame->ToTop(); - } - else - pViewFrame->GetDispatcher()->Execute(SID_CLOSEWIN, - SfxCallMode::SYNCHRON); + nEntry = -1; + pCont = nullptr; } - else + if(pBool->GetValue()) { + InsertRegion(pCont, &sNewFile); pViewFrame->ToTop(); - return; } + else + pViewFrame->GetDispatcher()->Execute(SID_CLOSEWIN, SfxCallMode::SYNCHRON); } - } - break; - case CTX_INSERT_TEXT: - { - if(pCont) - m_pActiveShell->InsertGlobalDocContent(*pCont); else { - m_pActiveShell->SplitNode(); // Empty document - m_pActiveShell->Up( false ); + pViewFrame->ToTop(); + return; } - m_pActiveShell->GetView().GetEditWin().GrabFocus(); } - break; - case CTX_UPDATE: - pCont = nullptr; - break; - default:; - // here nothing happens } - if(pCont) + else if (rSelectedPopupEntry == "inserttext") + { + if (pCont) + m_pActiveShell->InsertGlobalDocContent(*pCont); + else + { + m_pActiveShell->SplitNode(); // Empty document + m_pActiveShell->Up( false ); + } + m_pActiveShell->GetView().GetEditWin().GrabFocus(); + } + else if (rSelectedPopupEntry == "update") + pCont = nullptr; + + if (pCont) GotoContent(pCont); - if(nSlot) + if (nSlot) rDispatch.Execute(nSlot); if (Update(bUpdateHard)) Display(); @@ -1022,7 +770,7 @@ void SwGlobalTree::ExecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) IMPL_LINK_NOARG(SwGlobalTree, Timeout, Timer *, void) { - if(!IsDisposed() && !HasFocus() && Update( false )) + if (!m_xTreeView->has_focus() && Update(false)) Display(); } @@ -1048,42 +796,43 @@ void SwGlobalTree::GotoContent(const SwGlblDocContent* pCont) } -void SwGlobalTree::ShowTree() +void SwGlobalTree::ShowTree() { m_aUpdateTimer.Start(); - SvTreeListBox::Show(); + m_xTreeView->show(); } -void SwGlobalTree::HideTree() +void SwGlobalTree::HideTree() { m_aUpdateTimer.Stop(); - SvTreeListBox::Hide(); + m_xTreeView->hide(); } -void SwGlobalTree::ExecCommand(const OUString &rCmd) +void SwGlobalTree::ExecCommand(const OString &rCmd) { - SvTreeListEntry* pEntry = FirstSelected(); - OSL_ENSURE(pEntry, "It explodes in the next moment"); + int nEntry = m_xTreeView->get_selected_index(); + if (nEntry == -1) + return; if (rCmd == "edit") { - const SwGlblDocContent* pCont = static_cast<const SwGlblDocContent*>( - pEntry->GetUserData()); + const SwGlblDocContent* pCont = reinterpret_cast<const SwGlblDocContent*>( + m_xTreeView->get_id(nEntry).toInt64()); EditContent(pCont); } else { - if(GetSelectionCount() == 1) + if (m_xTreeView->count_selected_rows() == 1) { bool bMove = false; - sal_uLong nSource = GetModel()->GetAbsPos(pEntry); + sal_uLong nSource = nEntry; sal_uLong nDest = nSource; - if (rCmd == "down") + if (rCmd == "movedown") { - sal_uLong nEntryCount = GetEntryCount(); + size_t nEntryCount = m_xTreeView->n_children(); bMove = nEntryCount > nSource + 1; nDest+= 2; } - else if (rCmd == "up") + else if (rCmd == "moveup") { bMove = 0 != nSource; nDest--; @@ -1096,7 +845,7 @@ void SwGlobalTree::ExecCommand(const OUString &rCmd) } } -bool SwGlobalTree::Update(bool bHard) +bool SwGlobalTree::Update(bool bHard) { SwView* pActView = GetParentWindow()->GetCreateView(); bool bRet = false; @@ -1119,8 +868,9 @@ bool SwGlobalTree::Update(bool bHard) bool bCopy = false; std::unique_ptr<SwGlblDocContents> pTempContents(new SwGlblDocContents); m_pActiveShell->GetGlobalDocContent(*pTempContents); - if(pTempContents->size() != m_pSwGlblDocContents->size() || - pTempContents->size() != GetEntryCount()) + size_t nChildren = m_xTreeView->n_children(); + if (pTempContents->size() != m_pSwGlblDocContents->size() || + pTempContents->size() != nChildren) { bRet = true; bCopy = true; @@ -1132,8 +882,7 @@ bool SwGlobalTree::Update(bool bHard) SwGlblDocContent* pLeft = (*pTempContents)[i].get(); SwGlblDocContent* pRight = (*m_pSwGlblDocContents)[i].get(); GlobalDocContentType eType = pLeft->GetType(); - SvTreeListEntry* pEntry = GetEntry(i); - OUString sTemp = GetEntryText(pEntry); + OUString sTemp = m_xTreeView->get_text(i); if ( eType != pRight->GetType() || ( @@ -1150,7 +899,7 @@ bool SwGlobalTree::Update(bool bHard) } } } - if(bCopy || bHard) + if (bCopy || bHard) { *m_pSwGlblDocContents = std::move( *pTempContents ); bRet = true; @@ -1159,7 +908,7 @@ bool SwGlobalTree::Update(bool bHard) } else { - Clear(); + m_xTreeView->clear(); if(m_pSwGlblDocContents) m_pSwGlblDocContents->clear(); } @@ -1180,7 +929,7 @@ void SwGlobalTree::OpenDoc(const SwGlblDocContent* pCont) { bFound = true; SwGlobalTree::SetShowShell(pCurr); - Application::PostUserEvent( LINK( this, SwGlobalTree, ShowFrameHdl ), nullptr, true ); + Application::PostUserEvent(LINK(this, SwGlobalTree, ShowFrameHdl)); pCurr = nullptr; } else @@ -1198,11 +947,11 @@ void SwGlobalTree::OpenDoc(const SwGlblDocContent* pCont) } } -IMPL_LINK_NOARG( SwGlobalTree, DoubleClickHdl, SvTreeListBox*, bool) +IMPL_LINK_NOARG( SwGlobalTree, DoubleClickHdl, weld::TreeView&, bool) { - SvTreeListEntry* pEntry = GetCurEntry(); - SwGlblDocContent* pCont = static_cast<SwGlblDocContent*>(pEntry->GetUserData()); - if(pCont->GetType() == GLBLDOC_SECTION) + int nEntry = m_xTreeView->get_cursor_index(); + SwGlblDocContent* pCont = nEntry != -1 ? reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(nEntry).toInt64()) : nullptr; + if (pCont->GetType() == GLBLDOC_SECTION) OpenDoc(pCont); else { @@ -1225,51 +974,15 @@ IMPL_STATIC_LINK_NOARG(SwGlobalTree, ShowFrameHdl, void*, void) SwGlobalTree::SetShowShell(nullptr); } -void SwGlobalTree::InitEntry(SvTreeListEntry* pEntry, - const OUString& rStr ,const Image& rImg1,const Image& rImg2) -{ - const size_t nColToHilite = 1; //0==Bitmap;1=="Column1";2=="Column2" - SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2 ); - SvLBoxString& rCol = static_cast<SvLBoxString&>(pEntry->GetItem( nColToHilite )); - pEntry->ReplaceItem(std::make_unique<SwLBoxString>(rCol.GetText()), nColToHilite); -} - -void SwLBoxString::Paint(const Point& rPos, SvTreeListBox& rDev, vcl::RenderContext& rRenderContext, - const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) -{ - SwGlblDocContent* pCont = static_cast<SwGlblDocContent*>(rEntry.GetUserData()); - if (pCont->GetType() == GLBLDOC_SECTION && - !pCont->GetSection()->IsConnectFlag()) - { - rRenderContext.Push(PushFlags::FONT); - vcl::Font aFont(rRenderContext.GetFont()); - aFont.SetColor(COL_LIGHTRED); - rRenderContext.SetFont(aFont); - rRenderContext.DrawText(rPos, GetText()); - rRenderContext.Pop(); - } - else - SvLBoxString::Paint(rPos, rDev, rRenderContext, pView, rEntry); -} - -void SwGlobalTree::DataChanged( const DataChangedEvent& rDCEvt ) -{ - if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) && - (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) ) - { - Update(true); - } - SvTreeListBox::DataChanged( rDCEvt ); -} - void SwGlobalTree::InsertRegion( const SwGlblDocContent* _pContent, const Sequence< OUString >& _rFiles ) { sal_Int32 nFiles = _rFiles.getLength(); - if ( !nFiles ) + if (!nFiles) return; - bool bMove = _pContent == nullptr;; - sal_uLong nEntryCount = GetEntryCount(); + size_t nEntryCount = m_xTreeView->n_children(); + + bool bMove = _pContent == nullptr; const OUString* pFileNames = _rFiles.getConstArray(); SwWrtShell& rSh = GetParentWindow()->GetCreateView()->GetWrtShell(); rSh.StartAction(); diff --git a/sw/source/uibase/utlui/navipi.cxx b/sw/source/uibase/utlui/navipi.cxx index c9c2cd1d0fa0..ca52eeb8cc5f 100644 --- a/sw/source/uibase/utlui/navipi.cxx +++ b/sw/source/uibase/utlui/navipi.cxx @@ -35,7 +35,6 @@ #include <navicfg.hxx> #include <wrtsh.hxx> #include <docsh.hxx> -#include <actctrl.hxx> #include <navipi.hxx> #include <workctrl.hxx> #include <edtwin.hxx> @@ -119,7 +118,6 @@ void SwNavigationPI::MoveOutline(SwOutlineNodes::size_type nSource, SwOutlineNod } // After goto cancel the status frame selection - static void lcl_UnSelectFrame(SwWrtShell *pSh) { if (pSh->IsFrameSelected()) @@ -130,10 +128,9 @@ static void lcl_UnSelectFrame(SwWrtShell *pSh) } // Select the document view - -IMPL_LINK( SwNavigationPI, DocListBoxSelectHdl, ListBox&, rBox, void ) +IMPL_LINK(SwNavigationPI, DocListBoxSelectHdl, weld::ComboBox&, rBox, void) { - int nEntryIdx = rBox.GetSelectedEntryPos(); + int nEntryIdx = rBox.get_active(); SwView *pView ; pView = SwModule::GetFirstView(); while (nEntryIdx-- && pView) @@ -143,40 +140,39 @@ IMPL_LINK( SwNavigationPI, DocListBoxSelectHdl, ListBox&, rBox, void ) if(!pView) { nEntryIdx == 0 ? - m_aContentTree->ShowHiddenShell(): - m_aContentTree->ShowActualView(); + m_xContentTree->ShowHiddenShell(): + m_xContentTree->ShowActualView(); } else { - m_aContentTree->SetConstantShell(pView->GetWrtShellPtr()); + m_xContentTree->SetConstantShell(pView->GetWrtShellPtr()); } } // Filling of the list box for outline view or documents // The PI will be set to full size - void SwNavigationPI::FillBox() { if(m_pContentWrtShell) { - m_aContentTree->SetHiddenShell( m_pContentWrtShell ); - m_aContentTree->Display( false ); + m_xContentTree->SetHiddenShell( m_pContentWrtShell ); + m_xContentTree->Display( false ); } else { SwView *pView = GetCreateView(); if(!pView) { - m_aContentTree->SetActiveShell(nullptr); + m_xContentTree->SetActiveShell(nullptr); } else if( pView != m_pActContView) { SwWrtShell* pWrtShell = pView->GetWrtShellPtr(); - m_aContentTree->SetActiveShell(pWrtShell); + m_xContentTree->SetActiveShell(pWrtShell); } else - m_aContentTree->Display( true ); + m_xContentTree->Display( true ); m_pActContView = pView; } } @@ -185,48 +181,43 @@ void SwNavigationPI::UsePage() { SwView *pView = GetCreateView(); SwWrtShell *pSh = pView ? &pView->GetWrtShell() : nullptr; - GetPageEdit().set_value(1); + m_xEdit->set_value(1); if (pSh) { const sal_uInt16 nPageCnt = pSh->GetPageCnt(); sal_uInt16 nPhyPage, nVirPage; pSh->GetPageNum(nPhyPage, nVirPage); - GetPageEdit().set_max(nPageCnt); - GetPageEdit().set_value(nPhyPage); + m_xEdit->set_max(nPageCnt); + m_xEdit->set_width_chars(3); + m_xEdit->set_value(nPhyPage); } } // Select handler of the toolboxes - -IMPL_LINK( SwNavigationPI, ToolBoxSelectHdl, ToolBox *, pBox, void ) +IMPL_LINK(SwNavigationPI, ToolBoxSelectHdl, const OString&, rCommand, void) { - const sal_uInt16 nCurrItemId = pBox->GetCurItemId(); - const OUString sCommand = pBox->GetItemCommand(nCurrItemId); SwView *pView = GetCreateView(); if (!pView) return; SwWrtShell &rSh = pView->GetWrtShell(); // Get MouseModifier for Outline-Move - // Standard: sublevels are taken - // do not take sublevels with Ctrl - bool bOutlineWithChildren = ( KEY_MOD1 != pBox->GetModifier()); int nFuncId = 0; bool bFocusToDoc = false; - if (sCommand == ".uno:ScrollToPrevious") + if (rCommand == ".uno:ScrollToPrevious") { rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(FN_SCROLL_PREV, SfxCallMode::ASYNCHRON); } - else if (sCommand == ".uno:ScrollToNext") + else if (rCommand == ".uno:ScrollToNext") { rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(FN_SCROLL_NEXT, SfxCallMode::ASYNCHRON); } - else if (sCommand == "root") + else if (rCommand == "root") { - m_aContentTree->ToggleToRoot(); + m_xContentTree->ToggleToRoot(); } - else if (sCommand == "listbox") + else if (rCommand == "listbox") { if (SfxChildWindowContext::GetFloatingWindow(GetParent())) { @@ -242,7 +233,7 @@ IMPL_LINK( SwNavigationPI, ToolBoxSelectHdl, ToolBox *, pBox, void ) return; } // Functions that will trigger a direct action. - else if (sCommand == "footer") + else if (rCommand == "footer") { rSh.MoveCursor(); const FrameTypeFlags eType = rSh.GetFrameType(nullptr,false); @@ -255,7 +246,7 @@ IMPL_LINK( SwNavigationPI, ToolBoxSelectHdl, ToolBox *, pBox, void ) nFuncId = FN_TO_FOOTER; bFocusToDoc = true; } - else if (sCommand == "header") + else if (rCommand == "header") { rSh.MoveCursor(); const FrameTypeFlags eType = rSh.GetFrameType(nullptr,false); @@ -268,7 +259,7 @@ IMPL_LINK( SwNavigationPI, ToolBoxSelectHdl, ToolBox *, pBox, void ) nFuncId = FN_TO_HEADER; bFocusToDoc = true; } - else if (sCommand == "anchor") + else if (rCommand == "anchor") { rSh.MoveCursor(); const FrameTypeFlags eFrameType = rSh.GetFrameType(nullptr,false); @@ -292,32 +283,50 @@ IMPL_LINK( SwNavigationPI, ToolBoxSelectHdl, ToolBox *, pBox, void ) } bFocusToDoc = true; } - else if (sCommand == "reminder") + else if (rCommand == "reminder") { rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(FN_SET_REMINDER, SfxCallMode::ASYNCHRON); } - else if (sCommand == "down" || - sCommand == "up" || - sCommand == "promote" || - sCommand == "demote" || - sCommand == "edit") + else if (rCommand == "chapterdown" || + rCommand == "movedown" || + rCommand == "chapterup" || + rCommand == "moveup" || + rCommand == "promote" || + rCommand == "demote" || + rCommand == "edit") { if (IsGlobalMode()) - m_aGlobalTree->ExecCommand(sCommand); + m_xGlobalTree->ExecCommand(rCommand); else - m_aContentTree->ExecCommand(sCommand, bOutlineWithChildren); + { + // Standard: sublevels are taken + // do not take sublevels with Ctrl + bool bOutlineWithChildren = (KEY_MOD1 != m_xContent3ToolBox->get_modifier_state()); + m_xContentTree->ExecCommand(rCommand, bOutlineWithChildren); + } } - else if (sCommand == "toggle") + else if (rCommand == "contenttoggle" || rCommand == "globaltoggle") { ToggleTree(); - m_pConfig->SetGlobalActive(IsGlobalMode()); + bool bGlobalMode = IsGlobalMode(); + m_pConfig->SetGlobalActive(bGlobalMode); + m_xGlobalToolBox->set_item_active("globaltoggle", bGlobalMode); + m_xContent1ToolBox->set_item_active("contenttoggle", bGlobalMode); } - else if (sCommand == "save") + else if (rCommand == "save") { bool bSave = rSh.IsGlblDocSaveLinks(); rSh.SetGlblDocSaveLinks( !bSave ); - pBox->CheckItem(nCurrItemId, !bSave ); + m_xGlobalToolBox->set_item_active(rCommand, !bSave); } + else if (rCommand == "dragmode") + m_xContent3ToolBox->set_menu_item_active("dragmode", !m_xContent3ToolBox->get_menu_item_active("dragmode")); + else if (rCommand == "headings") + m_xContent2ToolBox->set_menu_item_active("headings", !m_xContent2ToolBox->get_menu_item_active("headings")); + else if (rCommand == "update") + m_xGlobalToolBox->set_menu_item_active("update", !m_xGlobalToolBox->get_menu_item_active("update")); + else if (rCommand == "insert") + m_xGlobalToolBox->set_menu_item_active("insert", !m_xGlobalToolBox->get_menu_item_active("insert")); if (nFuncId) lcl_UnSelectFrame(&rSh); @@ -326,61 +335,63 @@ IMPL_LINK( SwNavigationPI, ToolBoxSelectHdl, ToolBox *, pBox, void ) } // Click handler of the toolboxes - -IMPL_LINK( SwNavigationPI, ToolBoxClickHdl, ToolBox *, pBox, void ) +IMPL_LINK(SwNavigationPI, ToolBoxClickHdl, const OString&, rCommand, void) { - const sal_uInt16 nCurrItemId = pBox->GetCurItemId(); - const OUString sCommand = pBox->GetItemCommand(nCurrItemId); - if (sCommand == "update" || sCommand == "insert") - m_aGlobalTree->TbxMenuHdl(nCurrItemId, pBox); + if (!m_xGlobalToolBox->get_menu_item_active(rCommand)) + return; + + if (rCommand == "update") + m_xGlobalTree->TbxMenuHdl(rCommand, *m_xUpdateMenu); + else if (rCommand == "insert") + m_xGlobalTree->TbxMenuHdl(rCommand, *m_xInsertMenu); } -IMPL_LINK( SwNavigationPI, ToolBoxDropdownClickHdl, ToolBox*, pBox, void ) +IMPL_LINK(SwNavigationPI, ToolBox3DropdownClickHdl, const OString&, rCommand, void) { - const sal_uInt16 nCurrItemId = pBox->GetCurItemId(); - const OUString sCommand = pBox->GetItemCommand(nCurrItemId); - if (sCommand == "dragmode") - { - static const char* aHIDs[] = - { - HID_NAVI_DRAG_HYP, - HID_NAVI_DRAG_LINK, - HID_NAVI_DRAG_COPY, - }; - ScopedVclPtrInstance<PopupMenu> pMenu; - for (sal_uInt16 i = 0; i <= static_cast<sal_uInt16>(RegionMode::EMBEDDED); ++i) - { - pMenu->InsertItem(i + 1, m_aContextArr[i], MenuItemBits::RADIOCHECK); - pMenu->SetHelpId(i + 1, aHIDs[i]); - } - pMenu->CheckItem( static_cast<int>(m_nRegionMode) + 1 ); - pMenu->SetSelectHdl(LINK(this, SwNavigationPI, MenuSelectHdl)); - pBox->SetItemDown(nCurrItemId, true); - pMenu->Execute(pBox, pBox->GetItemRect(nCurrItemId), PopupMenuFlags::ExecuteDown); - pBox->SetItemDown(nCurrItemId, false); - pBox->EndSelection(); - pMenu.disposeAndClear(); - pBox->Invalidate(); - } - else if (sCommand == "headings") + if (!m_xContent3ToolBox->get_menu_item_active(rCommand)) + return; + + if (rCommand == "dragmode") { - ScopedVclPtrInstance<PopupMenu> pMenu; - for (sal_uInt16 i = 101; i <= 100 + MAXLEVEL; ++i) + switch (m_nRegionMode) { - pMenu->InsertItem(i, OUString::number(i - 100), MenuItemBits::RADIOCHECK); - pMenu->SetHelpId(i, HID_NAVI_OUTLINES); + case RegionMode::NONE: + m_xDragModeMenu->set_active("hyperlink", true); + break; + case RegionMode::LINK: + m_xDragModeMenu->set_active("link", true); + break; + case RegionMode::EMBEDDED: + m_xDragModeMenu->set_active("copy", true); + break; } - pMenu->CheckItem( m_aContentTree->GetOutlineLevel() + 100 ); - pMenu->SetSelectHdl(LINK(this, SwNavigationPI, MenuSelectHdl)); - pBox->SetItemDown( nCurrItemId, true ); - pMenu->Execute(pBox, pBox->GetItemRect(nCurrItemId), PopupMenuFlags::ExecuteDown); - pBox->SetItemDown( nCurrItemId, false ); - pMenu.disposeAndClear(); - pBox->EndSelection(); - pBox->Invalidate(); } } +IMPL_LINK(SwNavigationPI, DropModeMenuSelectHdl, const OString&, rIdent, void) +{ + if (rIdent == "hyperlink") + SetRegionDropMode(RegionMode::NONE); + else if (rIdent == "link") + SetRegionDropMode(RegionMode::LINK); + else if (rIdent == "copy") + SetRegionDropMode(RegionMode::EMBEDDED); +} + +IMPL_LINK(SwNavigationPI, GlobalMenuSelectHdl, const OString&, rIdent, void) +{ + m_xGlobalTree->ExecuteContextMenuAction(rIdent); +} + +IMPL_LINK(SwNavigationPI, ToolBox2DropdownClickHdl, const OString&, rCommand, void) +{ + if (!m_xContent2ToolBox->get_menu_item_active(rCommand)) + return; + + if (rCommand == "headings") + m_xHeadingsMenu->set_active(OString::number(m_xContentTree->GetOutlineLevel()), true); +} + FactoryFunction SwNavigationPI::GetUITestFactory() const { return SwNavigationPIUIObject::create; @@ -398,7 +409,7 @@ bool SwNavigationPI::EditAction() m_aPageChgIdle.Stop(); SwWrtShell &rSh = m_pCreateView->GetWrtShell(); - sal_uInt16 nNewPage = GetPageEdit().get_value(); + sal_uInt16 nNewPage = m_xEdit->get_value(); sal_uInt16 nPhyPage, nVirPage; rSh.GetPageNum(nPhyPage, nVirPage); @@ -423,14 +434,14 @@ void SwNavigationPI::ZoomOut() FillBox(); if (IsGlobalMode()) { - m_aGlobalBox->Show(); - m_aGlobalTree->ShowTree(); + m_xGlobalBox->show(); + m_xGlobalTree->ShowTree(); } else { - m_aContentBox->Show(); - m_aContentTree->ShowTree(); - m_aDocListBox->Show(); + m_xContentBox->show(); + m_xContentTree->ShowTree(); + m_xDocListBox->show(); } Size aOptimalSize(GetOptimalSize()); @@ -439,11 +450,9 @@ void SwNavigationPI::ZoomOut() pNav->SetMinOutputSizePixel(aOptimalSize); pNav->SetOutputSizePixel(aNewSize); - SvTreeListEntry* pFirst = m_aContentTree->FirstSelected(); - if (pFirst) - m_aContentTree->Select(pFirst); // Enable toolbox + m_xContentTree->Select(); // Enable toolbox m_pConfig->SetSmall(false); - m_aContentToolBox->CheckItem(m_aContentToolBox->GetItemId("listbox")); + m_xContent3ToolBox->set_item_active("listbox", true); } void SwNavigationPI::ZoomIn() @@ -456,11 +465,11 @@ void SwNavigationPI::ZoomIn() m_aExpandedSize = GetSizePixel(); - m_aContentBox->Hide(); - m_aContentTree->HideTree(); - m_aGlobalBox->Hide(); - m_aGlobalTree->HideTree(); - m_aDocListBox->Hide(); + m_xContentBox->hide(); + m_xContentTree->HideTree(); + m_xGlobalBox->hide(); + m_xGlobalTree->HideTree(); + m_xDocListBox->hide(); m_bIsZoomedIn = true; Size aOptimalSize(GetOptimalSize()); @@ -469,11 +478,10 @@ void SwNavigationPI::ZoomIn() pNav->SetMinOutputSizePixel(aOptimalSize); pNav->SetOutputSizePixel(aNewSize); - SvTreeListEntry* pFirst = m_aContentTree->FirstSelected(); - if (pFirst) - m_aContentTree->Select(pFirst); // Enable toolbox + m_xContentTree->Select(); // Enable toolbox + m_pConfig->SetSmall(true); - m_aContentToolBox->CheckItem(m_aContentToolBox->GetItemId("listbox"), false); + m_xContent3ToolBox->set_item_active("listbox", false); } namespace { @@ -503,9 +511,24 @@ VclPtr<vcl::Window> SwNavigationPI::Create(vcl::Window* pParent, SwNavigationPI::SwNavigationPI(vcl::Window* pParent, const css::uno::Reference<css::frame::XFrame>& rxFrame, SfxBindings* _pBindings) - : PanelLayout(pParent, "NavigatorPanel", "modules/swriter/ui/navigatorpanel.ui", rxFrame/*, true*/) + : PanelLayout(pParent, "NavigatorPanel", "modules/swriter/ui/navigatorpanel.ui", rxFrame, true) , m_aDocFullName(SID_DOCFULLNAME, *_pBindings, *this) , m_aPageStats(FN_STAT_PAGE, *_pBindings, *this) + , m_xContent1ToolBox(m_xBuilder->weld_toolbar("content1")) + , m_xContent2ToolBox(m_xBuilder->weld_toolbar("content2")) + , m_xContent3ToolBox(m_xBuilder->weld_toolbar("content3")) + , m_xContent1Dispatch(new ToolbarUnoDispatcher(*m_xContent1ToolBox, *m_xBuilder, rxFrame)) + , m_xHeadingsMenu(m_xBuilder->weld_menu("headingsmenu")) + , m_xDragModeMenu(m_xBuilder->weld_menu("dragmodemenu")) + , m_xUpdateMenu(m_xBuilder->weld_menu("updatemenu")) + , m_xInsertMenu(m_xBuilder->weld_menu("insertmenu")) + , m_xGlobalToolBox(m_xBuilder->weld_toolbar("global")) + , m_xEdit(m_xBuilder->weld_spin_button("spinbutton")) + , m_xContentBox(m_xBuilder->weld_widget("contentbox")) + , m_xContentTree(new SwContentTree(m_xBuilder->weld_tree_view("contenttree"), this)) + , m_xGlobalBox(m_xBuilder->weld_widget("globalbox")) + , m_xGlobalTree(new SwGlobalTree(m_xBuilder->weld_tree_view("globaltree"), this)) + , m_xDocListBox(m_xBuilder->weld_combo_box("documents")) , m_pContentView(nullptr) , m_pContentWrtShell(nullptr) , m_pActContView(nullptr) @@ -516,50 +539,26 @@ SwNavigationPI::SwNavigationPI(vcl::Window* pParent, , m_bIsZoomedIn(false) , m_bGlobalMode(false) { - get(m_aContentToolBox, "content"); - m_aContentToolBox->SetLineCount(2); - m_aContentToolBox->InsertBreak(4); - get(m_aGlobalToolBox, "global"); - get(m_aDocListBox, "documents"); - - get(m_aContentBox, "contentbox"); - m_aContentTree = VclPtr<SwContentTree>::Create(m_aContentBox, this); - m_aContentTree->set_expand(true); - get(m_aGlobalBox, "globalbox"); - m_aGlobalTree = VclPtr<SwGlobalTree>::Create(m_aGlobalBox, this); - m_aGlobalTree->set_expand(true); + set_id("NavigatorPanelParent"); // for uitest/writer_tests5/tdf114724.py GetCreateView(); - m_aContentToolBox->SetHelpId(HID_NAVIGATOR_TOOLBOX); - m_aGlobalToolBox->SetHelpId(HID_NAVIGATOR_GLOBAL_TOOLBOX); - m_aDocListBox->SetHelpId(HID_NAVIGATOR_LISTBOX); - m_aDocListBox->SetDropDownLineCount(9); - m_aDocListBox->setMaxWidthChars(20); + m_xContent1ToolBox->set_help_id(HID_NAVIGATOR_TOOLBOX); + m_xContent2ToolBox->set_help_id(HID_NAVIGATOR_TOOLBOX); + m_xContent3ToolBox->set_help_id(HID_NAVIGATOR_TOOLBOX); + m_xGlobalToolBox->set_help_id(HID_NAVIGATOR_GLOBAL_TOOLBOX); + m_xDocListBox->set_help_id(HID_NAVIGATOR_LISTBOX); + m_xDocListBox->set_size_request(42, -1); // set a nominal width so it takes width of surroundings // Insert the numeric field in the toolbox. - m_xEdit = VclPtr<NumEditAction>::Create(m_aContentToolBox.get()); - m_xEdit->set_accessible_name(m_xEdit->GetQuickHelpText()); + m_xEdit->set_accessible_name(m_xEdit->get_tooltip_text()); + m_xEdit->set_width_chars(3); m_xEdit->connect_value_changed(LINK(this, SwNavigationPI, PageEditModifyHdl)); + m_xEdit->set_help_id("modules/swriter/ui/navigatorpanel/numericfield"); - // Double separators are not allowed, so you have to - // determine the suitable size differently. - tools::Rectangle aFirstRect = m_aContentToolBox->GetItemRect(m_aContentToolBox->GetItemId("anchor")); - tools::Rectangle aSecondRect = m_aContentToolBox->GetItemRect(m_aContentToolBox->GetItemId("header")); - Size aItemWinSize( aFirstRect.Left() - aSecondRect.Left(), - aFirstRect.Bottom() - aFirstRect.Top() ); - Size aOptimalSize(m_xEdit->GetSizePixel()); - aItemWinSize.setWidth( std::max(aItemWinSize.Width(), aOptimalSize.Width()) ); - aItemWinSize.setHeight( std::max(aItemWinSize.Height(), aOptimalSize.Height()) ); - m_xEdit->SetSizePixel(aItemWinSize); - m_aContentToolBox->InsertSeparator(4); - m_aContentToolBox->InsertWindow( FN_PAGENUMBER, m_xEdit, ToolBoxItemBits::NONE, 4); - m_aContentToolBox->InsertSeparator(4); - m_aContentToolBox->SetHelpId(FN_PAGENUMBER, "modules/swriter/ui/navigatorpanel/numericfield"); - m_aContentToolBox->ShowItem(FN_PAGENUMBER); if (!IsGlobalDoc()) { - m_aContentToolBox->HideItem(m_aContentToolBox->GetItemId("toggle")); + m_xContent1ToolBox->set_item_visible("contenttoggle", false); } const char* REGIONNAME_ARY[] = @@ -581,77 +580,62 @@ SwNavigationPI::SwNavigationPI(vcl::Window* pParent, for (sal_uInt16 i = 0; i <= static_cast<sal_uInt16>(RegionMode::EMBEDDED); ++i) { - m_aContextArr[i] = SwResId(REGIONNAME_ARY[i]); m_aStatusArr[i] = SwResId(REGIONMODE_ARY[i]); } m_aStatusArr[3] = SwResId(STR_ACTIVE_VIEW); - m_aContentTree->SetStyle(m_aContentTree->GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT| - WB_CLIPCHILDREN|WB_HSCROLL|WB_TABSTOP); - m_aContentTree->SetForceMakeVisible(true); - m_aContentTree->SetSpaceBetweenEntries(3); - m_aContentTree->SetSelectionMode(SelectionMode::Single); - m_aContentTree->SetDragDropMode(DragDropMode::CTRL_MOVE | - DragDropMode::CTRL_COPY | - DragDropMode::ENABLE_TOP); - m_aContentTree->EnableAsyncDrag(true); - m_aContentTree->ShowTree(); - m_aContentToolBox->CheckItem(m_aContentToolBox->GetItemId("listbox")); - m_aContentToolBox->ShowItem(m_aContentToolBox->GetItemId("listbox"), SfxChildWindowContext::GetFloatingWindow(GetParent()) != nullptr); + m_xContentTree->set_selection_mode(SelectionMode::Single); + m_xContentTree->ShowTree(); + m_xContent3ToolBox->set_item_active("listbox", true); + m_xContent3ToolBox->set_item_sensitive("listbox", SfxChildWindowContext::GetFloatingWindow(GetParent()) != nullptr); // TreeListBox for global document - m_aGlobalTree->SetSelectionMode( SelectionMode::Multiple ); - m_aGlobalTree->SetStyle(m_aGlobalTree->GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT| - WB_CLIPCHILDREN|WB_HSCROLL|WB_TABSTOP); + m_xGlobalTree->set_selection_mode(SelectionMode::Multiple); // Handler - Link<ToolBox *, void> aLk = LINK(this, SwNavigationPI, ToolBoxSelectHdl); - m_aContentToolBox->SetSelectHdl( aLk ); - m_aGlobalToolBox->SetSelectHdl( aLk ); - m_aDocListBox->SetSelectHdl(LINK(this, SwNavigationPI, - DocListBoxSelectHdl)); - m_aContentToolBox->SetClickHdl( LINK(this, SwNavigationPI, ToolBoxClickHdl) ); - m_aContentToolBox->SetDropdownClickHdl( LINK(this, SwNavigationPI, ToolBoxDropdownClickHdl) ); - m_aGlobalToolBox->SetClickHdl( LINK(this, SwNavigationPI, ToolBoxClickHdl) ); - m_aGlobalToolBox->SetDropdownClickHdl( LINK(this, SwNavigationPI, ToolBoxDropdownClickHdl) ); - m_aGlobalToolBox->CheckItem(m_aGlobalToolBox->GetItemId("toggle")); - - vcl::Font aFont(GetFont()); - aFont.SetWeight(WEIGHT_NORMAL); - GetPageEdit().SetFont(aFont); - aFont = m_aContentTree->GetFont(); - aFont.SetWeight(WEIGHT_NORMAL); - m_aContentTree->SetFont(aFont); - m_aGlobalTree->SetFont(aFont); + Link<const OString&, void> aLk = LINK(this, SwNavigationPI, ToolBoxSelectHdl); + m_xContent1ToolBox->connect_clicked(aLk); + m_xContent2ToolBox->connect_clicked(aLk); + m_xContent3ToolBox->connect_clicked(aLk); + m_xGlobalToolBox->connect_clicked(aLk); + m_xDocListBox->connect_changed(LINK(this, SwNavigationPI, DocListBoxSelectHdl)); + m_xContent2ToolBox->set_item_menu("headings", m_xHeadingsMenu.get()); + m_xHeadingsMenu->connect_activate(LINK(this, SwNavigationPI, HeadingsMenuSelectHdl)); + m_xContent2ToolBox->connect_menu_toggled(LINK(this, SwNavigationPI, ToolBox2DropdownClickHdl)); + m_xContent3ToolBox->set_item_menu("dragmode", m_xDragModeMenu.get()); + m_xDragModeMenu->connect_activate(LINK(this, SwNavigationPI, DropModeMenuSelectHdl)); + m_xContent3ToolBox->connect_menu_toggled(LINK(this, SwNavigationPI, ToolBox3DropdownClickHdl)); + m_xGlobalToolBox->set_item_menu("update", m_xUpdateMenu.get()); + m_xUpdateMenu->connect_activate(LINK(this, SwNavigationPI, GlobalMenuSelectHdl)); + m_xGlobalToolBox->set_item_menu("insert", m_xInsertMenu.get()); + m_xInsertMenu->connect_activate(LINK(this, SwNavigationPI, GlobalMenuSelectHdl)); + m_xGlobalToolBox->connect_menu_toggled(LINK(this, SwNavigationPI, ToolBoxClickHdl)); + m_xGlobalToolBox->set_item_active("globaltoggle", true); + +// set toolbar of both modes to widest of each + m_xGlobalToolBox->set_size_request(m_xContent1ToolBox->get_preferred_size().Width(), -1); StartListening(*SfxGetpApp()); - sal_uInt16 nNavId = m_aContentToolBox->GetItemId("navigation"); - m_aContentToolBox->SetItemBits(nNavId, m_aContentToolBox->GetItemBits(nNavId) | ToolBoxItemBits::DROPDOWNONLY ); - sal_uInt16 nDropId = m_aContentToolBox->GetItemId("dragmode"); - m_aContentToolBox->SetItemBits(nDropId, m_aContentToolBox->GetItemBits(nDropId) | ToolBoxItemBits::DROPDOWNONLY ); - sal_uInt16 nOutlineId = m_aContentToolBox->GetItemId("headings"); - m_aContentToolBox->SetItemBits(nOutlineId, m_aContentToolBox->GetItemBits(nOutlineId) | ToolBoxItemBits::DROPDOWNONLY ); - if(IsGlobalDoc()) { SwView *pActView = GetCreateView(); - m_aGlobalToolBox->CheckItem(m_aGlobalToolBox->GetItemId("save"), + m_xGlobalToolBox->set_item_active("save", pActView->GetWrtShellPtr()->IsGlblDocSaveLinks()); if (m_pConfig->IsGlobalActive()) ToggleTree(); - m_aGlobalTree->GrabFocus(); + m_xGlobalTree->grab_focus(); } else - m_aContentTree->GrabFocus(); + m_xContentTree->grab_focus(); UsePage(); m_aPageChgIdle.SetInvokeHandler(LINK(this, SwNavigationPI, ChangePageHdl)); m_aPageChgIdle.SetPriority(TaskPriority::LOWEST); - m_aContentTree->SetAccessibleName(SwResId(STR_ACCESS_TL_CONTENT)); - m_aGlobalTree->SetAccessibleName(SwResId(STR_ACCESS_TL_GLOBAL)); - m_aDocListBox->SetAccessibleName(m_aStatusArr[3]); + m_xContentTree->set_accessible_name(SwResId(STR_ACCESS_TL_CONTENT)); + m_xGlobalTree->set_accessible_name(SwResId(STR_ACCESS_TL_GLOBAL)); + m_xDocListBox->set_accessible_name(m_aStatusArr[3]); m_aExpandedSize = GetOptimalSize(); } @@ -673,8 +657,6 @@ void SwNavigationPI::dispose() EndListening(*SfxGetpApp()); - m_aContentToolBox->GetItemWindow(FN_PAGENUMBER)->disposeOnce(); - m_aContentToolBox->Clear(); if (m_pxObjectShell) { if (m_pxObjectShell->Is()) @@ -682,14 +664,21 @@ void SwNavigationPI::dispose() m_pxObjectShell.reset(); } - m_aDocListBox.clear(); - m_aGlobalTree.disposeAndClear(); - m_aGlobalBox.clear(); - m_aContentTree.disposeAndClear(); - m_aContentBox.clear(); - m_aGlobalToolBox.disposeAndClear(); - m_xEdit.disposeAndClear(); - m_aContentToolBox.clear(); + m_xDocListBox.reset(); + m_xGlobalTree.reset(); + m_xGlobalBox.reset(); + m_xContentTree.reset(); + m_xContentBox.reset(); + m_xGlobalToolBox.reset(); + m_xEdit.reset(); + m_xHeadingsMenu.reset(); + m_xDragModeMenu.reset(); + m_xUpdateMenu.reset(); + m_xInsertMenu.reset(); + m_xContent1Dispatch.reset(); + m_xContent1ToolBox.reset(); + m_xContent2ToolBox.reset(); + m_xContent3ToolBox.reset(); m_aPageChgIdle.Stop(); @@ -708,21 +697,21 @@ void SwNavigationPI::NotifyItemUpdate(sal_uInt16 nSID, SfxItemState /*eState*/, if(pActView) { SwWrtShell* pWrtShell = pActView->GetWrtShellPtr(); - m_aContentTree->SetActiveShell(pWrtShell); + m_xContentTree->SetActiveShell(pWrtShell); bool bGlobal = IsGlobalDoc(); - m_aContentToolBox->ShowItem(m_aContentToolBox->GetItemId("toggle"), bGlobal); + m_xContent1ToolBox->set_item_visible("contenttoggle", bGlobal); if ((!bGlobal && IsGlobalMode()) || (!IsGlobalMode() && m_pConfig->IsGlobalActive())) { ToggleTree(); } if (bGlobal) { - m_aGlobalToolBox->CheckItem(m_aGlobalToolBox->GetItemId("save"), pWrtShell->IsGlblDocSaveLinks()); + m_xGlobalToolBox->set_item_active("save", pWrtShell->IsGlblDocSaveLinks()); } } else { - m_aContentTree->SetActiveShell(nullptr); + m_xContentTree->SetActiveShell(nullptr); } UpdateListBox(); } @@ -732,10 +721,10 @@ void SwNavigationPI::NotifyItemUpdate(sal_uInt16 nSID, SfxItemState /*eState*/, if(pActView) { SwWrtShell &rSh = pActView->GetWrtShell(); - GetPageEdit().set_max(rSh.GetPageCnt()); + m_xEdit->set_max(rSh.GetPageCnt()); + m_xEdit->set_width_chars(3); } } - } void SwNavigationPI::StateChanged(StateChangedType nStateChange) @@ -746,15 +735,15 @@ void SwNavigationPI::StateChanged(StateChangedType nStateChange) // if the parent isn't a float, then the navigator is displayed in // the sidebar or is otherwise docked. While the navigator could change // its size, the sidebar can not, and the navigator would just waste - // space. Therefore hide this button. - m_aContentToolBox->ShowItem(m_aContentToolBox->GetItemId("listbox"), SfxChildWindowContext::GetFloatingWindow(GetParent()) != nullptr); + // space. Therefore disable this button. + m_xContent3ToolBox->set_item_sensitive("listbox", SfxChildWindowContext::GetFloatingWindow(GetParent()) != nullptr); // show content if docked if (SfxChildWindowContext::GetFloatingWindow(GetParent()) == nullptr && IsZoomedIn()) ZoomOut(); } else if (nStateChange == StateChangedType::ControlFocus) { - if (m_aContentTree) + if (m_xContentTree) { // update documents listbox UpdateListBox(); @@ -762,13 +751,6 @@ void SwNavigationPI::StateChanged(StateChangedType nStateChange) } } -// Get the numeric field from the toolbox. - -NumEditAction& SwNavigationPI::GetPageEdit() -{ - return *static_cast<NumEditAction*>(m_aContentToolBox->GetItemWindow(FN_PAGENUMBER)); -} - // Notification on modified DocInfo void SwNavigationPI::Notify( SfxBroadcaster& rBrdc, const SfxHint& rHint ) { @@ -791,15 +773,13 @@ void SwNavigationPI::Notify( SfxBroadcaster& rBrdc, const SfxHint& rHint ) if(pActView) { SwWrtShell* pWrtShell = pActView->GetWrtShellPtr(); - m_aContentTree->SetActiveShell(pWrtShell); - if(m_aGlobalTree->IsVisible()) + m_xContentTree->SetActiveShell(pWrtShell); + if (m_xGlobalTree->get_visible()) { - if(m_aGlobalTree->Update( false )) - m_aGlobalTree->Display(); - else - // If no update is needed, then paint at least, - // because of the red entries for the broken links. - m_aGlobalTree->Invalidate(); + bool bUpdateAll = m_xGlobalTree->Update(false); + // If no update is needed, then update the font colors + // at the entries of broken links. + m_xGlobalTree->Display(!bUpdateAll); } } } @@ -807,17 +787,10 @@ void SwNavigationPI::Notify( SfxBroadcaster& rBrdc, const SfxHint& rHint ) } } -IMPL_LINK( SwNavigationPI, MenuSelectHdl, Menu *, pMenu, bool ) +IMPL_LINK( SwNavigationPI, HeadingsMenuSelectHdl, const OString&, rMenuId, void ) { - sal_uInt16 nMenuId = pMenu->GetCurItemId(); - if(nMenuId != USHRT_MAX) - { - if(nMenuId < 100) - SetRegionDropMode( static_cast<RegionMode>(--nMenuId)); - else - m_aContentTree->SetOutlineLevel( static_cast< sal_uInt8 >(nMenuId - 100) ); - } - return false; + if (!rMenuId.isEmpty()) + m_xContentTree->SetOutlineLevel(rMenuId.toUInt32()); } void SwNavigationPI::UpdateListBox() @@ -825,17 +798,17 @@ void SwNavigationPI::UpdateListBox() if (isDisposed()) return; - m_aDocListBox->SetUpdateMode(false); - m_aDocListBox->Clear(); + m_xDocListBox->freeze(); + m_xDocListBox->clear(); SwView *pActView = GetCreateView(); bool bDisable = pActView == nullptr; SwView *pView = SwModule::GetFirstView(); sal_Int32 nCount = 0; sal_Int32 nAct = 0; sal_Int32 nConstPos = 0; - const SwView* pConstView = m_aContentTree->IsConstantView() && - m_aContentTree->GetActiveWrtShell() ? - &m_aContentTree->GetActiveWrtShell()->GetView(): + const SwView* pConstView = m_xContentTree->IsConstantView() && + m_xContentTree->GetActiveWrtShell() ? + &m_xContentTree->GetActiveWrtShell()->GetView(): nullptr; while (pView) { @@ -852,7 +825,7 @@ void SwNavigationPI::UpdateListBox() else sEntry += m_aStatusArr[IDX_STR_INACTIVE]; sEntry += ")"; - m_aDocListBox->InsertEntry(sEntry); + m_xDocListBox->append_text(sEntry); if (pConstView && pView == pConstView) nConstPos = nCount; @@ -861,33 +834,35 @@ void SwNavigationPI::UpdateListBox() } pView = SwModule::GetNextView(pView); } - m_aDocListBox->InsertEntry(m_aStatusArr[3]); // "Active Window" + m_xDocListBox->append_text(m_aStatusArr[3]); // "Active Window" nCount++; - if(m_aContentTree->GetHiddenWrtShell()) + if(m_xContentTree->GetHiddenWrtShell()) { - OUString sEntry = m_aContentTree->GetHiddenWrtShell()->GetView(). + OUString sEntry = m_xContentTree->GetHiddenWrtShell()->GetView(). GetDocShell()->GetTitle() + " (" + m_aStatusArr[IDX_STR_HIDDEN] + ")"; - m_aDocListBox->InsertEntry(sEntry); + m_xDocListBox->append_text(sEntry); bDisable = false; } - if(m_aContentTree->IsActiveView()) + + m_xDocListBox->thaw(); + + if(m_xContentTree->IsActiveView()) { //Either the name of the current Document or "Active Document". - m_aDocListBox->SelectEntryPos( pActView ? nAct : --nCount ); + m_xDocListBox->set_active(pActView ? nAct : --nCount); } - else if(m_aContentTree->IsHiddenView()) + else if(m_xContentTree->IsHiddenView()) { - m_aDocListBox->SelectEntryPos(nCount); + m_xDocListBox->set_active(nCount); } else - m_aDocListBox->SelectEntryPos(nConstPos); + m_xDocListBox->set_active(nConstPos); - m_aDocListBox->Enable( !bDisable ); - m_aDocListBox->SetUpdateMode(true); + m_xDocListBox->set_sensitive(!bDisable); } IMPL_LINK(SwNavigationPI, DoneLink, SfxPoolItem const *, pItem, void) @@ -898,7 +873,7 @@ IMPL_LINK(SwNavigationPI, DoneLink, SfxPoolItem const *, pItem, void) SfxViewFrame* pFrame = pFrameItem->GetFrame(); if(pFrame) { - m_aContentTree->Clear(); + m_xContentTree->clear(); m_pContentView = dynamic_cast<SwView*>( pFrame->GetViewShell() ); OSL_ENSURE(m_pContentView, "no SwView"); if(m_pContentView) @@ -907,7 +882,6 @@ IMPL_LINK(SwNavigationPI, DoneLink, SfxPoolItem const *, pItem, void) m_pContentWrtShell = nullptr; m_pxObjectShell.reset( new SfxObjectShellLock(pFrame->GetObjectShell()) ); FillBox(); - m_aContentTree->Update(); } } } @@ -947,15 +921,15 @@ OUString SwNavigationPI::CreateDropFileName( TransferableDataHelper& rData ) sal_Int8 SwNavigationPI::AcceptDrop() { - return ( !SwContentTree::IsInDrag() && - ( m_aContentTree->IsDropFormatSupported( SotClipboardFormatId::SIMPLE_FILE ) || - m_aContentTree->IsDropFormatSupported( SotClipboardFormatId::STRING ) || - m_aContentTree->IsDropFormatSupported( SotClipboardFormatId::SOLK ) || - m_aContentTree->IsDropFormatSupported( SotClipboardFormatId::NETSCAPE_BOOKMARK )|| - m_aContentTree->IsDropFormatSupported( SotClipboardFormatId::FILECONTENT ) || - m_aContentTree->IsDropFormatSupported( SotClipboardFormatId::FILEGRPDESCRIPTOR ) || - m_aContentTree->IsDropFormatSupported( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) || - m_aContentTree->IsDropFormatSupported( SotClipboardFormatId::FILENAME ))) + return ( !m_xContentTree->IsInDrag() && + ( m_xContentTree->IsDropFormatSupported( SotClipboardFormatId::SIMPLE_FILE ) || + m_xContentTree->IsDropFormatSupported( SotClipboardFormatId::STRING ) || + m_xContentTree->IsDropFormatSupported( SotClipboardFormatId::SOLK ) || + m_xContentTree->IsDropFormatSupported( SotClipboardFormatId::NETSCAPE_BOOKMARK )|| + m_xContentTree->IsDropFormatSupported( SotClipboardFormatId::FILECONTENT ) || + m_xContentTree->IsDropFormatSupported( SotClipboardFormatId::FILEGRPDESCRIPTOR ) || + m_xContentTree->IsDropFormatSupported( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) || + m_xContentTree->IsDropFormatSupported( SotClipboardFormatId::FILENAME ))) ? DND_ACTION_COPY : DND_ACTION_NONE; } @@ -964,7 +938,7 @@ sal_Int8 SwNavigationPI::ExecuteDrop( const ExecuteDropEvent& rEvt ) { TransferableDataHelper aData( rEvt.maDropEvent.Transferable ); sal_Int8 nRet = DND_ACTION_NONE; - if(SwContentTree::IsInDrag()) + if (m_xContentTree->IsInDrag()) return nRet; OUString sFileName = SwNavigationPI::CreateDropFileName(aData); @@ -986,7 +960,7 @@ sal_Int8 SwNavigationPI::ExecuteDrop( const ExecuteDropEvent& rEvt ) m_sContentFileName = sFileName; if(m_pxObjectShell) { - m_aContentTree->SetHiddenShell( nullptr ); + m_xContentTree->SetHiddenShell( nullptr ); (*m_pxObjectShell)->DoClose(); m_pxObjectShell.reset(); } @@ -1019,7 +993,7 @@ void SwNavigationPI::SetRegionDropMode(RegionMode nNewMode) sImageId = RID_BMP_DROP_COPY; break; } - m_aContentToolBox->SetItemImage(m_aContentToolBox->GetItemId("dragmode"), Image(StockImage::Yes, sImageId)); + m_xContent3ToolBox->set_item_icon_name("dragmode", sImageId); } void SwNavigationPI::ToggleTree() @@ -1030,27 +1004,31 @@ void SwNavigationPI::ToggleTree() SetUpdateMode(false); if (IsZoomedIn()) ZoomOut(); - m_aGlobalBox->Show(); - m_aGlobalTree->ShowTree(); - m_aGlobalToolBox->Show(); - m_aContentBox->Hide(); - m_aContentTree->HideTree(); - m_aContentToolBox->Hide(); - m_aDocListBox->Hide(); + m_xGlobalBox->show(); + m_xGlobalTree->ShowTree(); + m_xGlobalToolBox->show(); + m_xContentBox->hide(); + m_xContentTree->HideTree(); + m_xContent1ToolBox->hide(); + m_xContent2ToolBox->hide(); + m_xContent3ToolBox->hide(); + m_xDocListBox->hide(); SetGlobalMode(true); SetUpdateMode(true); } else { - m_aGlobalBox->Hide(); - m_aGlobalTree->HideTree(); - m_aGlobalToolBox->Hide(); + m_xGlobalBox->hide(); + m_xGlobalTree->HideTree(); + m_xGlobalToolBox->hide(); if (!IsZoomedIn()) { - m_aContentBox->Show(); - m_aContentTree->ShowTree(); - m_aContentToolBox->Show(); - m_aDocListBox->Show(); + m_xContentBox->show(); + m_xContentTree->ShowTree(); + m_xContent1ToolBox->show(); + m_xContent2ToolBox->show(); + m_xContent3ToolBox->show(); + m_xDocListBox->show(); } SetGlobalMode(false); } @@ -1072,9 +1050,8 @@ IMPL_LINK_NOARG(SwNavigationPI, ChangePageHdl, Timer *, void) { if (IsDisposed()) return; - if (EditAction()) - GetPageEdit().GrabFocus(); + m_xEdit->grab_focus(); } IMPL_LINK_NOARG(SwNavigationPI, PageEditModifyHdl, weld::SpinButton&, void) @@ -1117,17 +1094,14 @@ SwNavigationChild::SwNavigationChild( vcl::Window* pParent, const ContentTypeId nRootType = pNaviConfig->GetRootType(); if( nRootType != ContentTypeId::UNKNOWN ) { - pNavi->m_aContentTree->SetRootType(nRootType); - pNavi->m_aContentToolBox->CheckItem(pNavi->m_aContentToolBox->GetItemId("root")); + pNavi->m_xContentTree->SetRootType(nRootType); + pNavi->m_xContent2ToolBox->set_item_active("root", true); if (nRootType == ContentTypeId::OUTLINE) { - pNavi->m_aContentTree->SetSelectionMode(SelectionMode::Multiple); - pNavi->m_aContentTree->SetDragDropMode(DragDropMode::CTRL_MOVE | - DragDropMode::CTRL_COPY | - DragDropMode::ENABLE_TOP); + pNavi->m_xContentTree->set_selection_mode(SelectionMode::Multiple); } } - pNavi->m_aContentTree->SetOutlineLevel( static_cast< sal_uInt8 >( pNaviConfig->GetOutlineLevel() ) ); + pNavi->m_xContentTree->SetOutlineLevel( static_cast< sal_uInt8 >( pNaviConfig->GetOutlineLevel() ) ); pNavi->SetRegionDropMode( pNaviConfig->GetRegionMode() ); if (SfxNavigator* pNav = dynamic_cast<SfxNavigator*>(pParent)) diff --git a/sw/uiconfig/swriter/ui/mastercontextmenu.ui b/sw/uiconfig/swriter/ui/mastercontextmenu.ui new file mode 100644 index 000000000000..2d346ac0d3de --- /dev/null +++ b/sw/uiconfig/swriter/ui/mastercontextmenu.ui @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sw"> + <requires lib="gtk+" version="3.18"/> + <object class="GtkMenu" id="navmenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="update"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="readonlymenu|STR_UPDATE">_Update</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="updatemenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="updatesel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_UPDATE_SEL">Selection</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="updateindex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_UPDATE_INDEX">Indexes</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="updatelinks"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_UPDATE_SEL">Links</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="updateall"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_UPDATE_ALL">All</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkMenuItem" id="editcontent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_EDIT_CONTENT">Edit</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="editlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_EDIT_LINK">Edit link</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="readonlymenu|STR_EDIT_INSERT">Insert</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="insertmenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="insertindex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_INDEX">_Index</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="insertfile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_FILE">File</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="insertnewfile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_NEW_FILE">New Document</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="inserttext"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_INSERT_TEXT">Text</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="deleteentry"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastercontextmenu|STR_DELETE_ENTRY">_Delete</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui b/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui new file mode 100644 index 000000000000..b324c1a26c74 --- /dev/null +++ b/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui @@ -0,0 +1,242 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.2 --> +<interface domain="sw"> + <requires lib="gtk+" version="3.18"/> + <object class="GtkMenu" id="navmenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="800"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_underline">True</property> + <accelerator key="asterisk" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="700"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_SEND_OUTLINE_TO_CLIPBOARD_ENTRY">Send Outline to Clipboard</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="900"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_GOTO">Go to</property> + <property name="use_underline">True</property> + <accelerator key="Return" signal="activate"/> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="805"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_SELECT">Select</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="806"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_DELETE">Delete</property> + <property name="use_underline">True</property> + <accelerator key="Delete" signal="activate"/> + </object> + </child> + <child> + <object class="GtkMenuItem" id="801"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_PROMOTE_CHAPTER">Promote Chapter</property> + <property name="use_underline">True</property> + <accelerator key="Up" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> + <object class="GtkMenuItem" id="802"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_DEMOTE_CHAPTER">Demote Chapter</property> + <property name="use_underline">True</property> + <accelerator key="Down" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> + <object class="GtkMenuItem" id="803"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_PROMOTE_LEVEL">Promote Level</property> + <property name="use_underline">True</property> + <accelerator key="Left" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> + <object class="GtkMenuItem" id="804"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_DEMOTE_LEVEL">Demote Level</property> + <property name="use_underline">True</property> + <accelerator key="Right" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> + <object class="GtkMenuItem" id="401"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_REMOVE_INDEX">_Remove Index</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="402"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_UPDATE">_Update</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="403"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_EDIT_ENTRY">Edit...</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="404"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_REMOVE_TBL_PROTECTION">_Unprotect</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="405"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_READONLY_IDX">Read-_only</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="501"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_DELETE_ENTRY">_Delete</property> + <property name="use_underline">True</property> + <accelerator key="Delete" signal="activate"/> + </object> + </child> + <child> + <object class="GtkMenuItem" id="502"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_RENAME">_Rename...</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="600"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_POSTIT_SHOW">Show All</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="601"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_POSTIT_HIDE">Hide All</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="602"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_POSTIT_DELETE">Delete All</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_OUTLINE_TRACKING">Outline Tracking</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="outlinetracking"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + </object> + </child> + <child> + <object class="GtkMenuItem" id="1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_OUTLINE_LEVEL">Outline Level</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="outlinelevel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + </object> + </child> + <child> + <object class="GtkMenuItem" id="2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_DRAGMODE">Drag Mode</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="dragmodemenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + </object> + </child> + <child> + <object class="GtkMenuItem" id="3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_DISPLAY">Display</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="displaymenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + </object> + </child> + </object> +</interface> diff --git a/sw/uiconfig/swriter/ui/navigatorpanel.ui b/sw/uiconfig/swriter/ui/navigatorpanel.ui index 28c08eb21c38..caac5279152b 100644 --- a/sw/uiconfig/swriter/ui/navigatorpanel.ui +++ b/sw/uiconfig/swriter/ui/navigatorpanel.ui @@ -1,11 +1,231 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.20.0 --> +<!-- Generated with glade 3.22.2 --> <interface domain="sw"> <requires lib="gtk+" version="3.18"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="lower">1</property> + <property name="upper">100000</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkMenu" id="dragmodemenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="hyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|hyperlink">Insert as Hyperlink</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_as_radio">True</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="link"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|link">Insert as Link</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">hyperlink</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="copy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|copy">Insert as Copy</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">hyperlink</property> + </object> + </child> + </object> + <object class="GtkMenu" id="headingsmenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">1</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">2</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">3</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">4</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">5</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">6</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">7</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">8</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">9</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">10</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">1</property> + </object> + </child> + </object> + <object class="GtkMenu" id="insertmenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="insertindex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_INDEX">_Index</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="insertfile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_FILE">File</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="insertnewfile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_NEW_FILE">New Document</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="inserttext"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_INSERT_TEXT">Text</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name expander --> + <column type="GdkPixbuf"/> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + <!-- column-name weight --> + <column type="gint"/> + <!-- column-name sensitive --> + <column type="gboolean"/> + <!-- column-name extraindent --> + <column type="gint"/> + </columns> + </object> + <object class="GtkTreeStore" id="liststore2"> + <columns> + <!-- column-name expander --> + <column type="GdkPixbuf"/> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + <!-- column-name textcolor --> + <column type="GdkRGBA"/> + </columns> + </object> + <object class="GtkListStore" id="liststore4"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + <!-- column-name image --> + <column type="GdkPixbuf"/> + <!-- column-name surface --> + <column type="CairoSurface"/> + </columns> + </object> <object class="GtkGrid" id="NavigatorPanel"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="border_width">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> <child> <object class="GtkGrid"> <property name="visible">True</property> @@ -23,260 +243,314 @@ <property name="row_spacing">6</property> <property name="column_spacing">12</property> <child> - <object class="sfxlo-SidebarToolBox" id="content"> + <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="toolbar_style">icons</property> - <child> - <object class="GtkToolButton" id="contenttoggle"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|contenttoggle|tooltip_text">Toggle Master View</property> - <property name="action_name">toggle</property> - <property name="icon_name">sw/res/sc20244.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id=".uno:NavElement"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:NavElement</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="back"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:ScrollToPrevious</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="forward"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:ScrollToNext</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="listbox"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|listbox|tooltip_text">List Box On/Off</property> - <property name="action_name">listbox</property> - <property name="icon_name">sw/res/sc20233.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="root"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|root|tooltip_text">Content Navigation View</property> - <property name="action_name">root</property> - <property name="icon_name">sw/res/sc20234.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkSeparatorToolItem" id="separator2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="reminder"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|reminder|tooltip_text">Set Reminder</property> - <property name="action_name">reminder</property> - <property name="icon_name">sw/res/sc20183.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkSeparatorToolItem" id="separator3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="header"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|header|tooltip_text">Header</property> - <property name="action_name">header</property> - <property name="icon_name">sw/res/sc20179.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="footer"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|footer|tooltip_text">Footer</property> - <property name="action_name">footer</property> - <property name="icon_name">sw/res/sc20177.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="anchor"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|anchor|tooltip_text">Anchor<->Text</property> - <property name="action_name">anchor</property> - <property name="icon_name">sw/res/sc20182.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkSeparatorToolItem" id="separator4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkMenuToolButton" id="headings"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|headings|tooltip_text">Heading Levels Shown</property> - <property name="action_name">headings</property> - <property name="icon_name">sw/res/sc20236.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkSeparatorToolItem" id="separator5"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="dragmode"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|dragmode|tooltip_text">Drag Mode</property> - <property name="action_name">dragmode</property> - <property name="icon_name">sw/res/sc20235.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkSeparatorToolItem" id="separator6"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> - <child> - <object class="GtkToolButton" id="promote"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|promote|tooltip_text">Promote Level</property> - <property name="action_name">promote</property> - <property name="icon_name">sw/res/sc20172.png</property> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> <child> - <object class="GtkToolButton" id="demote"> + <object class="GtkToolbar" id="content1"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|demote|tooltip_text">Demote Level</property> - <property name="action_name">demote</property> - <property name="icon_name">sw/res/sc20173.png</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToggleToolButton" id="contenttoggle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|contenttoggle|tooltip_text">Toggle Master View</property> + <property name="icon_name">sw/res/sc20244.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id=".uno:NavElement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <child> + <object class="GtkComboBox" id="NavElementWidget"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="model">liststore4</property> + <property name="entry_text_column">0</property> + <property name="id_column">1</property> + <child> + <object class="GtkCellRendererText" id="cellrenderertext3"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererPixbuf" id="cellrenderertext1"/> + <attributes> + <attribute name="pixbuf">2</attribute> + </attributes> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id=".uno:ScrollToPrevious"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id=".uno:ScrollToNext"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="contentedit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <child> + <object class="GtkSpinButton" id="spinbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="adjustment">adjustment1</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> </object> <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> </packing> </child> <child> - <object class="GtkToolButton" id="chapterup"> + <object class="GtkToolbar" id="content2"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|chapterup|tooltip_text">Promote Chapter</property> - <property name="action_name">up</property> - <property name="icon_name">sw/res/sc20174.png</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToggleToolButton" id="root"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|root|tooltip_text">Content Navigation View</property> + <property name="icon_name">sw/res/sc20234.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkSeparatorToolItem" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="header"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|header|tooltip_text">Header</property> + <property name="icon_name">sw/res/sc20179.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="footer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|footer|tooltip_text">Footer</property> + <property name="icon_name">sw/res/sc20177.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="anchor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|anchor|tooltip_text">Anchor<->Text</property> + <property name="icon_name">sw/res/sc20182.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="reminder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|reminder|tooltip_text">Set Reminder</property> + <property name="icon_name">sw/res/sc20183.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkSeparatorToolItem" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="headings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|headings|tooltip_text">Heading Levels Shown</property> + <property name="icon_name">sw/res/sc20236.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="fill">True</property> + <property name="position">1</property> </packing> </child> <child> - <object class="GtkToolButton" id="chapterdown"> + <object class="GtkToolbar" id="content3"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="navigatorpanel|chapterdown|tooltip_text">Demote Chapter</property> - <property name="action_name">down</property> - <property name="icon_name">sw/res/sc20171.png</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToggleToolButton" id="listbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|listbox|tooltip_text">List Box On/Off</property> + <property name="icon_name">sw/res/sc20233.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkSeparatorToolItem" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="promote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|promote|tooltip_text">Promote Level</property> + <property name="icon_name">sw/res/sc20172.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="demote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|demote|tooltip_text">Demote Level</property> + <property name="icon_name">sw/res/sc20173.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="chapterup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|chapterup|tooltip_text">Promote Chapter</property> + <property name="icon_name">sw/res/sc20174.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="chapterdown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|chapterdown|tooltip_text">Demote Chapter</property> + <property name="icon_name">sw/res/sc20171.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkSeparatorToolItem" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="dragmode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="navigatorpanel|dragmode|tooltip_text">Drag Mode</property> + <property name="icon_name">sw/res/sc20235.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="fill">True</property> + <property name="position">2</property> </packing> </child> </object> @@ -292,7 +566,7 @@ </packing> </child> <child> - <object class="GtkComboBox" id="documents"> + <object class="GtkComboBoxText" id="documents"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes" context="navigatorpanel|documents|tooltip_text">Document</property> @@ -315,7 +589,58 @@ <property name="vexpand">True</property> <property name="orientation">vertical</property> <child> - <placeholder/> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="contenttree"> + <property name="width_request">-1</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers_visible">False</property> + <property name="reorderable">True</property> + <property name="search_column">1</property> + <property name="enable_tree_lines">True</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="Macro Library List-selection1"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn2"> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/> + <attributes> + <attribute name="sensitive">4</attribute> + <attribute name="pixbuf">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererText" id="cellrenderertext2"> + <property name="xalign">0</property> + </object> + <attributes> + <attribute name="xpad">5</attribute> + <attribute name="sensitive">4</attribute> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> </child> </object> <packing> @@ -325,20 +650,18 @@ </child> <child> <object class="GtkToolbar" id="global"> - <property name="visible">False</property> <property name="can_focus">False</property> <property name="toolbar_style">icons</property> <child> - <object class="GtkToolButton" id="globaltoggle"> + <object class="GtkToggleToolButton" id="globaltoggle"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes" context="navigatorpanel|globaltoggle|tooltip_text">Toggle Master View</property> - <property name="action_name">toggle</property> <property name="icon_name">sw/res/sc20244.png</property> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> <child> @@ -348,7 +671,7 @@ </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> <child> @@ -356,38 +679,35 @@ <property name="visible">True</property> <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes" context="navigatorpanel|edit|tooltip_text">Edit</property> - <property name="action_name">edit</property> <property name="icon_name">sw/res/sc20245.png</property> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> <child> - <object class="GtkToolButton" id="update"> + <object class="GtkMenuToolButton" id="update"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes" context="navigatorpanel|update|tooltip_text">Update</property> - <property name="action_name">update</property> <property name="icon_name">sw/res/sc20246.png</property> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> <child> - <object class="GtkToolButton" id="insert"> + <object class="GtkMenuToolButton" id="insert"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes" context="navigatorpanel|insert|tooltip_text">Insert</property> - <property name="action_name">insert</property> <property name="icon_name">sw/res/sc20247.png</property> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> <child> @@ -397,20 +717,19 @@ </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> <child> - <object class="GtkToolButton" id="save"> + <object class="GtkToggleToolButton" id="save"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes" context="navigatorpanel|save|tooltip_text">Save Contents as well</property> - <property name="action_name">save</property> <property name="icon_name">sw/res/sc20248.png</property> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> <child> @@ -420,7 +739,7 @@ </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> <child> @@ -428,12 +747,11 @@ <property name="visible">True</property> <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes" context="navigatorpanel|moveup|tooltip_text">Move Up</property> - <property name="action_name">up</property> <property name="icon_name">sw/res/sc20174.png</property> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> <child> @@ -441,12 +759,11 @@ <property name="visible">True</property> <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes" context="navigatorpanel|movedown|tooltip_text">Move Down</property> - <property name="action_name">down</property> <property name="icon_name">sw/res/sc20171.png</property> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="homogeneous">False</property> </packing> </child> </object> @@ -457,13 +774,59 @@ </child> <child> <object class="GtkBox" id="globalbox"> - <property name="visible">False</property> <property name="can_focus">False</property> <property name="hexpand">True</property> <property name="vexpand">True</property> <property name="orientation">vertical</property> <child> - <placeholder/> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="globaltree"> + <property name="width_request">-1</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="has_tooltip">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore2</property> + <property name="headers_visible">False</property> + <property name="reorderable">True</property> + <property name="search_column">1</property> + <child internal-child="selection"> + <object class="GtkTreeSelection"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn1"> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererPixbuf" id="cellrenderertext5"/> + <attributes> + <attribute name="pixbuf">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererText" id="cellrenderertext6"/> + <attributes> + <attribute name="text">1</attribute> + <attribute name="foreground-rgba">3</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> </child> </object> <packing> @@ -478,4 +841,48 @@ </packing> </child> </object> + <object class="GtkSizeGroup" id="sizegroup1"> + <widgets> + <widget name="content1"/> + <widget name="content2"/> + <widget name="content3"/> + <widget name="global"/> + </widgets> + </object> + <object class="GtkMenu" id="updatemenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="updatesel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_UPDATE_SEL">Selection</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="updateindex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_UPDATE_INDEX">Indexes</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="updatelinks"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_UPDATE_SEL">Links</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="updateall"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_UPDATE_ALL">All</property> + <property name="use_underline">True</property> + </object> + </child> + </object> </interface> diff --git a/sw/uiconfig/swriter/ui/spinbox.ui b/sw/uiconfig/swriter/ui/spinbox.ui deleted file mode 100644 index 73a9af9f0e7b..000000000000 --- a/sw/uiconfig/swriter/ui/spinbox.ui +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.22.1 --> -<interface domain="sc"> - <requires lib="gtk+" version="3.18"/> - <object class="GtkAdjustment" id="adjustment1"> - <property name="lower">1</property> - <property name="upper">100000</property> - <property name="value">1</property> - <property name="step_increment">1</property> - <property name="page_increment">10</property> - </object> - <object class="GtkBox" id="SpinBox"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="hexpand">True</property> - <property name="spacing">6</property> - <child> - <object class="GtkSpinButton" id="spin"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> - <property name="adjustment">adjustment1</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - </object> -</interface> diff --git a/uitest/writer_tests5/tdf114724.py b/uitest/writer_tests5/tdf114724.py index 8d67f2a95bff..390e53b3ac37 100644 --- a/uitest/writer_tests5/tdf114724.py +++ b/uitest/writer_tests5/tdf114724.py @@ -22,7 +22,7 @@ class tdf114724(UITestCase): self.xUITest.executeCommand(".uno:Sidebar") xWriterEdit.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "SwNavigatorPanel"})) - xNavigatorPanel = xWriterEdit.getChild("NavigatorPanel") + xNavigatorPanel = xWriterEdit.getChild("NavigatorPanelParent") xNavigatorPanel.executeAction("ROOT", tuple()) xWriterEdit.executeAction("FOCUS", tuple()) |