diff options
author | Ivo Hinkelmann <ihi@openoffice.org> | 2011-03-07 17:31:32 +0100 |
---|---|---|
committer | Ivo Hinkelmann <ihi@openoffice.org> | 2011-03-07 17:31:32 +0100 |
commit | ab72202f53d6d05f3656e65e568078da5b3b7525 (patch) | |
tree | c904d08e9dbf5385c42897e7c8a7b110ffdbd9e7 /editeng | |
parent | 7aff5812cbcc63044a20d263c07849334e51a60b (diff) | |
parent | 9310807dd3af0d878d0989dbab48ea10cb71780d (diff) |
CWS-TOOLING: integrate CWS os146
Diffstat (limited to 'editeng')
-rwxr-xr-x[-rw-r--r--] | editeng/inc/editeng/svxacorr.hxx | 1 | ||||
-rw-r--r-- | editeng/source/editeng/edtspell.cxx | 7 | ||||
-rwxr-xr-x[-rw-r--r--] | editeng/source/editeng/edtspell.hxx | 1 | ||||
-rwxr-xr-x[-rw-r--r--] | editeng/source/misc/svxacorr.cxx | 51 |
4 files changed, 53 insertions, 7 deletions
diff --git a/editeng/inc/editeng/svxacorr.hxx b/editeng/inc/editeng/svxacorr.hxx index f355a669a304..73dc7664562e 100644..100755 --- a/editeng/inc/editeng/svxacorr.hxx +++ b/editeng/inc/editeng/svxacorr.hxx @@ -79,6 +79,7 @@ public: virtual sal_Bool Delete( xub_StrLen nStt, xub_StrLen nEnd ) = 0; virtual sal_Bool Insert( xub_StrLen nPos, const String& rTxt ) = 0; virtual sal_Bool Replace( xub_StrLen nPos, const String& rTxt ) = 0; + virtual sal_Bool ReplaceRange( xub_StrLen nPos, xub_StrLen nLen, const String& rTxt ) = 0; virtual sal_Bool SetAttr( xub_StrLen nStt, xub_StrLen nEnd, sal_uInt16 nSlotId, SfxPoolItem& ) = 0; diff --git a/editeng/source/editeng/edtspell.cxx b/editeng/source/editeng/edtspell.cxx index afc329040e29..5fc43f461cac 100644 --- a/editeng/source/editeng/edtspell.cxx +++ b/editeng/source/editeng/edtspell.cxx @@ -583,8 +583,13 @@ sal_Bool EdtAutoCorrDoc::Insert( sal_uInt16 nPos, const String& rTxt ) sal_Bool EdtAutoCorrDoc::Replace( sal_uInt16 nPos, const String& rTxt ) { + return ReplaceRange( nPos, rTxt.Len(), rTxt ); +} + +sal_Bool EdtAutoCorrDoc::ReplaceRange( xub_StrLen nPos, xub_StrLen nSourceLength, const String& rTxt ) +{ // Eigentlich ein Replace einfuehren => Entspr. UNDO - sal_uInt16 nEnd = nPos+rTxt.Len(); + sal_uInt16 nEnd = nPos+nSourceLength; if ( nEnd > pCurNode->Len() ) nEnd = pCurNode->Len(); diff --git a/editeng/source/editeng/edtspell.hxx b/editeng/source/editeng/edtspell.hxx index 3ed82ac367f1..49978cdd310d 100644..100755 --- a/editeng/source/editeng/edtspell.hxx +++ b/editeng/source/editeng/edtspell.hxx @@ -158,6 +158,7 @@ public: virtual sal_Bool Delete( sal_uInt16 nStt, sal_uInt16 nEnd ); virtual sal_Bool Insert( sal_uInt16 nPos, const String& rTxt ); virtual sal_Bool Replace( sal_uInt16 nPos, const String& rTxt ); + virtual sal_Bool ReplaceRange( xub_StrLen nPos, xub_StrLen nLen, const String& rTxt ); virtual sal_Bool SetAttr( sal_uInt16 nStt, sal_uInt16 nEnd, sal_uInt16 nSlotId, SfxPoolItem& ); virtual sal_Bool SetINetAttr( sal_uInt16 nStt, sal_uInt16 nEnd, const String& rURL ); diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx index e15e92200e0c..1eebd5349fe4 100644..100755 --- a/editeng/source/misc/svxacorr.cxx +++ b/editeng/source/misc/svxacorr.cxx @@ -47,6 +47,7 @@ #include <com/sun/star/i18n/UnicodeType.hdl> #include <unotools/collatorwrapper.hxx> #include <com/sun/star/i18n/CollatorOptions.hpp> +#include <com/sun/star/i18n/UnicodeScript.hpp> #include <unotools/localedatawrapper.hxx> #include <unotools/transliterationwrapper.hxx> #include <com/sun/star/lang/XMultiServiceFactory.hpp> @@ -139,6 +140,41 @@ inline int IsUpperLetter( sal_Int32 nCharType ) 0 == ( ::com::sun::star::i18n::KCharacterType::LOWER & nCharType); } +bool lcl_IsUnsupportedUnicodeChar( CharClass& rCC, const String& rTxt, + xub_StrLen nStt, xub_StrLen nEnd ) +{ + for( ; nStt < nEnd; ++nStt ) + { +#if OSL_DEBUG_LEVEL > 1 + sal_Int32 nCharType; + sal_Int32 nChType; + nCharType = rCC.getCharacterType( rTxt, nStt ); + nChType = rCC.getType( rTxt, nStt ); +#endif + short nScript = rCC.getScript( rTxt, nStt ); + switch( nScript ) + { + case ::com::sun::star::i18n::UnicodeScript_kCJKRadicalsSupplement: + case ::com::sun::star::i18n::UnicodeScript_kHangulJamo: + case ::com::sun::star::i18n::UnicodeScript_kCJKSymbolPunctuation: + case ::com::sun::star::i18n::UnicodeScript_kHiragana: + case ::com::sun::star::i18n::UnicodeScript_kKatakana: + case ::com::sun::star::i18n::UnicodeScript_kHangulCompatibilityJamo: + case ::com::sun::star::i18n::UnicodeScript_kEnclosedCJKLetterMonth: + case ::com::sun::star::i18n::UnicodeScript_kCJKCompatibility: + case ::com::sun::star::i18n::UnicodeScript_k_CJKUnifiedIdeographsExtensionA: + case ::com::sun::star::i18n::UnicodeScript_kCJKUnifiedIdeograph: + case ::com::sun::star::i18n::UnicodeScript_kHangulSyllable: + case ::com::sun::star::i18n::UnicodeScript_kCJKCompatibilityIdeograph: + case ::com::sun::star::i18n::UnicodeScript_kHalfwidthFullwidthForm: + return true; + default: ; //do nothing + } + + } + return false; +} + sal_Bool lcl_IsSymbolChar( CharClass& rCC, const String& rTxt, xub_StrLen nStt, xub_StrLen nEnd ) { @@ -456,7 +492,7 @@ sal_Bool SvxAutoCorrect::FnCptlSttWrd( SvxAutoCorrDoc& rDoc, const String& rTxt, sal_Unicode cSave = rTxt.GetChar( nSttPos ); String sChar( cSave ); rCC.toLower( sChar ); - if( sChar.GetChar(0) != cSave && rDoc.Replace( nSttPos, sChar )) + if( sChar.GetChar(0) != cSave && rDoc.ReplaceRange( nSttPos, 1, sChar )) { if( SaveWordWrdSttLst & nFlags ) rDoc.SaveCpltSttWord( CptlSttWrd, nSttPos, sWord, cSave ); @@ -888,7 +924,7 @@ sal_Bool SvxAutoCorrect::FnCptlSttSntnc( SvxAutoCorrDoc& rDoc, String sChar( *pWordStt ); rCC.toUpper( sChar ); return sChar != *pWordStt && - rDoc.Replace( xub_StrLen( pWordStt - pStart ), sChar ); + rDoc.ReplaceRange( xub_StrLen( pWordStt - pStart ), 1, sChar ); } aText = *pPrevPara; @@ -1068,7 +1104,7 @@ sal_Bool SvxAutoCorrect::FnCptlSttSntnc( SvxAutoCorrDoc& rDoc, nSttPos = sal::static_int_cast< xub_StrLen >( pWordStt - rTxt.GetBuffer() ); String sChar( cSave ); rCC.toUpper( sChar ); - sal_Bool bRet = sChar.GetChar(0) != cSave && rDoc.Replace( nSttPos, sChar ); + sal_Bool bRet = sChar.GetChar(0) != cSave && rDoc.ReplaceRange( nSttPos, 1, sChar ); // das Wort will vielleicht jemand haben if( bRet && SaveWordCplSttLst & nFlags ) @@ -1299,7 +1335,7 @@ sal_uLong SvxAutoCorrect::AutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt, eLang = MsLangId::getSystemLanguage(); CharClass& rCC = GetCharClass( eLang ); - // Bug 19285: Symbolzeichen nicht anfassen + // no symbol characters if( lcl_IsSymbolChar( rCC, rTxt, nCapLttrPos, nInsPos )) break; @@ -1368,13 +1404,16 @@ sal_uLong SvxAutoCorrect::AutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt, else { nRet = 0; + bool bUnsupported = lcl_IsUnsupportedUnicodeChar( rCC, rTxt, nCapLttrPos, nInsPos ); // Grossbuchstabe am Satz-Anfang ?? - if( IsAutoCorrFlag( CptlSttSntnc ) && + if( !bUnsupported && + IsAutoCorrFlag( CptlSttSntnc ) && FnCptlSttSntnc( rDoc, rTxt, sal_True, nCapLttrPos, nInsPos, eLang ) ) nRet |= CptlSttSntnc; // Zwei Grossbuchstaben am Wort-Anfang ?? - if( IsAutoCorrFlag( CptlSttWrd ) && + if( !bUnsupported && + IsAutoCorrFlag( CptlSttWrd ) && FnCptlSttWrd( rDoc, rTxt, nCapLttrPos, nInsPos, eLang ) ) nRet |= CptlSttWrd; |