summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2012-12-11 12:09:21 -0500
committerKohei Yoshida <kohei.yoshida@gmail.com>2012-12-11 12:12:31 -0500
commitb30b0010c00c0cbfe4bd7e035255a6328ff68dee (patch)
tree326b959bc4e11fe292ffb0afe7a5d05c5e5c0551 /sc
parent693332c0b4a8e340b8350f548dce07456975531a (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.cxx17
-rw-r--r--sc/source/ui/view/gridwin.cxx47
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();