[Libreoffice-commits] core.git: Branch 'feature/tiled-editing' - 6 commits - editeng/source sc/source svx/source

Jan Holesovsky kendy at collabora.com
Wed Apr 1 08:55:33 PDT 2015


 editeng/source/editeng/editeng.cxx   |    1 
 editeng/source/editeng/impedit3.cxx  |    2 
 editeng/source/outliner/outliner.cxx |    1 
 sc/source/ui/inc/viewdata.hxx        |    4 -
 sc/source/ui/unoobj/docuno.cxx       |    8 +--
 sc/source/ui/view/gridwin.cxx        |   88 +++++++++++++++++++++--------------
 sc/source/ui/view/gridwin2.cxx       |   37 ++++++++++++--
 sc/source/ui/view/gridwin4.cxx       |   18 +++----
 sc/source/ui/view/viewdata.cxx       |   10 +++
 svx/source/svdraw/svdedxv.cxx        |   10 +++
 10 files changed, 116 insertions(+), 63 deletions(-)

New commits:
commit 95b2c1d86511b69eebe45aa398a4513f0dfc1662
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Wed Apr 1 17:48:29 2015 +0200

    sc tiled editing: Make the editing of text in shapes in Calc work.
    
    I suspect the change in svdedxv.cxx is a hack and that the root cause is that
    we should initialize the pDrawView somehow more / better wrt. the output
    device that we are passing to BeginDrawLayers.  [Probably the
    AddPaintWindowToPageView() called in ScGridWindow::PaintTile() is not enough.]
    
    But otherwise this makes the situation much better, and also makes the code
    even more on par with the non-tiled-rendering case, so let's live with that
    for now.
    
    Change-Id: I347b0af9e21acacc9aff4ebb7155246abd3beb43

diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx
index 22674a1..108f36f 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -634,7 +634,6 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
     OutputDevice* pContentDev = &rDevice;   // device for document content, used by overlay manager
     SdrPaintWindow* pTargetPaintWindow = 0; // #i74769# work with SdrPaintWindow directly
 
-    if (!bIsTiledRendering)
     {
         // init redraw
         ScTabViewShell* pTabViewShell = pViewData->GetViewShell();
@@ -649,13 +648,16 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
             {
                 // #i74769# Use new BeginDrawLayers() interface
                 vcl::Region aDrawingRegion(aDrawingRectLogic);
-                pTargetPaintWindow = pDrawView->BeginDrawLayers(this, aDrawingRegion);
+                pTargetPaintWindow = pDrawView->BeginDrawLayers(pContentDev, aDrawingRegion);
                 OSL_ENSURE(pTargetPaintWindow, "BeginDrawLayers: Got no SdrPaintWindow (!)");
 
-                // #i74769# get target device from SdrPaintWindow, this may be the prerender
-                // device now, too.
-                pContentDev = &(pTargetPaintWindow->GetTargetOutputDevice());
-                aOutputData.SetContentDevice( pContentDev );
+                if (!bIsTiledRendering)
+                {
+                    // #i74769# get target device from SdrPaintWindow, this may be the prerender
+                    // device now, too.
+                    pContentDev = &(pTargetPaintWindow->GetTargetOutputDevice());
+                    aOutputData.SetContentDevice(pContentDev);
+                }
             }
 
             pContentDev->SetMapMode(aCurrentMapMode);
@@ -845,7 +847,6 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
         }
     }
 
-    if (!bIsTiledRendering)
     {
         // end redraw
         ScTabViewShell* pTabViewShell = pViewData->GetViewShell();
diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx
index 65a457f..367cd8f 100644
--- a/svx/source/svdraw/svdedxv.cxx
+++ b/svx/source/svdraw/svdedxv.cxx
@@ -328,7 +328,15 @@ void SdrObjEditView::ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectang
     Rectangle aBlankRect(rOutlView.GetOutputArea());
     aBlankRect.Union(aMinTextEditArea);
     Rectangle aPixRect(rTargetDevice.LogicToPixel(aBlankRect));
-    aBlankRect.Intersection(rRect);
+
+    // in the tiled rendering case, the setup is incomplete, and we very
+    // easily get an empty rRect on input - that will cause that everything is
+    // clipped; happens in case of editing text inside a shape in Calc.
+    // FIXME would be better to complete the setup so that we don't get an
+    // empty rRect here
+    if (!GetModel()->isTiledRendering() || !rRect.IsEmpty())
+        aBlankRect.Intersection(rRect);
+
     rOutlView.GetOutliner()->SetUpdateMode(true); // Bugfix #22596#
     rOutlView.Paint(aBlankRect, &rTargetDevice);
 
commit f604218e3e8f54aae3aa8d7768081e87b7e13afc
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Wed Apr 1 17:48:09 2015 +0200

    Kill some whitespace found during debugging.
    
    Change-Id: I456aff9ab6d7469c88f21b0b2f6b922feddc9f50

diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx
index acc0b85..21bdec0 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -235,7 +235,6 @@ void EditEngine::Draw( OutputDevice* pOutDev, const Rectangle& rOutRect, const P
 
 void EditEngine::Draw( OutputDevice* pOutDev, const Rectangle& rOutRect, const Point& rStartDocPos, bool bClip )
 {
-
 #if defined( DBG_UTIL ) || (OSL_DEBUG_LEVEL > 1)
     if ( bDebugPaint )
         EditDbg::ShowEditEngineData( this, false );
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 069a393..972c997 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -3811,7 +3811,6 @@ void ImpEditEngine::Paint( ImpEditView* pView, const Rectangle& rRect, OutputDev
             pTarget->SetMapMode( aOldMapMode );
         }
 
-
         pView->DrawSelection(pView->GetEditSelection(), 0, pTarget);
     }
     else
@@ -3856,7 +3855,6 @@ void ImpEditEngine::Paint( ImpEditView* pView, const Rectangle& rRect, OutputDev
 
         pView->DrawSelection(pView->GetEditSelection(), 0, pTarget);
     }
-
 }
 
 void ImpEditEngine::InsertContent( ContentNode* pNode, sal_Int32 nPos )
diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx
index b30bd95..e0b05e1 100644
--- a/editeng/source/outliner/outliner.cxx
+++ b/editeng/source/outliner/outliner.cxx
@@ -1749,7 +1749,6 @@ void Outliner::DrawingText( const Point& rStartPos, const OUString& rText, sal_I
                             const Color& rOverlineColor,
                             const Color& rTextLineColor)
 {
-
     if(aDrawPortionHdl.IsSet())
     {
         DrawPortionInfo aInfo( rStartPos, rText, nTextStart, nTextLen, rFont, nPara, nIndex, pDXArray, pWrongSpellVector,
commit b11c58889cde10f43a9f239a959eb2c252dc4db7
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Mar 31 14:51:36 2015 +0200

    sc tiled editing: This got fixed by the recent changes.
    
    Change-Id: I6a87657749f3dfa494985893fd8c97ffda13581b

diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx
index dd7b43d..22674a1 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -891,10 +891,7 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
         // set the correct mapmode
         Rectangle aBackground(aStart, aEnd);
         if (bIsTiledRendering)
-        {
-            aBackground += Point(nScrX, nScrY);
             rDevice.SetMapMode(aDrawMode);
-        }
         else
             rDevice.SetMapMode(pViewData->GetLogicMode());
 
commit 901a0282672456987b6de8e515baada8ba8ac070
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Mar 31 14:35:17 2015 +0200

    sc tiled editing: Don't show the cell selection when editing text in shape.
    
    Change-Id: I1ddaa02e64a912c880faec9f907e9526432f6bcd

diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 1027a29..a04bac9 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -5764,6 +5764,22 @@ static void updateLibreOfficeKitSelection(ScViewData* pViewData, ScDrawLayer* pD
 
 void ScGridWindow::UpdateCursorOverlay()
 {
+    ScDocument* pDoc = pViewData->GetDocument();
+    bool bIsTiledRendering = pDoc->GetDrawLayer()->isTiledRendering();
+
+    // in the tiled rendering case, exit early if we are not supposed to draw
+    // the cell cursor:
+    // - there is a selection (either cell selection, or graphic object)
+    // - the user is typing inside a shape or so
+    if (bIsTiledRendering &&
+        (pViewData->GetMarkData().IsMarked() || pViewData->GetMarkData().IsMultiMarked() ||
+         pViewData->GetViewShell()->GetScDrawView()->IsMarking() ||
+         pViewData->GetViewShell()->GetScDrawView()->IsTextEdit() ||
+         pViewData->HasEditView(eWhich)))
+    {
+        return;
+    }
+
     MapMode aDrawMode = GetDrawMapMode();
     MapMode aOldMode = GetMapMode();
     if ( aOldMode != aDrawMode )
@@ -5782,7 +5798,6 @@ void ScGridWindow::UpdateCursorOverlay()
     SCCOL nX = pViewData->GetCurX();
     SCROW nY = pViewData->GetCurY();
 
-    ScDocument* pDoc = pViewData->GetDocument();
     const ScPatternAttr* pPattern = pDoc->GetPattern(nX,nY,nTab);
 
     if (!maVisibleRange.isInside(nX, nY))
@@ -5840,7 +5855,6 @@ void ScGridWindow::UpdateCursorOverlay()
         }
 
         // in the tiled rendering case, don't limit to the screen size
-        bool bIsTiledRendering = pDoc->GetDrawLayer()->isTiledRendering();
         if (bMaybeVisible || bIsTiledRendering)
         {
             long nSizeXPix;
@@ -5925,15 +5939,8 @@ void ScGridWindow::UpdateCursorOverlay()
             mpOOCursors.reset(new sdr::overlay::OverlayObjectList);
             mpOOCursors->append(*pOverlay);
 
-            // notify the LibreOfficeKit too, but only if there's no
-            // selection yet (either cell selection, or graphic object),
-            // to avoid setting the LOK selection twice
-            // (once for the cell only, and then for the selection)
-            if (!pViewData->GetMarkData().IsMarked() && !pViewData->GetMarkData().IsMultiMarked() &&
-                !pViewData->GetViewShell()->GetScDrawView()->IsMarking())
-            {
-                updateLibreOfficeKitSelection(pViewData, pDoc->GetDrawLayer(), aPixelRects);
-            }
+            // notify the LibreOfficeKit too
+            updateLibreOfficeKitSelection(pViewData, pDoc->GetDrawLayer(), aPixelRects);
         }
     }
 
commit 169c25dc48ee3c53e2ccc32d75fc9f4465057cc3
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Mar 31 14:13:09 2015 +0200

    sc tiled editing: Don't resize the gridwin to the entire document.
    
    Instead:
    
    * resize it only to the tile size
    * adjust the view area (to the entire document)
    * never set the "top left cell of the view"
    
    Change-Id: I5d9c784315549025cd77042c4763a53e020bcf03

diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx
index 634eb93..b5348cd 100644
--- a/sc/source/ui/inc/viewdata.hxx
+++ b/sc/source/ui/inc/viewdata.hxx
@@ -133,8 +133,8 @@ private:
     SCROW           nCurY;
     SCCOL           nOldCurX;
     SCROW           nOldCurY;
-    SCCOL           nPosX[2];
-    SCROW           nPosY[2];
+    SCCOL           nPosX[2];                   ///< X position of the top left cell of the visible area.
+    SCROW           nPosY[2];                   ///< Y position of the top left cell of the visible area.
 
     bool            bShowGrid;                  // per sheet show grid lines option.
     bool            mbOldCursorValid;           // "virtual" Cursor position when combined
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 35566dc..1d0684f 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -471,10 +471,10 @@ void ScModelObj::paintTile( VirtualDevice& rDevice,
     ScViewData* pViewData = ScDocShell::GetViewData();
     ScGridWindow* pGridWindow = pViewData->GetActiveWin();
 
-    // Set the viewport size to document size
-    const MapMode aMapTwip( MAP_TWIP );
-    Size aDocSize = getDocumentSize();
-    pGridWindow->SetOutputSizePixel( pGridWindow->LogicToPixel(aDocSize, aMapTwip) );
+    // update the size of the area we are painting
+    Size aTileSize(nOutputWidth, nOutputHeight);
+    if (pGridWindow->GetOutputSizePixel() != aTileSize)
+        pGridWindow->SetOutputSizePixel(Size(nOutputWidth, nOutputHeight));
 
     pGridWindow->PaintTile( rDevice, nOutputWidth, nOutputHeight,
                             nTilePosX, nTilePosY, nTileWidth, nTileHeight );
diff --git a/sc/source/ui/view/gridwin2.cxx b/sc/source/ui/view/gridwin2.cxx
index 4a66bbf..60b27ac 100644
--- a/sc/source/ui/view/gridwin2.cxx
+++ b/sc/source/ui/view/gridwin2.cxx
@@ -588,12 +588,37 @@ void ScGridWindow::UpdateDPFromFieldPopupMenu()
 
 bool ScGridWindow::UpdateVisibleRange()
 {
-    SCCOL nPosX = pViewData->GetPosX(eHWhich);
-    SCROW nPosY = pViewData->GetPosY(eVWhich);
-    SCCOL nXRight = nPosX + pViewData->VisibleCellsX(eHWhich);
-    if (nXRight > MAXCOL) nXRight = MAXCOL;
-    SCROW nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich);
-    if (nYBottom > MAXROW) nYBottom = MAXROW;
+    ScDocument& rDoc = pViewData->GetDocShell()->GetDocument();
+
+    SCCOL nPosX = 0;
+    SCROW nPosY = 0;
+    SCCOL nXRight = MAXCOL;
+    SCROW nYBottom = MAXROW;
+
+    if (rDoc.GetDrawLayer()->isTiledRendering())
+    {
+        // entire table in the tiled rendering case
+        SCTAB nTab = pViewData->GetTabNo();
+        SCCOL nEndCol = 0;
+        SCROW nEndRow = 0;
+
+        if (rDoc.GetPrintArea(nTab, nEndCol, nEndRow, false))
+        {
+            nXRight = nEndCol;
+            nYBottom = nEndRow;
+        }
+    }
+    else
+    {
+        nPosX = pViewData->GetPosX(eHWhich);
+        nPosY = pViewData->GetPosY(eVWhich);
+        nXRight = nPosX + pViewData->VisibleCellsX(eHWhich);
+        if (nXRight > MAXCOL)
+            nXRight = MAXCOL;
+        nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich);
+        if (nYBottom > MAXROW)
+            nYBottom = MAXROW;
+    }
 
     // Store the current visible range.
     bool bChanged = maVisibleRange.set(nPosX, nPosY, nXRight, nYBottom);
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index 2037f82..ced26de 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -1868,7 +1868,8 @@ void ScViewData::GetMouseQuadrant( const Point& rClickPos, ScSplitPos eWhich,
 
 void ScViewData::SetPosX( ScHSplitPos eWhich, SCCOL nNewPosX )
 {
-    if (nNewPosX != 0)
+    // in the tiled rendering case, nPosX [the leftmost visible column] must be 0
+    if (nNewPosX != 0 && !GetDocument()->GetDrawLayer()->isTiledRendering())
     {
         SCCOL nOldPosX = pThisTab->nPosX[eWhich];
         long nTPosX = pThisTab->nTPosX[eWhich];
@@ -1895,15 +1896,18 @@ void ScViewData::SetPosX( ScHSplitPos eWhich, SCCOL nNewPosX )
         pThisTab->nPixPosX[eWhich] = nPixPosX;
     }
     else
+    {
         pThisTab->nPixPosX[eWhich] =
         pThisTab->nTPosX[eWhich] =
         pThisTab->nMPosX[eWhich] =
         pThisTab->nPosX[eWhich] = 0;
+    }
 }
 
 void ScViewData::SetPosY( ScVSplitPos eWhich, SCROW nNewPosY )
 {
-    if (nNewPosY != 0)
+    // in the tiled rendering case, nPosY [the topmost visible row] must be 0
+    if (nNewPosY != 0 && !GetDocument()->GetDrawLayer()->isTiledRendering())
     {
         SCROW nOldPosY = pThisTab->nPosY[eWhich];
         long nTPosY = pThisTab->nTPosY[eWhich];
@@ -1934,10 +1938,12 @@ void ScViewData::SetPosY( ScVSplitPos eWhich, SCROW nNewPosY )
         pThisTab->nPixPosY[eWhich] = nPixPosY;
     }
     else
+    {
         pThisTab->nPixPosY[eWhich] =
         pThisTab->nTPosY[eWhich] =
         pThisTab->nMPosY[eWhich] =
         pThisTab->nPosY[eWhich] = 0;
+    }
 }
 
 void ScViewData::RecalcPixPos()             // after zoom changes
commit e6a9389b254ddef69b5b8acb9f55e8b928bdacb5
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Mar 31 13:15:23 2015 +0200

    sc tiled editing: Show the cell cursor as a rect, not as a frame.
    
    Change-Id: I323f38fffb354b8f5701780b9078aefbfe3e8040

diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 5c301f0..1027a29 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -5838,7 +5838,10 @@ void ScGridWindow::UpdateCursorOverlay()
             Size aOutSize = GetOutputSizePixel();
             bMaybeVisible = ( aScrPos.X() <= aOutSize.Width() + 2 && aScrPos.Y() <= aOutSize.Height() + 2 );
         }
-        if ( bMaybeVisible )
+
+        // in the tiled rendering case, don't limit to the screen size
+        bool bIsTiledRendering = pDoc->GetDrawLayer()->isTiledRendering();
+        if (bMaybeVisible || bIsTiledRendering)
         {
             long nSizeXPix;
             long nSizeYPix;
@@ -5847,36 +5850,46 @@ void ScGridWindow::UpdateCursorOverlay()
             if (bLayoutRTL)
                 aScrPos.X() -= nSizeXPix - 2;       // move instead of mirroring
 
-            Rectangle aRect( aScrPos, Size( nSizeXPix - 1, nSizeYPix - 1) );
+            if (bIsTiledRendering)
+            {
+                // just forward the area to LOK
+                Rectangle aRect(aScrPos, Size(nSizeXPix, nSizeYPix));
+                aPixelRects.push_back(aRect);
+            }
+            else
+            {
+                // show the cursor as 4 (thin) rectangles
+                Rectangle aRect(aScrPos, Size(nSizeXPix - 1, nSizeYPix - 1));
 
-            sal_Int32 nScale = GetDPIScaleFactor();
+                sal_Int32 nScale = GetDPIScaleFactor();
 
-            long aCursorWidth = 1 * nScale;
+                long aCursorWidth = 1 * nScale;
 
-            Rectangle aLeft = Rectangle(aRect);
-            aLeft.Top()    -= aCursorWidth;
-            aLeft.Bottom() += aCursorWidth;
-            aLeft.Right()   = aLeft.Left();
-            aLeft.Left()   -= aCursorWidth;
+                Rectangle aLeft = Rectangle(aRect);
+                aLeft.Top()    -= aCursorWidth;
+                aLeft.Bottom() += aCursorWidth;
+                aLeft.Right()   = aLeft.Left();
+                aLeft.Left()   -= aCursorWidth;
 
-            Rectangle aRight = Rectangle(aRect);
-            aRight.Top()    -= aCursorWidth;
-            aRight.Bottom() += aCursorWidth;
-            aRight.Left()    = aRight.Right();
-            aRight.Right()  += aCursorWidth;
+                Rectangle aRight = Rectangle(aRect);
+                aRight.Top()    -= aCursorWidth;
+                aRight.Bottom() += aCursorWidth;
+                aRight.Left()    = aRight.Right();
+                aRight.Right()  += aCursorWidth;
 
-            Rectangle aTop = Rectangle(aRect);
-            aTop.Bottom()  = aTop.Top();
-            aTop.Top()    -= aCursorWidth;
+                Rectangle aTop = Rectangle(aRect);
+                aTop.Bottom()  = aTop.Top();
+                aTop.Top()    -= aCursorWidth;
 
-            Rectangle aBottom = Rectangle(aRect);
-            aBottom.Top()     = aBottom.Bottom();
-            aBottom.Bottom() += aCursorWidth;
+                Rectangle aBottom = Rectangle(aRect);
+                aBottom.Top()     = aBottom.Bottom();
+                aBottom.Bottom() += aCursorWidth;
 
-            aPixelRects.push_back(aLeft);
-            aPixelRects.push_back(aRight);
-            aPixelRects.push_back(aTop);
-            aPixelRects.push_back(aBottom);
+                aPixelRects.push_back(aLeft);
+                aPixelRects.push_back(aRight);
+                aPixelRects.push_back(aTop);
+                aPixelRects.push_back(aBottom);
+            }
         }
     }
 


More information about the Libreoffice-commits mailing list