[Libreoffice-commits] core.git: chart2/source include/svtools solenv/sanitizers svtools/source svtools/uiconfig svx/source vcl/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Mon Jul 6 12:54:14 UTC 2020


 chart2/source/controller/dialogs/DataBrowser.cxx |    2 
 include/svtools/editbrowsebox.hxx                |   88 ++++++++++--------
 solenv/sanitizers/ui/svt.suppr                   |    1 
 svtools/source/brwbox/ebbcontrols.cxx            |  107 +++++++++++++++++++----
 svtools/source/brwbox/editbrowsebox.cxx          |   14 ++-
 svtools/source/brwbox/editbrowsebox2.cxx         |    2 
 svtools/uiconfig/ui/thineditcontrol.ui           |   15 +++
 svx/source/fmcomp/gridcell.cxx                   |   71 +++++++++------
 svx/source/inc/gridcell.hxx                      |    5 -
 vcl/source/app/salvtables.cxx                    |    2 
 10 files changed, 216 insertions(+), 91 deletions(-)

New commits:
commit d5b3c5d5093c56e748610a3972fc90b1521ae9e3
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Fri Jul 3 20:09:37 2020 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Mon Jul 6 14:53:21 2020 +0200

    weld DbNumericField item
    
    Change-Id: I96b7945cdf9f00c3d0a4e043ee77666e19c8a072
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97896
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/chart2/source/controller/dialogs/DataBrowser.cxx b/chart2/source/controller/dialogs/DataBrowser.cxx
index 6971be7433a9..ab967c92408d 100644
--- a/chart2/source/controller/dialogs/DataBrowser.cxx
+++ b/chart2/source/controller/dialogs/DataBrowser.cxx
@@ -497,7 +497,7 @@ DataBrowser::DataBrowser(const css::uno::Reference<css::awt::XWindow> &rParent,
     m_nSeekRow( 0 ),
     m_bIsReadOnly( false ),
     m_bDataValid( true ),
-    m_aNumberEditField(VclPtr<FormattedControl>::Create(&EditBrowseBox::GetDataWindow())),
+    m_aNumberEditField(VclPtr<FormattedControl>::Create(&EditBrowseBox::GetDataWindow(), false)),
     m_aTextEditField(VclPtr<EditControl>::Create(&EditBrowseBox::GetDataWindow())),
     m_pColumnsWin(pColumns),
     m_pColorsWin(pColors),
diff --git a/include/svtools/editbrowsebox.hxx b/include/svtools/editbrowsebox.hxx
index 1e24ced1d8ed..128c16021ca0 100644
--- a/include/svtools/editbrowsebox.hxx
+++ b/include/svtools/editbrowsebox.hxx
@@ -186,26 +186,37 @@ namespace svt
         virtual void                Paste() override;
     };
 
-    class SVT_DLLPUBLIC EditControlBase : public InterimItemWindow
+    class SVT_DLLPUBLIC ControlBase : public InterimItemWindow
     {
     public:
-        EditControlBase(BrowserDataWin* pParent);
+        ControlBase(BrowserDataWin* pParent, const OUString& rUIXMLDescription, const OString& rID);
+
+        bool ControlHasFocus() const;
 
         virtual void dispose() override;
 
-        virtual void GetFocus() override
-        {
-            if (m_pEntry)
-                m_pEntry->grab_focus();
-            InterimItemWindow::GetFocus();
-        }
+        virtual void GetFocus() override;
+
+    protected:
+        void InitControlBase(weld::Widget* pWidget);
+
+    private:
+        weld::Widget* m_pWidget;
+    };
+
+    class SVT_DLLPUBLIC EditControlBase : public ControlBase
+    {
+    public:
+        EditControlBase(BrowserDataWin* pParent);
+
+        virtual void dispose() override;
 
         weld::Entry& get_widget() { return *m_pEntry; }
 
         virtual void connect_changed(const Link<weld::Entry&, void>& rLink) = 0;
 
     protected:
-        void init(weld::Entry* pEntry);
+        void InitEditControlBase(weld::Entry* pEntry);
 
     private:
         weld::Entry* m_pEntry;
@@ -422,9 +433,7 @@ namespace svt
         DECL_LINK(ModifyHdl, LinkParamNone*, void);
     };
 
-
     //= SpinCellController
