sc/source/ui/view/cellsh2.cxx |  239 ++++++++++++++++++++++++++----------------
 1 file changed, 151 insertions(+), 88 deletions(-)

New commits:
commit ba2a63a0c2bee76e4d1e3ee35f5eab44b2cdc69a
Author:     Pranam Lashkari <lpra...@collabora.com>
AuthorDate: Wed Dec 25 23:15:02 2024 +0530
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Fri Jan 24 12:20:39 2025 +0100

    sc: convert data validity dialog async
    
    Change-Id: Ifef985c15a58c1c081f9a011e174e3b2547f3ea2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/179402
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx
index b2fdf0ba411b..51c5feea769c 100644
--- a/sc/source/ui/view/cellsh2.cxx
+++ b/sc/source/ui/view/cellsh2.cxx
@@ -901,102 +901,165 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
                     // cell range picker
                     vcl::Window* pWin = GetViewData().GetActiveWin();
                     weld::Window* pParentWin = pWin ? pWin->GetFrameWeld() : 
nullptr;
-                    auto xDlg = std::make_shared<ScValidationDlg>(pParentWin, 
&aArgSet, pTabViewShell);
-                    ScValidationRegisteredDlg 
aRegisterThatDlgExists(pParentWin, xDlg);
+                    auto xDlg
+                        = std::make_shared<ScValidationDlg>(pParentWin, 
&aArgSet, pTabViewShell);
 
