diff options
author | Eike Rathke <erack@redhat.com> | 2021-03-30 19:04:55 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2021-03-30 22:28:45 +0200 |
commit | fb68609fadc7fd46c44f404ac611d87e2cc03ea0 (patch) | |
tree | 4f5e06c4895503457e7764a941cfa1e9b9abce56 /sc/source/ui/app/inputwin.cxx | |
parent | a69ad67504b32dd644902d8acf4c2a0fef86d3c7 (diff) |
Related: tdf#137577 Be able to select a global named range from Name Box
... if an identical sheet-local name exists.
Change-Id: I6d92a7ed93e81da64f60c26fd81eb6775582b053
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113384
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
Diffstat (limited to 'sc/source/ui/app/inputwin.cxx')
-rw-r--r-- | sc/source/ui/app/inputwin.cxx | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/sc/source/ui/app/inputwin.cxx b/sc/source/ui/app/inputwin.cxx index 3473ffc48109..2b5a48c09d38 100644 --- a/sc/source/ui/app/inputwin.cxx +++ b/sc/source/ui/app/inputwin.cxx @@ -101,7 +101,8 @@ enum ScNameInputType { SC_NAME_INPUT_CELL, SC_NAME_INPUT_RANGE, - SC_NAME_INPUT_NAMEDRANGE, + SC_NAME_INPUT_NAMEDRANGE_LOCAL, + SC_NAME_INPUT_NAMEDRANGE_GLOBAL, SC_NAME_INPUT_DATABASE, SC_NAME_INPUT_ROW, SC_NAME_INPUT_SHEET, @@ -2323,14 +2324,23 @@ static ScNameInputType lcl_GetInputType( const OUString& rText ) SCTAB nNameTab; sal_Int32 nNumeric; + // From the context we know that when testing for a range name + // sheet-local scope names have " (sheetname)" appended and global + // names don't and can't contain ')', so we can force one or the other. + const RutlNameScope eNameScope = + ((!rText.isEmpty() && rText[rText.getLength()-1] == ')') ? RUTL_NAMES_LOCAL : RUTL_NAMES_GLOBAL); + if (rText == ScResId(STR_MANAGE_NAMES)) eRet = SC_MANAGE_NAMES; else if ( aRange.Parse( rText, rDoc, eConv ) & ScRefFlags::VALID ) eRet = SC_NAME_INPUT_RANGE; else if ( aAddress.Parse( rText, rDoc, eConv ) & ScRefFlags::VALID ) eRet = SC_NAME_INPUT_CELL; - else if ( ScRangeUtil::MakeRangeFromName( rText, rDoc, nTab, aRange, RUTL_NAMES, eConv ) ) - eRet = SC_NAME_INPUT_NAMEDRANGE; + else if ( ScRangeUtil::MakeRangeFromName( rText, rDoc, nTab, aRange, eNameScope, eConv ) ) + { + eRet = ((eNameScope == RUTL_NAMES_LOCAL) ? SC_NAME_INPUT_NAMEDRANGE_LOCAL : + SC_NAME_INPUT_NAMEDRANGE_GLOBAL); + } else if ( ScRangeUtil::MakeRangeFromName( rText, rDoc, nTab, aRange, RUTL_DBASE, eConv ) ) eRet = SC_NAME_INPUT_DATABASE; else if ( comphelper::string::isdigitAsciiString( rText ) && @@ -2375,7 +2385,8 @@ IMPL_LINK_NOARG(ScPosWnd, ModifyHdl, weld::ComboBox&, void) pStrId = STR_NAME_INPUT_CELL; break; case SC_NAME_INPUT_RANGE: - case SC_NAME_INPUT_NAMEDRANGE: + case SC_NAME_INPUT_NAMEDRANGE_LOCAL: + case SC_NAME_INPUT_NAMEDRANGE_GLOBAL: pStrId = STR_NAME_INPUT_RANGE; // named range or range reference break; case SC_NAME_INPUT_DATABASE: @@ -2483,6 +2494,7 @@ void ScPosWnd::DoEnter() } else { + bool bForceGlobalName = false; // for all selection types, execute the SID_CURRENTCELL slot. if (eType == SC_NAME_INPUT_CELL || eType == SC_NAME_INPUT_RANGE) { @@ -2492,13 +2504,19 @@ void ScPosWnd::DoEnter() aRange.ParseAny(aText, rDoc, rDoc.GetAddressConvention()); aText = aRange.Format(rDoc, ScRefFlags::RANGE_ABS_3D, ::formula::FormulaGrammar::CONV_OOO); } + else if (eType == SC_NAME_INPUT_NAMEDRANGE_GLOBAL) + { + bForceGlobalName = true; + } SfxStringItem aPosItem( SID_CURRENTCELL, aText ); SfxBoolItem aUnmarkItem( FN_PARAM_1, true ); // remove existing selection + // FN_PARAM_2 reserved for AlignToCursor + SfxBoolItem aForceGlobalName( FN_PARAM_3, bForceGlobalName ); pViewSh->GetViewData().GetDispatcher().ExecuteList( SID_CURRENTCELL, SfxCallMode::SYNCHRON | SfxCallMode::RECORD, - { &aPosItem, &aUnmarkItem }); + { &aPosItem, &aUnmarkItem, &aForceGlobalName }); } } } |