[Libreoffice-commits] core.git: bin/find-headers-to-move-inside-modules.py bin/find-mergedlib-can-be-private.classes.results bin/update_pch dbaccess/source include/svtools include/vcl solenv/clang-format svtools/source svx/source sw/source vcl/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Wed Jul 22 10:25:06 UTC 2020


 bin/find-headers-to-move-inside-modules.py            |    1 
 bin/find-mergedlib-can-be-private.classes.results     |    1 
 bin/update_pch                                        |    3 
 dbaccess/source/ui/tabledesign/TEditControl.cxx       |    1 
 dbaccess/source/ui/tabledesign/TableDesignControl.cxx |    1 
 include/svtools/editbrowsebox.hxx                     |  102 ----
 include/svtools/editimplementation.hxx                |  135 ------
 include/vcl/field.hxx                                 |    2 
 include/vcl/weldutils.hxx                             |   44 ++
 solenv/clang-format/excludelist                       |    1 
 svtools/source/brwbox/ebbcontrols.cxx                 |   91 ----
 svx/source/fmcomp/gridcell.cxx                        |   43 +-
 sw/source/ui/index/cnttab.cxx                         |    1 
 vcl/source/app/weldutils.cxx                          |   33 +
 vcl/source/control/field2.cxx                         |  372 ++++++++++++++----
 15 files changed, 445 insertions(+), 386 deletions(-)

New commits:
commit 9ebe58f0437bbb5714e629bd22e004ac895086d6
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Tue Jul 21 11:34:19 2020 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Jul 22 12:24:23 2020 +0200

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

diff --git a/bin/find-headers-to-move-inside-modules.py b/bin/find-headers-to-move-inside-modules.py
index f33922ee457d..af2ca619a461 100755
--- a/bin/find-headers-to-move-inside-modules.py
+++ b/bin/find-headers-to-move-inside-modules.py
@@ -13,7 +13,6 @@ with a.stdout as txt:
         header = line[8:].strip();
         if "README" in header: continue
         if header == "version.hrc": continue
-        if header == "svtools/editimplementation.hxx": continue
         # ignore URE headers
         if header.startswith("IwyuFilter_include.yaml"): continue
         if header.startswith("cppu/"): continue
diff --git a/bin/find-mergedlib-can-be-private.classes.results b/bin/find-mergedlib-can-be-private.classes.results
index b75fe09fb821..a9e425512aca 100644
--- a/bin/find-mergedlib-can-be-private.classes.results
+++ b/bin/find-mergedlib-can-be-private.classes.results
@@ -386,7 +386,6 @@ svt::MultiLineEditImplementation
 svt::MultiLineTextCell
 svt::OStringTransferable
 svt::PopupMenuControllerBase
-svt::SpinCellController
 svt::TemplateFolderCache
 svtools::AsynchronLink
 svtools::ToolbarPopup
diff --git a/bin/update_pch b/bin/update_pch
index 7411e79acb80..4226b02ec037 100755
--- a/bin/update_pch
+++ b/bin/update_pch
@@ -372,8 +372,7 @@ def filter_ignore(line, module):
             'LibreOfficeKit/LibreOfficeKitTypes.h', # Needs special directives
             'jerror.h',     # c++ unfriendly
             'jpeglib.h',    # c++ unfriendly
-            'boost/spirit/include/classic_core.hpp', # depends on BOOST_SPIRIT_DEBUG
-            'svtools/editimplementation.hxx' # no direct include
+            'boost/spirit/include/classic_core.hpp' # depends on BOOST_SPIRIT_DEBUG
         ]
 
     if module == 'accessibility':
diff --git a/dbaccess/source/ui/tabledesign/TEditControl.cxx b/dbaccess/source/ui/tabledesign/TEditControl.cxx
index 5073a4667717..c11a52cc3a2e 100644
--- a/dbaccess/source/ui/tabledesign/TEditControl.cxx
+++ b/dbaccess/source/ui/tabledesign/TEditControl.cxx
@@ -42,6 +42,7 @@
 #include "TableFieldControl.hxx"
 #include <dsntypes.hxx>
 #include <vcl/commandevent.hxx>
+#include <vcl/menu.hxx>
 #include <vcl/svapp.hxx>
 
 using namespace ::dbaui;
diff --git a/dbaccess/source/ui/tabledesign/TableDesignControl.cxx b/dbaccess/source/ui/tabledesign/TableDesignControl.cxx
index 2fe3e5ec906e..a969dc2c0f28 100644
--- a/dbaccess/source/ui/tabledesign/TableDesignControl.cxx
+++ b/dbaccess/source/ui/tabledesign/TableDesignControl.cxx
@@ -24,6 +24,7 @@
 #include <com/sun/star/beans/PropertyValue.hpp>
 #include <vcl/builder.hxx>
 #include <vcl/commandevent.hxx>
+#include <vcl/menu.hxx>
 #include <helpids.h>
 
 using namespace ::dbaui;
diff --git a/include/svtools/editbrowsebox.hxx b/include/svtools/editbrowsebox.hxx
index 98da5046e73f..aa162d1bd09b 100644
--- a/include/svtools/editbrowsebox.hxx
+++ b/include/svtools/editbrowsebox.hxx
@@ -25,22 +25,17 @@
 #include <memory>
 #include <svtools/svtdllapi.h>
 #include <tools/ref.hxx>
-#include <vcl/window.hxx>
 
 #include <svtools/brwbox.hxx>
 #include <svtools/brwhead.hxx>
 #include <tools/lineend.hxx>
 #include <vcl/InterimItemWindow.hxx>
-#include <vcl/edit.hxx>
 #include <vcl/weldutils.hxx>
 #include <o3tl/typed_flags_set.hxx>
 
 class BrowserDataWin;
-class Button;
-class SpinField;
 
 // EditBrowseBoxFlags (EBBF)
-
 enum class EditBrowseBoxFlags
 {
     NONE                       = 0x0000,
@@ -170,39 +165,6 @@ namespace svt
         }
     };
 
