summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/source/core/data/global.cxx23
1 files changed, 21 insertions, 2 deletions
diff --git a/sc/source/core/data/global.cxx b/sc/source/core/data/global.cxx
index dde79f5d8482..825278134b43 100644
--- a/sc/source/core/data/global.cxx
+++ b/sc/source/core/data/global.cxx
@@ -814,17 +814,36 @@ void ScGlobal::OpenURL(const OUString& rURL, const OUString& rTarget)
if (!pViewFrm)
return;
+ OUString aUrlName( rURL );
SfxViewFrame* pFrame = nullptr;
+ const SfxObjectShell* pObjShell = nullptr;
OUString aReferName;
if ( pScActiveViewShell )
{
pFrame = pScActiveViewShell->GetViewFrame();
- SfxMedium* pMed = pFrame->GetObjectShell()->GetMedium();
+ pObjShell = pFrame->GetObjectShell();
+ const SfxMedium* pMed = pObjShell->GetMedium();
if (pMed)
aReferName = pMed->GetName();
}
- SfxStringItem aUrl( SID_FILE_NAME, rURL );
+ // Don't fiddle with fragments pointing into current document.
+ if (!aUrlName.startsWith("#"))
+ {
+ // Any relative reference would fail with "not an absolute URL"
+ // error, try to construct an absolute URI with the path relative
+ // to the current document's path or work path, as usual for all
+ // external references.
+ // This then also, as ScGlobal::GetAbsDocName() uses
+ // INetURLObject::smartRel2Abs(), supports "\\" UNC path names as
+ // smb:// Samba shares and DOS path separators converted to proper
+ // file:// URI.
+ const OUString aNewUrlName( ScGlobal::GetAbsDocName( aUrlName, pObjShell));
+ if (!aNewUrlName.isEmpty())
+ aUrlName = aNewUrlName;
+ }
+
+ SfxStringItem aUrl( SID_FILE_NAME, aUrlName );
SfxStringItem aTarget( SID_TARGETNAME, rTarget );
if ( nScClickMouseModifier & KEY_SHIFT ) // control-click -> into new window
aTarget.SetValue("_blank");