-
     class UNLESS_MERGELIBS(SVT_DLLPUBLIC) SpinCellController final : public CellController
     {
     public:
@@ -440,9 +449,7 @@ namespace svt
         DECL_LINK(ModifyHdl, Edit&, void);
     };
 
-
     //= CheckBoxControl
-
     class SVT_DLLPUBLIC CheckBoxControl final : public Control
     {
         VclPtr<CheckBox>             pBox;
@@ -489,19 +496,12 @@ namespace svt
     };
 
     //= ComboBoxControl
-    class SVT_DLLPUBLIC ComboBoxControl final : public InterimItemWindow
+    class SVT_DLLPUBLIC ComboBoxControl final : public ControlBase
     {
         friend class ComboBoxCellController;
 
     public:
-        ComboBoxControl(vcl::Window* pParent);
-
-        virtual void GetFocus() override
-        {
-            if (m_xWidget)
-                m_xWidget->grab_focus();
-            InterimItemWindow::GetFocus();
-        }
+        ComboBoxControl(BrowserDataWin* pParent);
 
         weld::ComboBox& get_widget() { return *m_xWidget; }
 
@@ -529,19 +529,12 @@ namespace svt
     };
 
     //= ListBoxControl
-    class SVT_DLLPUBLIC ListBoxControl final : public InterimItemWindow
+    class SVT_DLLPUBLIC ListBoxControl final : public ControlBase
     {
         friend class ListBoxCellController;
 
     public:
-        ListBoxControl(vcl::Window* pParent);
-
-        virtual void GetFocus() override
-        {
-            if (m_xWidget)
-                m_xWidget->grab_focus();
-            InterimItemWindow::GetFocus();
-        }
+        ListBoxControl(BrowserDataWin* pParent);
 
         weld::ComboBox& get_widget() { return *m_xWidget; }
 
@@ -567,30 +560,43 @@ namespace svt
         DECL_LINK(ListBoxSelectHdl, weld::ComboBox&, void);
     };
 
-    class SVT_DLLPUBLIC FormattedControl : public EditControlBase
+    class SVT_DLLPUBLIC FormattedControlBase : public EditControlBase
     {
     public:
-        FormattedControl(BrowserDataWin* pParent);
+        FormattedControlBase(BrowserDataWin* pParent, bool bSpinVariant);
 
         virtual void dispose() override;
 
-        virtual void connect_changed(const Link<weld::Entry&, void>& rLink) override
-        {
-            m_xEntryFormatter->connect_changed(rLink);
-        }
+        virtual void connect_changed(const Link<weld::Entry&, void>& rLink) override;
 
-        weld::EntryFormatter& get_formatter() { return *m_xEntryFormatter; }
+        weld::EntryFormatter& get_formatter();
 
-    private:
+    protected:
+        bool m_bSpinVariant;
         std::unique_ptr<weld::Entry> m_xEntry;
+        std::unique_ptr<weld::FormattedSpinButton> m_xSpinButton;
         std::unique_ptr<weld::EntryFormatter> m_xEntryFormatter;
+
+        void InitFormattedControlBase();
+    };
+
+    class SVT_DLLPUBLIC FormattedControl : public FormattedControlBase
+    {
+    public:
+        FormattedControl(BrowserDataWin* pParent, bool bSpinVariant);
+    };
+
+    class SVT_DLLPUBLIC DoubleNumericControl : public FormattedControlBase
+    {
+    public:
+        DoubleNumericControl(BrowserDataWin* pParent, bool bSpinVariant);
     };
 
     //= FormattedFieldCellController
     class SVT_DLLPUBLIC FormattedFieldCellController final : public EditCellController
     {
     public:
-        FormattedFieldCellController( FormattedControl* _pFormatted );
+        FormattedFieldCellController( FormattedControlBase* _pFormatted );
 
         virtual void CommitModifications() override;
     };
@@ -827,6 +833,8 @@ namespace svt
 
         SVT_DLLPRIVATE void implActivateCellOnMouseEvent(const BrowserMouseEvent& _rEvt, bool _bUp);
 
+        bool ControlHasFocus() const;
+
         DECL_DLLPRIVATE_LINK( ModifyHdl, LinkParamNone*, void );
         DECL_DLLPRIVATE_LINK( StartEditHdl, void*, void );
         DECL_DLLPRIVATE_LINK( EndEditHdl, void*, void );