-    //= GenericEditImplementation
-    template <class EDIT>
-    class GenericEditImplementation : public IEditImplementation
-    {
-        EDIT&   m_rEdit;
-    public:
-        GenericEditImplementation( EDIT& _rEdit );
-
-        virtual Control&            GetControl() override;
-
-        virtual OUString            GetText( LineEnd aSeparator ) const override;
-        virtual void                SetText( const OUString& _rStr ) override;
-
-        virtual bool                IsReadOnly() const override;
-        virtual void                SetReadOnly( bool bReadOnly ) override;
-
-        virtual sal_Int32           GetMaxTextLen() const override;
-        virtual void                SetMaxTextLen( sal_Int32 _nMaxLen ) override;
-
-        virtual Selection           GetSelection() const override;
-        virtual void                SetSelection( const Selection& _rSelection ) override;
-
-        virtual void                ReplaceSelected( const OUString& _rStr ) override;
-        virtual OUString            GetSelected( LineEnd aSeparator ) const override;
-
-        virtual bool                IsValueChangedFromSaved() const override;
-        virtual void                SaveValue() override;
-
-        virtual void                Cut() override;
-        virtual void                Copy() override;
-        virtual void                Paste() override;
-    };
-
     class SVT_DLLPUBLIC ControlBase : public InterimItemWindow
     {
     public:
@@ -268,7 +230,7 @@ namespace svt
     public:
         EntryImplementation(EditControlBase& rEdit)
             : m_rEdit(rEdit)
-            , m_nMaxTextLen(EDIT_NOLIMIT)
+            , m_nMaxTextLen(0)
         {
             m_rEdit.connect_changed(LINK(this, EntryImplementation, ModifyHdl));
         }
@@ -307,7 +269,7 @@ namespace svt
         virtual void SetMaxTextLen( sal_Int32 nMaxLen ) override
         {
             m_nMaxTextLen = nMaxLen;
-            m_rEdit.get_widget().set_max_length(nMaxLen == EDIT_NOLIMIT ? 0 : nMaxLen);
+            m_rEdit.get_widget().set_max_length(m_nMaxTextLen);
         }
 
         virtual Selection GetSelection() const override
@@ -374,9 +336,6 @@ namespace svt
         }
     };
 
