sc/inc/document.hxx | 30 +++++++++++++++- sc/inc/table.hxx | 1 sc/source/core/data/document.cxx | 21 +++++++++++ sc/source/core/data/table2.cxx | 21 +++++++++++ sc/source/ui/inc/viewdata.hxx | 1 sc/source/ui/unoobj/docuno.cxx | 24 +++++++++++-- sc/source/ui/view/gridwin4.cxx | 70 ++++++++++++++++++++++++++++++++++----- sc/source/ui/view/viewdata.cxx | 6 +++ 8 files changed, 160 insertions(+), 14 deletions(-)
New commits: commit d04e06f6e41250d51c931dd9aa160c7d1b83941b Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed Jan 14 22:16:33 2015 -0500 Comment these out for now. We'll use them later. Change-Id: I7e6afeea9368241bea8af141726e73c557475317 diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 05fc3a0..366eb28 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -874,7 +874,7 @@ void ScGridWindow::Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, ScUpdateMod void ScGridWindow::PaintTile( VirtualDevice& rDevice, int nOutputWidth, int nOutputHeight, - int nTilePosX, int nTilePosY, + int /*nTilePosX*/, int /*nTilePosY*/, long nTileWidth, long nTileHeight ) { // Output size is in pixels while tile position and size are in logical units (twips). commit eb6b39c3002b6e05ef417cf477808479f7a3b763 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed Jan 14 22:11:35 2015 -0500 Add TODO. Text rendering is still weird. Change-Id: I2da98a82f2d2407f48960a4e53643cee63b4844d diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 85ab94f..05fc3a0 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -934,7 +934,9 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, aOutData.DrawShadow(); aOutData.DrawFrame(); + // TODO : Scaling of strings is incorrect. Find out why. aOutData.DrawStrings(true); + // TODO : Edit texts don't get rendered at all. Fix this. aOutData.DrawEdit(true); } commit 31e5afcd7abcb27aa2af991aebdb184fa0e15849 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed Jan 14 16:14:50 2015 -0500 Adjust zoom level for different output tile size. Change-Id: I54b9f3ca66035b66509c960ca79391446ecf8778 diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index fc9879b..85ab94f 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -882,6 +882,24 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, // Assumption: always paint the whole sheet i.e. "visible" range is always // from (0,0) to last data position. + // Tile geometry is independent of the zoom level, but the output size is + // dependent of the zoom level. Determine the correct zoom level before + // we start. + + // TODO : zooming isn't perfect. Find out why. + double nOutWTwips = static_cast<double>(nOutputWidth) / PIXEL_PER_TWIPS; + double nOutHTwips = static_cast<double>(nOutputHeight) / PIXEL_PER_TWIPS; + + nOutWTwips /= nTileWidth; + nOutHTwips /= nTileHeight; + Fraction aFracX(nOutWTwips); + Fraction aFracY(nOutHTwips); + + pViewData->SetZoom(aFracX, aFracY, true); + pViewData->RefreshZoom(); + + rDevice.SetOutputSizePixel(Size(nOutputWidth, nOutputHeight)); + SCTAB nTab = pViewData->GetTabNo(); ScDocument* pDoc = pViewData->GetDocument(); ScAddress aLastPos = pDoc->GetLastDataPos(nTab); @@ -908,6 +926,9 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, } aOutData.SetGridColor(aGridColor); + aOutData.DrawClear(); + aOutData.DrawDocumentBackground(); + aOutData.DrawBackground(); aOutData.DrawGrid(true, false); aOutData.DrawShadow(); commit 169b93971bb16058ad83603cc6849a35e22929d7 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Tue Jan 13 18:50:04 2015 -0500 Set correct grid color. Change-Id: Ie8ccf61f0b04b718c930b14374843e3858c6278b diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 54d9d0e..fc9879b 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -897,6 +897,17 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, ScOutputData aOutData( &rDevice, OUTTYPE_WINDOW, aTabInfo, pDoc, nTab, 0, 0, nCol1, nRow1, nCol2, nRow2, fPPTX, fPPTY); + + const svtools::ColorConfig& rColorCfg = SC_MOD()->GetColorConfig(); + Color aGridColor = rColorCfg.GetColorValue(svtools::CALCGRID, false).nColor; + if (aGridColor.GetColor() == COL_TRANSPARENT) + { + // use view options' grid color only if color config has "automatic" color + const ScViewOptions& rOpts = pViewData->GetOptions(); + aGridColor = rOpts.GetGridColor(); + } + aOutData.SetGridColor(aGridColor); + aOutData.DrawGrid(true, false); aOutData.DrawShadow(); commit 6a5f3ff796db42a616845323731bf796907797b8 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Tue Jan 13 18:21:55 2015 -0500 Tiled rendering, first cut. Very simple, without zooming. Change-Id: Ia5bd5c02dab3eedbaad07ebd81c4d7fe3c6a00c1 diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index e163d4d..54d9d0e 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -877,13 +877,33 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, int nTilePosX, int nTilePosY, long nTileWidth, long nTileHeight ) { - (void) rDevice; - (void) nOutputWidth; - (void) nOutputHeight; - (void) nTilePosX; - (void) nTilePosY; - (void) nTileWidth; - (void) nTileHeight; + // Output size is in pixels while tile position and size are in logical units (twips). + + // Assumption: always paint the whole sheet i.e. "visible" range is always + // from (0,0) to last data position. + + SCTAB nTab = pViewData->GetTabNo(); + ScDocument* pDoc = pViewData->GetDocument(); + ScAddress aLastPos = pDoc->GetLastDataPos(nTab); + + SCCOL nCol1 = 0, nCol2 = aLastPos.Col(); + SCROW nRow1 = 0, nRow2 = aLastPos.Row(); + + double fPPTX = pViewData->GetPPTX(); + double fPPTY = pViewData->GetPPTY(); + + ScTableInfo aTabInfo; + pDoc->FillInfo(aTabInfo, nCol1, nRow1, nCol2, nRow2, nTab, fPPTX, fPPTY, false, false, NULL); + + ScOutputData aOutData( + &rDevice, OUTTYPE_WINDOW, aTabInfo, pDoc, nTab, 0, 0, nCol1, nRow1, nCol2, nRow2, fPPTX, fPPTY); + aOutData.DrawGrid(true, false); + + aOutData.DrawShadow(); + aOutData.DrawFrame(); + + aOutData.DrawStrings(true); + aOutData.DrawEdit(true); } void ScGridWindow::CheckNeedsRepaint() commit 8a0a1fbfc3aacb7e71c79da75c56698c1ea2378d Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Jan 12 21:59:50 2015 -0500 Implement getDocumentSize(). Cell data only for now. Change-Id: I31e14f12aaee2d98103d1594ba5b511ebf91e333 diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 61fa81d..ddf427d 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -1105,6 +1105,16 @@ public: SCROW GetLastDataRow( SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCROW nLastRow ) const; /** + * Return the cell position representing the bottom-right corner of the + * smallest range that includes all non-empty cells for specified sheet. + * + * @param nTab sheet index. + * + * @return address of the last data position. + */ + ScAddress GetLastDataPos( SCTAB nTab ) const; + + /** * Return the smallest area containing at least all contiguous cells * having data. This area is a square containing also empty cells. It may * shrink or extend the area given as input Flags as modifiers: @@ -1520,6 +1530,7 @@ public: SC_DLLPUBLIC void SetManualHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bManual ); SC_DLLPUBLIC sal_uInt16 GetColWidth( SCCOL nCol, SCTAB nTab, bool bHiddenAsZero = true ) const; + SC_DLLPUBLIC sal_uLong GetColWidth( SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool bHiddenAsZero = true ) const; SC_DLLPUBLIC sal_uInt16 GetRowHeight( SCROW nRow, SCTAB nTab, bool bHiddenAsZero = true ) const; SC_DLLPUBLIC sal_uInt16 GetRowHeight( SCROW nRow, SCTAB nTab, SCROW* pStartRow, SCROW* pEndRow, bool bHiddenAsZero = true ) const; SC_DLLPUBLIC sal_uLong GetRowHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bHiddenAsZero = true ) const; diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 89a9a49..88a0461 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -721,6 +721,7 @@ public: void SetManualHeight( SCROW nStartRow, SCROW nEndRow, bool bManual ); sal_uInt16 GetColWidth( SCCOL nCol, bool bHiddenAsZero = true ) const; + sal_uLong GetColWidth( SCCOL nStartCol, SCCOL nEndCol, bool bHiddenAsZero = true ) const; SC_DLLPUBLIC sal_uInt16 GetRowHeight( SCROW nRow, SCROW* pStartRow = NULL, SCROW* pEndRow = NULL, bool bHiddenAsZero = true ) const; sal_uLong GetRowHeight( SCROW nStartRow, SCROW nEndRow, bool bHiddenAsZero = true ) const; sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale ) const; diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 64a4284..43117b0 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -1045,6 +1045,18 @@ SCROW ScDocument::GetLastDataRow( SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCROW nL return pTab->GetLastDataRow(nCol1, nCol2, nLastRow); } +ScAddress ScDocument::GetLastDataPos( SCTAB nTab ) const +{ + const ScTable* pTab = FetchTable(nTab); + if (!pTab) + return ScAddress(ScAddress::INITIALIZE_INVALID); + + SCCOL nCol; + SCROW nRow; + pTab->GetLastDataPos(nCol, nRow); + return ScAddress(nCol, nRow, nTab); +} + // connected area void ScDocument::GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, @@ -3894,6 +3906,15 @@ sal_uInt16 ScDocument::GetColWidth( SCCOL nCol, SCTAB nTab, bool bHiddenAsZero ) return 0; } +sal_uLong ScDocument::GetColWidth( SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool bHiddenAsZero ) const +{ + const ScTable* pTab = FetchTable(nTab); + if (!pTab) + return 0; + + return pTab->GetColWidth(nStartCol, nEndCol, bHiddenAsZero); +} + sal_uInt16 ScDocument::GetOriginalWidth( SCCOL nCol, SCTAB nTab ) const { if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index adc1626..160da7f 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -2837,6 +2837,27 @@ sal_uInt16 ScTable::GetColWidth( SCCOL nCol, bool bHiddenAsZero ) const return (sal_uInt16) STD_COL_WIDTH; } +sal_uLong ScTable::GetColWidth( SCCOL nStartCol, SCCOL nEndCol, bool bHiddenAsZero ) const +{ + if (!ValidCol(nStartCol) || !ValidCol(nEndCol) || nStartCol > nEndCol) + return 0; + + sal_uLong nW = 0; + bool bHidden = false; + SCCOL nLastHiddenCol = -1; + for (SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol) + { + if (bHiddenAsZero && nCol > nLastHiddenCol) + bHidden = ColHidden(nCol, NULL, &nLastHiddenCol); + + if (bHidden) + continue; + + nW += pColWidth[nCol]; + } + return nW; +} + sal_uInt16 ScTable::GetOriginalWidth( SCCOL nCol ) const // immer die eingestellte { OSL_ENSURE(ValidCol(nCol),"wrong column number"); diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index 10f50aa..faf655b 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -488,10 +488,26 @@ int ScModelObj::getPart() Size ScModelObj::getDocumentSize() { - // TODO: not sure what we want to do here, maybe just return the size for a certain - // default minimum number of cells, e.g. 100x100 and more if more cells have - // content? - return Size(); + Size aSize(10, 10); // minimum size + + const ScViewData* pViewData = ScDocShell::GetViewData(); + if (!pViewData) + return aSize; + + SCTAB nTab = pViewData->GetTabNo(); + const ScDocument& rDoc = pDocShell->GetDocument(); + ScAddress aPos = rDoc.GetLastDataPos(nTab); + if (!aPos.IsValid()) + return aSize; + + // TWIPS + sal_uLong nH = rDoc.GetRowHeight(0, aPos.Row(), nTab, true); + sal_uLong nW = rDoc.GetColWidth(0, aPos.Col(), nTab, true); + + aSize.setWidth(nW); + aSize.setHeight(nH); + + return aSize; } uno::Any SAL_CALL ScModelObj::queryInterface( const uno::Type& rType ) commit 83e8b259c3c0c0bc593ea0eb60dde0dc8299d970 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Jan 12 18:50:11 2015 -0500 Annotate this method. Change-Id: Ia8f518fd6e61562e95eddacafc9f7e49656826e8 diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 57fcf74..61fa81d 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -1104,8 +1104,23 @@ public: */ SCROW GetLastDataRow( SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCROW nLastRow ) const; - SC_DLLPUBLIC void GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, - SCCOL& rEndCol, SCROW& rEndRow, bool bIncludeOld, bool bOnlyDown ) const; + /** + * Return the smallest area containing at least all contiguous cells + * having data. This area is a square containing also empty cells. It may + * shrink or extend the area given as input Flags as modifiers: + * + * @param bIncludeOld when true, ensure that the returned area contains at + * least the initial area even if the actual data area + * is smaller than the initial area. + * + * @param bOnlyDown when true, extend / shrink the data area only in a + * downward direction i.e. only modify the end row + * position. + */ + SC_DLLPUBLIC void GetDataArea( + SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, + bool bIncludeOld, bool bOnlyDown ) const; + SC_DLLPUBLIC bool GetCellArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const; SC_DLLPUBLIC bool GetTableArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const; SC_DLLPUBLIC bool GetPrintArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow, commit 403bf4defabf440e9a44ed77febc1b4aaa92e07d Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Jan 12 17:22:25 2015 -0500 Provide const version that returns a const pointer. Change-Id: I6a07919af477f2641797b14838ee5ef563ffe532 diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx index 233c60a..634eb93 100644 --- a/sc/source/ui/inc/viewdata.hxx +++ b/sc/source/ui/inc/viewdata.hxx @@ -241,6 +241,7 @@ public: vcl::Window* GetDialogParent(); // forwarded from tabvwsh ScGridWindow* GetActiveWin(); // from View + const ScGridWindow* GetActiveWin() const; ScDrawView* GetScDrawView(); // from View bool IsMinimized(); // from View diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx index b5950a0..357b900 100644 --- a/sc/source/ui/view/viewdata.cxx +++ b/sc/source/ui/view/viewdata.cxx @@ -2108,6 +2108,12 @@ ScGridWindow* ScViewData::GetActiveWin() return pView->GetActiveWin(); } +const ScGridWindow* ScViewData::GetActiveWin() const +{ + OSL_ENSURE( pView, "GetActiveWin() ohne View" ); + return pView->GetActiveWin(); +} + ScDrawView* ScViewData::GetScDrawView() { OSL_ENSURE( pView, "GetScDrawView() ohne View" ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits