sc/source/ui/inc/dbfunc.hxx | 2 sc/source/ui/undo/undodat.cxx | 8 sc/source/ui/view/cellsh2.cxx | 376 ++++++++++++++++++++--------------------- sc/source/ui/view/dbfunc.cxx | 5 sc/source/ui/view/tabvwshc.cxx | 65 +++---- 5 files changed, 235 insertions(+), 221 deletions(-)
New commits: commit 63d700dbdf8d36789f5ad819a2ba6d2a4570b070 Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Thu Aug 14 12:31:28 2025 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Mon Aug 25 20:05:33 2025 +0200 crashreporting: sc: check GetDBData() it might return nullptr Seen in https://crashreport.libreoffice.org/stats/crash_details/9b83d1cc-1964-4e9d-a7b5-2f0ab4702303 Change-Id: Ie4b538697842560f821d78c5fe5e135a517beb82 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189586 Reviewed-by: Ilmari Lauhakangas <ilmari.lauhakan...@libreoffice.org> Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx index b17d37790b9e..5e79e0820c36 100644 --- a/sc/source/ui/view/cellsh2.cxx +++ b/sc/source/ui/view/cellsh2.cxx @@ -674,17 +674,18 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq ) case SID_UNFILTER: { - ScQueryParam aParam; // tdf#117346 - show current data range of the filter with selection - ScDBData* pDBData = pTabViewShell->GetDBData(true, SC_DB_OLD); - - pDBData->GetQueryParam( aParam ); - SCSIZE nEC = aParam.GetEntryCount(); - for (SCSIZE i=0; i<nEC; i++) - aParam.GetEntry(i).bDoQuery = false; - aParam.bDuplicate = true; - pTabViewShell->Query( aParam, nullptr, true ); - rReq.Done(); + if (ScDBData* pDBData = pTabViewShell->GetDBData(true, SC_DB_OLD)) + { + ScQueryParam aParam; + pDBData->GetQueryParam( aParam ); + SCSIZE nEC = aParam.GetEntryCount(); + for (SCSIZE i=0; i<nEC; i++) + aParam.GetEntry(i).bDoQuery = false; + aParam.bDuplicate = true; + pTabViewShell->Query( aParam, nullptr, true ); + rReq.Done(); + } } break; commit e7644224f9a4ca3b24346c5967d4c82ebbbf814c Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Thu Aug 14 12:46:37 2025 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Mon Aug 25 20:05:22 2025 +0200 sc: use SAL_RET_MAYBENULL in GetDBData() Change-Id: Iaccf557056877128b4ba036ff43056816795874d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189587 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> Tested-by: Jenkins (cherry picked from commit 8ffeca7af4302da21d33494342017c3737d540e1) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189734 Reviewed-by: Ilmari Lauhakangas <ilmari.lauhakan...@libreoffice.org> diff --git a/sc/source/ui/inc/dbfunc.hxx b/sc/source/ui/inc/dbfunc.hxx index a30f39747f30..0a9463e87e15 100644 --- a/sc/source/ui/inc/dbfunc.hxx +++ b/sc/source/ui/inc/dbfunc.hxx @@ -67,7 +67,7 @@ public: void GotoDBArea( const OUString& rDBName ); // DB range from Cursor - ScDBData* GetDBData( bool bMarkArea = true, ScGetDBMode eMode = SC_DB_MAKE, ScGetDBSelection eSel = ScGetDBSelection::Keep); + SAL_RET_MAYBENULL ScDBData* GetDBData( bool bMarkArea = true, ScGetDBMode eMode = SC_DB_MAKE, ScGetDBSelection eSel = ScGetDBSelection::Keep); ScDBData* GetAnonymousDBData(); void Consolidate( const ScConsolidateParam& rParam ); diff --git a/sc/source/ui/undo/undodat.cxx b/sc/source/ui/undo/undodat.cxx index 7820d60da6a1..8b9ff7a4a814 100644 --- a/sc/source/ui/undo/undodat.cxx +++ b/sc/source/ui/undo/undodat.cxx @@ -1266,10 +1266,12 @@ void ScUndoImportData::Repeat(SfxRepeatTarget& rTarget) { ScTabViewShell& rViewShell = pViewTarget->GetViewShell(); - SCTAB nDummy; ScImportParam aNewParam(aImportParam); - ScDBData* pDBData = rViewShell.GetDBData(); - pDBData->GetArea( nDummy, aNewParam.nCol1,aNewParam.nRow1, aNewParam.nCol2,aNewParam.nRow2 ); + if (ScDBData* pDBData = rViewShell.GetDBData()) + { + SCTAB nDummy; + pDBData->GetArea( nDummy, aNewParam.nCol1,aNewParam.nRow1, aNewParam.nCol2,aNewParam.nRow2 ); + } rViewShell.ImportData( aNewParam ); } diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx index a8e494abeeae..b17d37790b9e 100644 --- a/sc/source/ui/view/cellsh2.cxx +++ b/sc/source/ui/view/cellsh2.cxx @@ -384,216 +384,219 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq ) case SID_SORT_DESCENDING: case SID_SORT_ASCENDING: { - //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data - //the patch comes from maoyg - ScSortParam aSortParam; - ScDBData* pDBData = pTabViewShell->GetDBData(); - ScViewData& rData = GetViewData(); - - pDBData->GetSortParam( aSortParam ); - - if( lcl_GetSortParam( rData, aSortParam ) ) + if (ScDBData* pDBData = pTabViewShell->GetDBData()) { - SCCOL nCol = GetViewData().GetCurX(); - SCCOL nTab = GetViewData().GetTabNo(); - ScDocument& rDoc = GetViewData().GetDocument(); + //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data + //the patch comes from maoyg + ScSortParam aSortParam; + ScViewData& rData = GetViewData(); pDBData->GetSortParam( aSortParam ); - bool bHasHeader = rDoc.HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, nTab ); - - if( nCol < aSortParam.nCol1 ) - nCol = aSortParam.nCol1; - else if( nCol > aSortParam.nCol2 ) - nCol = aSortParam.nCol2; - - aSortParam.bHasHeader = bHasHeader; - aSortParam.bByRow = true; - aSortParam.bCaseSens = false; - aSortParam.bNaturalSort = false; - aSortParam.aDataAreaExtras.mbCellNotes = false; - aSortParam.aDataAreaExtras.mbCellDrawObjects = true; - aSortParam.aDataAreaExtras.mbCellFormats = true; - aSortParam.bInplace = true; - aSortParam.maKeyState[0].bDoSort = true; - aSortParam.maKeyState[0].nField = nCol; - aSortParam.maKeyState[0].bAscending = ( nSlotId == SID_SORT_ASCENDING ); - - for ( sal_uInt16 i=1; i<aSortParam.GetSortKeyCount(); i++ ) - aSortParam.maKeyState[i].bDoSort = false; - - pTabViewShell->UISort( aSortParam ); // subtotal when needed new - rReq.Done(); + if( lcl_GetSortParam( rData, aSortParam ) ) + { + SCCOL nCol = GetViewData().GetCurX(); + SCCOL nTab = GetViewData().GetTabNo(); + ScDocument& rDoc = GetViewData().GetDocument(); + + pDBData->GetSortParam( aSortParam ); + bool bHasHeader = rDoc.HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, nTab ); + + if( nCol < aSortParam.nCol1 ) + nCol = aSortParam.nCol1; + else if( nCol > aSortParam.nCol2 ) + nCol = aSortParam.nCol2; + + aSortParam.bHasHeader = bHasHeader; + aSortParam.bByRow = true; + aSortParam.bCaseSens = false; + aSortParam.bNaturalSort = false; + aSortParam.aDataAreaExtras.mbCellNotes = false; + aSortParam.aDataAreaExtras.mbCellDrawObjects = true; + aSortParam.aDataAreaExtras.mbCellFormats = true; + aSortParam.bInplace = true; + aSortParam.maKeyState[0].bDoSort = true; + aSortParam.maKeyState[0].nField = nCol; + aSortParam.maKeyState[0].bAscending = ( nSlotId == SID_SORT_ASCENDING ); + + for ( sal_uInt16 i=1; i<aSortParam.GetSortKeyCount(); i++ ) + aSortParam.maKeyState[i].bDoSort = false; + + pTabViewShell->UISort( aSortParam ); // subtotal when needed new + + rReq.Done(); + } } } break; case SID_SORT: { - const SfxItemSet* pArgs = rReq.GetArgs(); - - //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data - //the patch comes from maoyg - - if ( pArgs ) // Basic + if (ScDBData* pDBData = pTabViewShell->GetDBData()) { - ScSortParam aSortParam; - ScDBData* pDBData = pTabViewShell->GetDBData(); - ScViewData& rData = GetViewData(); + const SfxItemSet* pArgs = rReq.GetArgs(); - pDBData->GetSortParam( aSortParam ); + //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data + //the patch comes from maoyg - if( lcl_GetSortParam( rData, aSortParam ) ) + if ( pArgs ) // Basic { - ScDocument& rDoc = GetViewData().GetDocument(); + ScSortParam aSortParam; + ScViewData& rData = GetViewData(); pDBData->GetSortParam( aSortParam ); - bool bHasHeader = rDoc.HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, rData.GetTabNo() ); - if( bHasHeader ) - aSortParam.bHasHeader = bHasHeader; - - aSortParam.bInplace = true; // from Basic always - - if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_BYROW ) ) - aSortParam.bByRow = pItem->GetValue(); - if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_HASHEADER ) ) - aSortParam.bHasHeader = pItem->GetValue(); - if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_CASESENS ) ) - aSortParam.bCaseSens = pItem->GetValue(); - if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_NATURALSORT ) ) - aSortParam.bNaturalSort = pItem->GetValue(); - if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_INCCOMMENTS ) ) - aSortParam.aDataAreaExtras.mbCellNotes = pItem->GetValue(); - if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_INCIMAGES ) ) - aSortParam.aDataAreaExtras.mbCellDrawObjects = pItem->GetValue(); - if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_ATTRIBS ) ) - aSortParam.aDataAreaExtras.mbCellFormats = pItem->GetValue(); - if ( const SfxUInt16Item* pItem = pArgs->GetItemIfSet( SID_SORT_USERDEF ) ) + + if( lcl_GetSortParam( rData, aSortParam ) ) { - sal_uInt16 nUserIndex = pItem->GetValue(); - aSortParam.bUserDef = ( nUserIndex != 0 ); - if ( nUserIndex ) - aSortParam.nUserIndex = nUserIndex - 1; // Basic: 1-based - } + ScDocument& rDoc = GetViewData().GetDocument(); + + pDBData->GetSortParam( aSortParam ); + bool bHasHeader = rDoc.HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, rData.GetTabNo() ); + if( bHasHeader ) + aSortParam.bHasHeader = bHasHeader; + + aSortParam.bInplace = true; // from Basic always + + if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_BYROW ) ) + aSortParam.bByRow = pItem->GetValue(); + if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_HASHEADER ) ) + aSortParam.bHasHeader = pItem->GetValue(); + if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_CASESENS ) ) + aSortParam.bCaseSens = pItem->GetValue(); + if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_NATURALSORT ) ) + aSortParam.bNaturalSort = pItem->GetValue(); + if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_INCCOMMENTS ) ) + aSortParam.aDataAreaExtras.mbCellNotes = pItem->GetValue(); + if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_INCIMAGES ) ) + aSortParam.aDataAreaExtras.mbCellDrawObjects = pItem->GetValue(); + if ( const SfxBoolItem* pItem = pArgs->GetItemIfSet( SID_SORT_ATTRIBS ) ) + aSortParam.aDataAreaExtras.mbCellFormats = pItem->GetValue(); + if ( const SfxUInt16Item* pItem = pArgs->GetItemIfSet( SID_SORT_USERDEF ) ) + { + sal_uInt16 nUserIndex = pItem->GetValue(); + aSortParam.bUserDef = ( nUserIndex != 0 ); + if ( nUserIndex ) + aSortParam.nUserIndex = nUserIndex - 1; // Basic: 1-based + } - SCCOLROW nField0 = 0; - const SfxPoolItem* pItem = nullptr; - if ( pArgs->GetItemState( FN_PARAM_1, true, &pItem ) == SfxItemState::SET ) - nField0 = static_cast<const SfxInt32Item*>(pItem)->GetValue(); - aSortParam.maKeyState[0].bDoSort = ( nField0 != 0 ); - aSortParam.maKeyState[0].nField = nField0 > 0 ? (nField0-1) : 0; - if ( pArgs->GetItemState( FN_PARAM_2, true, &pItem ) == SfxItemState::SET ) - aSortParam.maKeyState[0].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue(); - SCCOLROW nField1 = 0; - if ( pArgs->GetItemState( FN_PARAM_3, true, &pItem ) == SfxItemState::SET ) - nField1 = static_cast<const SfxInt32Item*>(pItem)->GetValue(); - aSortParam.maKeyState[1].bDoSort = ( nField1 != 0 ); - aSortParam.maKeyState[1].nField = nField1 > 0 ? (nField1-1) : 0; - if ( pArgs->GetItemState( FN_PARAM_4, true, &pItem ) == SfxItemState::SET ) - aSortParam.maKeyState[1].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue(); - SCCOLROW nField2 = 0; - if ( pArgs->GetItemState( FN_PARAM_5, true, &pItem ) == SfxItemState::SET ) - nField2 = static_cast<const SfxInt32Item*>(pItem)->GetValue(); - aSortParam.maKeyState[2].bDoSort = ( nField2 != 0 ); - aSortParam.maKeyState[2].nField = nField2 > 0 ? (nField2-1) : 0; - if ( pArgs->GetItemState( FN_PARAM_6, true, &pItem ) == SfxItemState::SET ) - aSortParam.maKeyState[2].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue(); - - // subtotal when needed new - pTabViewShell->UISort( aSortParam ); - rReq.Done(); + SCCOLROW nField0 = 0; + const SfxPoolItem* pItem = nullptr; + if ( pArgs->GetItemState( FN_PARAM_1, true, &pItem ) == SfxItemState::SET ) + nField0 = static_cast<const SfxInt32Item*>(pItem)->GetValue(); + aSortParam.maKeyState[0].bDoSort = ( nField0 != 0 ); + aSortParam.maKeyState[0].nField = nField0 > 0 ? (nField0-1) : 0; + if ( pArgs->GetItemState( FN_PARAM_2, true, &pItem ) == SfxItemState::SET ) + aSortParam.maKeyState[0].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue(); + SCCOLROW nField1 = 0; + if ( pArgs->GetItemState( FN_PARAM_3, true, &pItem ) == SfxItemState::SET ) + nField1 = static_cast<const SfxInt32Item*>(pItem)->GetValue(); + aSortParam.maKeyState[1].bDoSort = ( nField1 != 0 ); + aSortParam.maKeyState[1].nField = nField1 > 0 ? (nField1-1) : 0; + if ( pArgs->GetItemState( FN_PARAM_4, true, &pItem ) == SfxItemState::SET ) + aSortParam.maKeyState[1].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue(); + SCCOLROW nField2 = 0; + if ( pArgs->GetItemState( FN_PARAM_5, true, &pItem ) == SfxItemState::SET ) + nField2 = static_cast<const SfxInt32Item*>(pItem)->GetValue(); + aSortParam.maKeyState[2].bDoSort = ( nField2 != 0 ); + aSortParam.maKeyState[2].nField = nField2 > 0 ? (nField2-1) : 0; + if ( pArgs->GetItemState( FN_PARAM_6, true, &pItem ) == SfxItemState::SET ) + aSortParam.maKeyState[2].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue(); + + // subtotal when needed new + pTabViewShell->UISort( aSortParam ); + rReq.Done(); + } } - } - else - { - ScSortParam aSortParam; - ScDBData* pDBData = pTabViewShell->GetDBData(); - ScViewData& rData = GetViewData(); - - pDBData->GetSortParam( aSortParam ); - - if( lcl_GetSortParam( rData, aSortParam ) ) + else { - ScDocument& rDoc = GetViewData().GetDocument(); - SfxItemSetFixed<SCITEM_SORTDATA, SCITEM_SORTDATA> aArgSet( GetPool() ); + ScSortParam aSortParam; + ScViewData& rData = GetViewData(); pDBData->GetSortParam( aSortParam ); - bool bHasHeader = rDoc.HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, rData.GetTabNo() ); - if( bHasHeader ) - aSortParam.bHasHeader = bHasHeader; - aArgSet.Put( ScSortItem( SCITEM_SORTDATA, &GetViewData(), &aSortParam ) ); + if( lcl_GetSortParam( rData, aSortParam ) ) + { + ScDocument& rDoc = GetViewData().GetDocument(); + SfxItemSetFixed<SCITEM_SORTDATA, SCITEM_SORTDATA> aArgSet( GetPool() ); + + pDBData->GetSortParam( aSortParam ); + bool bHasHeader = rDoc.HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, rData.GetTabNo() ); + if( bHasHeader ) + aSortParam.bHasHeader = bHasHeader; - ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); - std::shared_ptr<ScAsyncTabController> pDlg(pFact->CreateScSortDlg(pTabViewShell->GetFrameWeld(), &aArgSet)); - pDlg->SetCurPageId(u"criteria"_ustr); // 1=sort field tab 2=sort options tab + aArgSet.Put( ScSortItem( SCITEM_SORTDATA, &GetViewData(), &aSortParam ) ); - VclAbstractDialog::AsyncContext aContext; - aContext.maEndDialogFn = [pDlg, &rData, pTabViewShell](sal_Int32 nResult) - { - if ( nResult == RET_OK ) + ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); + std::shared_ptr<ScAsyncTabController> pDlg(pFact->CreateScSortDlg(pTabViewShell->GetFrameWeld(), &aArgSet)); + pDlg->SetCurPageId(u"criteria"_ustr); // 1=sort field tab 2=sort options tab + + VclAbstractDialog::AsyncContext aContext; + aContext.maEndDialogFn = [pDlg, &rData, pTabViewShell](sal_Int32 nResult) { - const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); - const ScSortParam& rOutParam = - pOutSet->Get( SCITEM_SORTDATA ).GetSortData(); + if ( nResult == RET_OK ) + { + const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); + const ScSortParam& rOutParam = + pOutSet->Get( SCITEM_SORTDATA ).GetSortData(); - // subtotal when needed new + // subtotal when needed new - pTabViewShell->UISort( rOutParam ); + pTabViewShell->UISort( rOutParam ); - SfxViewFrame& rViewFrm = pTabViewShell->GetViewFrame(); - SfxRequest aRequest(rViewFrm, SID_SORT); + SfxViewFrame& rViewFrm = pTabViewShell->GetViewFrame(); + SfxRequest aRequest(rViewFrm, SID_SORT); - if ( rOutParam.bInplace ) - { - aRequest.AppendItem( SfxBoolItem( SID_SORT_BYROW, - rOutParam.bByRow ) ); - aRequest.AppendItem( SfxBoolItem( SID_SORT_HASHEADER, - rOutParam.bHasHeader ) ); - aRequest.AppendItem( SfxBoolItem( SID_SORT_CASESENS, - rOutParam.bCaseSens ) ); - aRequest.AppendItem( SfxBoolItem( SID_SORT_NATURALSORT, - rOutParam.bNaturalSort ) ); - aRequest.AppendItem( SfxBoolItem( SID_SORT_INCCOMMENTS, - rOutParam.aDataAreaExtras.mbCellNotes ) ); - aRequest.AppendItem( SfxBoolItem( SID_SORT_INCIMAGES, - rOutParam.aDataAreaExtras.mbCellDrawObjects ) ); - aRequest.AppendItem( SfxBoolItem( SID_SORT_ATTRIBS, - rOutParam.aDataAreaExtras.mbCellFormats ) ); - sal_uInt16 nUser = rOutParam.bUserDef ? ( rOutParam.nUserIndex + 1 ) : 0; - aRequest.AppendItem( SfxUInt16Item( SID_SORT_USERDEF, nUser ) ); - if ( rOutParam.maKeyState[0].bDoSort ) - { - aRequest.AppendItem( SfxInt32Item( TypedWhichId<SfxInt32Item>(FN_PARAM_1), - rOutParam.maKeyState[0].nField + 1 ) ); - aRequest.AppendItem( SfxBoolItem( FN_PARAM_2, - rOutParam.maKeyState[0].bAscending ) ); - } - if ( rOutParam.maKeyState[1].bDoSort ) + if ( rOutParam.bInplace ) { - aRequest.AppendItem( SfxInt32Item( TypedWhichId<SfxInt32Item>(FN_PARAM_3), - rOutParam.maKeyState[1].nField + 1 ) ); - aRequest.AppendItem( SfxBoolItem( FN_PARAM_4, - rOutParam.maKeyState[1].bAscending ) ); - } - if ( rOutParam.maKeyState[2].bDoSort ) - { - aRequest.AppendItem( SfxInt32Item( TypedWhichId<SfxInt32Item>(FN_PARAM_5), - rOutParam.maKeyState[2].nField + 1 ) ); - aRequest.AppendItem( SfxBoolItem( FN_PARAM_6, - rOutParam.maKeyState[2].bAscending ) ); + aRequest.AppendItem( SfxBoolItem( SID_SORT_BYROW, + rOutParam.bByRow ) ); + aRequest.AppendItem( SfxBoolItem( SID_SORT_HASHEADER, + rOutParam.bHasHeader ) ); + aRequest.AppendItem( SfxBoolItem( SID_SORT_CASESENS, + rOutParam.bCaseSens ) ); + aRequest.AppendItem( SfxBoolItem( SID_SORT_NATURALSORT, + rOutParam.bNaturalSort ) ); + aRequest.AppendItem( SfxBoolItem( SID_SORT_INCCOMMENTS, + rOutParam.aDataAreaExtras.mbCellNotes ) ); + aRequest.AppendItem( SfxBoolItem( SID_SORT_INCIMAGES, + rOutParam.aDataAreaExtras.mbCellDrawObjects ) ); + aRequest.AppendItem( SfxBoolItem( SID_SORT_ATTRIBS, + rOutParam.aDataAreaExtras.mbCellFormats ) ); + sal_uInt16 nUser = rOutParam.bUserDef ? ( rOutParam.nUserIndex + 1 ) : 0; + aRequest.AppendItem( SfxUInt16Item( SID_SORT_USERDEF, nUser ) ); + if ( rOutParam.maKeyState[0].bDoSort ) + { + aRequest.AppendItem( SfxInt32Item( TypedWhichId<SfxInt32Item>(FN_PARAM_1), + rOutParam.maKeyState[0].nField + 1 ) ); + aRequest.AppendItem( SfxBoolItem( FN_PARAM_2, + rOutParam.maKeyState[0].bAscending ) ); + } + if ( rOutParam.maKeyState[1].bDoSort ) + { + aRequest.AppendItem( SfxInt32Item( TypedWhichId<SfxInt32Item>(FN_PARAM_3), + rOutParam.maKeyState[1].nField + 1 ) ); + aRequest.AppendItem( SfxBoolItem( FN_PARAM_4, + rOutParam.maKeyState[1].bAscending ) ); + } + if ( rOutParam.maKeyState[2].bDoSort ) + { + aRequest.AppendItem( SfxInt32Item( TypedWhichId<SfxInt32Item>(FN_PARAM_5), + rOutParam.maKeyState[2].nField + 1 ) ); + aRequest.AppendItem( SfxBoolItem( FN_PARAM_6, + rOutParam.maKeyState[2].bAscending ) ); + } } - } - aRequest.Done(); - } - else - { - rData.GetDocShell().CancelAutoDBRange(); - } - }; + aRequest.Done(); + } + else + { + rData.GetDocShell().CancelAutoDBRange(); + } + }; - pDlg->StartExecuteAsync(aContext); + pDlg->StartExecuteAsync(aContext); + } } } } diff --git a/sc/source/ui/view/dbfunc.cxx b/sc/source/ui/view/dbfunc.cxx index 8b0ade4fee01..ec13d170f7ef 100644 --- a/sc/source/ui/view/dbfunc.cxx +++ b/sc/source/ui/view/dbfunc.cxx @@ -282,6 +282,9 @@ void ScDBFunc::ToggleAutoFilter() ScDocument& rDoc = rViewData.GetDocument(); ScDBData* pDBData = GetDBData(false, SC_DB_AUTOFILTER, ScGetDBSelection::RowDown); + if (!pDBData) + return; + pDBData->SetByRow( true ); //! undo, retrieve beforehand ?? pDBData->GetQueryParam( aParam ); @@ -419,6 +422,8 @@ void ScDBFunc::HideAutoFilter() ScDocument& rDoc = rDocSh.GetDocument(); ScDBData* pDBData = GetDBData( false ); + if (!pDBData) + return; SCTAB nTab; SCCOL nCol1, nCol2; diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx index 8aceaab2f36b..f63a670e22de 100644 --- a/sc/source/ui/view/tabvwshc.cxx +++ b/sc/source/ui/view/tabvwshc.cxx @@ -332,52 +332,55 @@ std::shared_ptr<SfxModelessDialogController> ScTabViewShell::CreateRefDialogCont } case SID_FILTER: { + if (ScDBData* pDBData = GetDBData(false, SC_DB_MAKE, ScGetDBSelection::RowDown)) + { + ScQueryParam aQueryParam; + SfxItemSetFixed<SCITEM_QUERYDATA, SCITEM_QUERYDATA> aArgSet( GetPool() ); - ScQueryParam aQueryParam; - SfxItemSetFixed<SCITEM_QUERYDATA, SCITEM_QUERYDATA> aArgSet( GetPool() ); - - ScDBData* pDBData = GetDBData(false, SC_DB_MAKE, ScGetDBSelection::RowDown); - pDBData->ExtendDataArea(rDoc); - pDBData->ExtendBackColorArea(rDoc); - pDBData->GetQueryParam( aQueryParam ); + pDBData->ExtendDataArea(rDoc); + pDBData->ExtendBackColorArea(rDoc); + pDBData->GetQueryParam( aQueryParam ); - ScRange aArea; - pDBData->GetArea(aArea); - MarkRange(aArea, false); + ScRange aArea; + pDBData->GetArea(aArea); + MarkRange(aArea, false); - aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA, &aQueryParam ) ); + aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA, &aQueryParam ) ); - // mark current sheet (due to RefInput in dialog) - GetViewData().SetRefTabNo( GetViewData().GetTabNo() ); + // mark current sheet (due to RefInput in dialog) + GetViewData().SetRefTabNo( GetViewData().GetTabNo() ); - xResult = std::make_shared<ScFilterDlg>(pB, pCW, pParent, GetViewData(), aArgSet); + xResult = std::make_shared<ScFilterDlg>(pB, pCW, pParent, GetViewData(), aArgSet); + } break; } case SID_SPECIAL_FILTER: { - ScQueryParam aQueryParam; - SfxItemSetFixed<SCITEM_QUERYDATA, - SCITEM_QUERYDATA> aArgSet( GetPool() ); + if (ScDBData* pDBData = GetDBData(false, SC_DB_MAKE, ScGetDBSelection::RowDown)) + { + ScQueryParam aQueryParam; + SfxItemSetFixed<SCITEM_QUERYDATA, + SCITEM_QUERYDATA> aArgSet( GetPool() ); - ScDBData* pDBData = GetDBData(false, SC_DB_MAKE, ScGetDBSelection::RowDown); - pDBData->ExtendDataArea(rDoc); - pDBData->GetQueryParam( aQueryParam ); + pDBData->ExtendDataArea(rDoc); + pDBData->GetQueryParam( aQueryParam ); - ScRange aArea; - pDBData->GetArea(aArea); - MarkRange(aArea, false); + ScRange aArea; + pDBData->GetArea(aArea); + MarkRange(aArea, false); - ScQueryItem aItem( SCITEM_QUERYDATA, &aQueryParam ); - ScRange aAdvSource; - if (pDBData->GetAdvancedQuerySource(aAdvSource)) - aItem.SetAdvancedQuerySource( &aAdvSource ); + ScQueryItem aItem( SCITEM_QUERYDATA, &aQueryParam ); + ScRange aAdvSource; + if (pDBData->GetAdvancedQuerySource(aAdvSource)) + aItem.SetAdvancedQuerySource( &aAdvSource ); - aArgSet.Put( aItem ); + aArgSet.Put( aItem ); - // mark current sheet (due to RefInput in dialog) - GetViewData().SetRefTabNo( GetViewData().GetTabNo() ); + // mark current sheet (due to RefInput in dialog) + GetViewData().SetRefTabNo( GetViewData().GetTabNo() ); - xResult = std::make_shared<ScSpecialFilterDlg>(pB, pCW, pParent, GetViewData(), aArgSet); + xResult = std::make_shared<ScSpecialFilterDlg>(pB, pCW, pParent, GetViewData(), aArgSet); + } break; } case SID_OPENDLG_OPTSOLVER: