summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorMarco Cecchetti <marco.cecchetti@collabora.com>2017-03-29 12:55:12 +0200
committerMarco Cecchetti <mrcekets@gmail.com>2017-10-02 18:44:46 +0200
commitb230f845e794641721254e0a95b006eb3588aa0c (patch)
treea8fce1f2b972d7ccd9745b4448a908603b00862a /sc
parenta789ef3c41443a3aa964bea31e2c8e22552fcdfd (diff)
lok - sc: document size as sum of row heights/col widths in pixel
Grid lines, cursor overlay, row/col headers are all computed by summing up row heights / col widths converted to pixels. On the contrary the document size was converted to pixel only at the end after having summed up heights/widths in twips. All that lead to have a document height/width greater than the position of the last row/col, with the scrolling in online going unplesantly far beyond the last row/column. This patch change the way the document size is computed, so that the spreadsheet height/width matches the position of the last row/column. Moreover it exploits the cache-like structure for row/col positions introduced in a previous commit. Change-Id: Ibb2cc6a7b592e359a0b1202dc9bea1dd4c421354 Reviewed-on: https://gerrit.libreoffice.org/40448 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Marco Cecchetti <mrcekets@gmail.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/ui/inc/viewdata.hxx7
-rw-r--r--sc/source/ui/unoobj/docuno.cxx20
-rw-r--r--sc/source/ui/view/viewdata.cxx90
3 files changed, 109 insertions, 8 deletions
diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx
index dbda16afe2f2..0b3fbb2f61b3 100644
--- a/sc/source/ui/inc/viewdata.hxx
+++ b/sc/source/ui/inc/viewdata.hxx
@@ -337,6 +337,9 @@ public:
SCROW GetCurYForTab( SCTAB nTabIndex ) const;
SCCOL GetOldCurX() const;
SCROW GetOldCurY() const;
+ long GetLOKDocWidthPixel() const { return pThisTab->aWidthHelper.getPosition(pThisTab->nMaxTiledCol); }
+ long GetLOKDocHeightPixel() const { return pThisTab->aHeightHelper.getPosition(pThisTab->nMaxTiledRow); }
+
ScPositionHelper& GetLOKWidthHelper() { return pThisTab->aWidthHelper; }
ScPositionHelper& GetLOKHeightHelper() { return pThisTab->aHeightHelper; }
@@ -367,8 +370,8 @@ public:
void SetVSplitPos( long nPos ) { pThisTab->nVSplitPos = nPos; }
void SetFixPosX( SCCOL nPos ) { pThisTab->nFixPosX = nPos; }
void SetFixPosY( SCROW nPos ) { pThisTab->nFixPosY = nPos; }
- void SetMaxTiledCol( SCCOL nCol ) { pThisTab->nMaxTiledCol = nCol; }
- void SetMaxTiledRow( SCROW nRow ) { pThisTab->nMaxTiledRow = nRow; }
+ void SetMaxTiledCol( SCCOL nCol );
+ void SetMaxTiledRow( SCROW nRow );
void SetPagebreakMode( bool bSet );
void SetPasteMode ( ScPasteFlags nFlags ) { nPasteFlags = nFlags; }
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 265334a5eef8..ba1508c5195a 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -551,7 +551,7 @@ Size ScModelObj::getDocumentSize()
{
Size aSize(10, 10); // minimum size
- const ScViewData* pViewData = ScDocShell::GetViewData();
+ ScViewData* pViewData = ScDocShell::GetViewData();
if (!pViewData)
return aSize;
@@ -562,9 +562,21 @@ Size ScModelObj::getDocumentSize()
rDoc.GetTiledRenderingArea(nTab, nEndCol, nEndRow);
- // convert to twips
- aSize.setWidth(rDoc.GetColWidth(0, nEndCol, nTab));
- aSize.setHeight(rDoc.GetRowHeight(0, nEndRow, nTab));
+ pViewData->SetMaxTiledCol(nEndCol);
+ pViewData->SetMaxTiledRow(nEndRow);
+
+ if (pViewData->GetLOKDocWidthPixel() > 0 && pViewData->GetLOKDocHeightPixel() > 0)
+ {
+ // convert to twips
+ aSize.setWidth(pViewData->GetLOKDocWidthPixel() * TWIPS_PER_PIXEL);
+ aSize.setHeight(pViewData->GetLOKDocHeightPixel() * TWIPS_PER_PIXEL);
+ }
+ else
+ {
+ // convert to twips
+ aSize.setWidth(rDoc.GetColWidth(0, nEndCol, nTab));
+ aSize.setHeight(rDoc.GetRowHeight(0, nEndRow, nTab));
+ }
return aSize;
}
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index af65ac0af798..88d2c8e56418 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -1163,9 +1163,95 @@ void ScViewData::SetCurYForTab( SCCOL nNewCurY, SCTAB nTabIndex )
maTabData[nTabIndex]->nCurY = nNewCurY;
}
+void ScViewData::SetMaxTiledCol( SCCOL nNewMaxCol )
+{
+ if (nNewMaxCol < 0)
+ nNewMaxCol = 0;
+ if (nNewMaxCol > MAXCOL)
+ nNewMaxCol = MAXCOL;
+
+ const SCTAB nTab = GetTabNo();
+ ScDocument* pThisDoc = pDoc;
+ auto GetColWidthPx = [pThisDoc, nTab](SCCOL nCol) {
+ const sal_uInt16 nSize = pThisDoc->GetColWidth(nCol, nTab);
+ const long nSizePx = ScViewData::ToPixel(nSize, 1.0 / TWIPS_PER_PIXEL);
+ return nSizePx;
+ };
+
+ const auto& rNearest = GetLOKWidthHelper().getNearestByIndex(nNewMaxCol);
+ SCCOL nStartCol = rNearest.first;
+ long nTotalPixels = rNearest.second;
+
+ if (nStartCol < nNewMaxCol)
+ {
+ for (SCCOL nCol = nStartCol + 1; nCol <= nNewMaxCol; ++nCol)
+ {
+ nTotalPixels += GetColWidthPx(nCol);
+ }
+ }
+ else
+ {
+ for (SCCOL nCol = nStartCol; nCol > nNewMaxCol; --nCol)
+ {
+ nTotalPixels -= GetColWidthPx(nCol);
+ }
+ }
+
+ SAL_INFO("sc.lok.docsize", "ScViewData::SetMaxTiledCol: nNewMaxCol: "
+ << nNewMaxCol << ", nTotalPixels: " << nTotalPixels);
+
+ GetLOKWidthHelper().removeByIndex(pThisTab->nMaxTiledCol);
+ GetLOKWidthHelper().insert(nNewMaxCol, nTotalPixels);
+
+ pThisTab->nMaxTiledCol = nNewMaxCol;
+}
+
+void ScViewData::SetMaxTiledRow( SCROW nNewMaxRow )
+{
+ if (nNewMaxRow < 0)
+ nNewMaxRow = 0;
+ if (nNewMaxRow > MAXTILEDROW)
+ nNewMaxRow = MAXTILEDROW;
+
+ const SCTAB nTab = GetTabNo();
+ ScDocument* pThisDoc = pDoc;
+ auto GetRowHeightPx = [pThisDoc, nTab](SCROW nRow) {
+ const sal_uInt16 nSize = pThisDoc->GetRowHeight(nRow, nTab);
+ const long nSizePx = ScViewData::ToPixel(nSize, 1.0 / TWIPS_PER_PIXEL);
+ return nSizePx;
+ };
+
+ const auto& rNearest = GetLOKHeightHelper().getNearestByIndex(nNewMaxRow);
+ SCROW nStartRow = rNearest.first;
+ long nTotalPixels = rNearest.second;
+
+ if (nStartRow < nNewMaxRow)
+ {
+ for (SCROW nRow = nStartRow + 1; nRow <= nNewMaxRow; ++nRow)
+ {
+ nTotalPixels += GetRowHeightPx(nRow);
+ }
+ }
+ else
+ {
+ for (SCROW nRow = nStartRow; nRow > nNewMaxRow; --nRow)
+ {
+ nTotalPixels -= GetRowHeightPx(nRow);
+ }
+ }
+
+ SAL_INFO("sc.lok.docsize", "ScViewData::SetMaxTiledRow: nNewMaxRow: "
+ << nNewMaxRow << ", nTotalPixels: " << nTotalPixels);
+
+ GetLOKHeightHelper().removeByIndex(pThisTab->nMaxTiledRow);
+ GetLOKHeightHelper().insert(nNewMaxRow, nTotalPixels);
+
+ pThisTab->nMaxTiledRow = nNewMaxRow;
+}
+
tools::Rectangle ScViewData::GetEditArea( ScSplitPos eWhich, SCCOL nPosX, SCROW nPosY,
- vcl::Window* pWin, const ScPatternAttr* pPattern,
- bool bForceToTop )
+ vcl::Window* pWin, const ScPatternAttr* pPattern,
+ bool bForceToTop )
{
return ScEditUtil( pDoc, nPosX, nPosY, nTabNo, GetScrPos(nPosX,nPosY,eWhich,true),
pWin, nPPTX, nPPTY, GetZoomX(), GetZoomY() ).