-    #include <svtools/editimplementation.hxx>
-
-
     //= MultiLineTextCell
 
     /** a multi line edit which can be used in a cell of an EditBrowseBox
@@ -403,28 +362,6 @@ namespace svt
         virtual bool ProcessKey(const KeyEvent& rKEvt) override;
     };
 
-    //= concrete edit implementations
-    typedef GenericEditImplementation< Edit >             EditImplementation_Base;
-    class EditImplementation final : public EditImplementation_Base
-    {
-        DECL_LINK(ModifyHdl, Edit&, void);
-    public:
-        EditImplementation( Edit& _rEdit ) : EditImplementation_Base( _rEdit )
-        {
-            _rEdit.SetModifyHdl(LINK(this, EditImplementation, ModifyHdl));
-        }
-
-        virtual bool CanUp() const override
-        {
-            return false;
-        }
-
-        virtual bool CanDown() const override
-        {
-            return false;
-        }
-    };
-
     class SVT_DLLPUBLIC MultiLineEditImplementation : public IEditImplementation
     {
         MultiLineTextCell& m_rEdit;
@@ -434,7 +371,7 @@ namespace svt
     public:
         MultiLineEditImplementation(MultiLineTextCell& rEdit)
             : m_rEdit(rEdit)
-            , m_nMaxTextLen(EDIT_NOLIMIT)
+            , m_nMaxTextLen(0)
         {
             m_rEdit.connect_changed(LINK(this, MultiLineEditImplementation, ModifyHdl));
         }
@@ -469,7 +406,7 @@ namespace svt
         virtual void SetMaxTextLen( sal_Int32 nMaxLen ) override
         {
             m_nMaxTextLen = nMaxLen;
-            m_rEdit.get_widget().set_max_length(nMaxLen == EDIT_NOLIMIT ? 0 : nMaxLen);
+            m_rEdit.get_widget().set_max_length(m_nMaxTextLen);
         }
 
         virtual Selection GetSelection() const override
@@ -537,7 +474,6 @@ namespace svt
         bool                    m_bOwnImplementation;   // did we create m_pEditImplementation?
 
     public:
-        EditCellController( Edit* _pEdit );
         EditCellController( EditControlBase* _pEdit );
         EditCellController( IEditImplementation* _pImplementation );
         virtual ~EditCellController( ) override;
@@ -559,22 +495,6 @@ namespace svt
         DECL_LINK(ModifyHdl, LinkParamNone*, void);
     };
 
-    //= SpinCellController
-    class UNLESS_MERGELIBS(SVT_DLLPUBLIC) SpinCellController final : public CellController
-    {
-    public:
-        SpinCellController(SpinField* pSpinField);
-        const SpinField& GetSpinWindow() const;
-        SpinField& GetSpinWindow();
-
-        virtual bool IsValueChangedFromSaved() const override;
-        virtual void SaveValue() override;
-
-    private:
-        virtual bool MoveAllowed(const KeyEvent& rEvt) const override;
-        DECL_LINK(ModifyHdl, Edit&, void);
-    };
-
     //= CheckBoxControl
     class SVT_DLLPUBLIC CheckBoxControl final : public ControlBase
     {
@@ -771,6 +691,20 @@ namespace svt
         DECL_LINK(ImplClickHdl, weld::Button&, void);
     };
 
+    class SVT_DLLPUBLIC PatternControl final : public EditControl
+    {
+    public:
+        PatternControl(BrowserDataWin* pParent);
+
+        weld::PatternFormatter& get_formatter() { return *m_xEntryFormatter; }
+
+        virtual void connect_changed(const Link<weld::Entry&, void>& rLink) override;
+
+        virtual void dispose() override;
+    private:
+        std::unique_ptr<weld::PatternFormatter> m_xEntryFormatter;
+    };
+
     //= FormattedFieldCellController
     class SVT_DLLPUBLIC FormattedFieldCellController final : public EditCellController
     {
diff --git a/include/svtools/editimplementation.hxx b/include/svtools/editimplementation.hxx
deleted file mode 100644
index 81728017af52..000000000000
--- a/include/svtools/editimplementation.hxx
+++ /dev/null
@@ -1,135 +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 SVTOOLS_IN_EDITBROWSEBOX_HXX
-#error "not to be included directly!"
-#endif
-
-
-template <class EDIT>
-GenericEditImplementation< EDIT >::GenericEditImplementation( EDIT& _rEdit )
-    :m_rEdit( _rEdit )
-{
-}
-
-template <class EDIT>
-Control& GenericEditImplementation< EDIT >::GetControl()
-{
-    return m_rEdit;
-}
-
-
-template <class EDIT>
-OUString GenericEditImplementation< EDIT >::GetText( LineEnd ) const
-{
-    // ignore the line end - this base implementation does not support it
-    return m_rEdit.GetText( );
-}
-
-
-template <class EDIT>
-void GenericEditImplementation< EDIT >::SetText( const OUString& _rStr )
-{
-    m_rEdit.SetText( _rStr );
-}
-
-
-template <class EDIT>
-Selection GenericEditImplementation< EDIT >::GetSelection() const
-{
-    return m_rEdit.GetSelection( );
-}
-
-
-template <class EDIT>
-void GenericEditImplementation< EDIT >::SetSelection( const Selection& _rSelection )
-{
-    m_rEdit.SetSelection( _rSelection );
-}
-
-
-template <class EDIT>
-void GenericEditImplementation< EDIT >::SetReadOnly( bool bReadOnly )
-{
-    m_rEdit.SetReadOnly( bReadOnly );
-}
-
-
-template <class EDIT>
-bool GenericEditImplementation< EDIT >::IsReadOnly() const
-{
-    return m_rEdit.IsReadOnly();
-}
-
-
-template <class EDIT>
-void GenericEditImplementation< EDIT >::ReplaceSelected( const OUString& _rStr )
-{
-    m_rEdit.ReplaceSelected( _rStr );
-}
-
-template <class EDIT>
-OUString GenericEditImplementation< EDIT >::GetSelected( LineEnd ) const
-{
-    return m_rEdit.GetSelected( );
-}
-
-template <class EDIT>
-void GenericEditImplementation< EDIT >::SetMaxTextLen( sal_Int32 _nMaxLen )
-{
-    m_rEdit.SetMaxTextLen( _nMaxLen );
-}
-
-template <class EDIT>
-sal_Int32 GenericEditImplementation< EDIT >::GetMaxTextLen() const
-{
-    return m_rEdit.GetMaxTextLen( );
-}
-
-template <class EDIT>
-bool GenericEditImplementation< EDIT >::IsValueChangedFromSaved() const
-{
-    return m_rEdit.IsValueChangedFromSaved();
-}
-
-template <class EDIT>
-void GenericEditImplementation< EDIT >::SaveValue()
-{
-    m_rEdit.SaveValue();
-}
-
-template <class EDIT>
-void GenericEditImplementation< EDIT >::Cut()
-{
-    m_rEdit.Cut();
-}
-
-template <class EDIT>
-void GenericEditImplementation< EDIT >::Copy()
-{
-    m_rEdit.Copy();
-}
-
-template <class EDIT>
-void GenericEditImplementation< EDIT >::Paste()
-{
-    m_rEdit.Paste();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/field.hxx b/include/vcl/field.hxx
index 36a786061bdb..ac72ac78b3c4 100644
--- a/include/vcl/field.hxx
+++ b/include/vcl/field.hxx
@@ -96,8 +96,6 @@ private:
 protected:
                             PatternFormatter(Edit* pEdit);
 
-    SAL_DLLPRIVATE void ImplSetMask(const OString& rEditMask,
-        const OUString& rLiteralMask);
     SAL_DLLPRIVATE bool     ImplIsSameMask() const { return mbSameMask; }
     SAL_DLLPRIVATE bool&    ImplGetInPattKeyInput() { return mbInPattKeyInput; }
 
diff --git a/include/vcl/weldutils.hxx b/include/vcl/weldutils.hxx
index cc2a49d4d881..75da11f586bd 100644
--- a/include/vcl/weldutils.hxx
+++ b/include/vcl/weldutils.hxx
@@ -312,6 +312,50 @@ private:
     mutable std::unique_ptr<CalendarWrapper> m_xCalendarWrapper;
 };
 
+class VCL_DLLPUBLIC PatternFormatter final
+{
+public:
+    PatternFormatter(weld::Entry& rEntry);
+    ~PatternFormatter();
+
+    weld::Entry& get_widget() { return m_rEntry; }
+
+    void SetMask(const OString& rEditMask, const OUString& rLiteralMask);
+    void SetStrictFormat(bool bStrict);
+    void ReformatAll();
+
+    /* PatternFormatter will set listeners to "changed", "focus-out", "focus-in"
+       and  "key-press" of the Entry so users that want to add their own listeners
+       to those must set them through this formatter and not directly on that entry.
+    */
+    void connect_changed(const Link<weld::Entry&, void>& rLink) { m_aModifyHdl = rLink; }
+    void connect_focus_out(const Link<weld::Widget&, void>& rLink) { m_aFocusOutHdl = rLink; }
+    void connect_focus_in(const Link<weld::Widget&, void>& rLink) { m_aFocusInHdl = rLink; }
+    void connect_key_press(const Link<const KeyEvent&, bool>& rLink) { m_aKeyPressHdl = rLink; }
+
+    void Modify();
+
+private:
+    weld::Entry& m_rEntry;
+    Link<weld::Entry&, void> m_aModifyHdl;
+    Link<weld::Widget&, void> m_aFocusInHdl;
+    Link<weld::Widget&, void> m_aFocusOutHdl;
+    Link<const KeyEvent&, bool> m_aKeyPressHdl;
+    bool m_bStrictFormat;
+    bool m_bSameMask;
+    bool m_bReformat;
+    bool m_bInPattKeyInput;
+    OString m_aEditMask;
+    OUString m_aLiteralMask;
+
+    void EntryGainFocus();
+    void EntryLostFocus();
+    DECL_DLLPRIVATE_LINK(ModifyHdl, weld::Entry&, void);
+    DECL_DLLPRIVATE_LINK(FocusInHdl, weld::Widget&, void);
+    DECL_DLLPRIVATE_LINK(FocusOutHdl, weld::Widget&, void);
+    DECL_DLLPRIVATE_LINK(KeyInputHdl, const KeyEvent&, bool);
+};
+
 // get the row the iterator is on
 VCL_DLLPUBLIC size_t GetAbsPos(const weld::TreeView& rTreeView, const weld::TreeIter& rIter);
 
diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist
index 0708c30817f7..1a1d6e3fc105 100644
--- a/solenv/clang-format/excludelist
+++ b/solenv/clang-format/excludelist
@@ -6573,7 +6573,6 @@ include/svtools/ctrlbox.hxx
 include/svtools/ctrltool.hxx
 include/svtools/dialogclosedlistener.hxx
 include/svtools/editbrowsebox.hxx
-include/svtools/editimplementation.hxx
 include/svtools/editsyntaxhighlighter.hxx
 include/svtools/ehdl.hxx
 include/svtools/embedhlp.hxx
