Kaydet (Commit) 4551eb21 authored tarafından Markus Mohrhard's avatar Markus Mohrhard

change from manual loop to ScMarkData::iterator

in most situations it's much faster to use the iterator instead of the
manual loop + ScMarkData::GetTableSelect
üst 1fed62c9
......@@ -111,35 +111,34 @@ void ScPrintFuncCache::InitLocations( const ScMarkData& rMark, OutputDevice* pDe
ScDocument* pDoc = pDocSh->GetDocument();
SCTAB nTabCount = pDoc->GetTableCount();
for ( SCTAB nTab=0; nTab<nTabCount; nTab++ )
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd && (*itr) < nTabCount; ++itr)
{
if ( rMark.GetTableSelect( nTab ) )
{
ScPrintFunc aFunc( pDev, pDocSh, nTab, nFirstAttr[nTab], nTotalPages, pSelRange, &aSelection.GetOptions() );
aFunc.SetRenderFlag( sal_True );
long nDisplayStart = GetDisplayStart( nTab );
SCTAB nTab = *itr;
ScPrintFunc aFunc( pDev, pDocSh, nTab, nFirstAttr[nTab], nTotalPages, pSelRange, &aSelection.GetOptions() );
aFunc.SetRenderFlag( sal_True );
for ( long nPage=0; nPage<nPages[nTab]; nPage++ )
{
Range aPageRange( nRenderer+1, nRenderer+1 );
MultiSelection aPage( aPageRange );
aPage.SetTotalRange( Range(0,RANGE_MAX) );
aPage.Select( aPageRange );
long nDisplayStart = GetDisplayStart( nTab );
ScPreviewLocationData aLocData( pDoc, pDev );
aFunc.DoPrint( aPage, nTabStart, nDisplayStart, false, NULL, &aLocData );
for ( long nPage=0; nPage<nPages[nTab]; nPage++ )
{
Range aPageRange( nRenderer+1, nRenderer+1 );
MultiSelection aPage( aPageRange );
aPage.SetTotalRange( Range(0,RANGE_MAX) );
aPage.Select( aPageRange );
ScRange aCellRange;
Rectangle aPixRect;
if ( aLocData.GetMainCellRange( aCellRange, aPixRect ) )
aLocations.push_back( ScPrintPageLocation( nRenderer, aCellRange, aPixRect ) );
ScPreviewLocationData aLocData( pDoc, pDev );
aFunc.DoPrint( aPage, nTabStart, nDisplayStart, false, NULL, &aLocData );
++nRenderer;
}
ScRange aCellRange;
Rectangle aPixRect;
if ( aLocData.GetMainCellRange( aCellRange, aPixRect ) )
aLocations.push_back( ScPrintPageLocation( nRenderer, aCellRange, aPixRect ) );
nTabStart += nPages[nTab];
++nRenderer;
}
nTabStart += nPages[nTab];
}
bLocInitialized = true;
......
......@@ -237,13 +237,13 @@ void ScSpellDialogChildWindow::Init()
if ( rMarkData.GetSelectCount() > 1 )
{
SCTAB nTabCount = mpDoc->GetTableCount();
for( SCTAB nOtherTab = 0; nOtherTab < nTabCount; ++nOtherTab )
ScMarkData::iterator itr = rMarkData.begin(), itrEnd = rMarkData.end();
for (; itr != itrEnd; ++itr)
{
if( rMarkData.GetTableSelect( nOtherTab ) && (nOtherTab != nTab) )
if( *itr != nTab )
{
mxUndoDoc->AddUndoTab( nOtherTab, nOtherTab );
mxRedoDoc->AddUndoTab( nOtherTab, nOtherTab );
mxUndoDoc->AddUndoTab( *itr, *itr );
mxRedoDoc->AddUndoTab( *itr, *itr );
}
}
}
......
......@@ -634,7 +634,7 @@ void ScTabViewShell::ExecuteTable( SfxRequest& rReq )
{
SCTAB nNewTab = nCurrentTab;
SCTAB nFirstTab=0;
sal_Bool bTabFlag=false;
bool bTabFlag=false;
ScMarkData& rMark = pViewData->GetMarkData();
std::vector<SCTAB> TheTabs;
for(SCTAB i=0;i<nTabCount;i++)
......@@ -672,9 +672,9 @@ void ScTabViewShell::ExecuteTable( SfxRequest& rReq )
String aUndo = ScGlobal::GetRscString( STR_UNDO_TAB_RTL );
pUndoManager->EnterListAction( aUndo, aUndo );
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
if ( rMark.GetTableSelect(nTab) )
aFunc.SetLayoutRTL( nTab, bSet, false );
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd; ++itr)
aFunc.SetLayoutRTL( *itr, bSet, false );
pUndoManager->LeaveListAction();
}
......@@ -723,11 +723,12 @@ void ScTabViewShell::ExecuteTable( SfxRequest& rReq )
{
scoped_ptr<ScUndoTabColorInfo::List>
pTabColorList(new ScUndoTabColorInfo::List);
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd; ++itr)
{
if ( rMark.GetTableSelect(nTab) && !pDoc->IsTabProtected(nTab) )
if ( !pDoc->IsTabProtected(*itr) )
{
ScUndoTabColorInfo aTabColorInfo(nTab);
ScUndoTabColorInfo aTabColorInfo(*itr);
aTabColorInfo.maNewTabBgColor = aColor;
pTabColorList->push_back(aTabColorInfo);
}
......@@ -771,69 +772,70 @@ void ScTabViewShell::ExecuteTable( SfxRequest& rReq )
pTabColorList(new ScUndoTabColorInfo::List);
if ( nTabSelCount > 1 )
{
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
{
if ( rMark.GetTableSelect(nTab) && !pDoc->IsTabProtected(nTab) )
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd; ++itr)
{
ScUndoTabColorInfo aTabColorInfo(nTab);
aTabColorInfo.maNewTabBgColor = aSelectedColor;
pTabColorList->push_back(aTabColorInfo);
if ( !pDoc->IsTabProtected(*itr) )
{
ScUndoTabColorInfo aTabColorInfo(*itr);
aTabColorInfo.maNewTabBgColor = aSelectedColor;
pTabColorList->push_back(aTabColorInfo);
}
}
bDone = SetTabBgColor( *pTabColorList );
}
bDone = SetTabBgColor( *pTabColorList );
}
else
{
bDone = SetTabBgColor( aSelectedColor, nCurrentTab ); //ScViewFunc.SetTabBgColor
}
if ( bDone )
{
rReq.AppendItem( SvxColorItem( aTabBgColor, nSlot ) );
rReq.Done();
}
else
{
if( rReq.IsAPI() )
else
{
bDone = SetTabBgColor( aSelectedColor, nCurrentTab ); //ScViewFunc.SetTabBgColor
}
if ( bDone )
{
StarBASIC::Error( SbERR_SETPROP_FAILED );
rReq.AppendItem( SvxColorItem( aTabBgColor, nSlot ) );
rReq.Done();
}
else
{
if( rReq.IsAPI() )
{
StarBASIC::Error( SbERR_SETPROP_FAILED );
}
}
}
}
delete( pDlg );
}
delete( pDlg );
}
}
break;
break;
case FID_TAB_EVENTS:
{
ScDocShell* pDocSh = pViewData->GetDocShell();
uno::Reference<container::XNameReplace> xEvents( new ScSheetEventsObj( pDocSh, nCurrentTab ) );
uno::Reference<frame::XFrame> xFrame = GetViewFrame()->GetFrame().GetFrameInterface();
SvxAbstractDialogFactory* pDlgFactory = SvxAbstractDialogFactory::Create();
if (pDlgFactory)
case FID_TAB_EVENTS:
{
std::auto_ptr<VclAbstractDialog> pDialog( pDlgFactory->CreateSvxMacroAssignDlg(
GetDialogParent(), xFrame, false, xEvents, 0 ) );
if ( pDialog.get() && pDialog->Execute() == RET_OK )
ScDocShell* pDocSh = pViewData->GetDocShell();
uno::Reference<container::XNameReplace> xEvents( new ScSheetEventsObj( pDocSh, nCurrentTab ) );
uno::Reference<frame::XFrame> xFrame = GetViewFrame()->GetFrame().GetFrameInterface();
SvxAbstractDialogFactory* pDlgFactory = SvxAbstractDialogFactory::Create();
if (pDlgFactory)
{
// the dialog modifies the settings directly
std::auto_ptr<VclAbstractDialog> pDialog( pDlgFactory->CreateSvxMacroAssignDlg(
GetDialogParent(), xFrame, false, xEvents, 0 ) );
if ( pDialog.get() && pDialog->Execute() == RET_OK )
{
// the dialog modifies the settings directly
}
}
}
}
break;
break;
default:
OSL_FAIL("Unbekannte Message bei ViewShell");
break;
default:
OSL_FAIL("Unbekannte Message bei ViewShell");
break;
}
}
}
//------------------------------------------------------------------
//------------------------------------------------------------------
void ScTabViewShell::GetStateTable( SfxItemSet& rSet )
{
ScViewData* pViewData = GetViewData();
void ScTabViewShell::GetStateTable( SfxItemSet& rSet )
{
ScViewData* pViewData = GetViewData();
ScDocument* pDoc = pViewData->GetDocument();
ScDocShell* pDocShell = pViewData->GetDocShell();
ScMarkData& rMark = GetViewData()->GetMarkData();
......
......@@ -591,12 +591,8 @@ void ScViewData::SetZoomType( SvxZoomType eNew, sal_Bool bAll )
std::vector< SCTAB > vTabs; // Empty for all tabs
if ( !bAll ) // get selected tabs
{
SCTAB nTabCount = pDoc->GetTableCount();
for (SCTAB i=0; i<nTabCount; i++)
{
if ( aMarkData.GetTableSelect(i) )
vTabs.push_back( i );
}
ScMarkData::iterator itr = aMarkData.begin(), itrEnd = aMarkData.end();
vTabs.insert(vTabs.begin(), itr, itrEnd);
}
SetZoomType( eNew, vTabs );
}
......@@ -680,12 +676,8 @@ void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, sal_Bool
std::vector< SCTAB > vTabs;
if ( !bAll ) // get selected tabs
{
SCTAB nTabCount = pDoc->GetTableCount();
for (SCTAB i=0; i<nTabCount; i++)
{
if ( aMarkData.GetTableSelect(i) )
vTabs.push_back( i );
}
ScMarkData::iterator itr = aMarkData.begin(), itrEnd = aMarkData.end();
vTabs.insert(vTabs.begin(), itr, itrEnd);
}
SetZoom( rNewX, rNewY, vTabs );
}
......@@ -1434,10 +1426,9 @@ void ScViewData::CreateTabData( SCTAB nNewTab )
void ScViewData::CreateSelectedTabData()
{
SCTAB nTabCount = aMarkData.GetLastSelected();
for (SCTAB i=0; i<nTabCount; i++)
if ( aMarkData.GetTableSelect(i))
CreateTabData(i);
ScMarkData::iterator itr = aMarkData.begin(), itrEnd = aMarkData.end();
for (; itr != itrEnd; ++itr)
CreateTabData(*itr);
}
void ScViewData::EnsureTabDataSize(size_t nSize)
......
This diff is collapsed.
......@@ -924,9 +924,9 @@ sal_Bool ScViewFunc::PasteOnDrawObject( const uno::Reference<datatransfer::XTran
sal_Bool lcl_SelHasAttrib( ScDocument* pDoc, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
const ScMarkData& rTabSelection, sal_uInt16 nMask )
{
SCTAB nTabCount = pDoc->GetTableCount();
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
if ( rTabSelection.GetTableSelect(nTab) && pDoc->HasAttrib( nCol1, nRow1, nTab, nCol2, nRow2, nTab, nMask ) )
ScMarkData::iterator itr = rTabSelection.begin(), itrEnd = rTabSelection.end();
for (; itr != itrEnd; ++itr)
if ( pDoc->HasAttrib( nCol1, nRow1, *itr, nCol2, nRow2, *itr, nMask ) )
return sal_True;
return false;
}
......@@ -959,13 +959,10 @@ private:
bool lcl_checkDestRangeForOverwrite(const ScRange& rDestRange, const ScDocument* pDoc, const ScMarkData& rMark, Window* pParentWnd)
{
bool bIsEmpty = true;
SCTAB nTabCount = pDoc->GetTableCount();
for (SCTAB nTab=0; nTab < nTabCount && bIsEmpty; ++nTab)
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd && bIsEmpty; ++itr)
{
if (!rMark.GetTableSelect(nTab))
continue;
bIsEmpty = pDoc->IsBlockEmpty(nTab, rDestRange.aStart.Col(), rDestRange.aStart.Row(),
bIsEmpty = pDoc->IsBlockEmpty(*itr, rDestRange.aStart.Col(), rDestRange.aStart.Row(),
rDestRange.aEnd.Col(), rDestRange.aEnd.Row());
}
......@@ -1732,7 +1729,6 @@ void ScViewFunc::PostPasteFromClip(const ScRange& rPasteRange, const ScMarkData&
{
ScViewData* pViewData = GetViewData();
ScDocShell* pDocSh = pViewData->GetDocShell();
ScDocument* pDoc = pViewData->GetDocument();
pDocSh->UpdateOle(pViewData);
SelectionChanged();
......@@ -1742,16 +1738,13 @@ void ScViewFunc::PostPasteFromClip(const ScRange& rPasteRange, const ScMarkData&
if ( pModelObj && pModelObj->HasChangesListeners() )
{
ScRangeList aChangeRanges;
SCTAB nTabCount = pDoc->GetTableCount();
for ( SCTAB i = 0; i < nTabCount; ++i )
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd; ++itr)
{
if ( rMark.GetTableSelect( i ) )
{
ScRange aChangeRange(rPasteRange);
aChangeRange.aStart.SetTab( i );
aChangeRange.aEnd.SetTab( i );
aChangeRanges.Append( aChangeRange );
}
ScRange aChangeRange(rPasteRange);
aChangeRange.aStart.SetTab( *itr );
aChangeRange.aEnd.SetTab( *itr );
aChangeRanges.Append( aChangeRange );
}
pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
}
......
......@@ -227,9 +227,10 @@ void ScViewFunc::DoRefConversion( sal_Bool bRecord )
if ( rMark.GetSelectCount() > 1 )
{
for (SCTAB i=0; i<nTabCount; i++)
if ( rMark.GetTableSelect(i) && i != nTab )
pUndoDoc->AddUndoTab( i, i );
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd; ++itr)
if ( *itr != nTab )
pUndoDoc->AddUndoTab( *itr, *itr );
}
ScRange aCopyRange = aMarkRange;
aCopyRange.aStart.SetTab(0);
......@@ -241,41 +242,40 @@ void ScViewFunc::DoRefConversion( sal_Bool bRecord )
GetViewData()->GetMultiArea( xRanges );
size_t nCount = xRanges->size();
for (SCTAB i=0; i<nTabCount; i++)
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd; ++itr)
{
if (rMark.GetTableSelect(i))
SCTAB i = *itr;
for (size_t j = 0; j < nCount; ++j)
{
for (size_t j = 0; j < nCount; ++j)
ScRange aRange = *(*xRanges)[j];
aRange.aStart.SetTab(i);
aRange.aEnd.SetTab(i);
ScCellIterator aIter( pDoc, aRange );
ScBaseCell* pCell = aIter.GetFirst();
while ( pCell )
{
ScRange aRange = *(*xRanges)[j];
aRange.aStart.SetTab(i);
aRange.aEnd.SetTab(i);
ScCellIterator aIter( pDoc, aRange );
ScBaseCell* pCell = aIter.GetFirst();
while ( pCell )
if (pCell->GetCellType() == CELLTYPE_FORMULA)
{
if (pCell->GetCellType() == CELLTYPE_FORMULA)
String aOld;
((ScFormulaCell*)pCell)->GetFormula(aOld);
xub_StrLen nLen = aOld.Len();
ScRefFinder aFinder( aOld, aIter.GetPos(), pDoc, pDoc->GetAddressConvention() );
aFinder.ToggleRel( 0, nLen );
if (aFinder.GetFound())
{
String aOld;
((ScFormulaCell*)pCell)->GetFormula(aOld);
xub_StrLen nLen = aOld.Len();
ScRefFinder aFinder( aOld, aIter.GetPos(), pDoc, pDoc->GetAddressConvention() );
aFinder.ToggleRel( 0, nLen );
if (aFinder.GetFound())
{
ScAddress aPos = ((ScFormulaCell*)pCell)->aPos;
String aNew = aFinder.GetText();
ScCompiler aComp( pDoc, aPos);
aComp.SetGrammar(pDoc->GetGrammar());
ScTokenArray* pArr = aComp.CompileString( aNew );
ScFormulaCell* pNewCell = new ScFormulaCell( pDoc, aPos,
pArr,formula::FormulaGrammar::GRAM_DEFAULT, MM_NONE );
pDoc->PutCell( aPos, pNewCell );
bOk = sal_True;
}
ScAddress aPos = ((ScFormulaCell*)pCell)->aPos;
String aNew = aFinder.GetText();
ScCompiler aComp( pDoc, aPos);
aComp.SetGrammar(pDoc->GetGrammar());
ScTokenArray* pArr = aComp.CompileString( aNew );
ScFormulaCell* pNewCell = new ScFormulaCell( pDoc, aPos,
pArr,formula::FormulaGrammar::GRAM_DEFAULT, MM_NONE );
pDoc->PutCell( aPos, pNewCell );
bOk = sal_True;
}
pCell = aIter.GetNext();
}
pCell = aIter.GetNext();
}
}
}
......@@ -287,9 +287,10 @@ void ScViewFunc::DoRefConversion( sal_Bool bRecord )
if ( rMark.GetSelectCount() > 1 )
{
for (SCTAB i=0; i<nTabCount; i++)
if ( rMark.GetTableSelect(i) && i != nTab )
pRedoDoc->AddUndoTab( i, i );
itr = rMark.begin();
for (; itr != itrEnd; ++itr)
if ( *itr != nTab )
pRedoDoc->AddUndoTab( *itr, *itr );
}
ScRange aCopyRange = aMarkRange;
aCopyRange.aStart.SetTab(0);
......@@ -518,12 +519,12 @@ void ScViewFunc::DoSheetConversion( const ScConversionParam& rConvParam, sal_Boo
if ( rMark.GetSelectCount() > 1 )
{
SCTAB nTabCount = pDoc->GetTableCount();
for (SCTAB i=0; i<nTabCount; i++)
if ( rMark.GetTableSelect(i) && i != nTab )
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd; ++itr)
if ( *itr != nTab )
{
pUndoDoc->AddUndoTab( i, i );
pRedoDoc->AddUndoTab( i, i );
pUndoDoc->AddUndoTab( *itr, *itr );
pRedoDoc->AddUndoTab( *itr, *itr );
}
}
}
......
This diff is collapsed.
......@@ -259,24 +259,24 @@ void ScViewUtil::UnmarkFiltered( ScMarkData& rMark, ScDocument* pDoc )
SCROW nEndRow = aMultiArea.aEnd.Row();
bool bChanged = false;
SCTAB nTabCount = pDoc->GetTableCount();
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
if ( rMark.GetTableSelect(nTab ) )
ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
for (; itr != itrEnd; ++itr)
{
SCTAB nTab = *itr;
for (SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow)
{
for (SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow)
SCROW nLastRow = nRow;
if (pDoc->RowFiltered(nRow, nTab, NULL, &nLastRow))
{
SCROW nLastRow = nRow;
if (pDoc->RowFiltered(nRow, nTab, NULL, &nLastRow))
{
// use nStartCol/nEndCol, so the multi mark area isn't extended to all columns
// (visible in repaint for indentation)
rMark.SetMultiMarkArea(
ScRange(nStartCol, nRow, nTab, nEndCol, nLastRow, nTab), false);
bChanged = true;
nRow = nLastRow;
}
// use nStartCol/nEndCol, so the multi mark area isn't extended to all columns
// (visible in repaint for indentation)
rMark.SetMultiMarkArea(
ScRange(nStartCol, nRow, nTab, nEndCol, nLastRow, nTab), false);
bChanged = true;
nRow = nLastRow;
}
}
}
if ( bChanged && !rMark.HasAnyMultiMarks() )
rMark.ResetMark();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment