diff options
Diffstat (limited to 'sc/source/ui/app/inputhdl.cxx')
-rw-r--r-- | sc/source/ui/app/inputhdl.cxx | 422 |
1 files changed, 264 insertions, 158 deletions
diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx index 38cbee81ff02..af0982001201 100644 --- a/sc/source/ui/app/inputhdl.cxx +++ b/sc/source/ui/app/inputhdl.cxx @@ -102,23 +102,114 @@ using namespace formula; sal_Bool ScInputHandler::bOptLoaded = false; // App-Optionen ausgewertet sal_Bool ScInputHandler::bAutoComplete = false; // wird in KeyInput gesetzt +extern sal_uInt16 nEditAdjust; //! Member an ViewData + +namespace { + // delimiters (in addition to ScEditUtil) needed for range finder: // only characters that are allowed in formulas next to references // and the quotation mark (so string constants can be skipped) +const sal_Char pMinDelimiters[] = " !\""; -static const sal_Char pMinDelimiters[] = " !\""; - -extern sal_uInt16 nEditAdjust; //! Member an ViewData - -//================================================================== - -static sal_Unicode lcl_getSheetSeparator(ScDocument* pDoc) +sal_Unicode lcl_getSheetSeparator(ScDocument* pDoc) { ScCompiler aComp(pDoc, ScAddress()); aComp.SetGrammar(pDoc->GetGrammar()); return aComp.GetNativeAddressSymbol(ScCompiler::Convention::SHEET_SEPARATOR); } +ScTypedCaseStrSet::const_iterator findText( + const ScTypedCaseStrSet& rDataSet, ScTypedCaseStrSet::const_iterator itPos, + const rtl::OUString& rStart, rtl::OUString& rResult, bool bBack) +{ + rtl::OUString aOldResult; + if (itPos != rDataSet.end()) + { + const TypedStrData& rData = *itPos; + if (rData.GetStringType()) + aOldResult = rData.GetString(); + } + + if (bBack) // rueckwaerts + { + ScTypedCaseStrSet::const_reverse_iterator it = rDataSet.rbegin(), itEnd = rDataSet.rend(); + if (itPos != rDataSet.end()) + { + size_t nPos = std::distance(rDataSet.begin(), itPos); + size_t nRPos = rDataSet.size() - 1 - nPos; + std::advance(it, nRPos); + } + + for (; it != itEnd; ++it) + { + const TypedStrData& rData = *it; + if (rData.GetStringType() == TypedStrData::Value) + // skip values. + continue; + + if (!ScGlobal::GetpTransliteration()->isMatch(rStart, rData.GetString())) + // not a match. + continue; + + rResult = rData.GetString(); + return (++it).base(); // convert the reverse iterator back to iterator. + } + } + else // vorwaerts + { + ScTypedCaseStrSet::const_iterator it = rDataSet.begin(), itEnd = rDataSet.end(); + if (itPos != rDataSet.end()) + it = itPos; + + for (; it != itEnd; ++it) + { + const TypedStrData& rData = *it; + if (rData.GetStringType() == TypedStrData::Value) + // skip values. + continue; + + if (!ScGlobal::GetpTransliteration()->isMatch(rStart, rData.GetString())) + // not a match. + continue; + + rResult = rData.GetString(); + return it; + } + } + + return rDataSet.end(); // no matching text found. +} + +rtl::OUString getExactMatch(const ScTypedCaseStrSet& rDataSet, const rtl::OUString& rString) +{ + ScTypedCaseStrSet::const_iterator it = rDataSet.begin(), itEnd = rDataSet.end(); + for (; it != itEnd; ++it) + { + const TypedStrData& rData = *it; + if (rData.GetStringType() == TypedStrData::Value) + continue; + + if (!ScGlobal::GetpTransliteration()->isEqual(rData.GetString(), rString)) + continue; + + return rData.GetString(); + } + return rtl::OUString(); +} + +void removeChars(rtl::OUString& rStr, sal_Unicode c) +{ + rtl::OUStringBuffer aBuf(rStr); + for (sal_Int32 i = 0, n = aBuf.getLength(); i < n; ++i) + { + if (aBuf.charAt(i) == c) + aBuf.setCharAt(i, sal_Unicode(' ')); + } + rStr = aBuf.makeStringAndClear(); +} + +} + void ScInputHandler::InitRangeFinder( const String& rFormula ) { DeleteRangeFinder(); @@ -312,19 +403,15 @@ inline String GetEditText(EditEngine* pEng) return ScEditUtil::GetSpaceDelimitedString(*pEng); } -void lcl_RemoveTabs(String& rStr) +void lcl_RemoveTabs(rtl::OUString& rStr) { - xub_StrLen nPos; - while ( (nPos=rStr.Search('\t')) != STRING_NOTFOUND ) - rStr.SetChar( nPos, ' ' ); + removeChars(rStr, sal_Unicode('\t')); } -void lcl_RemoveLineEnd(String& rStr) +void lcl_RemoveLineEnd(rtl::OUString& rStr) { rStr = convertLineEnd(rStr, LINEEND_LF); - xub_StrLen nPos; - while ( (nPos=rStr.Search('\n')) != STRING_NOTFOUND ) - rStr.SetChar( nPos, ' ' ); + removeChars(rStr, sal_Unicode('\n')); } xub_StrLen lcl_MatchParenthesis( const String& rStr, xub_StrLen nPos ) @@ -433,7 +520,6 @@ ScInputHandler::ScInputHandler() nTipVisible( 0 ), pTipVisibleSecParent( NULL ), nTipVisibleSec( 0 ), - nAutoPos( SCPOS_INVALID ), bUseTab( false ), bTextValid( sal_True ), nFormSelStart( 0 ), @@ -634,7 +720,6 @@ void ScInputHandler::UpdateSpellSettings( sal_Bool bFromStartTab ) // Funktionen/Bereichsnamen etc. als Tip-Hilfe // -#define SC_STRTYPE_FUNCTIONS 1 // die anderen Typen sind in ScDocument::GetFormulaEntries festgelegt void ScInputHandler::GetFormulaData() @@ -644,14 +729,14 @@ void ScInputHandler::GetFormulaData() ScDocument* pDoc = pActiveViewSh->GetViewData()->GetDocShell()->GetDocument(); if ( pFormulaData ) - pFormulaData->FreeAll(); + pFormulaData->clear(); else - pFormulaData = new TypedScStrCollection; + pFormulaData = new ScTypedCaseStrSet; if( pFormulaDataPara ) - pFormulaDataPara->FreeAll(); + pFormulaDataPara->clear(); else - pFormulaDataPara = new TypedScStrCollection; + pFormulaDataPara = new ScTypedCaseStrSet; // MRU-Funktionen aus dem Funktions-Autopiloten // wie in ScPosWnd::FillFunctions (inputwin.cxx) @@ -673,9 +758,7 @@ void ScInputHandler::GetFormulaData() { String aEntry = *pDesc->pFuncName; aEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "()" )); - TypedStrData* pData = new TypedStrData(aEntry, 0.0, TypedStrData::Standard); - if (!pFormulaData->Insert(pData)) - delete pData; + pFormulaData->insert(TypedStrData(aEntry, 0.0, TypedStrData::Standard)); break; // nicht weitersuchen } } @@ -688,9 +771,7 @@ void ScInputHandler::GetFormulaData() { pDesc->initArgumentInfo(); String aEntry = pDesc->getSignature(); - TypedStrData* pData = new TypedStrData(aEntry, 0.0, TypedStrData::Standard); - if (!pFormulaDataPara->Insert(pData)) - delete pData; + pFormulaDataPara->insert(TypedStrData(aEntry, 0.0, TypedStrData::Standard)); } } pDoc->GetFormulaEntries( *pFormulaData ); @@ -783,10 +864,11 @@ void ScInputHandler::ShowTipCursor() nArgPos = aHelper.GetArgStart( aSelText, nNextFStart, 0 ); nArgs = static_cast<sal_uInt16>(ppFDesc->getParameterCount()); - sal_Bool bFlag = false; - String aNew; - sal_uInt16 nParAutoPos = SCPOS_INVALID; - if( pFormulaDataPara->FindText( ppFDesc->getFunctionName(), aNew, nParAutoPos, false ) ) + bool bFlag = false; + rtl::OUString aNew; + ScTypedCaseStrSet::const_iterator it = + findText(*pFormulaDataPara, pFormulaDataPara->end(), ppFDesc->getFunctionName(), aNew, false); + if (it != pFormulaDataPara->end()) { sal_uInt16 nActive = 0; for( sal_uInt16 i=0; i < nArgs; i++ ) @@ -801,16 +883,16 @@ void ScInputHandler::ShowTipCursor() } if( bFlag ) { - sal_uInt16 nCountSemicolon = comphelper::string::getTokenCount(aNew, cSep) - 1; - sal_uInt16 nCountDot = comphelper::string::getTokenCount(aNew, cSheetSep) - 1; - sal_uInt16 nStartPosition = 0; - sal_uInt16 nEndPosition = 0; + sal_Int32 nCountSemicolon = comphelper::string::getTokenCount(aNew, cSep) - 1; + sal_Int32 nCountDot = comphelper::string::getTokenCount(aNew, cSheetSep) - 1; + sal_Int32 nStartPosition = 0; + sal_Int32 nEndPosition = 0; if( !nCountSemicolon ) { - for( sal_uInt16 i = 0; i < aNew.Len(); i++ ) + for (sal_Int32 i = 0; i < aNew.getLength(); ++i) { - sal_Unicode cNext = aNew.GetChar( i ); + sal_Unicode cNext = aNew.getStr()[i]; if( cNext == '(' ) { nStartPosition = i+1; @@ -820,9 +902,9 @@ void ScInputHandler::ShowTipCursor() else if( !nCountDot ) { sal_uInt16 nCount = 0; - for( sal_uInt16 i = 0; i < aNew.Len(); i++ ) + for (sal_Int32 i = 0; i < aNew.getLength(); ++i) { - sal_Unicode cNext = aNew.GetChar( i ); + sal_Unicode cNext = aNew.getStr()[i]; if( cNext == '(' ) { nStartPosition = i+1; @@ -842,9 +924,9 @@ void ScInputHandler::ShowTipCursor() else { sal_uInt16 nCount = 0; - for( sal_uInt16 i = 0; i < aNew.Len(); i++ ) + for (sal_Int32 i = 0; i < aNew.getLength(); ++i) { - sal_Unicode cNext = aNew.GetChar( i ); + sal_Unicode cNext = aNew.getStr()[i]; if( cNext == '(' ) { nStartPosition = i+1; @@ -866,9 +948,13 @@ void ScInputHandler::ShowTipCursor() } } - if( nStartPosition ) + if (nStartPosition > 0) { - aNew.Insert( 0x25BA, nStartPosition ); + rtl::OUStringBuffer aBuf; + aBuf.append(aNew.copy(0, nStartPosition)); + aBuf.append(static_cast<sal_Unicode>(0x25BA)); + aBuf.append(aNew.copy(nStartPosition)); + aNew = aBuf.makeStringAndClear(); ShowTipBelow( aNew ); bFound = sal_True; } @@ -890,10 +976,11 @@ void ScInputHandler::ShowTipCursor() { break; } - String aNew; - sal_uInt16 nParAutoPos = SCPOS_INVALID; + rtl::OUString aNew; nPosition = aText.Len()+1; - if( pFormulaDataPara->FindText( aText, aNew, nParAutoPos, false ) ) + ScTypedCaseStrSet::const_iterator it = + findText(*pFormulaDataPara, pFormulaDataPara->end(), aText, aNew, false); + if (it != pFormulaDataPara->end()) { if( aFormula.GetChar( nPosition ) =='(' ) { @@ -995,12 +1082,13 @@ void ScInputHandler::UseFormulaData() sal_uInt16 nArgs; sal_Bool bFound = false; - String aText = pEngine->GetWord( 0, aSel.nEndPos-1 ); - if ( aText.Len() ) + rtl::OUString aText = pEngine->GetWord( 0, aSel.nEndPos-1 ); + if (!aText.isEmpty()) { - String aNew; - nAutoPos = SCPOS_INVALID; - if ( pFormulaData->FindText( aText, aNew, nAutoPos, false ) ) + rtl::OUString aNew; + miAutoPos = pFormulaData->end(); + miAutoPos = findText(*pFormulaData, miAutoPos, aText, aNew, false); + if (miAutoPos != pFormulaData->end()) { ShowTip( aNew ); aAutoSearch = aText; @@ -1027,10 +1115,11 @@ void ScInputHandler::UseFormulaData() nArgPos = aHelper.GetArgStart( aFormula, nNextFStart, 0 ); nArgs = static_cast<sal_uInt16>(ppFDesc->getParameterCount()); - sal_Bool bFlag = false; - String aNew; - sal_uInt16 nParAutoPos = SCPOS_INVALID; - if( pFormulaDataPara->FindText( ppFDesc->getFunctionName(), aNew, nParAutoPos, false ) ) + bool bFlag = false; + rtl::OUString aNew; + ScTypedCaseStrSet::const_iterator it = + findText(*pFormulaDataPara, pFormulaDataPara->end(), ppFDesc->getFunctionName(), aNew, false); + if (it != pFormulaDataPara->end()) { sal_uInt16 nActive = 0; for( sal_uInt16 i=0; i < nArgs; i++ ) @@ -1045,16 +1134,16 @@ void ScInputHandler::UseFormulaData() } if( bFlag ) { - sal_uInt16 nCountSemicolon = comphelper::string::getTokenCount(aNew, cSep) - 1; - sal_uInt16 nCountDot = comphelper::string::getTokenCount(aNew, cSheetSep) - 1; - sal_uInt16 nStartPosition = 0; - sal_uInt16 nEndPosition = 0; + sal_Int32 nCountSemicolon = comphelper::string::getTokenCount(aNew, cSep) - 1; + sal_Int32 nCountDot = comphelper::string::getTokenCount(aNew, cSheetSep) - 1; + sal_Int32 nStartPosition = 0; + sal_Int32 nEndPosition = 0; if( !nCountSemicolon ) { - for( sal_uInt16 i = 0; i < aNew.Len(); i++ ) + for (sal_Int32 i = 0; i < aNew.getLength(); ++i) { - sal_Unicode cNext = aNew.GetChar( i ); + sal_Unicode cNext = aNew.getStr()[i]; if( cNext == '(' ) { nStartPosition = i+1; @@ -1064,9 +1153,9 @@ void ScInputHandler::UseFormulaData() else if( !nCountDot ) { sal_uInt16 nCount = 0; - for( sal_uInt16 i = 0; i < aNew.Len(); i++ ) + for (sal_Int32 i = 0; i < aNew.getLength(); ++i) { - sal_Unicode cNext = aNew.GetChar( i ); + sal_Unicode cNext = aNew.getStr()[i]; if( cNext == '(' ) { nStartPosition = i+1; @@ -1086,9 +1175,9 @@ void ScInputHandler::UseFormulaData() else { sal_uInt16 nCount = 0; - for( sal_uInt16 i = 0; i < aNew.Len(); i++ ) + for (sal_Int32 i = 0; i < aNew.getLength(); ++i) { - sal_Unicode cNext = aNew.GetChar( i ); + sal_Unicode cNext = aNew.getStr()[i]; if( cNext == '(' ) { nStartPosition = i+1; @@ -1110,9 +1199,13 @@ void ScInputHandler::UseFormulaData() } } - if( nStartPosition ) + if (nStartPosition > 0) { - aNew.Insert( 0x25BA, nStartPosition ); + rtl::OUStringBuffer aBuf; + aBuf.append(aNew.copy(0, nStartPosition)); + aBuf.append(static_cast<sal_Unicode>(0x25BA)); + aBuf.append(aNew.copy(nStartPosition)); + aNew = aBuf.makeStringAndClear(); ShowTipBelow( aNew ); bFound = sal_True; } @@ -1135,8 +1228,9 @@ void ScInputHandler::NextFormulaEntry( sal_Bool bBack ) EditView* pActiveView = pTopView ? pTopView : pTableView; if ( pActiveView && pFormulaData ) { - String aNew; - if ( pFormulaData->FindText( aAutoSearch, aNew, nAutoPos, bBack ) ) + rtl::OUString aNew; + miAutoPos = findText(*pFormulaData, miAutoPos, aAutoSearch, aNew, bBack); + if (miAutoPos != pFormulaData->end()) ShowTip( aNew ); // als QuickHelp anzeigen } @@ -1146,7 +1240,7 @@ void ScInputHandler::NextFormulaEntry( sal_Bool bBack ) pActiveView->ShowCursor(); } -void lcl_CompleteFunction( EditView* pView, const String& rInsert, sal_Bool& rParInserted ) +void lcl_CompleteFunction( EditView* pView, const String& rInsert, bool& rParInserted ) { if (pView) { @@ -1191,23 +1285,20 @@ void lcl_CompleteFunction( EditView* pView, const String& rInsert, sal_Bool& rPa void ScInputHandler::PasteFunctionData() { - if ( pFormulaData && nAutoPos != SCPOS_INVALID ) + if (pFormulaData && miAutoPos != pFormulaData->end()) { - TypedStrData* pData = (*pFormulaData)[nAutoPos]; - if (pData) - { - String aInsert = pData->GetString(); - sal_Bool bParInserted = false; + const TypedStrData& rData = *miAutoPos; + const rtl::OUString& aInsert = rData.GetString(); + bool bParInserted = false; - DataChanging(); // kann nicht neu sein - lcl_CompleteFunction( pTopView, aInsert, bParInserted ); - lcl_CompleteFunction( pTableView, aInsert, bParInserted ); - DataChanged(); - ShowTipCursor(); + DataChanging(); // kann nicht neu sein + lcl_CompleteFunction( pTopView, aInsert, bParInserted ); + lcl_CompleteFunction( pTableView, aInsert, bParInserted ); + DataChanged(); + ShowTipCursor(); - if (bParInserted) - AutoParAdded(); - } + if (bParInserted) + AutoParAdded(); } HideTip(); @@ -1310,7 +1401,10 @@ void ScInputHandler::FormulaPreview() { ShowTip( aValue ); // als QuickHelp anzeigen aManualTip = aValue; // nach ShowTip setzen - nAutoPos = SCPOS_INVALID; // Formel-Autocomplete aufheben + if (pFormulaData) + miAutoPos = pFormulaData->end(); + else if (pColumnData) + miAutoPos = pColumnData->end(); } } @@ -1437,15 +1531,17 @@ void ScInputHandler::GetColData() ScDocument* pDoc = pActiveViewSh->GetViewData()->GetDocShell()->GetDocument(); if ( pColumnData ) - pColumnData->FreeAll(); + pColumnData->clear(); else { - pColumnData = new TypedScStrCollection; - pColumnData->SetCaseSensitive( sal_True ); // equal strings are handled in FindText + pColumnData = new ScTypedCaseStrSet; } - pDoc->GetDataEntries( aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), - *pColumnData, sal_True ); + std::vector<TypedStrData> aEntries; + pDoc->GetDataEntries( + aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), true, aEntries, true); + if (!aEntries.empty()) + pColumnData->insert(aEntries.begin(), aEntries.end()); } } @@ -1465,12 +1561,13 @@ void ScInputHandler::UseColData() // beim Tippen xub_StrLen nParLen = pEngine->GetTextLen( aSel.nEndPara ); if ( aSel.nEndPos == nParLen ) { - String aText = GetEditText(pEngine); - if (aText.Len()) + rtl::OUString aText = GetEditText(pEngine); + if (!aText.isEmpty()) { - String aNew; - nAutoPos = SCPOS_INVALID; // nix - if ( pColumnData->FindText( aText, aNew, nAutoPos, false ) ) + rtl::OUString aNew; + miAutoPos = pColumnData->end(); + miAutoPos = findText(*pColumnData, miAutoPos, aText, aNew, false); + if (miAutoPos != pColumnData->end()) { // durch dBase Import etc. koennen Umbrueche im String sein, // das wuerde hier mehrere Absaetze ergeben -> nicht gut @@ -1481,12 +1578,12 @@ void ScInputHandler::UseColData() // beim Tippen //! genaue Ersetzung im EnterHandler !!! // ein Space zwischen Absaetzen: - sal_uLong nEdLen = pEngine->GetTextLen() + nParCnt - 1; - String aIns = aNew.Copy( (xub_StrLen)nEdLen ); + sal_Int32 nEdLen = pEngine->GetTextLen() + nParCnt - 1; + rtl::OUString aIns = aNew.copy(nEdLen); // selection must be "backwards", so the cursor stays behind the last // typed character - ESelection aSelection( aSel.nEndPara, aSel.nEndPos + aIns.Len(), + ESelection aSelection( aSel.nEndPara, aSel.nEndPos + aIns.getLength(), aSel.nEndPara, aSel.nEndPos ); // when editing in input line, apply to both edit views @@ -1503,17 +1600,18 @@ void ScInputHandler::UseColData() // beim Tippen aAutoSearch = aText; // zum Weitersuchen - nAutoPos ist gesetzt - if ( aText.Len() == aNew.Len() ) + if (aText.getLength() == aNew.getLength()) { // Wenn der eingegebene Text gefunden wurde, TAB nur dann // verschlucken, wenn noch etwas kommt - String aDummy; - sal_uInt16 nNextPos = nAutoPos; - bUseTab = pColumnData->FindText( aText, aDummy, nNextPos, false ); + rtl::OUString aDummy; + ScTypedCaseStrSet::const_iterator itNextPos = + findText(*pColumnData, miAutoPos, aText, aDummy, false); + bUseTab = itNextPos != pColumnData->end(); } else - bUseTab = sal_True; + bUseTab = true; } } } @@ -1526,7 +1624,7 @@ void ScInputHandler::NextAutoEntry( sal_Bool bBack ) EditView* pActiveView = pTopView ? pTopView : pTableView; if ( pActiveView && pColumnData ) { - if ( nAutoPos != SCPOS_INVALID && aAutoSearch.Len() ) + if (miAutoPos != pColumnData->end() && !aAutoSearch.isEmpty()) { // stimmt die Selektion noch? (kann per Maus geaendert sein) @@ -1535,18 +1633,19 @@ void ScInputHandler::NextAutoEntry( sal_Bool bBack ) sal_uInt16 nParCnt = pEngine->GetParagraphCount(); if ( aSel.nEndPara+1 == nParCnt && aSel.nStartPara == aSel.nEndPara ) { - String aText = GetEditText(pEngine); + rtl::OUString aText = GetEditText(pEngine); xub_StrLen nSelLen = aSel.nEndPos - aSel.nStartPos; xub_StrLen nParLen = pEngine->GetTextLen( aSel.nEndPara ); - if ( aSel.nEndPos == nParLen && aText.Len() == aAutoSearch.Len() + nSelLen ) + if ( aSel.nEndPos == nParLen && aText.getLength() == aAutoSearch.getLength() + nSelLen ) { - String aNew; - if ( pColumnData->FindText( aAutoSearch, aNew, nAutoPos, bBack ) ) + rtl::OUString aNew; + miAutoPos = findText(*pColumnData, miAutoPos, aAutoSearch, aNew, bBack); + if (miAutoPos != pColumnData->end()) { - bInOwnChange = sal_True; // disable ModifyHdl (reset below) + bInOwnChange = true; // disable ModifyHdl (reset below) lcl_RemoveLineEnd( aNew ); - String aIns = aNew.Copy( aAutoSearch.Len() ); + rtl::OUString aIns = aNew.copy(aAutoSearch.getLength()); // when editing in input line, apply to both edit views if ( pTableView ) @@ -1554,7 +1653,7 @@ void ScInputHandler::NextAutoEntry( sal_Bool bBack ) pTableView->DeleteSelected(); pTableView->InsertText( aIns, false ); pTableView->SetSelection( ESelection( - aSel.nEndPara, aSel.nStartPos + aIns.Len(), + aSel.nEndPara, aSel.nStartPos + aIns.getLength(), aSel.nEndPara, aSel.nStartPos ) ); } if ( pTopView ) @@ -1562,7 +1661,7 @@ void ScInputHandler::NextAutoEntry( sal_Bool bBack ) pTopView->DeleteSelected(); pTopView->InsertText( aIns, false ); pTopView->SetSelection( ESelection( - aSel.nEndPara, aSel.nStartPos + aIns.Len(), + aSel.nEndPara, aSel.nStartPos + aIns.getLength(), aSel.nEndPara, aSel.nStartPos ) ); } @@ -1968,7 +2067,7 @@ bool ScInputHandler::StartTable( sal_Unicode cTyped, bool bFromCommand, bool bIn pEngine->SetText(aCurrentText); aStr = aCurrentText; bTextValid = false; - aCurrentText.Erase(); + aCurrentText = rtl::OUString(); } else aStr = GetEditText(pEngine); @@ -2062,7 +2161,7 @@ IMPL_LINK( ScInputHandler, ModifyHdl, void *, EMPTYARG ) // update input line from ModifyHdl for changes that are not // wrapped by DataChanging/DataChanged calls (like Drag&Drop) - String aText; + rtl::OUString aText; if ( pInputWin->IsMultiLineInput() ) aText = ScEditUtil::GetMultilineString(*pEngine); else @@ -2114,7 +2213,7 @@ void ScInputHandler::DataChanged( sal_Bool bFromTopNotify ) if (eMode==SC_INPUT_TYPE || eMode==SC_INPUT_TABLE) { - String aText; + rtl::OUString aText; if ( pInputWin && pInputWin->IsMultiLineInput() ) aText = ScEditUtil::GetMultilineString(*pEngine); else @@ -2404,11 +2503,11 @@ void ScInputHandler::EnterHandler( sal_uInt8 nBlockMode ) sal_Bool bAttrib = false; // Formatierung vorhanden ? sal_Bool bForget = false; // wegen Gueltigkeit streichen ? - String aString = GetEditText(pEngine); + rtl::OUString aString = GetEditText(pEngine); EditView* pActiveView = pTopView ? pTopView : pTableView; - if (bModified && pActiveView && aString.Len() && !lcl_IsNumber(aString)) + if (bModified && pActiveView && !aString.isEmpty() && !lcl_IsNumber(aString)) { - if ( pColumnData && nAutoPos != SCPOS_INVALID ) + if (pColumnData && miAutoPos != pColumnData->end()) { // #i47125# If AutoInput appended something, do the final AutoCorrect // with the cursor at the end of the input. @@ -2609,8 +2708,8 @@ void ScInputHandler::EnterHandler( sal_uInt8 nBlockMode ) else if (bAutoComplete) // Gross-/Kleinschreibung anpassen { // Perform case-matching only when the typed text is partial. - if (pColumnData && aAutoSearch.Len() < aString.Len()) - pColumnData->GetExactMatch(aString); + if (pColumnData && aAutoSearch.getLength() < aString.getLength()) + aString = getExactMatch(*pColumnData, aString); } } @@ -2640,12 +2739,12 @@ void ScInputHandler::EnterHandler( sal_uInt8 nBlockMode ) DeleteRangeFinder(); ResetAutoPar(); - sal_Bool bOldMod = bModified; + bool bOldMod = bModified; bModified = false; bSelIsRef = false; eMode = SC_INPUT_NONE; - StopInputWinEngine( sal_True ); + StopInputWinEngine(true); // Text input (through number formats) or ApplySelectionPattern modify // the cell's attributes, so pLastPattern is no longer valid @@ -2655,34 +2754,34 @@ void ScInputHandler::EnterHandler( sal_uInt8 nBlockMode ) { // keine typographische Anfuehrungszeichen in Formeln - if ( aString.GetChar(0) == '=' ) + if (aString.getStr()[0] == '=') { SvxAutoCorrect* pAuto = SvxAutoCorrCfg::Get().GetAutoCorrect(); if ( pAuto ) { - sal_Unicode cReplace = pAuto->GetStartDoubleQuote(); - if( !cReplace ) - cReplace = ScGlobal::pLocaleData->getDoubleQuotationMarkStart().GetChar(0); - if ( cReplace != '"' ) - aString.SearchAndReplaceAll( cReplace, '"' ); - - cReplace = pAuto->GetEndDoubleQuote(); - if( !cReplace ) - cReplace = ScGlobal::pLocaleData->getDoubleQuotationMarkEnd().GetChar(0); - if ( cReplace != '"' ) - aString.SearchAndReplaceAll( cReplace, '"' ); - - cReplace = pAuto->GetStartSingleQuote(); - if( !cReplace ) - cReplace = ScGlobal::pLocaleData->getQuotationMarkStart().GetChar(0); - if ( cReplace != '\'' ) - aString.SearchAndReplaceAll( cReplace, '\'' ); - - cReplace = pAuto->GetEndSingleQuote(); - if( !cReplace ) - cReplace = ScGlobal::pLocaleData->getQuotationMarkEnd().GetChar(0); - if ( cReplace != '\'' ) - aString.SearchAndReplaceAll( cReplace, '\'' ); + rtl::OUString aReplace(pAuto->GetStartDoubleQuote()); + if (aReplace.isEmpty()) + aReplace = ScGlobal::pLocaleData->getDoubleQuotationMarkStart(); + if (!aReplace.equalsAsciiL("\"", 1)) + aString = comphelper::string::replace(aString, aReplace, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\""))); + + aReplace = rtl::OUString(pAuto->GetEndDoubleQuote()); + if (aReplace.isEmpty()) + aReplace = ScGlobal::pLocaleData->getDoubleQuotationMarkEnd(); + if (!aReplace.equalsAsciiL("\"", 1)) + aString = comphelper::string::replace(aString, aReplace, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\""))); + + aReplace = rtl::OUString(pAuto->GetStartSingleQuote()); + if (aReplace.isEmpty()) + aReplace = ScGlobal::pLocaleData->getQuotationMarkStart(); + if (!aReplace.equalsAsciiL("'", 1)) + aString = comphelper::string::replace(aString, aReplace, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("'"))); + + aReplace = rtl::OUString(pAuto->GetEndSingleQuote()); + if (aReplace.isEmpty()) + aReplace = ScGlobal::pLocaleData->getQuotationMarkEnd(); + if (!aReplace.equalsAsciiL("'", 1)) + aString = comphelper::string::replace(aString, aReplace, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("'"))); } } @@ -3021,7 +3120,7 @@ sal_Bool ScInputHandler::KeyInput( const KeyEvent& rKEvt, sal_Bool bStartEdit /* case KEY_RETURN: if (bControl && !bShift && ( !bInputLine || ( pInputWin && pInputWin->IsMultiLineInput() ) ) ) bDoEnter = sal_True; - else if ( nModi == 0 && nTipVisible && pFormulaData && nAutoPos != SCPOS_INVALID ) + else if (nModi == 0 && nTipVisible && pFormulaData && miAutoPos != pFormulaData->end()) { PasteFunctionData(); bUsed = sal_True; @@ -3049,14 +3148,14 @@ sal_Bool ScInputHandler::KeyInput( const KeyEvent& rKEvt, sal_Bool bStartEdit /* case KEY_TAB: if (bControl && !bAlt) { - if ( pFormulaData && nTipVisible && nAutoPos != SCPOS_INVALID ) + if (pFormulaData && nTipVisible && miAutoPos != pFormulaData->end()) { // blaettern NextFormulaEntry( bShift ); bUsed = true; } - else if ( pColumnData && bUseTab && nAutoPos != SCPOS_INVALID ) + else if (pColumnData && bUseTab && miAutoPos != pColumnData->end()) { // in den Eintraegen der AutoEingabe blaettern @@ -3183,7 +3282,10 @@ sal_Bool ScInputHandler::KeyInput( const KeyEvent& rKEvt, sal_Bool bStartEdit /* if ( bUsed && bAutoComplete ) { bUseTab = false; - nAutoPos = SCPOS_INVALID; // do not search further + if (pFormulaData) + miAutoPos = pFormulaData->end(); // do not search further + else if (pColumnData) + miAutoPos = pColumnData->end(); KeyFuncType eFunc = rKEvt.GetKeyCode().GetFunction(); if ( nChar && nChar != 8 && nChar != 127 && // no 'backspace', no 'delete' @@ -3307,7 +3409,11 @@ sal_Bool ScInputHandler::InputCommand( const CommandEvent& rCEvt, sal_Bool bForc { // AutoInput after ext text input - nAutoPos = SCPOS_INVALID; + if (pFormulaData) + miAutoPos = pFormulaData->end(); + else if (pColumnData) + miAutoPos = pColumnData->end(); + if (bFormulaMode) UseFormulaData(); else @@ -3392,7 +3498,7 @@ void ScInputHandler::NotifyChange( const ScInputHdlState* pState, const ScAddress& rSPos = pState->GetStartPos(); const ScAddress& rEPos = pState->GetEndPos(); const EditTextObject* pData = pState->GetEditData(); - String aString = pState->GetString(); + rtl::OUString aString = pState->GetString(); sal_Bool bTxtMod = false; ScDocShell* pDocSh = pActiveViewSh->GetViewData()->GetDocShell(); ScDocument* pDoc = pDocSh->GetDocument(); @@ -3404,9 +3510,9 @@ void ScInputHandler::NotifyChange( const ScInputHdlState* pState, else if ( bHadObject ) bTxtMod = sal_True; else if ( bTextValid ) - bTxtMod = ( aString != aCurrentText ); + bTxtMod = ( !aString.equals(aCurrentText) ); else - bTxtMod = ( aString != GetEditText(pEngine) ); + bTxtMod = ( !aString.equals(GetEditText(pEngine)) ); if ( bTxtMod || bForce ) { @@ -3419,12 +3525,12 @@ void ScInputHandler::NotifyChange( const ScInputHdlState* pState, aString = GetEditText(pEngine); lcl_RemoveTabs(aString); bTextValid = false; - aCurrentText.Erase(); + aCurrentText = rtl::OUString(); } else { aCurrentText = aString; - bTextValid = sal_True; //! erst nur als String merken + bTextValid = true; //! erst nur als String merken } if ( pInputWin ) @@ -3621,12 +3727,12 @@ void ScInputHandler::InputChanged( EditView* pView, sal_Bool bFromNotify ) SyncViews( pView ); } -const String& ScInputHandler::GetEditString() +const rtl::OUString& ScInputHandler::GetEditString() { if (pEngine) { aCurrentText = pEngine->GetText(); // immer neu aus Engine - bTextValid = sal_True; + bTextValid = true; } return aCurrentText; |