diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2012-12-11 12:09:21 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2012-12-11 12:12:31 -0500 |
commit | b30b0010c00c0cbfe4bd7e035255a6328ff68dee (patch) | |
tree | 326b959bc4e11fe292ffb0afe7a5d05c5e5c0551 /sc | |
parent | 693332c0b4a8e340b8350f548dce07456975531a (diff) |
Support non 'Calc A1' reference syntax in HYPERLINK function.
It uses the current formula syntax set in the Formula options page
to interpret the URL in HYPERLINK function.
Change-Id: Ic394d10b1e781fcd6a6949f62949c5cb137328bc
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/tool/address.cxx | 17 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin.cxx | 47 |
2 files changed, 63 insertions, 1 deletions
diff --git a/sc/source/core/tool/address.cxx b/sc/source/core/tool/address.cxx index 34a7306087a5..08e29ded0fc0 100644 --- a/sc/source/core/tool/address.cxx +++ b/sc/source/core/tool/address.cxx @@ -156,7 +156,24 @@ static bool lcl_ScRange_External_TabSpan( ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager(); if (pRefMgr->isOwnDocument( rExternDocName)) + { + // This is an internal document. Get the sheet positions from the + // ScDocument instance. + if (rStartTabName.Len()) + { + SCTAB nTab; + if (pDoc->GetTable(rStartTabName, nTab)) + rRange.aStart.SetTab(nTab); + } + + if (rEndTabName.Len()) + { + SCTAB nTab; + if (pDoc->GetTable(rEndTabName, nTab)) + rRange.aEnd.SetTab(nTab); + } return !pExtInfo || !pExtInfo->mbExternal; + } sal_uInt16 nFileId = pRefMgr->getExternalFileId( rExternDocName); diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index c116d432f0b5..be9520d9acc9 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -119,6 +119,7 @@ #include "markdata.hxx" #include "checklistmenu.hrc" #include "strload.hxx" +#include "externalrefmgr.hxx" #include <svx/sdrpagewindow.hxx> #include <svx/sdr/overlay/overlaymanager.hxx> @@ -2371,7 +2372,51 @@ void ScGridWindow::MouseButtonUp( const MouseEvent& rMEvt ) if ( GetEditUrl( rMEvt.GetPosPixel(), &aName, &aUrl, &aTarget ) ) { nMouseStatus = SC_GM_NONE; // keinen Doppelklick anfangen - ScGlobal::OpenURL( aUrl, aTarget ); + + // ScGlobal::OpenURL() only understands Calc A1 style syntax. + // Convert it to Calc A1 before calling OpenURL(). + + if (pDoc->GetAddressConvention() == formula::FormulaGrammar::CONV_OOO) + ScGlobal::OpenURL(aUrl, aTarget); + else + { + ScAddress aTempAddr; + ScAddress::ExternalInfo aExtInfo; + sal_uInt16 nRes = aTempAddr.Parse(aUrl, pDoc, pDoc->GetAddressConvention(), &aExtInfo); + if (!(nRes & SCA_VALID)) + { + // Not a reference string. Pass it through unmodified. + ScGlobal::OpenURL(aUrl, aTarget); + return; + } + + OUStringBuffer aBuf; + if (aExtInfo.mbExternal) + { + // External reference. + ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager(); + const OUString* pStr = pRefMgr->getExternalFileName(aExtInfo.mnFileId); + if (pStr) + aBuf.append(*pStr); + + aBuf.append('#'); + aBuf.append(aExtInfo.maTabName); + aBuf.append('.'); + OUString aRefCalcA1; + aTempAddr.Format(aRefCalcA1, SCA_ABS, NULL, formula::FormulaGrammar::CONV_OOO); + aBuf.append(aRefCalcA1); + ScGlobal::OpenURL(aBuf.makeStringAndClear(), aTarget); + } + else + { + // Internal reference. + aBuf.append('#'); + OUString aUrlCalcA1; + aTempAddr.Format(aUrlCalcA1, SCA_ABS_3D, pDoc, formula::FormulaGrammar::CONV_OOO); + aBuf.append(aUrlCalcA1); + ScGlobal::OpenURL(aBuf.makeStringAndClear(), aTarget); + } + } // fire worksheet_followhyperlink event uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = pDoc->GetVbaEventProcessor(); |