[Libreoffice-commits] .: sc/inc sc/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Jan 10 13:22:38 PST 2013


 sc/inc/document.hxx              |    1 +
 sc/source/core/data/document.cxx |   11 +++++++++++
 sc/source/ui/docshell/docsh.cxx  |   38 +++++++++++++++++++++++++++++++++++++-
 3 files changed, 49 insertions(+), 1 deletion(-)

New commits:
commit 831d1b6e62e91e67f171bd00305651043731d496
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Thu Jan 10 16:21:05 2013 -0500

    fdo#58069: Invalidate sheet stream cache when directory path changes.
    
    To properly regenerate hyperlinks (among other things) which depend on
    the full path of the host document.
    
    Change-Id: I44fdd5b0ef0a57bf4fae13f29f1ebacfe1ab19a8

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index a72f759..7573a80 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -572,6 +572,7 @@ public:
 
     void AppendTabOnLoad(const rtl::OUString& rName);
     void SetTabNameOnLoad(SCTAB nTab, const rtl::OUString& rName);
+    void InvalidateStreamOnSave();
 
     SC_DLLPUBLIC bool           InsertTab( SCTAB nPos, const rtl::OUString& rName,
                                         bool bExternalDocument = false );
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 78ae823..a3e5cfa 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -402,6 +402,17 @@ void ScDocument::SetTabNameOnLoad(SCTAB nTab, const rtl::OUString& rName)
     maTabs[nTab]->SetName(rName);
 }
 
+void ScDocument::InvalidateStreamOnSave()
+{
+    TableContainer::iterator it = maTabs.begin(), itEnd = maTabs.end();
+    for (; it != itEnd; ++it)
+    {
+        ScTable* pTab = *it;
+        if (pTab)
+            pTab->SetStreamValid(false);
+    }
+}
+
 bool ScDocument::InsertTab( SCTAB nPos, const rtl::OUString& rName,
             bool bExternalDocument )
 {
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index c8ff10b..2c35c01 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -34,6 +34,7 @@
 #include <sfx2/objface.hxx>
 #include <svl/documentlockfile.hxx>
 #include <svl/sharecontrolfile.hxx>
+#include "svl/urihelper.hxx"
 #include "chgtrack.hxx"
 #include "chgviset.hxx"
 #include <com/sun/star/awt/Key.hpp>
@@ -1528,10 +1529,45 @@ sal_Bool ScDocShell::Save()
     return bRet;
 }
 
+namespace {
+
+/**
+ * Remove the file name from the full path, to keep only the directory path.
+ */
+void popFileName(OUString& rPath)
+{
+    if (!rPath.isEmpty())
+    {
+        INetURLObject aURLObj(rPath);
+        aURLObj.removeSegment();
+        rPath = aURLObj.GetMainURL(INetURLObject::NO_DECODE);
+    }
+}
+
+}
 
 sal_Bool ScDocShell::SaveAs( SfxMedium& rMedium )
 {
-    RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::SaveAs" );
+    OUString aCurPath; // empty for new document that hasn't been saved.
+    const SfxMedium* pCurMedium = GetMedium();
+    if (pCurMedium)
+    {
+        aCurPath = pCurMedium->GetName();
+        popFileName(aCurPath);
+    }
+
+    if (!aCurPath.isEmpty())
+    {
+        // current document has a path -> not a brand-new document.
+        OUString aNewPath = rMedium.GetName();
+        popFileName(aNewPath);
+        OUString aRel = URIHelper::simpleNormalizedMakeRelative(aCurPath, aNewPath);
+        if (!aRel.isEmpty())
+        {
+            // Directory path will change before and after the save.
+            aDocument.InvalidateStreamOnSave();
+        }
+    }
 
     ScTabViewShell* pViewShell = GetBestViewShell();
     bool bNeedsRehash = ScPassHashHelper::needsPassHashRegen(aDocument, PASSHASH_SHA1);


More information about the Libreoffice-commits mailing list