sc/source/ui/view/gridwin4.cxx | 140 ++++++++++++++++++++--------------------- sc/source/ui/view/viewdata.cxx | 4 + 2 files changed, 74 insertions(+), 70 deletions(-)
New commits: commit 68dbf69cdbd822d4ce3bb1fc116b24db7ad5f6ff Author: Marco Cecchetti <[email protected]> Date: Sun Oct 9 22:06:40 2016 +0200 LOK: Calc: an edit view may be not displayed when a 2nd one is killed - description: when in view #1 text editing of a cell is over (edit view killed) a cell still text edited in view #2 can stop to be painted correctly; - reason: when an edit view is killed an ScTabViewShell::UpdateFormulas is broadcasted to all views which in turn ends by invoking ScViewData::SetEditEngine for already existent edit views: if the needed output area size for the actual text content is less then the actual output area size (once grown, output area is never shrunk) leads to this issue; - solution: skip to invoke ScViewData::SetEditEngine when LOK is active and the related view is not the current view. Change-Id: I2a97966c7c04701f0a5443aaaeb74760b622045d Reviewed-on: https://gerrit.libreoffice.org/29627 Reviewed-by: Marco Cecchetti <[email protected]> Tested-by: Marco Cecchetti <[email protected]> diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx index 0bf45ea..f61b5d7 100644 --- a/sc/source/ui/view/viewdata.cxx +++ b/sc/source/ui/view/viewdata.cxx @@ -943,6 +943,10 @@ void ScViewData::SetEditEngine( ScSplitPos eWhich, ScEditEngineDefaulter* pNewEngine, vcl::Window* pWin, SCCOL nNewX, SCROW nNewY ) { + if (comphelper::LibreOfficeKit::isActive() + && GetViewShell() != SfxViewShell::Current()) + return; + bool bLayoutRTL = pDoc->IsLayoutRTL( nTabNo ); ScHSplitPos eHWhich = WhichH(eWhich); commit 0502385b00d49588044abd638bb66c8326b06b87 Author: Marco Cecchetti <[email protected]> Date: Sun Oct 9 21:58:40 2016 +0200 LOK: Calc: if text of 2 cells overlaps, painting occurs in wrong order - description: when text content of two near cells (edited in 2 different views) overlaps, the input content showed is the one entered in the other view; - reason: the edit view of other views was painted after the edit view owned by the current view; Change-Id: I7c47f63bc46f7ce43fc494f018167918d44314b6 Reviewed-on: https://gerrit.libreoffice.org/29626 Reviewed-by: Marco Cecchetti <[email protected]> Tested-by: Marco Cecchetti <[email protected]> diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 800cc9e..bc35620 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -902,76 +902,6 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI } } - // In-place editing - when the user is typing, we need to paint the text - // using the editeng. - // It's being done after EndDrawLayers() to get it outside the overlay - // buffer and on top of everything. - if ( bEditMode && (pViewData->GetRefTabNo() == pViewData->GetTabNo()) ) - { - // get the coordinates of the area we need to clear (overpaint by - // the background) - SCCOL nCol1 = pViewData->GetEditStartCol(); - SCROW nRow1 = pViewData->GetEditStartRow(); - SCCOL nCol2 = pViewData->GetEditEndCol(); - SCROW nRow2 = pViewData->GetEditEndRow(); - rDevice.SetLineColor(); - rDevice.SetFillColor(pEditView->GetBackgroundColor()); - Point aStart = pViewData->GetScrPos( nCol1, nRow1, eWhich ); - Point aEnd = pViewData->GetScrPos( nCol2+1, nRow2+1, eWhich ); - - // don't overwrite grid - long nLayoutSign = bLayoutRTL ? -1 : 1; - aEnd.X() -= 2 * nLayoutSign; - aEnd.Y() -= 2; - - // toggle the cursor off if its on to ensure the cursor invert - // background logic remains valid after the background is cleared on - // the next cursor flash - vcl::Cursor* pCrsr = pEditView->GetCursor(); - const bool bVisCursor = pCrsr && pCrsr->IsVisible(); - if (bVisCursor) - pCrsr->Hide(); - - // set the correct mapmode - Rectangle aBackground(aStart, aEnd); - if (bIsTiledRendering) - { - // Need to draw the background in absolute coords. - auto aOrigin = aOriginalMode.GetOrigin(); - aOrigin.setX(aOrigin.getX() / TWIPS_PER_PIXEL + nScrX); - aOrigin.setY(aOrigin.getY() / TWIPS_PER_PIXEL + nScrY); - aBackground += aOrigin; - rDevice.SetMapMode(aDrawMode); - } - else - rDevice.SetMapMode(pViewData->GetLogicMode()); - - if (bIsTiledRendering) - { - auto aOrigin = aOriginalMode.GetOrigin(); - aOrigin.setX(aOrigin.getX() / TWIPS_PER_PIXEL + nScrX); - aOrigin.setY(aOrigin.getY() / TWIPS_PER_PIXEL + nScrY); - static const double twipFactor = 15 * 1.76388889; // 26.45833335 - aOrigin = Point(aOrigin.getX() * twipFactor, - aOrigin.getY() * twipFactor); - MapMode aNew = rDevice.GetMapMode(); - aNew.SetOrigin(aOrigin); - rDevice.SetMapMode(aNew); - } - - // paint the background - rDevice.DrawRect(rDevice.PixelToLogic(aBackground)); - - // paint the editeng text - Rectangle aEditRect(Point(nScrX, nScrY), Size(aOutputData.GetScrW(), aOutputData.GetScrH())); - pEditView->Paint(rDevice.PixelToLogic(aEditRect), &rDevice); - rDevice.SetMapMode(MAP_PIXEL); - - // restore the cursor it was originally visible - if (bVisCursor) - pCrsr->Show(); - } - // paint in-place editing on other views if (bIsTiledRendering) { @@ -1047,6 +977,76 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI } + // In-place editing - when the user is typing, we need to paint the text + // using the editeng. + // It's being done after EndDrawLayers() to get it outside the overlay + // buffer and on top of everything. + if ( bEditMode && (pViewData->GetRefTabNo() == pViewData->GetTabNo()) ) + { + // get the coordinates of the area we need to clear (overpaint by + // the background) + SCCOL nCol1 = pViewData->GetEditStartCol(); + SCROW nRow1 = pViewData->GetEditStartRow(); + SCCOL nCol2 = pViewData->GetEditEndCol(); + SCROW nRow2 = pViewData->GetEditEndRow(); + rDevice.SetLineColor(); + rDevice.SetFillColor(pEditView->GetBackgroundColor()); + Point aStart = pViewData->GetScrPos( nCol1, nRow1, eWhich ); + Point aEnd = pViewData->GetScrPos( nCol2+1, nRow2+1, eWhich ); + + // don't overwrite grid + long nLayoutSign = bLayoutRTL ? -1 : 1; + aEnd.X() -= 2 * nLayoutSign; + aEnd.Y() -= 2; + + // toggle the cursor off if its on to ensure the cursor invert + // background logic remains valid after the background is cleared on + // the next cursor flash + vcl::Cursor* pCrsr = pEditView->GetCursor(); + const bool bVisCursor = pCrsr && pCrsr->IsVisible(); + if (bVisCursor) + pCrsr->Hide(); + + // set the correct mapmode + Rectangle aBackground(aStart, aEnd); + if (bIsTiledRendering) + { + // Need to draw the background in absolute coords. + auto aOrigin = aOriginalMode.GetOrigin(); + aOrigin.setX(aOrigin.getX() / TWIPS_PER_PIXEL + nScrX); + aOrigin.setY(aOrigin.getY() / TWIPS_PER_PIXEL + nScrY); + aBackground += aOrigin; + rDevice.SetMapMode(aDrawMode); + } + else + rDevice.SetMapMode(pViewData->GetLogicMode()); + + if (bIsTiledRendering) + { + auto aOrigin = aOriginalMode.GetOrigin(); + aOrigin.setX(aOrigin.getX() / TWIPS_PER_PIXEL + nScrX); + aOrigin.setY(aOrigin.getY() / TWIPS_PER_PIXEL + nScrY); + static const double twipFactor = 15 * 1.76388889; // 26.45833335 + aOrigin = Point(aOrigin.getX() * twipFactor, + aOrigin.getY() * twipFactor); + MapMode aNew = rDevice.GetMapMode(); + aNew.SetOrigin(aOrigin); + rDevice.SetMapMode(aNew); + } + + // paint the background + rDevice.DrawRect(rDevice.PixelToLogic(aBackground)); + + // paint the editeng text + Rectangle aEditRect(Point(nScrX, nScrY), Size(aOutputData.GetScrW(), aOutputData.GetScrH())); + pEditView->Paint(rDevice.PixelToLogic(aEditRect), &rDevice); + rDevice.SetMapMode(MAP_PIXEL); + + // restore the cursor it was originally visible + if (bVisCursor) + pCrsr->Show(); + } + if (pViewData->HasEditView(eWhich)) { // flush OverlayManager before changing the MapMode _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
