desktop/source/lib/init.cxx |  128 ++++++++++++++++++--------------------------
 1 file changed, 55 insertions(+), 73 deletions(-)

New commits:
commit 7d15adbac6d69b80a1a2728f420e5c005745ae8d
Author:     Gökay Şatır <[email protected]>
AuthorDate: Tue Nov 12 12:15:31 2024 +0300
Commit:     Gökay ŞATIR <[email protected]>
CommitDate: Tue Nov 12 19:11:04 2024 +0100

    Make checking alternative views more strict.
    
    Remove unnecessary -1 checks.
    Remove nLastNonEditorView, we don't use a view if it is in edit mode. We 
are more picky now.
    Don't check for alternative views when the render state is empty. It 
shouldn't be empty but when switching to/from other modes, it is empty.
    
    Signed-off-by: Gökay Şatır <[email protected]>
    Change-Id: I2df4442d77bdddc4ce219a423f70527716245720
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176467
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 494a2c82f2a8..27fccf945914 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -4545,6 +4545,35 @@ inline static void 
enableViewCallbacks(LibLODocument_Impl* pDocument, const int
         handlerIt->second->enableCallbacks();
 }
 
+inline static int getAlternativeViewForPaint(LibreOfficeKitDocument* pThis, 
ITiledRenderable* pDoc, SfxViewShell* pCurrentViewShell,
+    const std::string_view &sCurrentViewRenderState, const int nPart, const 
int nMode)
+{
+    SfxViewShell* pViewShell = SfxViewShell::GetFirst();
+    while (pViewShell)
+    {
+        bool bIsInEdit = pViewShell->GetDrawView() && 
pViewShell->GetDrawView()->GetTextEditOutliner();
+
+        if (!bIsInEdit && pViewShell != pCurrentViewShell)
+        {
+            if (pViewShell->getPart() == nPart && pViewShell->getEditMode() == 
nMode)
+            {
+                OString sNewRenderState = pDoc->getViewRenderState(pViewShell);
+
+                if (sCurrentViewRenderState == sNewRenderState)
+                {
+                    const int nViewId = pViewShell->GetViewShellId().get();
+                    doc_setView(pThis, nViewId);
+                    return nViewId;
+                }
+            }
+        }
+
+        pViewShell = SfxViewShell::GetNext(*pViewShell);
+    }
+
+    return -1;
+}
+
 static void doc_paintPartTile(LibreOfficeKitDocument* pThis,
                               unsigned char* pBuffer,
                               const int nPart,
@@ -4585,82 +4614,38 @@ static void doc_paintPartTile(LibreOfficeKitDocument* 
pThis,
         int nOrigPart = 0;
         const int aType = doc_getDocumentType(pThis);
         const bool isText = (aType == LOK_DOCTYPE_TEXT);
-        const bool isCalc = (aType == LOK_DOCTYPE_SPREADSHEET);
         int nOrigEditMode = 0;
         bool bPaintTextEdit = true;
         int nViewId = nOrigViewId;
-        int nLastNonEditorView = -1;
-        int nViewMatchingMode = -1;
         SfxViewShell* pCurrentViewShell = SfxViewShell::Current();
         const OString sCurrentViewRenderState = 
pDoc->getViewRenderState(pCurrentViewShell);
 
         if (!isText)
         {
-            // Check if just switching to another view is enough, that has
-            // less side-effects.
-            if (nPart != doc_getPart(pThis) || nMode != pDoc->getEditMode())
+            // Check if just switching to another view is enough, that has 
less side-effects.
+            // Render state is sometimes empty, don't risk it.
+            if ((nPart != doc_getPart(pThis) || nMode != pDoc->getEditMode()) 
&& !sCurrentViewRenderState.isEmpty())
             {
-                SfxViewShell* pViewShell = SfxViewShell::GetFirst();
-                while (pViewShell)
-                {
-                    bool bIsInEdit = pViewShell->GetDrawView() &&
-                        pViewShell->GetDrawView()->GetTextEditOutliner();
+                nViewId = getAlternativeViewForPaint(pThis, pDoc, 
pCurrentViewShell, sCurrentViewRenderState, nPart, nMode);
 
-                    OString sNewRenderState = 
pDoc->getViewRenderState(pViewShell);
-
-                    if (sCurrentViewRenderState == sNewRenderState && 
!bIsInEdit)
-                        nLastNonEditorView = 
pViewShell->GetViewShellId().get();
-
-                    if (pViewShell->getPart() == nPart &&
-                        pViewShell->getEditMode() == nMode &&
-                        sCurrentViewRenderState == sNewRenderState &&
-                        !bIsInEdit)
-                    {
-                        nViewId = pViewShell->GetViewShellId().get();
-                        nViewMatchingMode = nViewId;
-                        nLastNonEditorView = nViewId;
-                        doc_setView(pThis, nViewId);
-                        break;
-                    }
-                    else if (pViewShell->getEditMode() == nMode && 
sCurrentViewRenderState == sNewRenderState && !bIsInEdit)
-                    {
-                        nViewMatchingMode = pViewShell->GetViewShellId().get();
-                    }
-
-                    pViewShell = SfxViewShell::GetNext(*pViewShell);
-                }
-            }
-
-            // if not found view with correct part
-            // - at least avoid rendering active textbox, This is for Impress.
-            // - prefer view with the same mode
-            if (nViewMatchingMode >= 0 && nViewMatchingMode != nViewId)
-            {
-                nViewId = nViewMatchingMode;
-                doc_setView(pThis, nViewId);
-            }
-            else if (!isCalc && nLastNonEditorView >= 0 && nLastNonEditorView 
!= nViewId &&
-                pCurrentViewShell && pCurrentViewShell->GetDrawView() &&
-                pCurrentViewShell->GetDrawView()->GetTextEditOutliner())
-            {
-                nViewId = nLastNonEditorView;
-                doc_setView(pThis, nViewId);
+                if (nViewId == -1)
+                    nViewId = nOrigViewId; // Couldn't find an alternative 
view.
+                // else -> We found an alternative view and already switched 
to that.
             }
 
             // Disable callbacks while we are painting - after setting the view
-            if (nViewId != nOrigViewId && nViewId >= 0)
+            if (nViewId != nOrigViewId)
                 disableViewCallbacks(pDocument, nViewId);
-
-            nOrigPart = doc_getPart(pThis);
-            if (nPart != nOrigPart)
-            {
-                doc_setPartImpl(pThis, nPart, false);
-            }
-
-            nOrigEditMode = pDoc->getEditMode();
-            if (nOrigEditMode != nMode)
+            else
             {
-                SfxLokHelper::setEditMode(nMode, pDoc);
+                // If we are here, we couldn't find an alternative view. We 
need to check the part and mode.
+                nOrigPart = doc_getPart(pThis);
+                if (nPart != nOrigPart)
+                    doc_setPartImpl(pThis, nPart, false);
+
+                nOrigEditMode = pDoc->getEditMode();
+                if (nOrigEditMode != nMode)
+                    SfxLokHelper::setEditMode(nMode, pDoc);
             }
 
             bPaintTextEdit = (nPart == nOrigPart && nMode == nOrigEditMode);
@@ -4673,18 +4658,18 @@ static void doc_paintPartTile(LibreOfficeKitDocument* 
pThis,
         {
             pDoc->setPaintTextEdit(true);
 
-            if (nMode != nOrigEditMode)
+            if (nViewId == nOrigViewId)
             {
-                SfxLokHelper::setEditMode(nOrigEditMode, pDoc);
-            }
+                // We didn't find an alternative view, set the part and mode 
back to their initial values if needed.
+                if (nMode != nOrigEditMode)
+                    SfxLokHelper::setEditMode(nOrigEditMode, pDoc);
 
-            if (nPart != nOrigPart)
-            {
-                doc_setPartImpl(pThis, nOrigPart, false);
+                if (nPart != nOrigPart)
+                    doc_setPartImpl(pThis, nOrigPart, false);
             }
-
-            if (nViewId != nOrigViewId)
+            else
             {
+                // We found an alternative view and used it. Enable its 
callbacks again and turn back to our original view.
                 enableViewCallbacks(pDocument, nViewId);
                 doc_setView(pThis, nOrigViewId);
             }
@@ -4695,10 +4680,7 @@ static void doc_paintPartTile(LibreOfficeKitDocument* 
pThis,
         // Nothing to do but restore the PartTilePainting flag.
     }
 
-    if (nOrigViewId >= 0)
-    {
-        enableViewCallbacks(pDocument, nOrigViewId);
-    }
+    enableViewCallbacks(pDocument, nOrigViewId);
 }
 
 static int doc_getTileMode(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* 
/*pThis*/)

Reply via email to