diff --git a/solenv/sanitizers/ui/svt.suppr b/solenv/sanitizers/ui/svt.suppr
index 3981518c1988..9c5609725170 100644
--- a/solenv/sanitizers/ui/svt.suppr
+++ b/solenv/sanitizers/ui/svt.suppr
@@ -27,3 +27,4 @@ svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_skia'] orphan-label
 svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='label'] orphan-label
 svtools/uiconfig/ui/spinfieldcontrol.ui://GtkSpinButton[@id='spinbutton'] no-labelled-by
 svtools/uiconfig/ui/thineditcontrol.ui://GtkEntry[@id='entry'] no-labelled-by
+svtools/uiconfig/ui/thineditcontrol.ui://GtkSpinButton[@id='spinbutton'] no-labelled-by
diff --git a/svtools/source/brwbox/ebbcontrols.cxx b/svtools/source/brwbox/ebbcontrols.cxx
index 4c42fa9f1cf5..f6d6992adeed 100644
--- a/svtools/source/brwbox/ebbcontrols.cxx
+++ b/svtools/source/brwbox/ebbcontrols.cxx
@@ -26,17 +26,18 @@ namespace svt
 {
 
     //= ComboBoxControl
-    ComboBoxControl::ComboBoxControl(vcl::Window* pParent)
-        : InterimItemWindow(pParent, "svt/ui/combocontrol.ui", "ComboControl")
+    ComboBoxControl::ComboBoxControl(BrowserDataWin* pParent)
+        : ControlBase(pParent, "svt/ui/combocontrol.ui", "ComboControl")
         , m_xWidget(m_xBuilder->weld_combo_box("combobox"))
     {
+        InitControlBase(m_xWidget.get());
         m_xWidget->set_entry_width_chars(1); // so a smaller than default width can be used
     }
 
     void ComboBoxControl::dispose()
     {
         m_xWidget.reset();
-        InterimItemWindow::dispose();
+        ControlBase::dispose();
     }
 
     //= ComboBoxCellController
@@ -103,17 +104,18 @@ namespace svt
     }
 
     //= ListBoxControl
-    ListBoxControl::ListBoxControl(vcl::Window* pParent)
-        : InterimItemWindow(pParent, "svt/ui/listcontrol.ui", "ListControl")
+    ListBoxControl::ListBoxControl(BrowserDataWin* pParent)
+        : ControlBase(pParent, "svt/ui/listcontrol.ui", "ListControl")
         , m_xWidget(m_xBuilder->weld_combo_box("listbox"))
     {
+        InitControlBase(m_xWidget.get());
         m_xWidget->set_size_request(42, -1); // so a later narrow size request can stick
     }
 
     void ListBoxControl::dispose()
     {
         m_xWidget.reset();
-        InterimItemWindow::dispose();
+        ControlBase::dispose();
     }
 
     //= ListBoxCellController
@@ -345,34 +347,66 @@ namespace svt
         m_aModifyHdl.Call(nullptr);
     }
 
+    ControlBase::ControlBase(BrowserDataWin* pParent, const OUString& rUIXMLDescription, const OString& rID)
+        : InterimItemWindow(pParent, rUIXMLDescription, rID)
+    {
+    }
+
+    bool ControlBase::ControlHasFocus() const
+    {
+        if (!m_pWidget)
+            return false;
+        return m_pWidget->has_focus();
+    }
+
+    void ControlBase::dispose()
+    {
+        m_pWidget = nullptr;
+        InterimItemWindow::dispose();
+    }
+
+    void ControlBase::GetFocus()
+    {
+        if (m_pWidget)
+            m_pWidget->grab_focus();
+        InterimItemWindow::GetFocus();
+    }
+
+    void ControlBase::InitControlBase(weld::Widget* pWidget)
+    {
+        m_pWidget = pWidget;
+    }
+
     EditControlBase::EditControlBase(BrowserDataWin* pParent)
-        : InterimItemWindow(pParent, "svt/ui/thineditcontrol.ui", "EditControl") // *thin*editcontrol has no frame/border
+        : ControlBase(pParent, "svt/ui/thineditcontrol.ui", "EditControl") // *thin*editcontrol has no frame/border
     {
     }
 
