diff options
Diffstat (limited to 'sc/source/ui/view/cellsh2.cxx')
-rw-r--r-- | sc/source/ui/view/cellsh2.cxx | 204 |
1 files changed, 119 insertions, 85 deletions
diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx index 38a2e62ac177..29d6f126b4e6 100644 --- a/sc/source/ui/view/cellsh2.cxx +++ b/sc/source/ui/view/cellsh2.cxx @@ -920,102 +920,136 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq ) auto xDlg = std::make_shared<ScValidationDlg>(pParentWin, &aArgSet, pTabViewShell); ScValidationRegisteredDlg aRegisterThatDlgExists(pParentWin, xDlg); - short nResult = xDlg->run(); - if ( nResult == RET_OK ) + struct lcl_auxData { - const SfxItemSet* pOutSet = xDlg->GetOutputItemSet(); - - 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 ) ) + 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; + bool bCaseSensitive; + }; + + std::shared_ptr<lcl_auxData> xAuxData = std::make_shared<lcl_auxData>(lcl_auxData{ + aCursorPos, eMode, eOper, aExpr1, aExpr2, bBlank, nListType, bShowHelp, + aHelpTitle, aHelpText, bShowError, eErrStyle, aErrTitle, aErrText, bCaseSensitive}); + + auto xRequest = std::make_shared<SfxRequest>(rReq); + rReq.Ignore(); // the 'old' request is not relevant any more + SfxTabDialogController::runAsync( + xDlg, + [&rDoc, xRequest=std::move(xRequest), xAuxData=std::move(xAuxData), + xDlg, pTabViewShell](sal_Int32 nResult) + { + if ( nResult == RET_OK ) { - OUString aTemp1 = pItem->GetValue(); - if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME) + const SfxItemSet* pOutSet = xDlg->GetOutputItemSet(); + + if ( const SfxUInt16Item* pItem = pOutSet->GetItemIfSet( FID_VALID_MODE ) ) + xAuxData->eMode = static_cast<ScValidationMode>(pItem->GetValue()); + if ( const SfxUInt16Item* pItem = pOutSet->GetItemIfSet( FID_VALID_CONDMODE ) ) + xAuxData->eOper = static_cast<ScConditionMode>(pItem->GetValue()); + if ( const SfxStringItem* pItem = pOutSet->GetItemIfSet( FID_VALID_VALUE1 ) ) { - 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); + OUString aTemp1 = pItem->GetValue(); + if (xAuxData->eMode == SC_VALID_DATE || xAuxData->eMode == SC_VALID_TIME) + { + sal_uInt32 nNumIndex = 0; + double nVal; + if (rDoc.GetFormatTable()->IsNumberFormat(aTemp1, nNumIndex, nVal)) + xAuxData->aExpr1 = ::rtl::math::doubleToUString( nVal, + rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, + ScGlobal::getLocaleData().getNumDecimalSep()[0], true); + else + xAuxData->aExpr1 = aTemp1; + } else - aExpr1 = aTemp1; + xAuxData->aExpr1 = aTemp1; } - else - aExpr1 = aTemp1; - } - if ( const SfxStringItem* pItem = pOutSet->GetItemIfSet( FID_VALID_VALUE2 ) ) - { - OUString aTemp2 = pItem->GetValue(); - if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME) + if ( const SfxStringItem* pItem = pOutSet->GetItemIfSet( FID_VALID_VALUE2 ) ) { - 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 ); + OUString aTemp2 = pItem->GetValue(); + if (xAuxData->eMode == SC_VALID_DATE || xAuxData->eMode == SC_VALID_TIME) + { + sal_uInt32 nNumIndex = 0; + double nVal; + if (rDoc.GetFormatTable()->IsNumberFormat(aTemp2, nNumIndex, nVal)) + xAuxData->aExpr2 = ::rtl::math::doubleToUString( nVal, + rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, + ScGlobal::getLocaleData().getNumDecimalSep()[0], true); + else + xAuxData->aExpr2 = aTemp2; + if ( xAuxData->eMode == SC_VALID_TIME ) { + sal_Int32 wraparound = xAuxData->aExpr1.compareTo(xAuxData->aExpr2); + if (wraparound > 0) { + if (xAuxData->eOper == ScConditionMode::Between) { + xAuxData->eOper = ScConditionMode::NotBetween; + std::swap( xAuxData->aExpr1, xAuxData->aExpr2 ); + } + else if (xAuxData->eOper == ScConditionMode::NotBetween) { + xAuxData->eOper = ScConditionMode::Between; + std::swap( xAuxData->aExpr1, xAuxData->aExpr2 ); + } } } } + else + xAuxData->aExpr2 = aTemp2; } - else - aExpr2 = aTemp2; + if ( const SfxBoolItem* pItem = pOutSet->GetItemIfSet( FID_VALID_BLANK ) ) + xAuxData->bBlank = pItem->GetValue(); + if ( const SfxBoolItem* pItem = pOutSet->GetItemIfSet( FID_VALID_CASESENS ) ) + xAuxData->bCaseSensitive = pItem->GetValue(); + if ( const SfxInt16Item* pItem = pOutSet->GetItemIfSet( FID_VALID_LISTTYPE ) ) + xAuxData->nListType = pItem->GetValue(); + + if ( const SfxBoolItem* pItem = pOutSet->GetItemIfSet( FID_VALID_SHOWHELP ) ) + xAuxData->bShowHelp = pItem->GetValue(); + if ( const SfxStringItem* pItem = pOutSet->GetItemIfSet( FID_VALID_HELPTITLE ) ) + xAuxData->aHelpTitle = pItem->GetValue(); + if ( const SfxStringItem* pItem = pOutSet->GetItemIfSet( FID_VALID_HELPTEXT ) ) + xAuxData->aHelpText = pItem->GetValue(); + + if ( const SfxBoolItem* pItem = pOutSet->GetItemIfSet( FID_VALID_SHOWERR ) ) + xAuxData->bShowError = pItem->GetValue(); + if ( const SfxUInt16Item* pItem = pOutSet->GetItemIfSet( FID_VALID_ERRSTYLE ) ) + xAuxData->eErrStyle = static_cast<ScValidErrorStyle>(pItem->GetValue()); + if ( const SfxStringItem* pItem = pOutSet->GetItemIfSet( FID_VALID_ERRTITLE ) ) + xAuxData->aErrTitle = pItem->GetValue(); + if ( const SfxStringItem* pItem = pOutSet->GetItemIfSet( FID_VALID_ERRTEXT ) ) + xAuxData->aErrText = pItem->GetValue(); + + ScValidationData aData( xAuxData->eMode, xAuxData->eOper, xAuxData->aExpr1, xAuxData->aExpr2, rDoc, xAuxData->aCursorPos ); + aData.SetIgnoreBlank( xAuxData->bBlank ); + aData.SetCaseSensitive( xAuxData->bCaseSensitive ); + aData.SetListType( xAuxData->nListType ); + + aData.SetInput(xAuxData->aHelpTitle, xAuxData->aHelpText); // sets bShowInput to TRUE + if (!xAuxData->bShowHelp) + aData.ResetInput(); // reset only bShowInput + + aData.SetError(xAuxData->aErrTitle, xAuxData->aErrText, xAuxData->eErrStyle); // sets bShowError to TRUE + if (!xAuxData->bShowError) + aData.ResetError(); // reset only bShowError + + pTabViewShell->SetValidation( aData ); + pTabViewShell->TestHintWindow(); + xRequest->Done( *pOutSet ); } - if ( const SfxBoolItem* pItem = pOutSet->GetItemIfSet( FID_VALID_BLANK ) ) - bBlank = pItem->GetValue(); - if ( const SfxBoolItem* pItem = pOutSet->GetItemIfSet( FID_VALID_CASESENS ) ) - bCaseSensitive = 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.SetCaseSensitive( bCaseSensitive ); - 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 ); - } + else + { + pTabViewShell->TestHintWindow(); + } + }); } } break; |