tdf#93889 Remove a busy loop

Add SyncFocusState(). Before we needed
pRefInputEdit or bRefInputMode.

Change-Id: Ib1d8c4d26f45824fd6652ef29d56ddf8d276319d
Reviewed-on: https://gerrit.libreoffice.org/22823
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Michael Meeks <michael.meeks@collabora.com>
diff --git a/sc/source/ui/dbgui/sfiltdlg.cxx b/sc/source/ui/dbgui/sfiltdlg.cxx
index 990939dc..f00924e 100644
--- a/sc/source/ui/dbgui/sfiltdlg.cxx
+++ b/sc/source/ui/dbgui/sfiltdlg.cxx
@@ -18,7 +18,6 @@
 */

#include <sfx2/dispatch.hxx>
#include <vcl/idle.hxx>

#include "uiitems.hxx"
#include "rangenam.hxx"
@@ -57,8 +56,7 @@ ScSpecialFilterDlg::ScSpecialFilterDlg( SfxBindings* pB, SfxChildWindow* pCW, vc
        pViewData       ( nullptr ),
        pDoc            ( nullptr ),
        pRefInputEdit   ( nullptr ),
        bRefInputMode   ( false ),
        pIdle          ( nullptr )
        bRefInputMode   ( false )
{
        get(pLbFilterArea,"lbfilterarea");
        get(pEdFilterArea,"edfilterarea");
@@ -85,12 +83,6 @@ ScSpecialFilterDlg::ScSpecialFilterDlg( SfxBindings* pB, SfxChildWindow* pCW, vc
    Init( rArgSet );
    pEdFilterArea->GrabFocus();

    // Hack: RefInput-Kontrolle
    pIdle = new Idle;
    // FIXME: this is an abomination
    pIdle->SetPriority( SchedulerPriority::LOWEST );
    pIdle->SetIdleHdl( LINK( this, ScSpecialFilterDlg, TimeOutHdl ) );
    pIdle->Start();

    pLbCopyArea->SetAccessibleName(pBtnCopyResult->GetText());
    pEdCopyArea->SetAccessibleName(pBtnCopyResult->GetText());
@@ -112,10 +104,6 @@ void ScSpecialFilterDlg::dispose()

    delete pOutItem;

    // Hack: RefInput-Kontrolle
    pIdle->Stop();
    delete pIdle;

    pLbFilterArea.clear();
    pEdFilterArea.clear();
    pRbFilterArea.clear();
@@ -228,6 +216,7 @@ bool ScSpecialFilterDlg::Close()

void ScSpecialFilterDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
{
    SyncFocusState();
    if ( bRefInputMode && pRefInputEdit )       // Nur moeglich, wenn im Referenz-Editmodus
    {
        if ( rRef.aStart != rRef.aEnd )
@@ -247,6 +236,7 @@ void ScSpecialFilterDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )

void ScSpecialFilterDlg::SetActive()
{
    SyncFocusState();
    if ( bRefInputMode )
    {
        if ( pRefInputEdit == pEdCopyArea )
@@ -399,30 +389,24 @@ IMPL_LINK_TYPED( ScSpecialFilterDlg, EndDlgHdl, Button*, pBtn, void )
    }
}

IMPL_LINK_TYPED( ScSpecialFilterDlg, TimeOutHdl, Idle*, _pIdle, void )

void ScSpecialFilterDlg::SyncFocusState()
{
    // every 50ms check whether RefInputMode is still true

    if( (_pIdle == pIdle) && IsActive() )
    if( pEdCopyArea->HasFocus() || pRbCopyArea->HasFocus() )
    {
        if( pEdCopyArea->HasFocus() || pRbCopyArea->HasFocus() )
        {
            pRefInputEdit = pEdCopyArea;
            bRefInputMode = true;
        }
        else if( pEdFilterArea->HasFocus() || pRbFilterArea->HasFocus() )
        {
            pRefInputEdit = pEdFilterArea;
            bRefInputMode = true;
        }
        else if( bRefInputMode )
        {
            pRefInputEdit = nullptr;
            bRefInputMode = false;
        }
        pRefInputEdit = pEdCopyArea;
        bRefInputMode = true;
    }

    pIdle->Start();
    else if( pEdFilterArea->HasFocus() || pRbFilterArea->HasFocus() )
    {
        pRefInputEdit = pEdFilterArea;
        bRefInputMode = true;
    }
    else if( bRefInputMode )
    {
        pRefInputEdit = nullptr;
        bRefInputMode = false;
    }
}

IMPL_LINK_TYPED( ScSpecialFilterDlg, FilterAreaSelHdl, ListBox&, rLb, void )
diff --git a/sc/source/ui/inc/filtdlg.hxx b/sc/source/ui/inc/filtdlg.hxx
index ba3a95a..473a6fd 100644
--- a/sc/source/ui/inc/filtdlg.hxx
+++ b/sc/source/ui/inc/filtdlg.hxx
@@ -61,7 +61,6 @@ public:

    virtual bool    IsRefInputMode() const override;
    virtual void    SetActive() override;

    virtual bool    Close() override;
    void            SliderMoved();
    size_t          GetSliderPos();
@@ -165,7 +164,7 @@ public:
    virtual void    dispose() override;

    virtual void    SetReference( const ScRange& rRef, ScDocument* pDoc ) override;

    void            SyncFocusState();
    virtual bool    IsRefInputMode() const override;
    virtual void    SetActive() override;

@@ -204,8 +203,6 @@ private:
    VclPtr<formula::RefEdit>   pRefInputEdit;
    bool                bRefInputMode;

    // Hack: RefInput control
    Idle*  pIdle;

private:
    void            Init( const SfxItemSet& rArgSet );