From f1a8aefec91f51a15c951f53f283a38a2edcd141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Fri, 18 Oct 2013 16:01:15 +0100 Subject: [PATCH] Resolves: rhbz#1020712 return all the selected scripts What we want here is *all* the scripts in the range, that's the whole point of using SCRIPTTYPE. We use this to determine the font to show in the fontbox. If it's an exclusive script then we can show the font that that script, and if there are multiple scripts we know to set it empty. With the other intermediate bugs out of the way, this now appears to work correctly. Change-Id: I58426123602d70c151bd878e96fa5cbab7d3fd3e --- editeng/source/editeng/impedit2.cxx | 35 ++++++++++++++++------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index e7dbdc65b546..a9b69a7caef0 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -1803,28 +1803,31 @@ sal_uInt16 ImpEditEngine::GetScriptType( const EditSelection& rSel ) const const ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos; - // find the first(!) script type position that holds the - // complete selection. Thus it will work for selections as - // well as with just moving the cursor from char to char. + // find all the scripts of this range sal_uInt16 nS = ( nPara == nStartPara ) ? aSel.Min().GetIndex() : 0; sal_uInt16 nE = ( nPara == nEndPara ) ? aSel.Max().GetIndex() : pParaPortion->GetNode()->Len(); - for ( size_t n = 0; n < rTypes.size(); n++ ) + + //no selection, just bare cursor + if (nStartPara == nEndPara && nS == nE) { - if (rTypes[n].nStartPos <= nS && nE <= rTypes[n].nEndPos) + //If we are not at the start of the paragraph we want the properties of the + //preceding character. Otherwise get the properties of the next (or what the + //next would have if it existed) + if (nS != 0) + --nS; + else + ++nE; + } + + for (size_t n = 0; n < rTypes.size(); ++n) + { + bool bStartInRange = rTypes[n].nStartPos <= nS && nS < rTypes[n].nEndPos; + bool bEndInRange = rTypes[n].nStartPos < nE && nE <= rTypes[n].nEndPos; + + if (bStartInRange || bEndInRange) { if ( rTypes[n].nScriptType != i18n::ScriptType::WEAK ) - { nScriptType |= GetItemScriptType ( rTypes[n].nScriptType ); - } - else - { - if ( !nScriptType && n ) - { - // #93548# When starting with WEAK, use prev ScriptType... - nScriptType = rTypes[n-1].nScriptType; - } - } - break; } } }