-    void EditControlBase::init(weld::Entry* pEntry)
+    void EditControlBase::InitEditControlBase(weld::Entry* pEntry)
     {
+        InitControlBase(pEntry);
         m_pEntry = pEntry;
+        m_pEntry->show();
         m_pEntry->set_width_chars(1); // so a smaller than default width can be used
         m_pEntry->connect_key_press(LINK(this, EditControl, KeyInputHdl));
     }
 
     IMPL_LINK(EditControlBase, KeyInputHdl, const KeyEvent&, rKEvt, bool)
     {
-        return ChildKeyInput(rKEvt);
+        return static_cast<BrowserDataWin*>(GetParent())->GetParent()->ProcessKey(rKEvt);
     }
 
     void EditControlBase::dispose()
     {
         m_pEntry = nullptr;
-        InterimItemWindow::dispose();
+        ControlBase::dispose();
     }
 
     EditControl::EditControl(BrowserDataWin* pParent)
         : EditControlBase(pParent)
         , m_xWidget(m_xBuilder->weld_entry("entry"))
     {
-        init(m_xWidget.get());
+        InitEditControlBase(m_xWidget.get());
     }
 
     void EditControl::dispose()
@@ -381,21 +415,62 @@ namespace svt
         EditControlBase::dispose();
     }
 
-    FormattedControl::FormattedControl(BrowserDataWin* pParent)
+    FormattedControlBase::FormattedControlBase(BrowserDataWin* pParent, bool bSpinVariant)
         : EditControlBase(pParent)
+        , m_bSpinVariant(bSpinVariant)
         , m_xEntry(m_xBuilder->weld_entry("entry"))
-        , m_xEntryFormatter(new weld::EntryFormatter(*m_xEntry))
+        , m_xSpinButton(m_xBuilder->weld_formatted_spin_button("spinbutton"))
     {
-        init(m_xEntry.get());
     }
 
-    void FormattedControl::dispose()
+    void FormattedControlBase::InitFormattedControlBase()
+    {
+        if (m_bSpinVariant)
+            m_xSpinButton->SetFormatter(m_xEntryFormatter.release());
+        InitEditControlBase(m_bSpinVariant ? m_xSpinButton.get() : m_xEntry.get());
+    }
+
+    void FormattedControlBase::connect_changed(const Link<weld::Entry&, void>& rLink)
+    {
+        get_formatter().connect_changed(rLink);
+    }
+
+    weld::EntryFormatter& FormattedControlBase::get_formatter()
+    {
+        if (m_bSpinVariant)
+            return static_cast<weld::EntryFormatter&>(m_xSpinButton->GetFormatter());
+        else
+            return *m_xEntryFormatter;
+    }
+
+    void FormattedControlBase::dispose()
     {
         m_xEntryFormatter.reset();
+        m_xSpinButton.reset();
         m_xEntry.reset();
         EditControlBase::dispose();
     }
 
+    FormattedControl::FormattedControl(BrowserDataWin* pParent, bool bSpinVariant)
+        : FormattedControlBase(pParent, bSpinVariant)
+    {
+        if (bSpinVariant)
+            m_xEntryFormatter.reset(new weld::EntryFormatter(*m_xSpinButton));
+        else
+            m_xEntryFormatter.reset(new weld::EntryFormatter(*m_xEntry));
+        InitFormattedControlBase();
+    }
+
+    DoubleNumericControl::DoubleNumericControl(BrowserDataWin* pParent, bool bSpinVariant)
+        : FormattedControlBase(pParent, bSpinVariant)
+    {
+        if (bSpinVariant)
+            m_xEntryFormatter.reset(new weld::DoubleNumericEntry(*m_xSpinButton));
+        else
+            m_xEntryFormatter.reset(new weld::DoubleNumericEntry(*m_xEntry));
+        InitFormattedControlBase();
+    }
+
     EditCellController::EditCellController(EditControlBase* pEdit)
         : CellController(pEdit)
         , m_pEditImplementation(new EntryImplementation(*pEdit))
@@ -506,7 +581,7 @@ namespace svt
     }
 
     //= FormattedFieldCellController
-    FormattedFieldCellController::FormattedFieldCellController( FormattedControl* _pFormatted )
+    FormattedFieldCellController::FormattedFieldCellController( FormattedControlBase* _pFormatted )
         : EditCellController(_pFormatted)
     {
     }
diff --git a/svtools/source/brwbox/editbrowsebox.cxx b/svtools/source/brwbox/editbrowsebox.cxx
index 4328e22d5ee8..48658e88fc53 100644
--- a/svtools/source/brwbox/editbrowsebox.cxx
+++ b/svtools/source/brwbox/editbrowsebox.cxx
@@ -210,7 +210,7 @@ namespace svt
         if (IsEditing())
         {
             EnableAndShow();
-            if (!aController->GetWindow().HasFocus() && (m_pFocusWhileRequest.get() == Application::GetFocusWindow()))
+            if (!ControlHasFocus() && (m_pFocusWhileRequest.get() == Application::GetFocusWindow()))
                 aController->GetWindow().GrabFocus();
         }
     }
@@ -450,7 +450,6 @@ namespace svt
         }
     }
 
-
     void EditBrowseBox::MouseButtonUp( const BrowserMouseEvent& rEvt )
     {
         // absorb double clicks
@@ -466,6 +465,13 @@ namespace svt
                 implActivateCellOnMouseEvent(rEvt, true);
     }
 
+    bool EditBrowseBox::ControlHasFocus() const
+    {
+        Window* pControlWindow = aController ? &aController->GetWindow() : nullptr;
+        if (ControlBase* pControlBase = dynamic_cast<ControlBase*>(pControlWindow))
+            return pControlBase->ControlHasFocus();
+        return pControlWindow && pControlWindow->HasChildPathFocus();
+    }
 
     void EditBrowseBox::implActivateCellOnMouseEvent(const BrowserMouseEvent& _rEvt, bool _bUp)
     {
@@ -473,7 +479,7 @@ namespace svt
             ActivateCell();
         else if (IsEditing() && !aController->GetWindow().IsEnabled())
             DeactivateCell();
-        else if (IsEditing() && !aController->GetWindow().HasChildPathFocus())
+        else if (IsEditing() && !ControlHasFocus())
             AsynchGetFocus();
 
         if (!(IsEditing() && aController->GetWindow().IsEnabled() && aController->WantMouseEvent()))
@@ -652,7 +658,7 @@ namespace svt
     {
         if (rEvt.GetType() == MouseNotifyEvent::KEYINPUT)
         {
-            if  (   (IsEditing() && Controller()->GetWindow().HasChildPathFocus())
+            if  (   (IsEditing() && ControlHasFocus())
                 ||  rEvt.GetWindow() == &GetDataWindow()
                 ||  (!IsEditing() && HasChildPathFocus())
                 )
diff --git a/svtools/source/brwbox/editbrowsebox2.cxx b/svtools/source/brwbox/editbrowsebox2.cxx
index 3544979e725b..7c84cf5eb805 100644
--- a/svtools/source/brwbox/editbrowsebox2.cxx
+++ b/svtools/source/brwbox/editbrowsebox2.cxx
@@ -124,7 +124,7 @@ void EditBrowseBox::GrabTableFocus()
 
 void EditBrowseBox::DetermineFocus( const GetFocusFlags _nGetFocusFlags )
 {
-    bool bFocus = false;
+    bool bFocus = ControlHasFocus();
     for (vcl::Window* pWindow = Application::GetFocusWindow();
          pWindow && !bFocus;
          pWindow = pWindow->GetParent())
diff --git a/svtools/uiconfig/ui/thineditcontrol.ui b/svtools/uiconfig/ui/thineditcontrol.ui
index a30e8db01435..fd88ec456cd8 100644
--- a/svtools/uiconfig/ui/thineditcontrol.ui
+++ b/svtools/uiconfig/ui/thineditcontrol.ui
@@ -6,11 +6,12 @@
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="hexpand">True</property>
+    <property name="orientation">vertical</property>
     <property name="spacing">6</property>
     <child>
       <object class="GtkEntry" id="entry">
-        <property name="visible">True</property>
         <property name="can_focus">True</property>
+        <property name="no_show_all">True</property>
         <property name="hexpand">True</property>
         <property name="vexpand">True</property>
         <property name="has_frame">False</property>
@@ -23,5 +24,17 @@
         <property name="position">0</property>
       </packing>
     </child>
+    <child>
+      <object class="GtkSpinButton" id="spinbutton">
+        <property name="can_focus">True</property>
+        <property name="no_show_all">True</property>
+        <property name="has_frame">False</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
   </object>
 </interface>
diff --git a/svx/source/fmcomp/gridcell.cxx b/svx/source/fmcomp/gridcell.cxx
index 5a5fc1ed314a..f4ccb57e1347 100644
--- a/svx/source/fmcomp/gridcell.cxx
+++ b/svx/source/fmcomp/gridcell.cxx
@@ -57,7 +57,6 @@
 #include <rtl/math.hxx>
 #include <svtools/calendar.hxx>
 #include <vcl/button.hxx>
-#include <vcl/fmtfield.hxx>
 #include <svl/numuno.hxx>
 #include <svl/zforlist.hxx>
 #include <svx/dialmgr.hxx>
@@ -917,13 +916,29 @@ namespace
 {
     void lcl_implAlign( vcl::Window* _pWindow, WinBits _nAlignmentBit )
     {
+        if (EditControlBase* pControl = dynamic_cast<EditControlBase*>(_pWindow))
+        {
+            switch (_nAlignmentBit)
+            {
+                case WB_LEFT:
+                    pControl->get_widget().set_alignment(TxtAlign::Left);
+                    break;
+                case WB_CENTER:
+                    pControl->get_widget().set_alignment(TxtAlign::Center);
+                    break;
+                case WB_RIGHT:
+                    pControl->get_widget().set_alignment(TxtAlign::Right);
+                    break;
+            }
+            return;
+        }
+
         WinBits nStyle = _pWindow->GetStyle();
         nStyle &= ~(WB_LEFT | WB_RIGHT | WB_CENTER);
         _pWindow->SetStyle( nStyle | _nAlignmentBit );
     }
 }
 
-
 void DbCellControl::AlignControl(sal_Int16 nAlignment)
 {
     WinBits nAlignmentBit = 0;
@@ -1247,8 +1262,8 @@ void DbFormattedField::Init( BrowserDataWin& rParent, const Reference< XRowSet >
 
     Reference< css::beans::XPropertySet >  xUnoModel = m_rColumn.getModel();
 
-    auto xEditControl = VclPtr<FormattedControl>::Create(&rParent);
-    auto xEditPainter = VclPtr<FormattedControl>::Create(&rParent);
+    auto xEditControl = VclPtr<FormattedControl>::Create(&rParent, false);
+    auto xEditPainter = VclPtr<FormattedControl>::Create(&rParent, false);
 
     weld::EntryFormatter& rControlFormatter = xEditControl->get_formatter();
     weld::EntryFormatter& rPainterFormatter = xEditPainter->get_formatter();
@@ -1452,7 +1467,7 @@ void DbFormattedField::Init( BrowserDataWin& rParent, const Reference< XRowSet >
 
 CellControllerRef DbFormattedField::CreateController() const
 {
-    return new ::svt::FormattedFieldCellController(static_cast<FormattedControl*>(m_pWindow.get()));
+    return new ::svt::FormattedFieldCellController(static_cast<FormattedControlBase*>(m_pWindow.get()));
 }
 
 void DbFormattedField::_propertyChanged( const PropertyChangeEvent& _rEvent )
@@ -1463,9 +1478,9 @@ void DbFormattedField::_propertyChanged( const PropertyChangeEvent& _rEvent )
 
         DBG_ASSERT(m_pWindow && m_pPainter, "DbFormattedField::_propertyChanged : where are my windows ?");
         if (m_pWindow)
-            static_cast<FormattedControl*>(m_pWindow.get())->get_formatter().SetFormatKey(nNewKey);
+            static_cast<FormattedControlBase*>(m_pWindow.get())->get_formatter().SetFormatKey(nNewKey);
         if (m_pPainter)
-            static_cast<FormattedControl*>(m_pPainter.get())->get_formatter().SetFormatKey(nNewKey);
+            static_cast<FormattedControlBase*>(m_pPainter.get())->get_formatter().SetFormatKey(nNewKey);
     }
     else
     {
@@ -1483,7 +1498,7 @@ OUString DbFormattedField::GetFormatText(const Reference< css::sdb::XColumn >& _
     if (!_rxField.is())
         return OUString();
 
-    FormattedControl* pControl = static_cast<FormattedControl*>(m_pPainter.get());
+    FormattedControlBase* pControl = static_cast<FormattedControlBase*>(m_pPainter.get());
     weld::EntryFormatter& rPainterFormatter = pControl->get_formatter();
 
     OUString aText;
@@ -1527,7 +1542,7 @@ void DbFormattedField::UpdateFromField(const Reference< css::sdb::XColumn >& _rx
 {
     try
     {
-        FormattedControl* pEditControl = static_cast<FormattedControl*>(m_pWindow.get());
+        FormattedControlBase* pEditControl = static_cast<FormattedControlBase*>(m_pWindow.get());
         weld::Entry& rEntry = pEditControl->get_widget();
         weld::EntryFormatter& rEditFormatter = pEditControl->get_formatter();
 
@@ -1569,7 +1584,7 @@ void DbFormattedField::updateFromModel( Reference< XPropertySet > _rxModel )
 {
     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbFormattedField::updateFromModel: invalid call!" );
 
-    FormattedControl* pEditControl = static_cast<FormattedControl*>(m_pWindow.get());
+    FormattedControlBase* pEditControl = static_cast<FormattedControlBase*>(m_pWindow.get());
     weld::Entry& rEntry = pEditControl->get_widget();
     weld::EntryFormatter& rEditFormatter = pEditControl->get_formatter();
 
@@ -1593,7 +1608,7 @@ bool DbFormattedField::commitControl()
 {
     Any aNewVal;
 
-    FormattedControl* pEditControl = static_cast<FormattedControl*>(m_pWindow.get());
+    FormattedControlBase* pEditControl = static_cast<FormattedControlBase*>(m_pWindow.get());
     weld::Entry& rEntry = pEditControl->get_widget();
     weld::EntryFormatter& rEditFormatter = pEditControl->get_formatter();
 
@@ -1883,6 +1898,10 @@ DbNumericField::DbNumericField( DbGridColumn& _rColumn )
     doPropertyListening( FM_PROP_SHOWTHOUSANDSEP );
 }
 
+CellControllerRef DbNumericField::CreateController() const
+{
+    return new ::svt::FormattedFieldCellController(static_cast<FormattedControlBase*>(m_pWindow.get()));
+}
 
 void DbNumericField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
 {
@@ -1898,13 +1917,13 @@ void DbNumericField::implAdjustGenericFieldSetting( const Reference< XPropertySe
     sal_Int16   nScale      = getINT16( _rxModel->getPropertyValue( FM_PROP_DECIMAL_ACCURACY ) );
     bool    bThousand   = getBOOL( _rxModel->getPropertyValue( FM_PROP_SHOWTHOUSANDSEP ) );
 
-    Formatter& rEditFormatter = static_cast<DoubleNumericField*>(m_pWindow.get())->GetFormatter();
+    Formatter& rEditFormatter = static_cast<FormattedControlBase*>(m_pWindow.get())->get_formatter();
     rEditFormatter.SetMinValue(nMin);
     rEditFormatter.SetMaxValue(nMax);
     rEditFormatter.SetSpinSize(nStep);
     rEditFormatter.SetStrictFormat(bStrict);
 
-    Formatter& rPaintFormatter = static_cast<DoubleNumericField*>(m_pPainter.get())->GetFormatter();
+    Formatter& rPaintFormatter = static_cast<FormattedControlBase*>(m_pPainter.get())->get_formatter();
     rPaintFormatter.SetMinValue(nMin);
     rPaintFormatter.SetMaxValue(nMax);
     rPaintFormatter.SetStrictFormat(bStrict);
@@ -1939,16 +1958,15 @@ void DbNumericField::implAdjustGenericFieldSetting( const Reference< XPropertySe
     rPaintFormatter.SetFormat( sFormatString, aAppLanguage );
 }
 
-VclPtr<Control> DbNumericField::createField(BrowserDataWin* _pParent, bool bSpinButton, const Reference< XPropertySet >& /*_rxModel*/)
+VclPtr<Control> DbNumericField::createField(BrowserDataWin* pParent, bool bSpinButton, const Reference<XPropertySet>& /*rxModel*/)
 {
-    WinBits _nFieldStyle = bSpinButton ? (WB_REPEAT | WB_SPIN) : 0;
-    return VclPtr<DoubleNumericField>::Create( _pParent, _nFieldStyle );
+    return VclPtr<DoubleNumericControl>::Create(pParent, bSpinButton);
 }
 
 namespace
 {
 
-    OUString lcl_setFormattedNumeric_nothrow( DoubleNumericField& _rField, const DbCellControl& _rControl,
+    OUString lcl_setFormattedNumeric_nothrow( FormattedControlBase& _rField, const DbCellControl& _rControl,
         const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
     {
         OUString sValue;
@@ -1959,8 +1977,8 @@ namespace
                 double fValue = _rControl.GetValue( _rxField, _rxFormatter );
                 if ( !_rxField->wasNull() )
                 {
-                    _rField.GetFormatter().SetValue( fValue );
-                    sValue = _rField.GetText();
+                    _rField.get_formatter().SetValue(fValue);
+                    sValue = _rField.get_widget().get_text();
                 }
             }
             catch( const Exception& )
@@ -1974,36 +1992,39 @@ namespace
 
 OUString DbNumericField::GetFormatText(const Reference< css::sdb::XColumn >& _rxField, const Reference< css::util::XNumberFormatter >& _rxFormatter, Color** /*ppColor*/)
 {
-    return lcl_setFormattedNumeric_nothrow(dynamic_cast<DoubleNumericField&>(*m_pPainter), *this, _rxField, _rxFormatter);
+    return lcl_setFormattedNumeric_nothrow(dynamic_cast<FormattedControlBase&>(*m_pPainter), *this, _rxField, _rxFormatter);
 }
 
 void DbNumericField::UpdateFromField(const Reference< css::sdb::XColumn >& _rxField, const Reference< css::util::XNumberFormatter >& _rxFormatter)
 {
-    lcl_setFormattedNumeric_nothrow(dynamic_cast<DoubleNumericField&>(*m_pWindow), *this, _rxField, _rxFormatter);
+    lcl_setFormattedNumeric_nothrow(dynamic_cast<FormattedControlBase&>(*m_pWindow), *this, _rxField, _rxFormatter);
 }
 
 void DbNumericField::updateFromModel( Reference< XPropertySet > _rxModel )
 {
     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbNumericField::updateFromModel: invalid call!" );
 
+    FormattedControlBase* pControl = static_cast<FormattedControlBase*>(m_pWindow.get());
+
     double dValue = 0;
     if ( _rxModel->getPropertyValue( FM_PROP_VALUE ) >>= dValue )
     {
-        Formatter& rFormatter = static_cast<DoubleNumericField*>(m_pWindow.get())->GetFormatter();
+        Formatter& rFormatter = pControl->get_formatter();
         rFormatter.SetValue(dValue);
     }
     else
-        m_pWindow->SetText( OUString() );
+        pControl->get_widget().set_text(OUString());
 }
 
 bool DbNumericField::commitControl()
 {
-    OUString aText( m_pWindow->GetText());
+    FormattedControlBase* pControl = static_cast<FormattedControlBase*>(m_pWindow.get());
+    OUString aText(pControl->get_widget().get_text());
     Any aVal;
 
     if (!aText.isEmpty())   // not empty
     {
-        Formatter& rFormatter = static_cast<DoubleNumericField*>(m_pWindow.get())->GetFormatter();
+        Formatter& rFormatter = pControl->get_formatter();
         double fValue = rFormatter.GetValue();
         aVal <<= fValue;
     }
diff --git a/svx/source/inc/gridcell.hxx b/svx/source/inc/gridcell.hxx
index 64fc8a9c0e11..1b93fe550469 100644
--- a/svx/source/inc/gridcell.hxx
+++ b/svx/source/inc/gridcell.hxx
@@ -628,11 +628,13 @@ protected:
     virtual void    implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override;
 };
 
-
 class DbNumericField : public DbSpinField
 {
 public:
     DbNumericField(DbGridColumn& _rColumn);
+
+    virtual ::svt::CellControllerRef CreateController() const override;
+
     virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, Color** ppColor = nullptr) override;
     virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override;
 
@@ -652,7 +654,6 @@ protected:
     void    implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override;
 };
 
-
 class DbFilterField final
         :public DbCellControl
         ,public ::svxform::OSQLParserClient
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 0d86ac4871f9..57b4fa29e5a5 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -3182,7 +3182,7 @@ void SalInstanceEntry::set_alignment(TxtAlign eXAlign)
     }
     WinBits nBits = m_xEntry->GetStyle();
     nBits &= ~(WB_LEFT | WB_CENTER | WB_RIGHT);
-    m_xEntry->SetStyle(nBits & nAlign);
+    m_xEntry->SetStyle(nBits | nAlign);
 }
 
 SalInstanceEntry::~SalInstanceEntry()


More information about the Libreoffice-commits mailing list