include/svtools/brwbox.hxx | 4 include/svtools/recorditemwindow.hxx | 23 + include/svx/gridctrl.hxx | 108 +++--- solenv/sanitizers/ui/svx.suppr | 1 svtools/source/brwbox/brwbox1.cxx | 50 +++ svtools/source/brwbox/brwbox2.cxx | 11 svtools/source/brwbox/recorditemwindow.cxx | 42 +- svx/UIConfig_svx.mk | 1 svx/inc/pch/precompiled_svx.hxx | 6 svx/inc/pch/precompiled_svxcore.hxx | 5 svx/source/fmcomp/gridctrl.cxx | 461 +++++++++-------------------- svx/uiconfig/ui/navigationbar.ui | 224 ++++++++++++++ 12 files changed, 539 insertions(+), 397 deletions(-)
New commits: commit 32f0a170c941522d0b7c0594aa4627a84a0d1b38 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Sat Jul 25 12:52:30 2020 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon Jul 27 20:13:41 2020 +0200 weld NavigationBar Change-Id: I5d31d603a9e5f91723a310900aeee875df1599c2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99445 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/include/svtools/brwbox.hxx b/include/svtools/brwbox.hxx index 00b68803515b..63796c752ef8 100644 --- a/include/svtools/brwbox.hxx +++ b/include/svtools/brwbox.hxx @@ -39,7 +39,7 @@ class BrowserColumn; class BrowserHeader; class ScrollBar; -class RecordItemWindow; +class MeasureStatusBar; namespace svt { class BrowseBoxImpl; @@ -275,7 +275,7 @@ private: VclPtr<BrowserDataWin> pDataWin; // window to display data rows VclPtr<ScrollBar> pVScroll; // vertical scrollbar VclPtr<ScrollBar> aHScroll; // horizontal scrollbar - VclPtr<RecordItemWindow> aStatusBarHeight; // statusbar, just to measure its height + VclPtr<MeasureStatusBar> aStatusBarHeight; // statusbar, just to measure its height long nDataRowHeight; // height of a single data-row sal_uInt16 nTitleLines; // number of lines in title row diff --git a/include/svtools/recorditemwindow.hxx b/include/svtools/recorditemwindow.hxx index 576be8766430..06571a7b69ac 100644 --- a/include/svtools/recorditemwindow.hxx +++ b/include/svtools/recorditemwindow.hxx @@ -12,24 +12,24 @@ #include <vcl/InterimItemWindow.hxx> #include <svtools/svtdllapi.h> -class SVT_DLLPUBLIC RecordItemWindow : public InterimItemWindow +class SVT_DLLPUBLIC RecordItemWindowBase { public: - RecordItemWindow(vcl::Window* pParent, bool bHasFrame); - virtual void dispose() override; - virtual ~RecordItemWindow() override; + RecordItemWindowBase(std::unique_ptr<weld::Entry> xEntry); + virtual ~RecordItemWindowBase(); void set_text(const OUString& rText) { m_xWidget->set_text(rText); } void set_font(const vcl::Font& rFont) { m_xWidget->set_font(rFont); } + void set_help_id(const OString& rHelpId) { m_xWidget->set_help_id(rHelpId); } protected: + std::unique_ptr<weld::Entry> m_xWidget; + virtual bool DoKeyInput(const KeyEvent& rEvt); private: virtual void PositionFired(sal_Int64 nRecord); - std::unique_ptr<weld::Entry> m_xWidget; - DECL_LINK(KeyInputHdl, const KeyEvent&, bool); DECL_LINK(ActivatedHdl, weld::Entry&, bool); @@ -39,4 +39,15 @@ private: void FirePosition(bool bForce); }; +class SVT_DLLPUBLIC RecordItemWindow : public InterimItemWindow, public RecordItemWindowBase +{ +public: + RecordItemWindow(vcl::Window* pParent, bool bHasFrame); + virtual void dispose() override; + virtual ~RecordItemWindow() override; + +protected: + virtual bool DoKeyInput(const KeyEvent& rEvt) override; +}; + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/include/svx/gridctrl.hxx b/include/svx/gridctrl.hxx index c07f9ed464f1..dfcf5cb151af 100644 --- a/include/svx/gridctrl.hxx +++ b/include/svx/gridctrl.hxx @@ -39,10 +39,6 @@ namespace com::sun::star::sdb { class XRowsChangeListener; } namespace com::sun::star::uno { class XComponentContext; } namespace com::sun::star::util { class XNumberFormatter; } -class Button; -class ImageButton; -class FixedText; - class CursorWrapper; bool CompareBookmark(const css::uno::Any& aLeft, const css::uno::Any& aRight); @@ -163,67 +159,79 @@ enum class DbGridControlNavigationBarState class FmXGridSourcePropListener; class DisposeListenerGridBridge; -class SVXCORE_DLLPUBLIC DbGridControl : public svt::EditBrowseBox + +// NavigationBar +class NavigationBar final : public InterimItemWindow { - friend class FmXGridSourcePropListener; - friend class GridFieldValueListener; - friend class DisposeListenerGridBridge; + class AbsolutePos final : public RecordItemWindowBase + { + public: + AbsolutePos(std::unique_ptr<weld::Entry> xEntry, NavigationBar* pBar); -public: + virtual bool DoKeyInput(const KeyEvent& rEvt) override; + virtual void PositionFired(sal_Int64 nRecord) override; - // NavigationBar + weld::Entry* GetWidget() { return m_xWidget.get(); } + private: + VclPtr<NavigationBar> m_xParent; + }; - class SAL_DLLPRIVATE NavigationBar final : public Control - { - class AbsolutePos final : public RecordItemWindow - { - public: - AbsolutePos(vcl::Window* pParent); + friend class NavigationBar::AbsolutePos; - virtual bool DoKeyInput(const KeyEvent& rEvt) override; - virtual void PositionFired(sal_Int64 nRecord) override; - }; + // additional controls + std::unique_ptr<weld::Label> m_xRecordText; + std::unique_ptr<AbsolutePos> m_xAbsolute; // absolute positioning + std::unique_ptr<weld::Label> m_xRecordOf; + std::unique_ptr<weld::Label> m_xRecordCount; - friend class NavigationBar::AbsolutePos; + std::unique_ptr<weld::Button> m_xFirstBtn; // Button for 'go to the first record' + std::unique_ptr<weld::Button> m_xPrevBtn; // Button for 'go to the previous record' + std::unique_ptr<weld::Button> m_xNextBtn; // Button for 'go to the next record' + std::unique_ptr<weld::Button> m_xLastBtn; // Button for 'go to the last record' + std::unique_ptr<weld::Button> m_xNewBtn; // Button for 'go to a new record' - // additional controls - VclPtr<FixedText> m_aRecordText; - VclPtr<AbsolutePos> m_aAbsolute; // absolute positioning - VclPtr<FixedText> m_aRecordOf; - VclPtr<FixedText> m_aRecordCount; + AutoTimer m_aNextRepeat; + AutoTimer m_aPrevRepeat; - VclPtr<ImageButton> m_aFirstBtn; // ImageButton for 'go to the first record' - VclPtr<ImageButton> m_aPrevBtn; // ImageButton for 'go to the previous record' - VclPtr<ImageButton> m_aNextBtn; // ImageButton for 'go to the next record' - VclPtr<ImageButton> m_aLastBtn; // ImageButton for 'go to the last record' - VclPtr<ImageButton> m_aNewBtn; // ImageButton for 'go to a new record' - sal_Int32 m_nCurrentPos; + sal_Int32 m_nCurrentPos; - bool m_bPositioning; // protect PositionDataSource against recursion + bool m_bPositioning; // protect PositionDataSource against recursion - public: - NavigationBar(vcl::Window* pParent); - virtual ~NavigationBar() override; - virtual void dispose() override; +public: + NavigationBar(vcl::Window* pParent); + virtual ~NavigationBar() override; + virtual void dispose() override; - // Status methods for Controls - void InvalidateAll(sal_Int32 nCurrentPos, bool bAll = false); - void InvalidateState(DbGridControlNavigationBarState nWhich) {SetState(nWhich);} - void SetState(DbGridControlNavigationBarState nWhich); - bool GetState(DbGridControlNavigationBarState nWhich) const; - sal_uInt16 ArrangeControls(); + // Status methods for Controls + void InvalidateAll(sal_Int32 nCurrentPos, bool bAll = false); + void InvalidateState(DbGridControlNavigationBarState nWhich) {SetState(nWhich);} + void SetState(DbGridControlNavigationBarState nWhich); + bool GetState(DbGridControlNavigationBarState nWhich) const; + sal_uInt16 ArrangeControls(); - private: - virtual void Resize() override; - virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override; - virtual void StateChanged( StateChangedType nType ) override; +private: - DECL_LINK(OnClick, Button*, void); + DECL_LINK(OnClick, weld::Button&, void); - void PositionDataSource(sal_Int32 nRecord); - }; + DECL_LINK(PrevMousePressHdl, const MouseEvent&, bool); + DECL_LINK(PrevMouseReleaseHdl, const MouseEvent&, bool); + DECL_LINK(NextMousePressHdl, const MouseEvent&, bool); + DECL_LINK(NextMouseReleaseHdl, const MouseEvent&, bool); + DECL_LINK(PrevRepeatTimerHdl, Timer*, void); + DECL_LINK(NextRepeatTimerHdl, Timer*, void); + + void PositionDataSource(sal_Int32 nRecord); +}; + +class SVXCORE_DLLPUBLIC DbGridControl : public svt::EditBrowseBox +{ + friend class FmXGridSourcePropListener; + friend class GridFieldValueListener; + friend class DisposeListenerGridBridge; + +public: - friend class DbGridControl::NavigationBar; + friend class NavigationBar; private: Link<DbGridControlNavigationBarState,int> m_aMasterStateProvider; diff --git a/solenv/sanitizers/ui/svx.suppr b/solenv/sanitizers/ui/svx.suppr index 5a9d0f52fde2..7f01613fa71a 100644 --- a/solenv/sanitizers/ui/svx.suppr +++ b/solenv/sanitizers/ui/svx.suppr @@ -69,6 +69,7 @@ svx/uiconfig/ui/mediawindow.ui://GtkLabel[@id='url'] orphan-label svx/uiconfig/ui/mediawindow.ui://GtkScale[@id='timeslider'] no-labelled-by svx/uiconfig/ui/mediawindow.ui://GtkScale[@id='volumeslider'] no-labelled-by svx/uiconfig/ui/metricfieldbox.ui://GtkSpinButton[@id='metricfield'] no-labelled-by +svx/uiconfig/ui/navigationbar.ui://GtkEntry[@id='entry-noframe'] no-labelled-by svx/uiconfig/ui/numberingwindow.ui://GtkButton[@id='more'] button-no-label svx/uiconfig/ui/optgridpage.ui://GtkLabel[@id='label4'] orphan-label svx/uiconfig/ui/optgridpage.ui://GtkLabel[@id='label5'] orphan-label diff --git a/svtools/source/brwbox/brwbox1.cxx b/svtools/source/brwbox/brwbox1.cxx index eb185380af8a..943e888385e8 100644 --- a/svtools/source/brwbox/brwbox1.cxx +++ b/svtools/source/brwbox/brwbox1.cxx @@ -27,6 +27,7 @@ #include <tools/fract.hxx> #include <sal/log.hxx> #include <vcl/scrbar.hxx> +#include <vcl/svapp.hxx> #include <algorithm> #include <com/sun/star/accessibility/AccessibleTableModelChange.hpp> @@ -105,12 +106,59 @@ void BrowseBox::ConstructImpl( BrowserMode nMode ) ( bHasFocus ? 0 : 1 ) + ( GetUpdateMode() ? 0 : 1 ); } +// we're just measuring the "real" NavigationBar +class MeasureStatusBar final : public InterimItemWindow +{ +private: + std::unique_ptr<weld::Label> m_xRecordText; + std::unique_ptr<weld::Entry> m_xAbsolute; + std::unique_ptr<weld::Label> m_xRecordOf; + std::unique_ptr<weld::Label> m_xRecordCount; +public: + MeasureStatusBar(vcl::Window *pParent) + : InterimItemWindow(pParent, "svx/ui/navigationbar.ui", "NavigationBar") + , m_xRecordText(m_xBuilder->weld_label("recordtext")) + , m_xAbsolute(m_xBuilder->weld_entry("entry-noframe")) + , m_xRecordOf(m_xBuilder->weld_label("recordof")) + , m_xRecordCount(m_xBuilder->weld_label("recordcount")) + { + vcl::Font aApplFont(Application::GetSettings().GetStyleSettings().GetToolFont()); + m_xAbsolute->set_font(aApplFont); + m_xRecordText->set_font(aApplFont); + m_xRecordOf->set_font(aApplFont); + m_xRecordCount->set_font(aApplFont); + + SetSizePixel(get_preferred_size()); + } + + virtual void dispose() override + { + m_xRecordCount.reset(); + m_xRecordOf.reset(); + m_xAbsolute.reset(); + m_xRecordText.reset(); + InterimItemWindow::dispose(); + } +}; + +long BrowseBox::GetBarHeight() const +{ + // tdf#115941 because some platforms have things like overlay scrollbars, take a max + // of a statusbar height and a scrollbar height as the control area height + + // (we can't ask the scrollbars for their size cause if we're zoomed they still have to be + // resized - which is done in UpdateScrollbars) + + return std::max(aStatusBarHeight->GetSizePixel().Height(), GetSettings().GetStyleSettings().GetScrollBarSize()); +} + BrowseBox::BrowseBox( vcl::Window* pParent, WinBits nBits, BrowserMode nMode ) :Control( pParent, nBits | WB_3DLOOK ) ,DragSourceHelper( this ) ,DropTargetHelper( this ) ,aHScroll( VclPtr<ScrollBar>::Create(this, WB_HSCROLL) ) - ,aStatusBarHeight(VclPtr<RecordItemWindow>::Create(this, false)) + // see NavigationBar ctor, here we just want to know its height + ,aStatusBarHeight(VclPtr<MeasureStatusBar>::Create(this)) { ConstructImpl( nMode ); } diff --git a/svtools/source/brwbox/brwbox2.cxx b/svtools/source/brwbox/brwbox2.cxx index 5abdf5e34099..298a61a31c80 100644 --- a/svtools/source/brwbox/brwbox2.cxx +++ b/svtools/source/brwbox/brwbox2.cxx @@ -1029,17 +1029,6 @@ void BrowseBox::PaintData( vcl::Window const & rWin, vcl::RenderContext& rRender ImplPaintData(rRenderContext, rRect, false); } -long BrowseBox::GetBarHeight() const -{ - // tdf#115941 because some platforms have things like overlay scrollbars, take a max - // of a statusbar height and a scrollbar height as the control area height - - // (we can't ask the scrollbars for their size cause if we're zoomed they still have to be - // resized - which is done in UpdateScrollbars) - - return std::max(aStatusBarHeight->GetSizePixel().Height(), GetSettings().GetStyleSettings().GetScrollBarSize()); -} - void BrowseBox::UpdateScrollbars() { diff --git a/svtools/source/brwbox/recorditemwindow.cxx b/svtools/source/brwbox/recorditemwindow.cxx index a993044cb6de..6898f9febbd7 100644 --- a/svtools/source/brwbox/recorditemwindow.cxx +++ b/svtools/source/brwbox/recorditemwindow.cxx @@ -20,18 +20,24 @@ #include <svtools/recorditemwindow.hxx> #include <vcl/event.hxx> +RecordItemWindowBase::RecordItemWindowBase(std::unique_ptr<weld::Entry> xEntry) + : m_xWidget(std::move(xEntry)) +{ + m_xWidget->connect_key_press(LINK(this, RecordItemWindowBase, KeyInputHdl)); + m_xWidget->connect_activate(LINK(this, RecordItemWindowBase, ActivatedHdl)); + m_xWidget->connect_focus_out(LINK(this, RecordItemWindowBase, FocusOutHdl)); + + m_xWidget->show(); +} + +RecordItemWindowBase::~RecordItemWindowBase() {} + RecordItemWindow::RecordItemWindow(vcl::Window* pParent, bool bHasFrame) : InterimItemWindow(pParent, "svx/ui/absrecbox.ui", "AbsRecBox") - , m_xWidget(m_xBuilder->weld_entry(bHasFrame ? "entry-frame" : "entry-noframe")) + , RecordItemWindowBase(m_xBuilder->weld_entry(bHasFrame ? "entry-frame" : "entry-noframe")) { InitControlBase(m_xWidget.get()); - m_xWidget->connect_key_press(LINK(this, RecordItemWindow, KeyInputHdl)); - m_xWidget->connect_activate(LINK(this, RecordItemWindow, ActivatedHdl)); - m_xWidget->connect_focus_out(LINK(this, RecordItemWindow, FocusOutHdl)); - - m_xWidget->show(); - auto aPrefSize(m_xWidget->get_preferred_size()); m_xWidget->set_width_chars(1); // so a smaller than default width can be used later @@ -47,7 +53,7 @@ void RecordItemWindow::dispose() RecordItemWindow::~RecordItemWindow() { disposeOnce(); } -void RecordItemWindow::FirePosition(bool _bForce) +void RecordItemWindowBase::FirePosition(bool _bForce) { if (!_bForce && !m_xWidget->get_value_changed_from_saved()) return; @@ -61,9 +67,9 @@ void RecordItemWindow::FirePosition(bool _bForce) m_xWidget->save_value(); } -IMPL_LINK_NOARG(RecordItemWindow, FocusOutHdl, weld::Widget&, void) { FirePosition(false); } +IMPL_LINK_NOARG(RecordItemWindowBase, FocusOutHdl, weld::Widget&, void) { FirePosition(false); } -bool RecordItemWindow::DoKeyInput(const KeyEvent& rKEvt) +bool RecordItemWindowBase::DoKeyInput(const KeyEvent& rKEvt) { vcl::KeyCode aCode = rKEvt.GetKeyCode(); bool bUp = (aCode.GetCode() == KEY_UP); @@ -82,14 +88,22 @@ bool RecordItemWindow::DoKeyInput(const KeyEvent& rKEvt) return true; } - return ChildKeyInput(rKEvt); + return false; +} + +bool RecordItemWindow::DoKeyInput(const KeyEvent& rKEvt) +{ + return RecordItemWindowBase::DoKeyInput(rKEvt) || ChildKeyInput(rKEvt); } -void RecordItemWindow::PositionFired(sal_Int64 /*nRecord*/) {} +void RecordItemWindowBase::PositionFired(sal_Int64 /*nRecord*/) {} -IMPL_LINK(RecordItemWindow, KeyInputHdl, const KeyEvent&, rKEvt, bool) { return DoKeyInput(rKEvt); } +IMPL_LINK(RecordItemWindowBase, KeyInputHdl, const KeyEvent&, rKEvt, bool) +{ + return DoKeyInput(rKEvt); +} -IMPL_LINK_NOARG(RecordItemWindow, ActivatedHdl, weld::Entry&, bool) +IMPL_LINK_NOARG(RecordItemWindowBase, ActivatedHdl, weld::Entry&, bool) { if (!m_xWidget->get_text().isEmpty()) FirePosition(true); diff --git a/svx/UIConfig_svx.mk b/svx/UIConfig_svx.mk index 4180c18ff114..098a7d3dd577 100644 --- a/svx/UIConfig_svx.mk +++ b/svx/UIConfig_svx.mk @@ -94,6 +94,7 @@ $(eval $(call gb_UIConfig_add_uifiles,svx,\ svx/uiconfig/ui/mediawindow \ svx/uiconfig/ui/metricfieldbox \ svx/uiconfig/ui/namespacedialog \ + svx/uiconfig/ui/navigationbar \ svx/uiconfig/ui/numberingwindow \ svx/uiconfig/ui/optgridpage \ svx/uiconfig/ui/paralinespacingcontrol \ diff --git a/svx/inc/pch/precompiled_svx.hxx b/svx/inc/pch/precompiled_svx.hxx index 0c96cace089e..e1f9ecaf7053 100644 --- a/svx/inc/pch/precompiled_svx.hxx +++ b/svx/inc/pch/precompiled_svx.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-07-09 17:06:53 using: + Generated on 2020-07-25 14:55:56 using: ./bin/update_pch svx svx --cutoff=3 --exclude:system --exclude:module --include:local If after updating build fails, use the following command to locate conflicting headers: @@ -99,6 +99,7 @@ #include <vcl/metric.hxx> #include <vcl/outdev.hxx> #include <vcl/ptrstyle.hxx> +#include <vcl/salctype.hxx> #include <vcl/settings.hxx> #include <vcl/status.hxx> #include <vcl/svapp.hxx> @@ -109,6 +110,7 @@ #include <vcl/vclptr.hxx> #include <vcl/virdev.hxx> #include <vcl/weld.hxx> +#include <vcl/weldutils.hxx> #include <vcl/window.hxx> #endif // PCH_LEVEL >= 2 #if PCH_LEVEL >= 3 @@ -138,7 +140,6 @@ #include <com/sun/star/awt/Rectangle.hpp> #include <com/sun/star/awt/XControl.hpp> #include <com/sun/star/awt/XControlContainer.hpp> -#include <com/sun/star/awt/XWindow.hpp> #include <com/sun/star/beans/NamedValue.hpp> #include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/beans/XPropertyChangeListener.hpp> @@ -361,7 +362,6 @@ #include <uno/sequence2.h> #include <unotools/accessiblerelationsethelper.hxx> #include <unotools/accessiblestatesethelper.hxx> -#include <unotools/configitem.hxx> #include <unotools/fontcvt.hxx> #include <unotools/localedatawrapper.hxx> #include <unotools/options.hxx> diff --git a/svx/inc/pch/precompiled_svxcore.hxx b/svx/inc/pch/precompiled_svxcore.hxx index af5edfcd45de..0f5d6f8f4137 100644 --- a/svx/inc/pch/precompiled_svxcore.hxx +++ b/svx/inc/pch/precompiled_svxcore.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-07-21 21:30:38 using: + Generated on 2020-07-25 14:55:53 using: ./bin/update_pch svx svxcore --cutoff=7 --exclude:system --include:module --exclude:local If after updating build fails, use the following command to locate conflicting headers: @@ -65,6 +65,7 @@ #include <osl/getglobalmutex.hxx> #include <osl/interlck.h> #include <osl/mutex.hxx> +#include <osl/thread.h> #include <osl/time.h> #include <rtl/alloc.h> #include <rtl/character.hxx> @@ -111,7 +112,6 @@ #include <vcl/ctrl.hxx> #include <vcl/customweld.hxx> #include <vcl/dllapi.h> -#include <vcl/dndhelp.hxx> #include <vcl/dockwin.hxx> #include <vcl/errcode.hxx> #include <vcl/event.hxx> @@ -137,7 +137,6 @@ #include <vcl/svapp.hxx> #include <vcl/syswin.hxx> #include <vcl/task.hxx> -#include <vcl/textfilter.hxx> #include <vcl/timer.hxx> #include <vcl/transfer.hxx> #include <vcl/vclenum.hxx> diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx index 820df8eb75e9..af1717231fa8 100644 --- a/svx/source/fmcomp/gridctrl.cxx +++ b/svx/source/fmcomp/gridctrl.cxx @@ -45,8 +45,6 @@ #include <tools/debug.hxx> #include <tools/fract.hxx> #include <vcl/builder.hxx> -#include <vcl/button.hxx> -#include <vcl/fixed.hxx> #include <vcl/menu.hxx> #include <vcl/settings.hxx> #include <vcl/commandevent.hxx> @@ -274,29 +272,31 @@ void FmXGridSourcePropListener::_propertyChanged(const PropertyChangeEvent& evt) m_pParent->DataSourcePropertyChanged(evt); } -DbGridControl::NavigationBar::AbsolutePos::AbsolutePos(vcl::Window* pParent) - : RecordItemWindow(pParent, false) +const int nReserveNumDigits = 7; + +NavigationBar::AbsolutePos::AbsolutePos(std::unique_ptr<weld::Entry> xEntry, NavigationBar* pBar) + : RecordItemWindowBase(std::move(xEntry)) + , m_xParent(pBar) { } -bool DbGridControl::NavigationBar::AbsolutePos::DoKeyInput(const KeyEvent& rEvt) +bool NavigationBar::AbsolutePos::DoKeyInput(const KeyEvent& rEvt) { if (rEvt.GetKeyCode() == KEY_TAB) { - GetParent()->GetParent()->GrabFocus(); + m_xParent->GetParent()->GrabFocus(); return true; } - return RecordItemWindow::DoKeyInput(rEvt); + return RecordItemWindowBase::DoKeyInput(rEvt); } -void DbGridControl::NavigationBar::AbsolutePos::PositionFired(sal_Int64 nRecord) +void NavigationBar::AbsolutePos::PositionFired(sal_Int64 nRecord) { - NavigationBar* pBar = static_cast<NavigationBar*>(GetParent()); - pBar->PositionDataSource(nRecord); - pBar->InvalidateState(DbGridControlNavigationBarState::Absolute); + m_xParent->PositionDataSource(nRecord); + m_xParent->InvalidateState(DbGridControlNavigationBarState::Absolute); } -void DbGridControl::NavigationBar::PositionDataSource(sal_Int32 nRecord) +void NavigationBar::PositionDataSource(sal_Int32 nRecord) { if (m_bPositioning) return; @@ -307,236 +307,145 @@ void DbGridControl::NavigationBar::PositionDataSource(sal_Int32 nRecord) m_bPositioning = false; } -DbGridControl::NavigationBar::NavigationBar(vcl::Window* pParent) - :Control(pParent, 0) - ,m_aRecordText(VclPtr<FixedText>::Create(this, WB_VCENTER)) - ,m_aAbsolute(VclPtr<DbGridControl::NavigationBar::AbsolutePos>::Create(this)) - ,m_aRecordOf(VclPtr<FixedText>::Create(this, WB_VCENTER)) - ,m_aRecordCount(VclPtr<FixedText>::Create(this, WB_VCENTER)) - ,m_aFirstBtn(VclPtr<ImageButton>::Create(this, WB_RECTSTYLE|WB_NOPOINTERFOCUS)) - ,m_aPrevBtn(VclPtr<ImageButton>::Create(this, WB_REPEAT|WB_RECTSTYLE|WB_NOPOINTERFOCUS)) - ,m_aNextBtn(VclPtr<ImageButton>::Create(this, WB_REPEAT|WB_RECTSTYLE|WB_NOPOINTERFOCUS)) - ,m_aLastBtn(VclPtr<ImageButton>::Create(this, WB_RECTSTYLE|WB_NOPOINTERFOCUS)) - ,m_aNewBtn(VclPtr<ImageButton>::Create(this, WB_RECTSTYLE|WB_NOPOINTERFOCUS)) - ,m_nCurrentPos(-1) - ,m_bPositioning(false) -{ - m_aFirstBtn->SetSymbol(SymbolType::FIRST); - m_aPrevBtn->SetSymbol(SymbolType::PREV); - m_aNextBtn->SetSymbol(SymbolType::NEXT); - m_aLastBtn->SetSymbol(SymbolType::LAST); - m_aNewBtn->SetModeImage(static_cast<DbGridControl*>(pParent)->GetImage(EditBrowseBox::NEW)); - - m_aFirstBtn->SetHelpId(HID_GRID_TRAVEL_FIRST); - m_aPrevBtn->SetHelpId(HID_GRID_TRAVEL_PREV); - m_aNextBtn->SetHelpId(HID_GRID_TRAVEL_NEXT); - m_aLastBtn->SetHelpId(HID_GRID_TRAVEL_LAST); - m_aNewBtn->SetHelpId(HID_GRID_TRAVEL_NEW); - m_aAbsolute->SetHelpId(HID_GRID_TRAVEL_ABSOLUTE); - m_aRecordCount->SetHelpId(HID_GRID_NUMBEROFRECORDS); +NavigationBar::NavigationBar(vcl::Window* pParent) + : InterimItemWindow(pParent, "svx/ui/navigationbar.ui", "NavigationBar") + , m_xRecordText(m_xBuilder->weld_label("recordtext")) + , m_xAbsolute(new NavigationBar::AbsolutePos(m_xBuilder->weld_entry("entry-noframe"), this)) + , m_xRecordOf(m_xBuilder->weld_label("recordof")) + , m_xRecordCount(m_xBuilder->weld_label("recordcount")) + , m_xFirstBtn(m_xBuilder->weld_button("first")) + , m_xPrevBtn(m_xBuilder->weld_button("prev")) + , m_xNextBtn(m_xBuilder->weld_button("next")) + , m_xLastBtn(m_xBuilder->weld_button("last")) + , m_xNewBtn(m_xBuilder->weld_button("new")) + , m_nCurrentPos(-1) + , m_bPositioning(false) +{ + vcl::Font aApplFont(Application::GetSettings().GetStyleSettings().GetToolFont()); + m_xAbsolute->set_font(aApplFont); + aApplFont.SetTransparent(true); + m_xRecordText->set_font(aApplFont); + m_xRecordOf->set_font(aApplFont); + m_xRecordCount->set_font(aApplFont); + + m_xFirstBtn->set_help_id(HID_GRID_TRAVEL_FIRST); + m_xPrevBtn->set_help_id(HID_GRID_TRAVEL_PREV); + m_xNextBtn->set_help_id(HID_GRID_TRAVEL_NEXT); + m_xLastBtn->set_help_id(HID_GRID_TRAVEL_LAST); + m_xNewBtn->set_help_id(HID_GRID_TRAVEL_NEW); + m_xAbsolute->set_help_id(HID_GRID_TRAVEL_ABSOLUTE); + m_xRecordCount->set_help_id(HID_GRID_NUMBEROFRECORDS); // set handlers for buttons - m_aFirstBtn->SetClickHdl(LINK(this,NavigationBar,OnClick)); - m_aPrevBtn->SetClickHdl(LINK(this,NavigationBar,OnClick)); - m_aNextBtn->SetClickHdl(LINK(this,NavigationBar,OnClick)); - m_aLastBtn->SetClickHdl(LINK(this,NavigationBar,OnClick)); - m_aNewBtn->SetClickHdl(LINK(this,NavigationBar,OnClick)); - - m_aRecordText->SetText(SvxResId(RID_STR_REC_TEXT)); - m_aRecordOf->SetText(SvxResId(RID_STR_REC_FROM_TEXT)); - m_aRecordCount->SetText(OUString('?')); - - m_aFirstBtn->Disable(); - m_aPrevBtn->Disable(); - m_aNextBtn->Disable(); - m_aLastBtn->Disable(); - m_aNewBtn->Disable(); - m_aRecordText->Disable(); - m_aRecordOf->Disable(); - m_aRecordCount->Disable(); - m_aAbsolute->Disable(); - - m_aFirstBtn->Show(); - m_aPrevBtn->Show(); - m_aNextBtn->Show(); - m_aLastBtn->Show(); - m_aNewBtn->Show(); - m_aRecordText->Show(); - m_aRecordOf->Show(); - m_aRecordCount->Show(); - m_aAbsolute->Show(); -} - -DbGridControl::NavigationBar::~NavigationBar() + m_xFirstBtn->connect_clicked(LINK(this,NavigationBar,OnClick)); + m_xLastBtn->connect_clicked(LINK(this,NavigationBar,OnClick)); + m_xNewBtn->connect_clicked(LINK(this,NavigationBar,OnClick)); + + // instead of connect_clicked because we want a a button held down to + // repeat the next/prev + m_xPrevBtn->connect_mouse_press(LINK(this, NavigationBar, PrevMousePressHdl)); + m_xNextBtn->connect_mouse_press(LINK(this, NavigationBar, NextMousePressHdl)); + m_xPrevBtn->connect_mouse_release(LINK(this, NavigationBar, PrevMouseReleaseHdl)); + m_xNextBtn->connect_mouse_release(LINK(this, NavigationBar, NextMouseReleaseHdl)); + + auto nRepeatTime = Application::GetSettings().GetMouseSettings().GetButtonRepeat(); + m_aNextRepeat.SetTimeout(nRepeatTime); + m_aNextRepeat.SetInvokeHandler(LINK(this, NavigationBar, NextRepeatTimerHdl)); + m_aPrevRepeat.SetTimeout(nRepeatTime); + m_aPrevRepeat.SetInvokeHandler(LINK(this, NavigationBar, PrevRepeatTimerHdl)); + + m_xRecordText->set_label(SvxResId(RID_STR_REC_TEXT)); + m_xRecordOf->set_label(SvxResId(RID_STR_REC_FROM_TEXT)); + m_xRecordCount->set_label(OUString('?')); + + auto nReserveWidth = m_xRecordCount->get_approximate_digit_width() * nReserveNumDigits; + m_xAbsolute->GetWidget()->set_size_request(nReserveWidth, -1); + m_xRecordCount->set_size_request(nReserveWidth, -1); +} + +NavigationBar::~NavigationBar() { disposeOnce(); } -void DbGridControl::NavigationBar::dispose() +void NavigationBar::dispose() { - m_aRecordText.disposeAndClear(); - m_aAbsolute.disposeAndClear(); - m_aRecordOf.disposeAndClear(); - m_aRecordCount.disposeAndClear(); - m_aFirstBtn.disposeAndClear(); - m_aPrevBtn.disposeAndClear(); - m_aNextBtn.disposeAndClear(); - m_aLastBtn.disposeAndClear(); - m_aNewBtn.disposeAndClear(); - Control::dispose(); + m_xRecordText.reset(); + m_xAbsolute.reset(); + m_xRecordOf.reset(); + m_xRecordCount.reset(); + m_xFirstBtn.reset(); + m_xPrevBtn.reset(); + m_xNextBtn.reset(); + m_xLastBtn.reset(); + m_xNewBtn.reset(); + InterimItemWindow::dispose(); } -namespace +sal_uInt16 NavigationBar::ArrangeControls() { - void SetPosAndSize(Button& _rButton,Point& _rPos,const Size& _rSize) - { - _rButton.SetPosPixel( _rPos ); - _rButton.SetSizePixel( _rSize ); - _rPos.AdjustX(static_cast<sal_uInt16>(_rSize.Width()) ); - } + return m_xContainer->get_preferred_size().Width(); } -sal_uInt16 DbGridControl::NavigationBar::ArrangeControls() +IMPL_LINK_NOARG(NavigationBar, PrevRepeatTimerHdl, Timer*, void) { - // positioning of the controls - // calculate base size - tools::Rectangle aRect(static_cast<DbGridControl*>(GetParent())->GetControlArea()); - long nH = aRect.GetSize().Height(); - - long nW = GetParent()->GetOutputSizePixel().Width(); - Size aBorder = LogicToPixel(Size(2, 2), MapMode(MapUnit::MapAppFont)); - aBorder = Size(CalcZoom(aBorder.Width()), CalcZoom(aBorder.Height())); - sal_uInt16 nX = 1; - sal_uInt16 nY = 0; - - { - vcl::Font aApplFont(GetSettings().GetStyleSettings().GetToolFont()); - m_aAbsolute->set_font(aApplFont); - aApplFont.SetTransparent( true ); - m_aRecordText->SetControlFont( aApplFont ); - m_aRecordOf->SetControlFont( aApplFont ); - m_aRecordCount->SetControlFont( aApplFont ); - } - - // set size and position of the control - OUString aText = m_aRecordText->GetText(); - long nTextWidth = m_aRecordText->GetTextWidth(aText); - m_aRecordText->SetPosPixel(Point(nX,nY)); - m_aRecordText->SetSizePixel(Size(nTextWidth,nH)); - nX = sal::static_int_cast< sal_uInt16 >(nX + nTextWidth + aBorder.Width()); - - // count an extra hairspace (U+200A) left and right - const OUString sevenDigits(OUString::number(6000000)); - const OUString hairSpace(u'\x200A'); - OUString textPattern = hairSpace + sevenDigits + hairSpace; - nTextWidth = m_aAbsolute->GetTextWidth(textPattern); - m_aAbsolute->SetPosPixel(Point(nX,nY)); - m_aAbsolute->SetSizePixel(Size(nTextWidth, nH)); - nX = sal::static_int_cast< sal_uInt16 >(nX + nTextWidth + aBorder.Width()); - - aText = m_aRecordOf->GetText(); - nTextWidth = m_aRecordOf->GetTextWidth(aText); - m_aRecordOf->SetPosPixel(Point(nX,nY)); - m_aRecordOf->SetSizePixel(Size(nTextWidth,nH)); - nX = sal::static_int_cast< sal_uInt16 >(nX + nTextWidth + aBorder.Width()); - - textPattern = sevenDigits + " * (" + sevenDigits + ")"; - nTextWidth = m_aRecordCount->GetTextWidth(textPattern); - m_aRecordCount->SetPosPixel(Point(nX,nY)); - m_aRecordCount->SetSizePixel(Size(nTextWidth,nH)); - nX = sal::static_int_cast< sal_uInt16 >(nX + nTextWidth + aBorder.Width()); - - Point aButtonPos(nX,nY); - const Size aButtonSize(nH,nH); - SetPosAndSize(*m_aFirstBtn, aButtonPos, aButtonSize); - SetPosAndSize(*m_aPrevBtn, aButtonPos, aButtonSize); - SetPosAndSize(*m_aNextBtn, aButtonPos, aButtonSize); - SetPosAndSize(*m_aLastBtn, aButtonPos, aButtonSize); - SetPosAndSize(*m_aNewBtn, aButtonPos, aButtonSize); - - nX = sal::static_int_cast< sal_uInt16 >(aButtonPos.X() + 1); - - nW = std::max(nW - GetSettings().GetStyleSettings().GetScrollBarSize(), 0L); - - if (nX > nW) - { - aButtonPos.setX( nW-nH ); - m_aNewBtn->SetPosPixel(aButtonPos); - aButtonPos.AdjustX( -nH ); - m_aLastBtn->SetPosPixel(aButtonPos); - aButtonPos.AdjustX( -nH ); - m_aNextBtn->SetPosPixel(aButtonPos); - aButtonPos.AdjustX( -nH ); - m_aPrevBtn->SetPosPixel(aButtonPos); - aButtonPos.AdjustX( -nH ); - m_aFirstBtn->SetPosPixel(aButtonPos); - - auto nDiff = nX - nW; - - Size aSize = m_aAbsolute->GetSizePixel(); - aSize.AdjustWidth( -(nDiff/3.0) ); - m_aAbsolute->SetSizePixel(aSize); - - aSize = m_aRecordCount->GetSizePixel(); - aSize.AdjustWidth( -(nDiff/3.0*2) ); - m_aRecordCount->SetSizePixel(aSize); - - Point aPos = m_aRecordOf->GetPosPixel(); - aPos.AdjustX( -(nDiff/3.0) ); - m_aRecordOf->SetPosPixel(aPos); - - aPos = m_aRecordCount->GetPosPixel(); - aPos.AdjustX( -(nDiff/3.0) ); - m_aRecordCount->SetPosPixel(aPos); - - vcl::Window* pWindows[] = - { - m_aRecordText.get(), - m_aAbsolute.get(), - m_aRecordOf.get(), - m_aRecordCount.get(), - m_aFirstBtn.get(), - m_aPrevBtn.get(), - m_aNextBtn.get(), - m_aLastBtn.get(), - m_aNewBtn.get() - }; - - for (vcl::Window* pWindow : pWindows) - { - if (pWindow->GetPosPixel().X() < 0) - pWindow->SetSizePixel(Size(0, nH)); - aSize = pWindow->GetSizePixel(); - auto nExcess = (pWindow->GetPosPixel().X() + aSize.Width()) - nW; - if (nExcess > 0) - { - aSize.AdjustWidth( -nExcess ); - pWindow->SetSizePixel(aSize); - } - } + OnClick(*m_xPrevBtn); +} - nX = nW; +IMPL_LINK_NOARG(NavigationBar, NextRepeatTimerHdl, Timer*, void) +{ + OnClick(*m_xNextBtn); +} + +IMPL_LINK_NOARG(NavigationBar, PrevMousePressHdl, const MouseEvent&, bool) +{ + if (!m_xPrevBtn->get_sensitive()) + return false; + PrevRepeatTimerHdl(nullptr); + if (!m_xPrevBtn->get_sensitive()) + return false; + m_aPrevRepeat.Start(); + return false; +} + +IMPL_LINK_NOARG(NavigationBar, PrevMouseReleaseHdl, const MouseEvent&, bool) +{ + m_aPrevRepeat.Stop(); + return false; +} + +IMPL_LINK_NOARG(NavigationBar, NextMousePressHdl, const MouseEvent&, bool) +{ + if (m_xNextBtn->get_sensitive()) + { + NextRepeatTimerHdl(nullptr); + m_aNextRepeat.Start(); } + return false; +} - return nX; +IMPL_LINK_NOARG(NavigationBar, NextMouseReleaseHdl, const MouseEvent&, bool) +{ + m_aNextRepeat.Stop(); + return false; } -IMPL_LINK(DbGridControl::NavigationBar, OnClick, Button *, pButton, void ) +IMPL_LINK(NavigationBar, OnClick, weld::Button&, rButton, void) { DbGridControl* pParent = static_cast<DbGridControl*>(GetParent()); if (pParent->m_aMasterSlotExecutor.IsSet()) { bool lResult = false; - if (pButton == m_aFirstBtn.get()) + if (&rButton == m_xFirstBtn.get()) lResult = pParent->m_aMasterSlotExecutor.Call(DbGridControlNavigationBarState::First); - else if( pButton == m_aPrevBtn.get() ) + else if( &rButton == m_xPrevBtn.get() ) lResult = pParent->m_aMasterSlotExecutor.Call(DbGridControlNavigationBarState::Prev); - else if( pButton == m_aNextBtn.get() ) + else if( &rButton == m_xNextBtn.get() ) lResult = pParent->m_aMasterSlotExecutor.Call(DbGridControlNavigationBarState::Next); - else if( pButton == m_aLastBtn.get() ) + else if( &rButton == m_xLastBtn.get() ) lResult = pParent->m_aMasterSlotExecutor.Call(DbGridControlNavigationBarState::Last); - else if( pButton == m_aNewBtn.get() ) + else if( &rButton == m_xNewBtn.get() ) lResult = pParent->m_aMasterSlotExecutor.Call(DbGridControlNavigationBarState::New); if (lResult) @@ -544,19 +453,19 @@ IMPL_LINK(DbGridControl::NavigationBar, OnClick, Button *, pButton, void ) return; } - if (pButton == m_aFirstBtn.get()) + if (&rButton == m_xFirstBtn.get()) pParent->MoveToFirst(); - else if( pButton == m_aPrevBtn.get() ) + else if( &rButton == m_xPrevBtn.get() ) pParent->MoveToPrev(); - else if( pButton == m_aNextBtn.get() ) + else if( &rButton == m_xNextBtn.get() ) pParent->MoveToNext(); - else if( pButton == m_aLastBtn.get() ) + else if( &rButton == m_xLastBtn.get() ) pParent->MoveToLast(); - else if( pButton == m_aNewBtn.get() ) + else if( &rButton == m_xNewBtn.get() ) pParent->AppendNew(); } -void DbGridControl::NavigationBar::InvalidateAll(sal_Int32 nCurrentPos, bool bAll) +void NavigationBar::InvalidateAll(sal_Int32 nCurrentPos, bool bAll) { if (m_nCurrentPos != nCurrentPos || nCurrentPos < 0 || bAll) { @@ -586,7 +495,7 @@ void DbGridControl::NavigationBar::InvalidateAll(sal_Int32 nCurrentPos, bool bAl } } -bool DbGridControl::NavigationBar::GetState(DbGridControlNavigationBarState nWhich) const +bool NavigationBar::GetState(DbGridControlNavigationBarState nWhich) const { DbGridControl* pParent = static_cast<DbGridControl*>(GetParent()); @@ -641,44 +550,44 @@ bool DbGridControl::NavigationBar::GetState(DbGridControlNavigationBarState nWhi } } -void DbGridControl::NavigationBar::SetState(DbGridControlNavigationBarState nWhich) +void NavigationBar::SetState(DbGridControlNavigationBarState nWhich) { bool bAvailable = GetState(nWhich); DbGridControl* pParent = static_cast<DbGridControl*>(GetParent()); - vcl::Window* pWnd = nullptr; + weld::Widget* pWnd = nullptr; switch (nWhich) { case DbGridControlNavigationBarState::First: - pWnd = m_aFirstBtn.get(); + pWnd = m_xFirstBtn.get(); break; case DbGridControlNavigationBarState::Prev: - pWnd = m_aPrevBtn.get(); + pWnd = m_xPrevBtn.get(); break; case DbGridControlNavigationBarState::Next: - pWnd = m_aNextBtn.get(); + pWnd = m_xNextBtn.get(); break; case DbGridControlNavigationBarState::Last: - pWnd = m_aLastBtn.get(); + pWnd = m_xLastBtn.get(); break; case DbGridControlNavigationBarState::New: - pWnd = m_aNewBtn.get(); + pWnd = m_xNewBtn.get(); break; case DbGridControlNavigationBarState::Absolute: - pWnd = m_aAbsolute.get(); + pWnd = m_xAbsolute->GetWidget(); if (bAvailable) - m_aAbsolute->set_text(OUString::number(m_nCurrentPos + 1)); + m_xAbsolute->set_text(OUString::number(m_nCurrentPos + 1)); else - m_aAbsolute->set_text(OUString()); + m_xAbsolute->set_text(OUString()); break; case DbGridControlNavigationBarState::Text: - pWnd = m_aRecordText.get(); + pWnd = m_xRecordText.get(); break; case DbGridControlNavigationBarState::Of: - pWnd = m_aRecordOf.get(); + pWnd = m_xRecordOf.get(); break; case DbGridControlNavigationBarState::Count: { - pWnd = m_aRecordCount.get(); + pWnd = m_xRecordCount.get(); OUString aText; if (bAvailable) { @@ -702,92 +611,30 @@ void DbGridControl::NavigationBar::SetState(DbGridControlNavigationBarState nWhi { OUString aExtendedInfo = aText + " (" + OUString::number(pParent->GetSelectRowCount()) + ")"; - pWnd->SetText(aExtendedInfo); + m_xRecordCount->set_label(aExtendedInfo); } else - pWnd->SetText(aText); + m_xRecordCount->set_label(aText); pParent->SetRealRowCount(aText); } break; default: break; } DBG_ASSERT(pWnd, "no window"); - if (pWnd && (pWnd->IsEnabled() != bAvailable)) + if (pWnd && (pWnd->get_sensitive() != bAvailable)) + { // this "pWnd->IsEnabled() != bAvailable" is a little hack : Window::Enable always generates a user // event (ImplGenerateMouseMove) even if nothing happened. This may lead to some unwanted effects, so we // do this check. // For further explanation see Bug 69900. - pWnd->Enable(bAvailable); -} - -void DbGridControl::NavigationBar::Resize() -{ - Control::Resize(); - ArrangeControls(); -} - -void DbGridControl::NavigationBar::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) -{ - Control::Paint(rRenderContext, rRect); - Point aAbsolutePos = m_aAbsolute->GetPosPixel(); - Size aAbsoluteSize = m_aAbsolute->GetSizePixel(); - - rRenderContext.DrawLine(Point(aAbsolutePos.X() - 1, 0 ), - Point(aAbsolutePos.X() - 1, aAbsolutePos.Y() + aAbsoluteSize.Height())); - - rRenderContext.DrawLine(Point(aAbsolutePos.X() + aAbsoluteSize.Width() + 1, 0 ), - Point(aAbsolutePos.X() + aAbsoluteSize.Width() + 1, aAbsolutePos.Y() + aAbsoluteSize.Height())); -} - -void DbGridControl::NavigationBar::StateChanged(StateChangedType nType) -{ - Control::StateChanged(nType); - - vcl::Window* pWindows[] = - { - m_aRecordText.get(), - m_aAbsolute.get(), - m_aRecordOf.get(), - m_aRecordCount.get(), - m_aFirstBtn.get(), - m_aPrevBtn.get(), - m_aNextBtn.get(), - m_aLastBtn.get(), - m_aNewBtn.get() - }; - - switch ( nType ) - { - case StateChangedType::Mirroring: + pWnd->set_sensitive(bAvailable); + if (!bAvailable) { - bool bIsRTLEnabled = IsRTLEnabled(); - for (vcl::Window* pWindow : pWindows) - pWindow->EnableRTL( bIsRTLEnabled ); + if (pWnd == m_xNextBtn.get()) + m_aNextRepeat.Stop(); + else if (pWnd == m_xPrevBtn.get()) + m_aPrevRepeat.Stop(); } - break; - - case StateChangedType::Zoom: - { - Fraction aZoom = GetZoom(); - - // not all of these controls need to know the new zoom, but to be sure ... - vcl::Font aFont(GetSettings().GetStyleSettings().GetToolFont()); - if (IsControlFont()) - aFont.Merge(GetControlFont()); - - for (vcl::Window* pWindow : pWindows) - { - pWindow->SetZoom(aZoom); - pWindow->SetZoomedPointFont(*pWindow, aFont); - } - - SetZoomedPointFont(*this, aFont); - - // rearrange the controls - ArrangeControls(); - } - break; - default:; } } @@ -898,7 +745,7 @@ DbGridControl::DbGridControl( WinBits nBits) :EditBrowseBox(pParent, EditBrowseBoxFlags::NONE, nBits, DEFAULT_BROWSE_MODE ) ,m_xContext(_rxContext) - ,m_aBar(VclPtr<DbGridControl::NavigationBar>::Create(this)) + ,m_aBar(VclPtr<NavigationBar>::Create(this)) ,m_nAsynAdjustEvent(nullptr) ,m_pDataSourcePropListener(nullptr) ,m_pFieldListeners(nullptr) diff --git a/svx/uiconfig/ui/navigationbar.ui b/svx/uiconfig/ui/navigationbar.ui new file mode 100644 index 000000000000..ede330757efc --- /dev/null +++ b/svx/uiconfig/ui/navigationbar.ui @@ -0,0 +1,224 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="dba"> + <requires lib="gtk+" version="3.18"/> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-goto-first</property> + <property name="icon_size">1</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-media-previous</property> + <property name="icon_size">1</property> + </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-media-next</property> + <property name="icon_size">1</property> + </object> + <object class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-goto-last</property> + <property name="icon_size">1</property> + </object> + <object class="GtkImage" id="image5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-new</property> + <property name="icon_size">1</property> + </object> + <object class="GtkBox" id="NavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkLabel" id="recordtext"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry-noframe"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="has_frame">False</property> + <property name="width_chars">4</property> + <property name="xalign">0.5</property> + <property name="shadow_type">none</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="recordof"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">False</property> + <property name="margin_left">3</property> + <property name="margin_right">3</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="recordcount"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkButton" id="first"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="navigationbar|first">First</property> + <property name="image">image1</property> + <property name="always_show_image">True</property> + <style> + <class name="small-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="GtkButton" id="prev"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="tooltip_text" translatable="yes" context="navigationbar|prev">Previous</property> + <property name="image">image2</property> + <property name="always_show_image">True</property> + <style> + <class name="small-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="GtkButton" id="next"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="tooltip_text" translatable="yes" context="navigationbar|next">Next</property> + <property name="image">image3</property> + <property name="always_show_image">True</property> + <style> + <class name="small-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="GtkButton" id="last"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="navigationbar|last">Last</property> + <property name="image">image4</property> + <property name="always_show_image">True</property> + <style> + <class name="small-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="GtkButton" id="new"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="navigationbar|new">New</property> + <property name="image">image5</property> + <property name="always_show_image">True</property> + <style> + <class name="small-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + </object> +</interface> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits