include/svx/gridctrl.hxx       |   15 ++++-
 svx/source/fmcomp/gridctrl.cxx |  112 +++++++++++++++++++++++++++++++----------
 2 files changed, 100 insertions(+), 27 deletions(-)

New commits:
commit f0960e05c2f540c99062867236419c2a70c1160b
Author:     Caolán McNamara <[email protected]>
AuthorDate: Sun May 19 20:29:26 2024 +0100
Commit:     Caolán McNamara <[email protected]>
CommitDate: Sun May 26 20:21:10 2024 +0200

    Resolves: tdf#155364 resize buttons and change widget font sizes on zoom
    
    Change-Id: Ied951e6c96881bd56a40ae01077cd7f76f9b7853
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168071
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/include/svx/gridctrl.hxx b/include/svx/gridctrl.hxx
index 27d7f25c7cf2..09c2a609a483 100644
--- a/include/svx/gridctrl.hxx
+++ b/include/svx/gridctrl.hxx
@@ -161,6 +161,7 @@ enum class DbGridControlNavigationBarState
 
 class FmXGridSourcePropListener;
 class DisposeListenerGridBridge;
+class DbGridControl;
 
 // NavigationBar
 class NavigationBar final : public InterimItemWindow
@@ -195,21 +196,26 @@ class NavigationBar final : public InterimItemWindow
     std::shared_ptr<weld::ButtonPressRepeater> m_xPrevRepeater;
     std::shared_ptr<weld::ButtonPressRepeater> m_xNextRepeater;
 
+    Size                 m_aLastAllocSize;
+
     sal_Int32            m_nCurrentPos;
 
     bool                 m_bPositioning;     // protect PositionDataSource 
against recursion
 
 public:
-    NavigationBar(vcl::Window* pParent);
+    NavigationBar(DbGridControl* pParent);
     virtual ~NavigationBar() override;
     virtual void dispose() override;
 
+    DECL_LINK(SizeAllocHdl, const Size&, void);
+
     // 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();
+    void SetPointFontAndZoom(const vcl::Font& rFont, const Fraction& rZoom);
+    sal_uInt16 GetPreferredWidth() const;
 
 private:
 
@@ -278,6 +284,8 @@ private:
     osl::Mutex          m_aDestructionSafety;
     osl::Mutex          m_aAdjustSafety;
 
+    Idle                m_aRearrangeIdle;
+
     css::util::Date
                         m_aNullDate;        // NullDate of the Numberformatter;
 
@@ -552,6 +560,8 @@ public:
         css::accessibility::XAccessible >
     CreateAccessibleCell( sal_Int32 nRow, sal_uInt16 nColumnId ) override;
 
+    void RearrangeAtIdle();
+
 protected:
     void RecalcRows(sal_Int32 nNewTopRow, sal_uInt16 nLinesOnScreen, bool 
bUpdateCursor);
     bool SeekCursor(sal_Int32 nRow, bool bAbsolute = false);
@@ -588,6 +598,7 @@ protected:
 protected:
     void ImplInitWindow( const InitWindowFacet _eInitWhat );
     DECL_DLLPRIVATE_LINK(OnDelete, void*, void);
+    DECL_DLLPRIVATE_LINK(RearrangeHdl, Timer*, void);
 
     DECL_DLLPRIVATE_LINK(OnAsyncAdjust, void*, void);
         // if the param is != NULL, AdjustRows will be called, else 
AdjustDataSource
diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx
index e6e3f8b40bc2..faedec67aa66 100644
--- a/svx/source/fmcomp/gridctrl.cxx
+++ b/svx/source/fmcomp/gridctrl.cxx
@@ -43,6 +43,7 @@
 #include <com/sun/star/container/XIndexAccess.hpp>
 #include <comphelper/diagnose_ex.hxx>
 #include <tools/debug.hxx>
+#include <tools/fract.hxx>
 #include <vcl/settings.hxx>
 #include <vcl/commandevent.hxx>
 #include <vcl/svapp.hxx>
@@ -302,7 +303,7 @@ void NavigationBar::PositionDataSource(sal_Int32 nRecord)
     m_bPositioning = false;
 }
 
-NavigationBar::NavigationBar(vcl::Window* pParent)
+NavigationBar::NavigationBar(DbGridControl* pParent)
     : InterimItemWindow(pParent, u"svx/ui/navigationbar.ui"_ustr, 
u"NavigationBar"_ustr)
     , m_xRecordText(m_xBuilder->weld_label(u"recordtext"_ustr))
     , m_xAbsolute(new 
NavigationBar::AbsolutePos(m_xBuilder->weld_entry(u"entry-noframe"_ustr), this))
@@ -318,13 +319,6 @@ NavigationBar::NavigationBar(vcl::Window* pParent)
     , 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);
@@ -342,9 +336,18 @@ NavigationBar::NavigationBar(vcl::Window* pParent)
     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);
+    vcl::Font 
aApplFont(Application::GetSettings().GetStyleSettings().GetToolFont());
+    SetPointFontAndZoom(aApplFont, Fraction(1, 1));
+
+    m_xContainer->connect_size_allocate(LINK(this, NavigationBar, 
SizeAllocHdl));
+}
+
+IMPL_LINK(NavigationBar, SizeAllocHdl, const Size&, rSize, void)
+{
+    if (rSize == m_aLastAllocSize)
+        return;
+    m_aLastAllocSize = rSize;
+    static_cast<DbGridControl*>(GetParent())->RearrangeAtIdle();
 }
 
 NavigationBar::~NavigationBar()
@@ -366,7 +369,7 @@ void NavigationBar::dispose()
     InterimItemWindow::dispose();
 }
 
-sal_uInt16 NavigationBar::ArrangeControls()
+sal_uInt16 NavigationBar::GetPreferredWidth() const
 {
     return m_xContainer->get_preferred_size().Width();
 }
@@ -579,6 +582,46 @@ void 
NavigationBar::SetState(DbGridControlNavigationBarState nWhich)
     }
 }
 
+static void ScaleButton(weld::Button& rBtn, const Fraction& rZoom)
+{
+    rBtn.set_size_request(-1, -1);
+    Size aPrefSize = rBtn.get_preferred_size();
+    aPrefSize.setWidth(std::round(double(aPrefSize.Width() * rZoom)));
+    aPrefSize.setHeight(std::round(double(aPrefSize.Height() * rZoom)));
+    rBtn.set_size_request(aPrefSize.Width(), aPrefSize.Height());
+}
+
+void NavigationBar::SetPointFontAndZoom(const vcl::Font& rFont, const 
Fraction& rZoom)
+{
+    vcl::Font aFont(rFont);
+    if (rZoom.GetNumerator() != rZoom.GetDenominator())
+    {
+        Size aSize = aFont.GetFontSize();
+        aSize.setWidth(std::round(double(aSize.Width() * rZoom)));
+        aSize.setHeight(std::round(double(aSize.Height() * rZoom)));
+        aFont.SetFontSize(aSize);
+    }
+
+    m_xRecordText->set_font(aFont);
+    m_xAbsolute->GetWidget()->set_font(aFont);
+    m_xRecordOf->set_font(aFont);
+    m_xRecordCount->set_font(aFont);
+
+    auto nReserveWidth = m_xRecordCount->get_approximate_digit_width() * 
nReserveNumDigits;
+    m_xAbsolute->GetWidget()->set_size_request(nReserveWidth, -1);
+    m_xRecordCount->set_size_request(nReserveWidth, -1);
+
+    ScaleButton(*m_xFirstBtn, rZoom);
+    ScaleButton(*m_xPrevBtn, rZoom);
+    ScaleButton(*m_xNextBtn, rZoom);
+    ScaleButton(*m_xLastBtn, rZoom);
+    ScaleButton(*m_xNewBtn, rZoom);
+
+    SetZoom(rZoom);
+
+    InvalidateChildSizeCache();
+}
+
 DbGridRow::DbGridRow():m_eStatus(GridRowStatus::Clean), m_bIsNew(true)
 {}
 
@@ -692,6 +735,7 @@ DbGridControl::DbGridControl(
             ,m_pGridListener(nullptr)
             ,m_nSeekPos(-1)
             ,m_nTotalCount(-1)
+            ,m_aRearrangeIdle("DbGridControl Rearrange Idle")
             ,m_aNullDate(::dbtools::DBTypeConversion::getStandardDate())
             ,m_nMode(DEFAULT_BROWSE_MODE)
             ,m_nCurrentPos(-1)
@@ -716,6 +760,8 @@ DbGridControl::DbGridControl(
     m_aBar->SetAccessibleName(sName);
     m_aBar->Show();
     ImplInitWindow( InitWindowFacet::All );
+
+    m_aRearrangeIdle.SetInvokeHandler(LINK(this, DbGridControl, RearrangeHdl));
 }
 
 void DbGridControl::InsertHandleColumn()
@@ -774,6 +820,11 @@ void DbGridControl::dispose()
     EditBrowseBox::dispose();
 }
 
+void DbGridControl::RearrangeAtIdle()
+{
+    m_aRearrangeIdle.Start();
+}
+
 void DbGridControl::StateChanged( StateChangedType nType )
 {
     EditBrowseBox::StateChanged( nType );
@@ -788,12 +839,7 @@ void DbGridControl::StateChanged( StateChangedType nType )
         case StateChangedType::Zoom:
         {
             ImplInitWindow( InitWindowFacet::Font );
-
-            // and give it a chance to rearrange
-            Point aPoint = GetControlArea().TopLeft();
-            sal_uInt16 nX = static_cast<sal_uInt16>(aPoint.X());
-            ArrangeControls(nX, static_cast<sal_uInt16>(aPoint.Y()));
-            ReserveControlArea(nX);
+            RearrangeAtIdle();
         }
         break;
         case StateChangedType::ControlFont:
@@ -853,12 +899,12 @@ void DbGridControl::ImplInitWindow( const InitWindowFacet 
_eInitWhat )
     {
         if ( m_bNavigationBar )
         {
-            if ( IsControlFont() )
-                m_aBar->SetControlFont( GetControlFont() );
-            else
-                m_aBar->SetControlFont();
+            const StyleSettings& rStyleSettings = 
Application::GetSettings().GetStyleSettings();
+            vcl::Font aFont = rStyleSettings.GetToolFont();
+            if (IsControlFont())
+                aFont.Merge(GetControlFont());
 
-            m_aBar->SetZoom( GetZoom() );
+            m_aBar->SetPointFontAndZoom(aFont, GetZoom());
         }
     }
 
@@ -926,8 +972,8 @@ void DbGridControl::ArrangeControls(sal_uInt16& nX, 
sal_uInt16 nY)
     if (m_bNavigationBar)
     {
         tools::Rectangle aRect(GetControlArea());
-        m_aBar->SetPosSizePixel(Point(0, nY + 1), 
Size(aRect.GetSize().Width(), aRect.GetSize().Height() - 1));
-        nX = m_aBar->ArrangeControls();
+        nX = m_aBar->GetPreferredWidth();
+        m_aBar->SetPosSizePixel(Point(0, nY + 1), Size(nX, 
aRect.GetSize().Height() - 1));
     }
 }
 
@@ -2594,6 +2640,22 @@ IMPL_LINK_NOARG(DbGridControl, OnDelete, void*, void)
     DeleteSelectedRows();
 }
 
+IMPL_LINK_NOARG(DbGridControl, RearrangeHdl, Timer*, void)
+{
+    // and give it a chance to rearrange
+    Point aPoint = GetControlArea().TopLeft();
+    sal_uInt16 nX = static_cast<sal_uInt16>(aPoint.X());
+    ArrangeControls(nX, aPoint.Y());
+    // tdf#155364 like tdf#97731 if the reserved area changed size, give
+    // the controls a chance to adapt to the new size
+    bool bChanged = ReserveControlArea(nX);
+    if (bChanged)
+    {
+        ArrangeControls(nX, aPoint.Y());
+        Invalidate();
+    }
+}
+
 void DbGridControl::DeleteSelectedRows()
 {
     DBG_ASSERT(GetSelection(), "no selection!!!");

Reply via email to