summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2018-07-11 15:44:18 +0200
committerEike Rathke <erack@redhat.com>2018-07-11 18:35:28 +0200
commite6b18c1d0f377e1295970b94bdf6b90739e13d4d (patch)
tree367e84359dc1cb552660103e4f9eaa3851dda6d9
parent4dfc014cb3838b61faef32991c8083787ee6d60c (diff)
ScGlobal::OpenURL: support relative references as URI references in hyperlinks
Instead of failing with "is not an absolute URL" error. For example in the HYPERLINK() spreadsheet function where Excel supports it, but also anywhere else that calls OpenURL(). A relative reference is relative to the current document, or for yet unsaved documents or if no object shell is available relative to the work path, as usual. Additional benefit is that "\\" UNC path names are accepted as smb:// Samba shares and DOS \ path name separators resolved for a proper file:// URI. Users are asking for this, found no related tdf# bug/RFE. See https://ask.libreoffice.org/en/question/160280/relative-and-absolute-hyperlinks/ and other linked q&a therein. Change-Id: Ib314b71d68fbe1793ec614cbf7c0c058fad14a10 Reviewed-on: https://gerrit.libreoffice.org/57277 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins
-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");