-                    short nResult = xDlg->run();
-                    if ( nResult == RET_OK )
-                    {
-                        const SfxItemSet* pOutSet = xDlg->GetOutputItemSet();
+                    auto aRegisterThatDlgExists
+                        = 
std::make_shared<ScValidationRegisteredDlg>(pParentWin, xDlg);
 
-                        if ( const SfxUInt16Item* pItem = 
pOutSet->GetItemIfSet( FID_VALID_MODE ) )
-                            eMode = 
static_cast<ScValidationMode>(pItem->GetValue());
-                        if ( const SfxUInt16Item* pItem = 
pOutSet->GetItemIfSet( FID_VALID_CONDMODE ) )
-                            eOper = 
static_cast<ScConditionMode>(pItem->GetValue());
-                        if ( const SfxStringItem* pItem = 
pOutSet->GetItemIfSet( FID_VALID_VALUE1 ) )
-                        {
-                            OUString aTemp1 = pItem->GetValue();
-                            if (eMode == SC_VALID_DATE || eMode == 
SC_VALID_TIME)
-                            {
-                                sal_uInt32 nNumIndex = 0;
-                                double nVal;
-                                if 
(rDoc.GetFormatTable()->IsNumberFormat(aTemp1, nNumIndex, nVal))
-                                    aExpr1 = ::rtl::math::doubleToUString( 
nVal,
-                                            rtl_math_StringFormat_Automatic, 
rtl_math_DecimalPlaces_Max,
-                                            
ScGlobal::getLocaleData().getNumDecimalSep()[0], true);
-                                else
-                                    aExpr1 = aTemp1;
-                            }
-                            else
-                                aExpr1 = aTemp1;
-                        }
-                        if ( const SfxStringItem* pItem = 
pOutSet->GetItemIfSet( FID_VALID_VALUE2 ) )
+                    struct lcl_auxData
+                    {
+                        ScAddress aCursorPos;
+                        ScValidationMode eMode;
+                        ScConditionMode eOper;
+                        OUString aExpr1;
+                        OUString aExpr2;
+                        bool bBlank;
+                        sal_Int16 nListType;
+                        bool bShowHelp;
+                        OUString aHelpTitle;
+                        OUString aHelpText;
+                        bool bShowError;
+                        ScValidErrorStyle eErrStyle;
+                        OUString aErrTitle;
+                        OUString aErrText;
+                    };
+
+                    std::shared_ptr<lcl_auxData> pAuxData = 
std::make_shared<lcl_auxData>(lcl_auxData{
+                        aCursorPos, eMode, eOper, aExpr1, aExpr2, bBlank, 
nListType, bShowHelp,
+                        aHelpTitle, aHelpText, bShowError, eErrStyle, 
aErrTitle, aErrText});
+                    SfxTabDialogController::runAsync(
+                        xDlg,
+                        [&rDoc, pAuxData, nSlotId, xDlg, 
pTabViewShell](sal_Int32 nResult)
                         {
-                            OUString aTemp2 = pItem->GetValue();
-                            if (eMode == SC_VALID_DATE || eMode == 
SC_VALID_TIME)
+                            if (nResult == RET_OK)
                             {
-                                sal_uInt32 nNumIndex = 0;
-                                double nVal;
-                                if 
(rDoc.GetFormatTable()->IsNumberFormat(aTemp2, nNumIndex, nVal))
-                                    aExpr2 = ::rtl::math::doubleToUString( 
nVal,
-                                            rtl_math_StringFormat_Automatic, 
rtl_math_DecimalPlaces_Max,
-                                            
ScGlobal::getLocaleData().getNumDecimalSep()[0], true);
-                                else
-                                    aExpr2 = aTemp2;
-                                if ( eMode == SC_VALID_TIME ) {
-                                    sal_Int32 wraparound = 
aExpr1.compareTo(aExpr2);
-                                    if (wraparound > 0) {
-                                        if (eOper == ScConditionMode::Between) 
{
-                                            eOper = 
ScConditionMode::NotBetween;
-                                            std::swap( aExpr1, aExpr2 );
-                                        }
-                                        else if (eOper == 
ScConditionMode::NotBetween) {
-                                            eOper = ScConditionMode::Between;
-                                            std::swap( aExpr1, aExpr2 );
+                                const SfxItemSet* pOutSet = 
xDlg->GetOutputItemSet();
+
+                                if (const SfxUInt16Item* pItem
+                                    = pOutSet->GetItemIfSet(FID_VALID_MODE))
+                                    pAuxData->eMode
+                                        = 
static_cast<ScValidationMode>(pItem->GetValue());
+                                if (const SfxUInt16Item* pItem
+                                    = 
pOutSet->GetItemIfSet(FID_VALID_CONDMODE))
+                                    pAuxData->eOper
+                                        = 
static_cast<ScConditionMode>(pItem->GetValue());
+                                if (const SfxStringItem* pItem
+                                    = pOutSet->GetItemIfSet(FID_VALID_VALUE1))
+                                {
+                                    OUString aTemp1 = pItem->GetValue();
+                                    if (pAuxData->eMode == SC_VALID_DATE
+                                        || pAuxData->eMode == SC_VALID_TIME)
+                                    {
+                                        sal_uInt32 nNumIndex = 0;
+                                        double nVal;
+                                        if 
(rDoc.GetFormatTable()->IsNumberFormat(aTemp1, nNumIndex,
+                                                                               
   nVal))
+                                            pAuxData->aExpr1 = 
::rtl::math::doubleToUString(
+                                                nVal, 
rtl_math_StringFormat_Automatic,
+                                                rtl_math_DecimalPlaces_Max,
+                                                
ScGlobal::getLocaleData().getNumDecimalSep()[0],
+                                                true);
+                                        else
+                                            pAuxData->aExpr1 = aTemp1;
+                                    }
+                                    else
+                                        pAuxData->aExpr1 = aTemp1;
+                                }
+                                if (const SfxStringItem* pItem
+                                    = pOutSet->GetItemIfSet(FID_VALID_VALUE2))
+                                {
+                                    OUString aTemp2 = pItem->GetValue();
+                                    if (pAuxData->eMode == SC_VALID_DATE
+                                        || pAuxData->eMode == SC_VALID_TIME)
+                                    {
+                                        sal_uInt32 nNumIndex = 0;
+                                        double nVal;
+                                        if 
(rDoc.GetFormatTable()->IsNumberFormat(aTemp2, nNumIndex,
+                                                                               
   nVal))
+                                            pAuxData->aExpr2 = 
::rtl::math::doubleToUString(
+                                                nVal, 
rtl_math_StringFormat_Automatic,
+                                                rtl_math_DecimalPlaces_Max,
+                                                
ScGlobal::getLocaleData().getNumDecimalSep()[0],
+                                                true);
+                                        else
+                                            pAuxData->aExpr2 = aTemp2;
+                                        if (pAuxData->eMode == SC_VALID_TIME)
+                                        {
+                                            sal_Int32 wraparound
+                                                = 
pAuxData->aExpr1.compareTo(pAuxData->aExpr2);
+                                            if (wraparound > 0)
+                                            {
+                                                if (pAuxData->eOper == 
ScConditionMode::Between)
+                                                {
+                                                    pAuxData->eOper = 
ScConditionMode::NotBetween;
+                                                    
std::swap(pAuxData->aExpr1, pAuxData->aExpr2);
+                                                }
+                                                else if (pAuxData->eOper
+                                                         == 
ScConditionMode::NotBetween)
+                                                {
+                                                    pAuxData->eOper = 
ScConditionMode::Between;
+                                                    
std::swap(pAuxData->aExpr1, pAuxData->aExpr2);
+                                                }
+                                            }
                                         }
                                     }
+                                    else
+                                        pAuxData->aExpr2 = aTemp2;
                                 }
+                                if (const SfxBoolItem* pItem
+                                    = pOutSet->GetItemIfSet(FID_VALID_BLANK))
+                                    pAuxData->bBlank = pItem->GetValue();
+                                if (const SfxInt16Item* pItem
+                                    = 
pOutSet->GetItemIfSet(FID_VALID_LISTTYPE))
+                                    pAuxData->nListType = pItem->GetValue();
+
+                                if (const SfxBoolItem* pItem
+                                    = 
pOutSet->GetItemIfSet(FID_VALID_SHOWHELP))
+                                    pAuxData->bShowHelp = pItem->GetValue();
+                                if (const SfxStringItem* pItem
+                                    = 
pOutSet->GetItemIfSet(FID_VALID_HELPTITLE))
+                                    pAuxData->aHelpTitle = pItem->GetValue();
+                                if (const SfxStringItem* pItem
+                                    = 
pOutSet->GetItemIfSet(FID_VALID_HELPTEXT))
+                                    pAuxData->aHelpText = pItem->GetValue();
+
+                                if (const SfxBoolItem* pItem
+                                    = pOutSet->GetItemIfSet(FID_VALID_SHOWERR))
+                                    pAuxData->bShowError = pItem->GetValue();
+                                if (const SfxUInt16Item* pItem
+                                    = 
pOutSet->GetItemIfSet(FID_VALID_ERRSTYLE))
+                                    pAuxData->eErrStyle
+                                        = 
static_cast<ScValidErrorStyle>(pItem->GetValue());
+                                if (const SfxStringItem* pItem
+                                    = 
pOutSet->GetItemIfSet(FID_VALID_ERRTITLE))
+                                    pAuxData->aErrTitle = pItem->GetValue();
+                                if (const SfxStringItem* pItem
+                                    = pOutSet->GetItemIfSet(FID_VALID_ERRTEXT))
+                                    pAuxData->aErrText = pItem->GetValue();
+
+                                ScValidationData aData(pAuxData->eMode, 
pAuxData->eOper,
+                                                       pAuxData->aExpr1, 
pAuxData->aExpr2, rDoc,
+                                                       pAuxData->aCursorPos);
+                                aData.SetIgnoreBlank(pAuxData->bBlank);
+                                aData.SetListType(pAuxData->nListType);
+
+                                aData.SetInput(pAuxData->aHelpTitle,
+                                               pAuxData->aHelpText); // sets 
bShowInput to TRUE
+                                if (!pAuxData->bShowHelp)
+                                    aData.ResetInput(); // reset only 
bShowInput
+
+                                aData.SetError(pAuxData->aErrTitle, 
pAuxData->aErrText,
+                                               pAuxData->eErrStyle); // sets 
bShowError to TRUE
+                                if (!pAuxData->bShowError)
+                                    aData.ResetError(); // reset only 
bShowError
+
+                                pTabViewShell->SetValidation(aData);
+                                pTabViewShell->TestHintWindow();
+                                SfxRequest 
aRequest(pTabViewShell->GetViewFrame(), nSlotId);
+                                aRequest.Done(*pOutSet);
                             }
-                            else
-                                aExpr2 = aTemp2;
-                        }
-                        if ( const SfxBoolItem* pItem = pOutSet->GetItemIfSet( 
FID_VALID_BLANK ) )
-                            bBlank = pItem->GetValue();
-                        if ( const SfxInt16Item* pItem = 
pOutSet->GetItemIfSet( FID_VALID_LISTTYPE ) )
-                            nListType = pItem->GetValue();
-
-                        if ( const SfxBoolItem* pItem = pOutSet->GetItemIfSet( 
FID_VALID_SHOWHELP ) )
-                            bShowHelp = pItem->GetValue();
-                        if ( const SfxStringItem* pItem = 
pOutSet->GetItemIfSet( FID_VALID_HELPTITLE ) )
-                            aHelpTitle = pItem->GetValue();
-                        if ( const SfxStringItem* pItem = 
pOutSet->GetItemIfSet( FID_VALID_HELPTEXT ) )
-                            aHelpText = pItem->GetValue();
-
-                        if ( const SfxBoolItem* pItem = pOutSet->GetItemIfSet( 
FID_VALID_SHOWERR ) )
-                            bShowError = pItem->GetValue();
-                        if ( const SfxUInt16Item* pItem = 
pOutSet->GetItemIfSet( FID_VALID_ERRSTYLE ) )
-                            eErrStyle = 
static_cast<ScValidErrorStyle>(pItem->GetValue());
-                        if ( const SfxStringItem* pItem = 
pOutSet->GetItemIfSet( FID_VALID_ERRTITLE ) )
-                            aErrTitle = pItem->GetValue();
-                        if ( const SfxStringItem* pItem = 
pOutSet->GetItemIfSet( FID_VALID_ERRTEXT ) )
-                            aErrText = pItem->GetValue();
-
-                        ScValidationData aData( eMode, eOper, aExpr1, aExpr2, 
rDoc, aCursorPos );
-                        aData.SetIgnoreBlank( bBlank );
-                        aData.SetListType( nListType );
-
-                        aData.SetInput(aHelpTitle, aHelpText);          // 
sets bShowInput to TRUE
-                        if (!bShowHelp)
-                            aData.ResetInput();                         // 
reset only bShowInput
-
-                        aData.SetError(aErrTitle, aErrText, eErrStyle); // 
sets bShowError to TRUE
-                        if (!bShowError)
-                            aData.ResetError();                         // 
reset only bShowError
-
-                        pTabViewShell->SetValidation( aData );
-                        pTabViewShell->TestHintWindow();
-                        rReq.Done( *pOutSet );
-                    }
+                        });
                 }
             }
             break;

Reply via email to