diff --git a/svtools/source/brwbox/ebbcontrols.cxx b/svtools/source/brwbox/ebbcontrols.cxx
index 3f1c0196e838..b228985547d8 100644
--- a/svtools/source/brwbox/ebbcontrols.cxx
+++ b/svtools/source/brwbox/ebbcontrols.cxx
@@ -17,10 +17,7 @@
  */
 
 #include <svtools/editbrowsebox.hxx>
-#include <vcl/spinfld.hxx>
 #include <vcl/svapp.hxx>
-#include <vcl/xtextedt.hxx>
-#include <vcl/textview.hxx>
 #include <vcl/virdev.hxx>
 
 namespace svt
@@ -288,20 +285,6 @@ namespace svt
         CallModifyHdls();
     }
 
-    IMPL_LINK_NOARG(EditImplementation, ModifyHdl, Edit&, void)
-    {
-        CallModifyHdls();
-    }
-
-    //= EditCellController
-    EditCellController::EditCellController( Edit* _pEdit )
-        :CellController( _pEdit )
-        ,m_pEditImplementation( new EditImplementation( *_pEdit ) )
-        ,m_bOwnImplementation( true )
-    {
-        m_pEditImplementation->SetModifyHdl( LINK(this, EditCellController, ModifyHdl) );
-    }
-
     EditCellController::EditCellController( IEditImplementation* _pImplementation )
         :CellController( &_pImplementation->GetControl() )
         ,m_pEditImplementation( _pImplementation )
@@ -536,6 +519,25 @@ namespace svt
         FormattedControlBase::dispose();
     }
 
+    PatternControl::PatternControl(BrowserDataWin* pParent)
+        : EditControl(pParent)
+    {
+        m_xWidget->connect_key_press(Link<const KeyEvent&, bool>()); // 1) acknowledge we first remove the old one
+        m_xEntryFormatter.reset(new weld::PatternFormatter(*m_xWidget));
+        m_xEntryFormatter->connect_key_press(LINK(this, ControlBase, KeyInputHdl)); // 2) and here we reattach via the formatter
+    }
+
+    void PatternControl::connect_changed(const Link<weld::Entry&, void>& rLink)
+    {
+        m_xEntryFormatter->connect_changed(rLink);
+    }
+
+    void PatternControl::dispose()
+    {
+        m_xEntryFormatter.reset();
+        EditControl::dispose();
+    }
+
     EditCellController::EditCellController(EditControlBase* pEdit)
         : CellController(pEdit)
         , m_pEditImplementation(new EntryImplementation(*pEdit))
@@ -600,61 +602,6 @@ namespace svt
         callModifyHdl();
     }
 
-    //= SpinCellController
-    SpinCellController::SpinCellController(SpinField* pWin)
-                         :CellController(pWin)
-    {
-        GetSpinWindow().SetModifyHdl( LINK(this, SpinCellController, ModifyHdl) );
-    }
-
-    const SpinField& SpinCellController::GetSpinWindow() const
-    {
-        return static_cast<const SpinField &>(GetWindow());
-    }
-
-    SpinField& SpinCellController::GetSpinWindow()
-    {
-        return static_cast<SpinField &>(GetWindow());
-    }
-
-    void SpinCellController::SaveValue()
-    {
-        GetSpinWindow().SaveValue();
-    }
-
-    bool SpinCellController::MoveAllowed(const KeyEvent& rEvt) const
-    {
-        bool bResult;
-        switch (rEvt.GetKeyCode().GetCode())
-        {
-            case KEY_END:
-            case KEY_RIGHT:
-            {
-                Selection aSel = GetSpinWindow().GetSelection();
-                bResult = !aSel && aSel.Max() == GetSpinWindow().GetText().getLength();
-            }   break;
-            case KEY_HOME:
-            case KEY_LEFT:
-            {
-                Selection aSel = GetSpinWindow().GetSelection();
-                bResult = !aSel && aSel.Min() == 0;
-            }   break;
-            default:
-                bResult = true;
-        }
-        return bResult;
-    }
-
-    bool SpinCellController::IsValueChangedFromSaved() const
-    {
-        return GetSpinWindow().IsValueChangedFromSaved();
-    }
-
-    IMPL_LINK_NOARG(SpinCellController, ModifyHdl, Edit&, void)
-    {
-        callModifyHdl();
-    }
-
     //= FormattedFieldCellController
     FormattedFieldCellController::FormattedFieldCellController( FormattedControlBase* _pFormatted )
         : EditCellController(_pFormatted)
diff --git a/svx/source/fmcomp/gridcell.cxx b/svx/source/fmcomp/gridcell.cxx
index 4005c0d2a7d1..b94f20727482 100644
--- a/svx/source/fmcomp/gridcell.cxx
+++ b/svx/source/fmcomp/gridcell.cxx
@@ -1728,7 +1728,6 @@ DbPatternField::DbPatternField( DbGridColumn& _rColumn, const Reference<XCompone
     doPropertyListening( FM_PROP_STRICTFORMAT );
 }
 
-
 void DbPatternField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
 {
     DBG_ASSERT( m_pWindow, "DbPatternField::implAdjustGenericFieldSetting: not to be called without window!" );
@@ -1746,18 +1745,21 @@ void DbPatternField::implAdjustGenericFieldSetting( const Reference< XPropertySe
 
     OString aAsciiEditMask(OUStringToOString(aEditMask, RTL_TEXTENCODING_ASCII_US));
 
-    static_cast< PatternField* >( m_pWindow.get() )->SetMask( aAsciiEditMask, aLitMask );
-    static_cast< PatternField* >( m_pPainter.get() )->SetMask( aAsciiEditMask, aLitMask );
-    static_cast< PatternField* >( m_pWindow.get() )->SetStrictFormat( bStrict );
-    static_cast< PatternField* >( m_pPainter.get() )->SetStrictFormat( bStrict );
+    weld::PatternFormatter& rEditFormatter = static_cast<PatternControl*>(m_pWindow.get())->get_formatter();
+    rEditFormatter.SetMask(aAsciiEditMask, aLitMask);
+    rEditFormatter.SetStrictFormat(bStrict);
+
+    weld::PatternFormatter& rPaintFormatter = static_cast<PatternControl*>(m_pPainter.get())->get_formatter();
+    rPaintFormatter.SetMask(aAsciiEditMask, aLitMask);
+    rPaintFormatter.SetStrictFormat(bStrict);
 }
 
 void DbPatternField::Init(BrowserDataWin& rParent, const Reference< XRowSet >& xCursor)
 {
     m_rColumn.SetAlignmentFromModel(-1);
 
-    m_pWindow = VclPtr<PatternField>::Create( &rParent, 0 );
-    m_pPainter= VclPtr<PatternField>::Create( &rParent, 0 );
+    m_pWindow = VclPtr<PatternControl>::Create(&rParent);
+    m_pPainter= VclPtr<PatternControl>::Create(&rParent);
 
     Reference< XPropertySet >   xModel( m_rColumn.getModel() );
     implAdjustGenericFieldSetting( xModel );
@@ -1767,17 +1769,17 @@ void DbPatternField::Init(BrowserDataWin& rParent, const Reference< XRowSet >& x
 
 CellControllerRef DbPatternField::CreateController() const
 {
-    return new SpinCellController( static_cast< PatternField* >( m_pWindow.get() ) );
+    return new EditCellController(static_cast<PatternControl*>(m_pWindow.get()));
 }
 
 OUString DbPatternField::impl_formatText( const OUString& _rText )
 {
-    m_pPainter->SetText( _rText );
-    static_cast< PatternField* >( m_pPainter.get() )->ReformatAll();
-    return m_pPainter->GetText();
+    weld::PatternFormatter& rPaintFormatter = static_cast<PatternControl*>(m_pPainter.get())->get_formatter();
+    rPaintFormatter.get_widget().set_text(_rText);
+    rPaintFormatter.ReformatAll();
+    return rPaintFormatter.get_widget().get_text();
 }
 
-
 OUString DbPatternField::GetFormatText(const Reference< css::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
 {
     bool bIsForPaint = _rxField != m_rColumn.GetField();
@@ -1800,11 +1802,11 @@ OUString DbPatternField::GetFormatText(const Reference< css::sdb::XColumn >& _rx
     return impl_formatText( sText );
 }
 
-
 void DbPatternField::UpdateFromField( const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
 {
-    static_cast< Edit* >( m_pWindow.get() )->SetText( GetFormatText( _rxField, _rxFormatter ) );
-    static_cast< Edit* >( m_pWindow.get() )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
+    weld::Entry& rEntry = static_cast<PatternControl*>(m_pWindow.get())->get_widget();
+    rEntry.set_text(GetFormatText(_rxField, _rxFormatter));
+    rEntry.select_region(-1, 0);
 }
 
 void DbPatternField::updateFromModel( Reference< XPropertySet > _rxModel )
@@ -1814,14 +1816,15 @@ void DbPatternField::updateFromModel( Reference< XPropertySet > _rxModel )
     OUString sText;
     _rxModel->getPropertyValue( FM_PROP_TEXT ) >>= sText;
 
-    static_cast< Edit* >( m_pWindow.get() )->SetText( impl_formatText( sText ) );
-    static_cast< Edit* >( m_pWindow.get() )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
+    weld::Entry& rEntry = static_cast<PatternControl*>(m_pWindow.get())->get_widget();
+    rEntry.set_text(impl_formatText(sText));
+    rEntry.select_region(-1, 0);
 }
 
 bool DbPatternField::commitControl()
 {
-    OUString aText(m_pWindow->GetText());
-    m_rColumn.getModel()->setPropertyValue(FM_PROP_TEXT, makeAny(aText));
+    weld::Entry& rEntry = static_cast<PatternControl*>(m_pWindow.get())->get_widget();
+    m_rColumn.getModel()->setPropertyValue(FM_PROP_TEXT, makeAny(rEntry.get_text()));
     return true;
 }
 
@@ -2770,7 +2773,7 @@ CellControllerRef DbFilterField::CreateController() const
             if (m_bFilterList)
                 xController = new ComboBoxCellController(static_cast<ComboBoxControl*>(m_pWindow.get()));
             else
-                xController = new EditCellController(static_cast<Edit*>(m_pWindow.get()));
+                xController = new EditCellController(static_cast<EditControlBase*>(m_pWindow.get()));
     }
     return xController;
 }
diff --git a/sw/source/ui/index/cnttab.cxx b/sw/source/ui/index/cnttab.cxx
index 3cb000eba8ec..ca8da21f9c64 100644
--- a/sw/source/ui/index/cnttab.cxx
+++ b/sw/source/ui/index/cnttab.cxx
@@ -23,6 +23,7 @@
 #include <sal/log.hxx>
 #include <svl/style.hxx>
 #include <vcl/weld.hxx>
+#include <vcl/edit.hxx>
 #include <svl/stritem.hxx>
 #include <unotools/pathoptions.hxx>
 #include <sfx2/viewfrm.hxx>
diff --git a/vcl/source/app/weldutils.cxx b/vcl/source/app/weldutils.cxx
index e24566675123..8b5532fccc8b 100644
--- a/vcl/source/app/weldutils.cxx
+++ b/vcl/source/app/weldutils.cxx
@@ -446,6 +446,39 @@ void DateFormatter::SetExtDateFormat(ExtDateFieldFormat eFormat)
 }
 
 DateFormatter::~DateFormatter() = default;
+
+PatternFormatter::PatternFormatter(weld::Entry& rEntry)
+    : m_rEntry(rEntry)
+    , m_bStrictFormat(false)
+    , m_bSameMask(true)
+    , m_bReformat(false)
+    , m_bInPattKeyInput(false)
+{
+    m_rEntry.connect_changed(LINK(this, PatternFormatter, ModifyHdl));
+    m_rEntry.connect_focus_in(LINK(this, PatternFormatter, FocusInHdl));
+    m_rEntry.connect_focus_out(LINK(this, PatternFormatter, FocusOutHdl));
+    m_rEntry.connect_key_press(LINK(this, PatternFormatter, KeyInputHdl));
+}
+
+IMPL_LINK_NOARG(PatternFormatter, ModifyHdl, weld::Entry&, void) { Modify(); }
+
+IMPL_LINK_NOARG(PatternFormatter, FocusOutHdl, weld::Widget&, void)
+{
+    EntryLostFocus();
+    m_aFocusOutHdl.Call(m_rEntry);
+}
+
+IMPL_LINK_NOARG(PatternFormatter, FocusInHdl, weld::Widget&, void)
+{
+    EntryGainFocus();
+    m_aFocusInHdl.Call(m_rEntry);
+}
+
+PatternFormatter::~PatternFormatter()
+{
+    m_rEntry.connect_changed(Link<weld::Entry&, void>());
+    m_rEntry.connect_focus_out(Link<weld::Widget&, void>());
+}
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/control/field2.cxx b/vcl/source/control/field2.cxx
index 1cbf4fcf9e92..a300bf50627a 100644
--- a/vcl/source/control/field2.cxx
+++ b/vcl/source/control/field2.cxx
@@ -361,12 +361,12 @@ static void ImplPatternMaxPos( const OUString& rStr, const OString& rEditMask,
         rPos = nCursorPos;
 }
 
-static void ImplPatternProcessStrictModify( Edit* pEdit,
-                                            const OString& rEditMask,
-                                            const OUString& rLiteralMask,
-                                            bool bSameMask )
+static OUString ImplPatternProcessStrictModify(const OUString& rText,
+                                               const OString& rEditMask,
+                                               const OUString& rLiteralMask,
+                                               bool bSameMask)
 {
-    OUString aText = pEdit->GetText();
+    OUString aText(rText);
 
     // remove leading blanks
     if (bSameMask && !rEditMask.isEmpty())
@@ -387,7 +387,20 @@ static void ImplPatternProcessStrictModify( Edit* pEdit,
         aText = aText.copy( i );
     }
 
-    OUString aNewText = ImplPatternReformat(aText, rEditMask, rLiteralMask, 0);
+    return ImplPatternReformat(aText, rEditMask, rLiteralMask, 0);
+}
+
+static void ImplPatternProcessStrictModify( Edit* pEdit,
+                                            const OString& rEditMask,
+                                            const OUString& rLiteralMask,
+                                            bool bSameMask )
+{
+    OUString aText = pEdit->GetText();
+    OUString aNewText = ImplPatternProcessStrictModify(aText,
+                                                       rEditMask,
+                                                       rLiteralMask,
+                                                       bSameMask);
+
     if ( aNewText != aText )
     {
         // adjust selection such that it remains at the end if it was there before
@@ -411,6 +424,43 @@ static void ImplPatternProcessStrictModify( Edit* pEdit,
     }
 }
 
+static void ImplPatternProcessStrictModify( weld::Entry& rEntry,
+                                            const OString& rEditMask,
+                                            const OUString& rLiteralMask,
+                                            bool bSameMask )
+{
+    OUString aText = rEntry.get_text();
+    OUString aNewText = ImplPatternProcessStrictModify(aText,
+                                                       rEditMask,
+                                                       rLiteralMask,
+                                                       bSameMask);
+
+    if (aNewText != aText)
+    {
+        // adjust selection such that it remains at the end if it was there before
+        int nStartPos, nEndPos;
+        rEntry.get_selection_bounds(nStartPos, nEndPos);
+
+        int nMaxSel = std::max(nStartPos, nEndPos);
+        if (nMaxSel >= aText.getLength())
+        {
+            sal_Int32 nMaxPos = aNewText.getLength();
+            ImplPatternMaxPos(aNewText, rEditMask, 0, bSameMask, nMaxSel, nMaxPos);
+            if (nStartPos == nEndPos)
+            {
+                nStartPos = nMaxPos;
+                nEndPos = nMaxPos;
+            }
+            else if (nStartPos > nMaxPos)
+                nStartPos = nMaxPos;
+            else
+                nEndPos = nMaxPos;
+        }
+        rEntry.set_text(aNewText);
+        rEntry.select_region(nStartPos, nEndPos);
+    }
+}
+
 static sal_Int32 ImplPatternLeftPos(const OString& rEditMask, sal_Int32 nCursorPos)
 {
     // search non-literal predecessor
@@ -447,7 +497,26 @@ static sal_Int32 ImplPatternRightPos( const OUString& rStr, const OString& rEdit
     return nNewPos;
 }
 
-static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
+namespace
+{
+    class IEditImplementation
+    {
+    public:
+        virtual ~IEditImplementation() {}
+
+        virtual OUString GetText() const = 0;
+        virtual void SetText(const OUString& rStr, const Selection& rSelection) = 0;
+
+        virtual Selection GetSelection() const = 0;
+        virtual void SetSelection(const Selection& rSelection) = 0;
+
+        virtual bool IsInsertMode() const = 0;
+
+        virtual void SetModified() = 0;
+    };
+}
+
+static bool ImplPatternProcessKeyInput( IEditImplementation& rEdit, const KeyEvent& rKEvt,
                                         const OString& rEditMask,
                                         const OUString& rLiteralMask,
                                         bool bStrictFormat,
@@ -458,7 +527,7 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
         return false;
 
     sal_uInt16 nFormatFlags = 0;
-    Selection   aOldSel     = pEdit->GetSelection();
+    Selection   aOldSel     = rEdit.GetSelection();
     vcl::KeyCode aCode      = rKEvt.GetKeyCode();
     sal_Unicode cChar       = rKEvt.GetCharCode();
     sal_uInt16      nKeyCode    = aCode.GetCode();
@@ -474,7 +543,7 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
             Selection aSel( ImplPatternLeftPos( rEditMask, nCursorPos ) );
             if ( bShift )
                 aSel.Min() = aOldSel.Min();
-            pEdit->SetSelection( aSel );
+            rEdit.SetSelection( aSel );
             return true;
         }
         else if ( nKeyCode == KEY_RIGHT )
@@ -484,12 +553,12 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
             Selection aSel( aOldSel );
             aSel.Justify();
             nCursorPos = aSel.Min();
-            aSel.Max() = ImplPatternRightPos( pEdit->GetText(), rEditMask, nFormatFlags, bSameMask, nCursorPos );
+            aSel.Max() = ImplPatternRightPos( rEdit.GetText(), rEditMask, nFormatFlags, bSameMask, nCursorPos );
             if ( bShift )
                 aSel.Min() = aOldSel.Min();
             else
                 aSel.Min() = aSel.Max();
-            pEdit->SetSelection( aSel );
+            rEdit.SetSelection( aSel );
             return true;
         }
         else if ( nKeyCode == KEY_HOME )
@@ -506,7 +575,7 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
             Selection aSel( nNewPos );
             if ( bShift )
                 aSel.Min() = aOldSel.Min();
-            pEdit->SetSelection( aSel );
+            rEdit.SetSelection( aSel );
             return true;
         }
         else if ( nKeyCode == KEY_END )
@@ -521,18 +590,18 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
             Selection aSel( aOldSel );
             aSel.Justify();
             nCursorPos = static_cast<sal_Int32>(aSel.Min());
-            ImplPatternMaxPos( pEdit->GetText(), rEditMask, nFormatFlags, bSameMask, nCursorPos, nNewPos );
+            ImplPatternMaxPos( rEdit.GetText(), rEditMask, nFormatFlags, bSameMask, nCursorPos, nNewPos );
             aSel.Max() = nNewPos;
             if ( bShift )
                 aSel.Min() = aOldSel.Min();
             else
                 aSel.Min() = aSel.Max();
-            pEdit->SetSelection( aSel );
+            rEdit.SetSelection( aSel );
             return true;
         }
         else if ( (nKeyCode == KEY_BACKSPACE) || (nKeyCode == KEY_DELETE) )
         {
-            OUString          aOldStr( pEdit->GetText() );
+            OUString          aOldStr( rEdit.GetText() );
             OUStringBuffer    aStr( aOldStr );
             Selection   aSel = aOldSel;
 
@@ -580,13 +649,12 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
                 if ( bSameMask )
                     aStr = ImplPatternReformat( aStr.toString(), rEditMask, rLiteralMask, nFormatFlags );
                 rbInKeyInput = true;
-                pEdit->SetText( aStr.toString(), Selection( nNewPos ) );
-                pEdit->SetModifyFlag();
-                pEdit->Modify();
+                rEdit.SetText( aStr.toString(), Selection( nNewPos ) );
+                rEdit.SetModified();
                 rbInKeyInput = false;
             }
             else
-                pEdit->SetSelection( Selection( nNewPos ) );
+                rEdit.SetSelection( Selection( nNewPos ) );
 
             return true;
         }
@@ -633,10 +701,10 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
                              ImplCommaPointCharEqual( cChar, rLiteralMask[nTempPos] ) )
                         {
                             nTempPos++;
-                            ImplPatternMaxPos( pEdit->GetText(), rEditMask, nFormatFlags, bSameMask, nNewPos, nTempPos );
+                            ImplPatternMaxPos( rEdit.GetText(), rEditMask, nFormatFlags, bSameMask, nNewPos, nTempPos );
                             if ( nTempPos > nNewPos )
                             {
-                                pEdit->SetSelection( Selection( nTempPos ) );
+                                rEdit.SetSelection( Selection( nTempPos ) );
                                 return true;
                             }
                         }
@@ -653,9 +721,9 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
         cChar = 0;
     if ( cChar )
     {
-        OUStringBuffer  aStr = pEdit->GetText();
+        OUStringBuffer  aStr = rEdit.GetText();
         bool        bError = false;
-        if ( bSameMask && pEdit->IsInsertMode() )
+        if ( bSameMask && rEdit.IsInsertMode() )
         {
             // crop spaces and literals at the end until current position
             sal_Int32 n = aStr.getLength();
@@ -706,9 +774,8 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
         {
             rbInKeyInput = true;
             Selection aNewSel( ImplPatternRightPos( aStr.toString(), rEditMask, nFormatFlags, bSameMask, nNewPos ) );
-            pEdit->SetText( aStr.toString(), aNewSel );
-            pEdit->SetModifyFlag();
-            pEdit->Modify();
+            rEdit.SetText( aStr.toString(), aNewSel );
+            rEdit.SetModified();
             rbInKeyInput = false;
         }
     }
@@ -716,55 +783,58 @@ static bool ImplPatternProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
     return true;
 }
 
