diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2019-10-10 21:46:59 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2019-10-11 20:20:50 +0200 |
commit | 5782dc181fe32c4b38dc8595adf7ac99bea2bce8 (patch) | |
tree | b8bc34d0f74bc3c6df137c2b3ef1ea1064f786bf | |
parent | 945c713d60fdca62905eb6aba48408ba5a7dca7a (diff) |
sc: rowcol: migrate some viewdata.
The ScViewData is able to not have a document for a time, curious
to allow a model-free view, but there it is.
Change-Id: I402fa5f814f3cc674b733353c5d3fa2de1970e23
Reviewed-on: https://gerrit.libreoffice.org/80631
Tested-by: Jenkins
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r-- | sc/source/ui/inc/viewdata.hxx | 8 | ||||
-rw-r--r-- | sc/source/ui/view/tabview4.cxx | 8 | ||||
-rw-r--r-- | sc/source/ui/view/tabview5.cxx | 14 | ||||
-rw-r--r-- | sc/source/ui/view/viewdata.cxx | 101 |
4 files changed, 77 insertions, 54 deletions
diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx index 3750a9ba8049..b288b6c05dbd 100644 --- a/sc/source/ui/inc/viewdata.hxx +++ b/sc/source/ui/inc/viewdata.hxx @@ -134,11 +134,12 @@ private: bool operator() (const value_type& rValue1, const value_type& rValue2) const; }; - const index_type MAX_INDEX; + index_type MAX_INDEX; std::set<value_type, Comp> mData; public: - ScPositionHelper(bool bColumn); + ScPositionHelper(ScDocument *pDoc, bool bColumn); + void setDocument(ScDocument *pDoc, bool bColumn); void insert(index_type nIndex, long nPos); void removeByIndex(index_type nIndex); @@ -245,8 +246,9 @@ private: bool bShowGrid; // per sheet show grid lines option. bool mbOldCursorValid; // "virtual" Cursor position when combined - ScViewDataTable(); + ScViewDataTable(ScDocument *pDoc = nullptr); + void InitData(ScDocument *pDoc); void WriteUserDataSequence( css::uno::Sequence <css::beans::PropertyValue>& rSettings, const ScViewData& rViewData ) const; diff --git a/sc/source/ui/view/tabview4.cxx b/sc/source/ui/view/tabview4.cxx index 70e72d0f2ace..3cbd121fb10b 100644 --- a/sc/source/ui/view/tabview4.cxx +++ b/sc/source/ui/view/tabview4.cxx @@ -416,24 +416,24 @@ void ScTabView::UpdateScrollBars( HeaderType eHeaderType ) nStartY = aViewData.GetFixPosY(); nVisXL = aViewData.VisibleCellsX( SC_SPLIT_LEFT ); - long nMaxXL = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_LEFT), nVisXL, MAXCOL, 0 ); + long nMaxXL = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_LEFT), nVisXL, pDoc->MaxCol(), 0 ); SetScrollBar( *aHScrollLeft, nMaxXL, nVisXL, aViewData.GetPosX( SC_SPLIT_LEFT ), bLayoutRTL ); nVisYB = aViewData.VisibleCellsY( SC_SPLIT_BOTTOM ); - long nMaxYB = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_BOTTOM), nVisYB, MAXROW, nStartY ); + long nMaxYB = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_BOTTOM), nVisYB, pDoc->MaxRow(), nStartY ); SetScrollBar( *aVScrollBottom, nMaxYB, nVisYB, aViewData.GetPosY( SC_SPLIT_BOTTOM ) - nStartY, bLayoutRTL ); if (bRight) { nVisXR = aViewData.VisibleCellsX( SC_SPLIT_RIGHT ); - long nMaxXR = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_RIGHT), nVisXR, MAXCOL, nStartX ); + long nMaxXR = lcl_GetScrollRange( nUsedX, aViewData.GetPosX(SC_SPLIT_RIGHT), nVisXR, pDoc->MaxCol(), nStartX ); SetScrollBar( *aHScrollRight, nMaxXR, nVisXR, aViewData.GetPosX( SC_SPLIT_RIGHT ) - nStartX, bLayoutRTL ); } if (bTop) { nVisYT = aViewData.VisibleCellsY( SC_SPLIT_TOP ); - long nMaxYT = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_TOP), nVisYT, MAXROW, 0 ); + long nMaxYT = lcl_GetScrollRange( nUsedY, aViewData.GetPosY(SC_SPLIT_TOP), nVisYT, pDoc->MaxRow(), 0 ); SetScrollBar( *aVScrollTop, nMaxYT, nVisYT, aViewData.GetPosY( SC_SPLIT_TOP ), bLayoutRTL ); } diff --git a/sc/source/ui/view/tabview5.cxx b/sc/source/ui/view/tabview5.cxx index 9d611736f1bb..22afcdb908cd 100644 --- a/sc/source/ui/view/tabview5.cxx +++ b/sc/source/ui/view/tabview5.cxx @@ -106,10 +106,10 @@ void ScTabView::Init() explicitly because the parent frame window is already RTL disabled. */ pTabControl->EnableRTL( AllSettings::GetLayoutRTL() ); - InitScrollBar( *aHScrollLeft, MAXCOL+1 ); - InitScrollBar( *aHScrollRight, MAXCOL+1 ); - InitScrollBar( *aVScrollTop, MAXROW+1 ); - InitScrollBar( *aVScrollBottom, MAXROW+1 ); + InitScrollBar( *aHScrollLeft, aViewData.GetDocument()->MaxCol()+1 ); + InitScrollBar( *aHScrollRight, aViewData.GetDocument()->MaxCol()+1 ); + InitScrollBar( *aVScrollTop, aViewData.GetDocument()->MaxRow()+1 ); + InitScrollBar( *aVScrollBottom, aViewData.GetDocument()->MaxRow()+1 ); /* #i97900# scrollbars remain in correct RTL mode, needed mirroring etc. is now handled correctly at the respective places. */ @@ -320,7 +320,7 @@ void ScTabView::TabChanged( bool bSameTabButMoved ) ScDocShell* pDocSh = GetViewData().GetDocShell(); ScModelObj* pModelObj = pDocSh ? comphelper::getUnoTunnelImplementation<ScModelObj>( pDocSh->GetModel()) : nullptr; - if (pModelObj) + if (pModelObj && GetViewData().GetDocument()) { Size aDocSize = pModelObj->getDocumentSize(); std::stringstream ss; @@ -585,7 +585,7 @@ void ScTabView::MakeVisible( const tools::Rectangle& rHMMRect ) long nLinesX=0, nLinesY=0; // columns/rows - scroll at least nScrollX/Y if (nScrollX > 0) - while (nScrollX > 0 && nPosX < MAXCOL) + while (nScrollX > 0 && nPosX < pDoc->MaxCol()) { nScrollX -= static_cast<long>( pDoc->GetColWidth(nPosX, nTab) * nPPTX ); ++nPosX; @@ -600,7 +600,7 @@ void ScTabView::MakeVisible( const tools::Rectangle& rHMMRect ) } if (nScrollY > 0) - while (nScrollY > 0 && nPosY < MAXROW) + while (nScrollY > 0 && nPosY < pDoc->MaxRow()) { nScrollY -= static_cast<long>( pDoc->GetRowHeight(nPosY, nTab) * nPPTY ); ++nPosY; diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx index e01e53914c81..c3e5482a8670 100644 --- a/sc/source/ui/view/viewdata.cxx +++ b/sc/source/ui/view/viewdata.cxx @@ -118,12 +118,17 @@ bool ScPositionHelper::Comp::operator() (const value_type& rValue1, const value_ } } -ScPositionHelper::ScPositionHelper(bool bColumn) - : MAX_INDEX(bColumn ? MAXCOL : MAXTILEDROW) +ScPositionHelper::ScPositionHelper(ScDocument *pDoc, bool bColumn) + : MAX_INDEX(bColumn ? (pDoc ? pDoc->MaxCol() : -1) : MAXTILEDROW) { mData.insert(std::make_pair(-1, 0)); } +void ScPositionHelper::setDocument(ScDocument *pDoc, bool bColumn) +{ + MAX_INDEX = bColumn ? pDoc->MaxCol() : MAXTILEDROW; +} + void ScPositionHelper::insert(index_type nIndex, long nPos) { if (nIndex < 0) return; @@ -250,6 +255,7 @@ long ScPositionHelper::getPosition(index_type nIndex) const long ScPositionHelper::computePosition(index_type nIndex, const std::function<long (index_type)>& getSizePx) { + assert(MAX_INDEX > 0); if (nIndex < 0) nIndex = 0; if (nIndex > MAX_INDEX) nIndex = MAX_INDEX; @@ -278,7 +284,7 @@ ScBoundsProvider::ScBoundsProvider(ScDocument* pD, SCTAB nT, bool bColHeader) : pDoc(pD) , nTab(nT) , bColumnHeader(bColHeader) - , MAX_INDEX(bColHeader ? MAXCOL : MAXTILEDROW) + , MAX_INDEX(bColHeader ? pD->MaxCol() : MAXTILEDROW) , nFirstIndex(-1) , nSecondIndex(-1) , nFirstPositionPx(-1) @@ -472,7 +478,7 @@ void ScBoundsProvider::GetIndexTowards( } } -ScViewDataTable::ScViewDataTable() : +ScViewDataTable::ScViewDataTable(ScDocument *pDoc) : eZoomType( SvxZoomType::PERCENT ), aZoomX( 1,1 ), aZoomY( 1,1 ), @@ -491,8 +497,8 @@ ScViewDataTable::ScViewDataTable() : nOldCurY( 0 ), nLOKOldCurX( 0 ), nLOKOldCurY( 0 ), - aWidthHelper(true), - aHeightHelper(false), + aWidthHelper(pDoc, true), + aHeightHelper(pDoc, false), nMaxTiledCol( 20 ), nMaxTiledRow( 50 ), bShowGrid( true ), @@ -508,6 +514,12 @@ ScViewDataTable::ScViewDataTable() : nPixPosY[0]=nPixPosY[1]=0; } +void ScViewDataTable::InitData(ScDocument *pDoc) +{ + aWidthHelper.setDocument(pDoc, true); + aHeightHelper.setDocument(pDoc, false); +} + void ScViewDataTable::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rSettings, const ScViewData& rViewData) const { rSettings.realloc(SC_TABLE_VIEWSETTINGS_COUNT); @@ -769,7 +781,7 @@ ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh ) : aScrSize = Size( long( STD_COL_WIDTH * PIXEL_PER_TWIPS * OLE_STD_CELLS_X ), static_cast<long>( ScGlobal::nStdRowHeight * PIXEL_PER_TWIPS * OLE_STD_CELLS_Y ) ); - maTabData.emplace_back( new ScViewDataTable ); + maTabData.emplace_back( new ScViewDataTable(nullptr) ); pThisTab = maTabData[nTabNo].get(); for (sal_uInt16 j=0; j<4; j++) { @@ -795,7 +807,7 @@ ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh ) : ++nTabNo; maTabData.emplace_back(nullptr); } - maTabData[nTabNo].reset( new ScViewDataTable() ); + maTabData[nTabNo].reset( new ScViewDataTable(nullptr) ); pThisTab = maTabData[nTabNo].get(); } @@ -803,6 +815,12 @@ ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh ) : { SCTAB nTableCount = pDoc->GetTableCount(); EnsureTabDataSize(nTableCount); + + for ( auto &it : maTabData ) + { + if (it.get()) + it->InitData( pDoc ); + } } CalcPPT(); @@ -812,6 +830,11 @@ void ScViewData::InitData( ScDocument* pDocument ) { pDoc = pDocument; *pOptions = pDoc->GetViewOptions(); + for ( auto &it : maTabData ) + { + if (it.get()) + it->InitData( pDocument ); + } } ScDocument* ScViewData::GetDocument() const @@ -841,7 +864,7 @@ void ScViewData::UpdateCurrentTab() pThisTab = maTabData[--nTabNo].get(); else { - maTabData[0].reset(new ScViewDataTable); + maTabData[0].reset(new ScViewDataTable(pDoc)); pThisTab = maTabData[0].get(); } } @@ -1185,7 +1208,7 @@ bool ScViewData::SimpleColMarked() SCROW nEndRow; SCTAB nEndTab; if (GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) == SC_MARK_SIMPLE) - if (nStartRow==0 && nEndRow==MAXROW) + if (nStartRow==0 && nEndRow==pDoc->MaxRow()) return true; return false; @@ -1200,7 +1223,7 @@ bool ScViewData::SimpleRowMarked() SCROW nEndRow; SCTAB nEndTab; if (GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) == SC_MARK_SIMPLE) - if (nStartCol==0 && nEndCol==MAXCOL) + if (nStartCol==0 && nEndCol==pDoc->MaxCol()) return true; return false; @@ -1345,8 +1368,8 @@ void ScViewData::SetMaxTiledCol( SCCOL nNewMaxCol ) { if (nNewMaxCol < 0) nNewMaxCol = 0; - if (nNewMaxCol > MAXCOL) - nNewMaxCol = MAXCOL; + if (nNewMaxCol > pDoc->MaxCol()) + nNewMaxCol = pDoc->MaxCol(); const SCTAB nTab = GetTabNo(); ScDocument* pThisDoc = pDoc; @@ -1962,7 +1985,7 @@ void ScViewData::CreateTabData( SCTAB nNewTab ) if (!maTabData[nNewTab]) { - maTabData[nNewTab].reset( new ScViewDataTable ); + maTabData[nNewTab].reset( new ScViewDataTable(pDoc) ); maTabData[nNewTab]->eZoomType = eDefZoomType; maTabData[nNewTab]->aZoomX = aDefZoomX; @@ -2096,7 +2119,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich, { for (SCCOL nX = nStartPosX; nX < nWhereX && (bAllowNeg || bIsTiledRendering || nScrPosX <= aScrSize.Width()); nX++) { - if ( nX > MAXCOL ) + if ( nX > pDoc->MaxCol() ) nScrPosX = 0x7FFFFFFF; else { @@ -2144,7 +2167,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich, { for (SCROW nY = nStartPosY; nY < nWhereY && (bAllowNeg || bIsTiledRendering || nScrPosY <= aScrSize.Height()); nY++) { - if ( nY > MAXROW ) + if ( nY > pDoc->MaxRow() ) nScrPosY = 0x7FFFFFFF; else { @@ -2154,12 +2177,12 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich, long nSizeYPix = ToPixel( nTSize, nPPTY ); nScrPosY += nSizeYPix; } - else if ( nY < MAXROW ) + else if ( nY < pDoc->MaxRow() ) { // skip multiple hidden rows (forward only for now) - SCROW nNext = pDoc->FirstVisibleRow(nY + 1, MAXROW, nTabNo); - if ( nNext > MAXROW ) - nY = MAXROW; + SCROW nNext = pDoc->FirstVisibleRow(nY + 1, pDoc->MaxRow(), nTabNo); + if ( nNext > pDoc->MaxRow() ) + nY = pDoc->MaxRow(); else nY = nNext - 1; // +=nDir advances to next visible row } @@ -2211,7 +2234,7 @@ SCCOL ScViewData::CellsAtX( SCCOL nPosX, SCCOL nDir, ScHSplitPos eWhichX, sal_uI for ( ; nScrPosX<=nScrSizeX && !bOut; nX = sal::static_int_cast<SCCOL>(nX + nDir) ) { SCCOL nColNo = nX; - if ( nColNo < 0 || nColNo > MAXCOL ) + if ( nColNo < 0 || nColNo > pDoc->MaxCol() ) bOut = true; else { @@ -2249,10 +2272,9 @@ SCROW ScViewData::CellsAtY( SCROW nPosY, SCROW nDir, ScVSplitPos eWhichY, sal_uI // forward nY = nPosY; long nScrPosY = 0; - AddPixelsWhile( nScrPosY, nScrSizeY, nY, MAXROW, nPPTY, pDoc, nTabNo); - // Original loop ended on last evaluated +1 or if that was MAXROW even - // on MAXROW+2. - nY += (nY == MAXROW ? 2 : 1); + AddPixelsWhile( nScrPosY, nScrSizeY, nY, pDoc->MaxRow(), nPPTY, pDoc, nTabNo); + // Original loop ended on last evaluated +1 or if that was MaxRow even on MaxRow+2. + nY += (nY == pDoc->MaxRow() ? 2 : 1); nY -= nPosY; } else @@ -2261,8 +2283,7 @@ SCROW ScViewData::CellsAtY( SCROW nPosY, SCROW nDir, ScVSplitPos eWhichY, sal_uI nY = nPosY-1; long nScrPosY = 0; AddPixelsWhileBackward( nScrPosY, nScrSizeY, nY, 0, nPPTY, pDoc, nTabNo); - // Original loop ended on last evaluated -1 or if that was 0 even on - // -2. + // Original loop ended on last evaluated -1 or if that was 0 even on -2. nY -= (nY == 0 ? 2 : 1); nY = (nPosY-1)-nY; } @@ -2354,7 +2375,7 @@ void ScViewData::GetPosFromPixel( long nClickX, long nClickY, ScSplitPos eWhich, if (nClickX > 0) { - while ( rPosX<=MAXCOL && nClickX >= nScrX ) + while ( rPosX<=pDoc->MaxCol() && nClickX >= nScrX ) { nScrX += ToPixel( pDoc->GetColWidth( rPosX, nTabNo ), nPPTX ); ++rPosX; @@ -2371,7 +2392,7 @@ void ScViewData::GetPosFromPixel( long nClickX, long nClickY, ScSplitPos eWhich, } if (nClickY > 0) - AddPixelsWhile( nScrY, nClickY, rPosY, MAXROW, nPPTY, pDoc, nTabNo ); + AddPixelsWhile( nScrY, nClickY, rPosY, pDoc->MaxRow(), nPPTY, pDoc, nTabNo ); else { /* TODO: could need some "SubPixelsWhileBackward" method */ @@ -2399,9 +2420,9 @@ void ScViewData::GetPosFromPixel( long nClickX, long nClickY, ScSplitPos eWhich, } if (rPosX<0) rPosX=0; - if (rPosX>MAXCOL) rPosX=MAXCOL; + if (rPosX>pDoc->MaxCol()) rPosX=pDoc->MaxCol(); if (rPosY<0) rPosY=0; - if (rPosY>MAXROW) rPosY=MAXROW; + if (rPosY>pDoc->MaxRow()) rPosY=pDoc->MaxRow(); if (bTestMerge) { @@ -2420,12 +2441,12 @@ void ScViewData::GetPosFromPixel( long nClickX, long nClickY, ScSplitPos eWhich, { OSL_FAIL("merge error found"); - pDoc->RemoveFlagsTab( 0,0, MAXCOL,MAXROW, nTabNo, ScMF::Hor | ScMF::Ver ); - SCCOL nEndCol = MAXCOL; - SCROW nEndRow = MAXROW; + pDoc->RemoveFlagsTab( 0,0, pDoc->MaxCol(),pDoc->MaxRow(), nTabNo, ScMF::Hor | ScMF::Ver ); + SCCOL nEndCol = pDoc->MaxCol(); + SCROW nEndRow = pDoc->MaxRow(); pDoc->ExtendMerge( 0,0, nEndCol,nEndRow, nTabNo, true ); if (pDocShell) - pDocShell->PostPaint( ScRange(0,0,nTabNo,MAXCOL,MAXROW,nTabNo), PaintPartFlags::Grid ); + pDocShell->PostPaint( ScRange(0,0,nTabNo,pDoc->MaxCol(),pDoc->MaxRow(),nTabNo), PaintPartFlags::Grid ); } } } @@ -2610,7 +2631,7 @@ void ScViewData::SetScreenPos( const Point& rVisAreaStart ) while (!bEnd) { nAdd = static_cast<long>(pDoc->GetColWidth(nX1,nTabNo)); - if (nSize+nAdd <= nTwips+1 && nX1<MAXCOL) + if (nSize+nAdd <= nTwips+1 && nX1<pDoc->MaxCol()) { nSize += nAdd; ++nX1; @@ -2626,7 +2647,7 @@ void ScViewData::SetScreenPos( const Point& rVisAreaStart ) while (!bEnd) { nAdd = static_cast<long>(pDoc->GetRowHeight(nY1,nTabNo)); - if (nSize+nAdd <= nTwips+1 && nY1<MAXROW) + if (nSize+nAdd <= nTwips+1 && nY1<pDoc->MaxRow()) { nSize += nAdd; ++nY1; @@ -2896,7 +2917,7 @@ void ScViewData::ReadUserData(const OUString& rData) aTabOpt = rData.getToken(0, ';', nMainIdx); EnsureTabDataSize(nPos + 1); if (!maTabData[nPos]) - maTabData[nPos].reset( new ScViewDataTable ); + maTabData[nPos].reset( new ScViewDataTable(pDoc) ); sal_Unicode cTabSep = 0; if (comphelper::string::getTokenCount(aTabOpt, SC_OLD_TABSEP) >= 11) @@ -3072,7 +3093,7 @@ void ScViewData::ReadExtOptions( const ScExtDocOptions& rDocOpt ) if( const ScExtTabSettings* pTabSett = rDocOpt.GetTabSettings( nTab ) ) { if( !maTabData[ nTab ] ) - maTabData[ nTab ].reset( new ScViewDataTable ); + maTabData[ nTab ].reset( new ScViewDataTable(pDoc) ); const ScExtTabSettings& rTabSett = *pTabSett; ScViewDataTable& rViewTab = *maTabData[ nTab ]; @@ -3343,7 +3364,7 @@ void ScViewData::ReadUserDataSequence(const uno::Sequence <beans::PropertyValue> { EnsureTabDataSize(nTab + 1); if (!maTabData[nTab]) - maTabData[nTab].reset( new ScViewDataTable ); + maTabData[nTab].reset( new ScViewDataTable(pDoc) ); bool bHasZoom = false; maTabData[nTab]->ReadUserDataSequence(aTabSettings, *this, nTab, bHasZoom); |