[Libreoffice-commits] core.git: desktop/source sc/source

Gabriel Masei (via logerrit) logerrit at kemper.freedesktop.org
Mon Sep 21 12:39:51 UTC 2020


 desktop/source/lib/init.cxx    |   15 ++++++++++-----
 sc/source/ui/view/tabvwsha.cxx |   19 ++++++++++++-------
 2 files changed, 22 insertions(+), 12 deletions(-)

New commits:
commit 137440e161f0f8631e7e67ba0609680d6686fa94
Author:     Gabriel Masei <gabriel.masei at 1and1.ro>
AuthorDate: Wed Sep 2 19:22:23 2020 +0300
Commit:     Jan Holesovsky <kendy at collabora.com>
CommitDate: Mon Sep 21 14:39:17 2020 +0200

    lok: remove .uno:ModifiedStatus message from deduplication mechanism
    
    This fixes the following issue in Online:
    
    When a save is performed while a cell is still edited the save icon
    does not reflect the correct state of the document: it shows that
    the document is dirty although it is not. This is generated by two facts:
    
    1. The status cache is avoided when sending the -dirty- status right
    after the cell editing is finished. Because the cache has an old value
    of -false- for ModifiedStatus, the notification that is sent after saving,
    with -false- value, is ignored. We should not avoid the status cache.
    
    2. Because there is a mechanism that keeps only the last notification
    value for a status change in the queue that keeps messages that were not
    sent yet (deduplication), the .uno:ModifiedStatus message with a value of -true-
    that is enqueued right after the cell edit is finished is replaced by the same
    message with a value of -false- that is enqueued after the save is finished.
    This happens if the flush mechanism doesn't occur between them.
    
    Change-Id: I3348bf230ba53a154c29e7d8ab064df7694adeae
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101948
    Tested-by: Jenkins
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index a5c2b7c4ea8b..ecef209842a8 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -1571,11 +1571,16 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                 if (pos != std::string::npos)
                 {
                     const std::string name = payload.substr(0, pos + 1);
-                    removeAll(
-                        [type, &name] (const queue_type::value_type& elem) {
-                            return (elem.Type == type) && (elem.PayloadString.compare(0, name.size(), name) == 0);
-                        }
-                    );
+                    // This is needed because otherwise it creates some problems when
+                    // a save occurs while a cell is still edited in Calc.
+                    if (name != ".uno:ModifiedStatus=")
+                    {
+                        removeAll(
+                            [type, &name] (const queue_type::value_type& elem) {
+                                return (elem.Type == type) && (elem.PayloadString.compare(0, name.size(), name) == 0);
+                            }
+                        );
+                    }
                 }
             }
             break;
diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx
index 210500e651d9..211a047c9bb1 100644
--- a/sc/source/ui/view/tabvwsha.cxx
+++ b/sc/source/ui/view/tabvwsha.cxx
@@ -742,20 +742,25 @@ void ScTabViewShell::ExecuteSave( SfxRequest& rReq )
     // Finish entering unless 'DontTerminateEdit' is specified, even if a formula is being processed
     if (bCommitChanges)
     {
+        SC_MOD()->InputEnterHandler();
+
         if (comphelper::LibreOfficeKit::isActive())
         {
             // Normally this isn't needed, but in Calc when editing a cell formula
             // and manually saving (without changing cells or hitting enter), while
             // InputEnterHandler will mark the doc as modified (when it is), because
             // we will save the doc immediately afterwards, the modified state event
-            // is clobbered. To avoid that, we notify all views immediately of the
-            // modified state, apply the modification, then save the document.
-            ScInputHandler* pHdl = GetInputHandler();
-            if (pHdl != nullptr && pHdl->GetModified())
-                SfxLokHelper::notifyAllViews(LOK_CALLBACK_STATE_CHANGED, ".uno:ModifiedStatus=true");
+            // is clobbered. To avoid that, we need to update SID_DOC_MODIFIED so that
+            // a possible state of "true" after "InputEnterHandler" will be sent
+            // as a notification. It is important that the notification goes through
+            // normal process (cache) rather than directly notifying the views.
+            // Otherwise, because there is a previous state of "false" in cache, the
+            // "false" state after saving will be ignored.
+            // This will work only if .uno:ModifiedStatus message will be removed from
+            // the mechanism that keeps in the message queue only last message of
+            // a particular status even if the values are different.
+            GetViewData().GetDocShell()->GetViewBindings()->Update(SID_DOC_MODIFIED);
         }
-
-        SC_MOD()->InputEnterHandler();
     }
 
     if ( GetViewData().GetDocShell()->IsDocShared() )


More information about the Libreoffice-commits mailing list