-void PatternFormatter::ImplSetMask(const OString& rEditMask, const OUString& rLiteralMask)
+namespace
 {
-    m_aEditMask     = rEditMask;
-    maLiteralMask   = rLiteralMask;
-    mbSameMask      = true;
-
-    if ( m_aEditMask.getLength() != maLiteralMask.getLength() )
+    bool ImplSetMask(OString& rEditMask, OUString& rLiteralMask)
     {
-        OUStringBuffer aBuf(maLiteralMask);
-        if (m_aEditMask.getLength() < aBuf.getLength())
-            aBuf.remove(m_aEditMask.getLength(), aBuf.getLength() - m_aEditMask.getLength());
-        else
-            comphelper::string::padToLength(aBuf, m_aEditMask.getLength(), ' ');
-        maLiteralMask = aBuf.makeStringAndClear();
-    }
+        bool bSameMask      = true;
 
-    // Strict mode allows only the input mode if only equal characters are allowed as mask and if
-    // only spaces are specified which are not allowed by the mask
-    sal_Int32   i = 0;
-    char    c = 0;
-    while ( i < rEditMask.getLength() )
-    {
-        char cTemp = rEditMask[i];
-        if ( cTemp != EDITMASK_LITERAL )
+        if (rEditMask.getLength() != rLiteralMask.getLength())
         {
-            if ( (cTemp == EDITMASK_ALLCHAR) ||
-                 (cTemp == EDITMASK_UPPERALLCHAR) ||
-                 (cTemp == EDITMASK_NUMSPACE) )
-            {
-                mbSameMask = false;
-                break;
-            }
-            if ( i < rLiteralMask.getLength() )
+            OUStringBuffer aBuf(rLiteralMask);
+            if (rEditMask.getLength() < aBuf.getLength())
+                aBuf.remove(rEditMask.getLength(), aBuf.getLength() - rEditMask.getLength());
+            else
+                comphelper::string::padToLength(aBuf, rEditMask.getLength(), ' ');
+            rLiteralMask = aBuf.makeStringAndClear();
+        }
+
+        // Strict mode allows only the input mode if only equal characters are allowed as mask and if
+        // only spaces are specified which are not allowed by the mask
+        sal_Int32   i = 0;
+        char    c = 0;
+        while ( i < rEditMask.getLength() )
+        {
+            char cTemp = rEditMask[i];
+            if ( cTemp != EDITMASK_LITERAL )
             {
-                if ( rLiteralMask[i] != ' ' )
+                if ( (cTemp == EDITMASK_ALLCHAR) ||
+                     (cTemp == EDITMASK_UPPERALLCHAR) ||
+                     (cTemp == EDITMASK_NUMSPACE) )
                 {
-                    mbSameMask = false;
+                    bSameMask = false;
+                    break;
+                }
+                if ( i < rLiteralMask.getLength() )
+                {
+                    if ( rLiteralMask[i] != ' ' )
+                    {
+                        bSameMask = false;
+                        break;
+                    }
+                }
+                if ( !c )
+                    c = cTemp;
+                if ( cTemp != c )
+                {
+                    bSameMask = false;
                     break;
                 }
             }
-            if ( !c )
-                c = cTemp;
-            if ( cTemp != c )
-            {
-                mbSameMask = false;
-                break;
-            }
+            i++;
         }
-        i++;
+
+        return bSameMask;
     }
 }
 
@@ -782,10 +852,128 @@ PatternFormatter::~PatternFormatter()
 void PatternFormatter::SetMask( const OString& rEditMask,
                                 const OUString& rLiteralMask )
 {
-    ImplSetMask( rEditMask, rLiteralMask );
+    m_aEditMask = rEditMask;
+    maLiteralMask = rLiteralMask;
+    mbSameMask = ImplSetMask(m_aEditMask, maLiteralMask);
     ReformatAll();
 }
 
+namespace
+{
+    class EntryImplementation : public IEditImplementation
+    {
+    public:
+        EntryImplementation(weld::PatternFormatter& rFormatter)
+            : m_rFormatter(rFormatter)
+            , m_rEntry(rFormatter.get_widget())
+        {
+        }
+
+        virtual OUString GetText() const override
+        {
+            return m_rEntry.get_text();
+        }
+
+        virtual void SetText(const OUString& rStr, const Selection& rSelection) override
+        {
+            m_rEntry.set_text(rStr);
+            SetSelection(rSelection);
+        }
+
+        virtual Selection GetSelection() const override
+        {
+            int nStartPos, nEndPos;
+            m_rEntry.get_selection_bounds(nStartPos, nEndPos);
+            return Selection(nStartPos, nEndPos);
+        }
+
+        virtual void SetSelection(const Selection& rSelection) override
+        {
+            auto nMin = rSelection.Min();
+            auto nMax = rSelection.Max();
+            m_rEntry.select_region(nMin < 0 ? 0 : nMin, nMax == SELECTION_MAX ? -1 : nMax);
+        }
+
+        virtual bool IsInsertMode() const override
+        {
+            return !m_rEntry.get_overwrite_mode();
+        }
+
+        virtual void SetModified() override
+        {
+            m_rFormatter.Modify();
+        }
+
+    private:
+        weld::PatternFormatter& m_rFormatter;
+        weld::Entry& m_rEntry;
+    };
+}
+
+namespace weld
+{
+    void PatternFormatter::SetStrictFormat(bool bStrict)
+    {
+        if (bStrict != m_bStrictFormat)
+        {
+            m_bStrictFormat = bStrict;
+            if (m_bStrictFormat)
+                ReformatAll();
+        }
+    }
+
+    void PatternFormatter::SetMask(const OString& rEditMask,
+                                   const OUString& rLiteralMask)
+    {
+        m_aEditMask = rEditMask;
+        m_aLiteralMask = rLiteralMask;
+        m_bSameMask = ImplSetMask(m_aEditMask, m_aLiteralMask);
+        ReformatAll();
+    }
+
+    void PatternFormatter::ReformatAll()
+    {
+        m_rEntry.set_text(ImplPatternReformat(m_rEntry.get_text(), m_aEditMask, m_aLiteralMask, 0/*nFormatFlags*/));
+        if (!m_bSameMask && m_bStrictFormat && m_rEntry.get_editable())
+            m_rEntry.set_overwrite_mode(true);
+    }
+
+    void PatternFormatter::EntryGainFocus()
+    {
+        m_bReformat = false;
+    }
+
+    void PatternFormatter::EntryLostFocus()
+    {
+        if (m_bReformat)
+            ReformatAll();
+    }
+
+    void PatternFormatter::Modify()
+    {
+        if (!m_bInPattKeyInput)
+        {
+            if (m_bStrictFormat)
+                ImplPatternProcessStrictModify(m_rEntry, m_aEditMask, m_aLiteralMask, m_bSameMask);
+            else
+                m_bReformat = true;
+        }
+        m_aModifyHdl.Call(m_rEntry);
+    }
+
+    IMPL_LINK(PatternFormatter, KeyInputHdl, const KeyEvent&, rKEvt, bool)
+    {
+        if (m_aKeyPressHdl.Call(rKEvt))
+            return true;
+        if (rKEvt.GetKeyCode().IsMod2())
+            return false;
+        EntryImplementation aAdapt(*this);
+        return ImplPatternProcessKeyInput(aAdapt, rKEvt, m_aEditMask, m_aLiteralMask,
+                                          m_bStrictFormat,
+                                          m_bSameMask, m_bInPattKeyInput);
+    }
+}
+
 void PatternFormatter::SetString( const OUString& rStr )
 {
     if ( GetField() )
@@ -826,11 +1014,58 @@ void PatternField::dispose()
     SpinField::dispose();
 }
 
+namespace
+{
+    class EditImplementation : public IEditImplementation
+    {
+    public:
+        EditImplementation(Edit& rEdit)
+            : m_rEdit(rEdit)
+        {
+        }
+
+        virtual OUString GetText() const override
+        {
+            return m_rEdit.GetText();
+        }
+
+        virtual void SetText(const OUString& rStr, const Selection& rSelection) override
+        {
+            m_rEdit.SetText(rStr, rSelection);
+        }
+
+        virtual Selection GetSelection() const override
+        {
+            return m_rEdit.GetSelection();
+        }
+
+        virtual void SetSelection(const Selection& rSelection) override
+        {
+            m_rEdit.SetSelection(rSelection);
+        }
+
+        virtual bool IsInsertMode() const override
+        {
+            return m_rEdit.IsInsertMode();
+        }
+
+        virtual void SetModified() override
+        {
+            m_rEdit.SetModifyFlag();
+            m_rEdit.Modify();
+        }
+
+    private:
+        Edit& m_rEdit;
+    };
+}
+
 bool PatternField::PreNotify( NotifyEvent& rNEvt )
 {
     if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() )
     {
-        if ( ImplPatternProcessKeyInput( GetField(), *rNEvt.GetKeyEvent(), GetEditMask(), GetLiteralMask(),
+        EditImplementation aAdapt(*GetField());
+        if ( ImplPatternProcessKeyInput( aAdapt, *rNEvt.GetKeyEvent(), GetEditMask(), GetLiteralMask(),
                                          IsStrictFormat(),
                                          ImplIsSameMask(), ImplGetInPattKeyInput() ) )
             return true;
@@ -882,7 +1117,8 @@ bool PatternBox::PreNotify( NotifyEvent& rNEvt )
 {
     if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() )
     {
-        if ( ImplPatternProcessKeyInput( GetField(), *rNEvt.GetKeyEvent(), GetEditMask(), GetLiteralMask(),
+        EditImplementation aAdapt(*GetField());
+        if ( ImplPatternProcessKeyInput( aAdapt, *rNEvt.GetKeyEvent(), GetEditMask(), GetLiteralMask(),
                                          IsStrictFormat(),
                                          ImplIsSameMask(), ImplGetInPattKeyInput() ) )
             return true;


More information about the Libreoffice-commits mailing list