summaryrefslogtreecommitdiff
path: root/svx/source/editeng/svxacorr.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/editeng/svxacorr.cxx')
-rw-r--r--svx/source/editeng/svxacorr.cxx2729
1 files changed, 0 insertions, 2729 deletions
diff --git a/svx/source/editeng/svxacorr.cxx b/svx/source/editeng/svxacorr.cxx
deleted file mode 100644
index 2cba63650f21..000000000000
--- a/svx/source/editeng/svxacorr.cxx
+++ /dev/null
@@ -1,2729 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: svxacorr.cxx,v $
- * $Revision: 1.62 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_svx.hxx"
-
-
-#include <com/sun/star/io/XStream.hpp>
-#include <tools/urlobj.hxx>
-#include <tools/table.hxx>
-#include <i18npool/mslangid.hxx>
-#ifndef _APP_HXX //autogen
-#include <vcl/svapp.hxx>
-#endif
-#ifndef _STORINFO_HXX //autogen
-#include <sot/storinfo.hxx>
-#endif
-#ifndef _SFX_DOCFILE_HXX
-#include <sfx2/docfile.hxx>
-#endif
-#include <sfx2/sfxhelp.hxx>
-#include <sfx2/viewfrm.hxx>
-// fuer die Sort-String-Arrays aus dem SVMEM.HXX
-#define _SVSTDARR_STRINGSISORTDTOR
-#define _SVSTDARR_STRINGSDTOR
-#include <svl/svstdarr.hxx>
-
-#ifndef SVTOOLS_FSTATHELPER_HXX
-#include <svl/fstathelper.hxx>
-#endif
-#include <svtools/helpopt.hxx>
-#include <svl/urihelper.hxx>
-#include <unotools/charclass.hxx>
-#ifndef _COM_SUN_STAR_I18N_UNICODETYPE_HDL_
-#include <com/sun/star/i18n/UnicodeType.hdl>
-#endif
-#include <unotools/collatorwrapper.hxx>
-#include <com/sun/star/i18n/CollatorOptions.hpp>
-#include <unotools/localedatawrapper.hxx>
-#include <unotools/transliterationwrapper.hxx>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <comphelper/processfactory.hxx>
-#include <com/sun/star/io/XActiveDataSource.hpp>
-
-#ifndef _SVX_SVXIDS_HRC
-#include <svx/svxids.hrc>
-#endif
-
-#include <sot/storage.hxx>
-#include <comphelper/storagehelper.hxx>
-
-#include <svx/udlnitem.hxx>
-#include <svx/wghtitem.hxx>
-#include <svx/escpitem.hxx>
-#include <svx/svxacorr.hxx>
-#include "unolingu.hxx"
-
-#ifndef _SVX_HELPID_HRC
-#include <helpid.hrc>
-#endif
-#include <comphelper/processfactory.hxx>
-#include <com/sun/star/xml/sax/InputSource.hpp>
-#include <com/sun/star/xml/sax/XParser.hpp>
-#include <unotools/streamwrap.hxx>
-#include <SvXMLAutoCorrectImport.hxx>
-#include <SvXMLAutoCorrectExport.hxx>
-#include <ucbhelper/content.hxx>
-#include <com/sun/star/ucb/XCommandEnvironment.hpp>
-#include <com/sun/star/ucb/TransferInfo.hpp>
-#include <com/sun/star/ucb/NameClash.hpp>
-#include <xmloff/xmltoken.hxx>
-
-using namespace ::com::sun::star::ucb;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star;
-using namespace ::xmloff::token;
-using namespace ::rtl;
-using namespace ::utl;
-
-const int C_NONE = 0x00;
-const int C_FULL_STOP = 0x01;
-const int C_EXCLAMATION_MARK = 0x02;
-const int C_QUESTION_MARK = 0x04;
-
-static const sal_Char pImplWrdStt_ExcptLstStr[] = "WordExceptList";
-static const sal_Char pImplCplStt_ExcptLstStr[] = "SentenceExceptList";
-static const sal_Char pImplAutocorr_ListStr[] = "DocumentList";
-static const sal_Char pXMLImplWrdStt_ExcptLstStr[] = "WordExceptList.xml";
-static const sal_Char pXMLImplCplStt_ExcptLstStr[] = "SentenceExceptList.xml";
-static const sal_Char pXMLImplAutocorr_ListStr[] = "DocumentList.xml";
-
-static const sal_Char
- /* auch bei diesen Anfaengen - Klammern auf und alle Arten von Anf.Zei. */
- sImplSttSkipChars[] = "\"\'([{\x83\x84\x89\x91\x92\x93\x94",
- /* auch bei diesen Ende - Klammern auf und alle Arten von Anf.Zei. */
- sImplEndSkipChars[] = "\"\')]}\x83\x84\x89\x91\x92\x93\x94";
-
-// diese Zeichen sind in Worten erlaubt: (fuer FnCptlSttSntnc)
-static const sal_Char sImplWordChars[] = "-'";
-
-void EncryptBlockName_Imp( String& rName );
-void DecryptBlockName_Imp( String& rName );
-
-
-// FileVersions Nummern fuer die Ersetzungs-/Ausnahmelisten getrennt
-#define WORDLIST_VERSION_358 1
-#define EXEPTLIST_VERSION_358 0
-
-
-_SV_IMPL_SORTAR_ALG( SvxAutocorrWordList, SvxAutocorrWordPtr )
-TYPEINIT0(SvxAutoCorrect)
-
-typedef SvxAutoCorrectLanguageLists* SvxAutoCorrectLanguageListsPtr;
-DECLARE_TABLE( SvxAutoCorrLanguageTable_Impl, SvxAutoCorrectLanguageListsPtr)
-
-DECLARE_TABLE( SvxAutoCorrLastFileAskTable_Impl, long )
-
-
-inline int IsWordDelim( const sal_Unicode c )
-{
- return ' ' == c || '\t' == c || 0x0a == c ||
- 0xA0 == c || 0x2011 == c || 0x1 == c;
-}
-
-inline int IsLowerLetter( sal_Int32 nCharType )
-{
- return CharClass::isLetterType( nCharType ) &&
- 0 == ( ::com::sun::star::i18n::KCharacterType::UPPER & nCharType);
-}
-inline int IsUpperLetter( sal_Int32 nCharType )
-{
- return CharClass::isLetterType( nCharType ) &&
- 0 == ( ::com::sun::star::i18n::KCharacterType::LOWER & nCharType);
-}
-
-BOOL lcl_IsSymbolChar( 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
- if( ::com::sun::star::i18n::UnicodeType::PRIVATE_USE ==
- rCC.getType( rTxt, nStt ))
- return TRUE;
- }
- return FALSE;
-}
-
-
-static BOOL lcl_IsInAsciiArr( const sal_Char* pArr, const sal_Unicode c )
-{
- BOOL bRet = FALSE;
- for( ; *pArr; ++pArr )
- if( *pArr == c )
- {
- bRet = TRUE;
- break;
- }
- return bRet;
-}
-
-SvxAutoCorrDoc::~SvxAutoCorrDoc()
-{
-}
-
-
- // wird nach dem austauschen der Zeichen von den Funktionen
- // - FnCptlSttWrd
- // - FnCptlSttSntnc
- // gerufen. Dann koennen die Worte ggfs. in die Ausnahmelisten
- // aufgenommen werden.
-void SvxAutoCorrDoc::SaveCpltSttWord( ULONG, xub_StrLen, const String&,
- sal_Unicode )
-{
-}
-
-LanguageType SvxAutoCorrDoc::GetLanguage( xub_StrLen , BOOL ) const
-{
- return LANGUAGE_SYSTEM;
-}
-
-static ::com::sun::star::uno::Reference<
- ::com::sun::star::lang::XMultiServiceFactory >& GetProcessFact()
-{
- static ::com::sun::star::uno::Reference<
- ::com::sun::star::lang::XMultiServiceFactory > xMSF =
- ::comphelper::getProcessServiceFactory();
- return xMSF;
-}
-
-static USHORT GetAppLang()
-{
- return Application::GetSettings().GetLanguage();
-}
-static LocaleDataWrapper& GetLocaleDataWrapper( USHORT nLang )
-{
- static LocaleDataWrapper aLclDtWrp( GetProcessFact(),
- SvxCreateLocale( GetAppLang() ) );
- ::com::sun::star::lang::Locale aLcl( SvxCreateLocale( nLang ));
- const ::com::sun::star::lang::Locale& rLcl = aLclDtWrp.getLoadedLocale();
- if( aLcl.Language != rLcl.Language ||
- aLcl.Country != rLcl.Country ||
- aLcl.Variant != rLcl.Variant )
- aLclDtWrp.setLocale( aLcl );
- return aLclDtWrp;
-}
-static TransliterationWrapper& GetIgnoreTranslWrapper()
-{
- static int bIsInit = 0;
- static TransliterationWrapper aWrp( GetProcessFact(),
- ::com::sun::star::i18n::TransliterationModules_IGNORE_CASE |
- ::com::sun::star::i18n::TransliterationModules_IGNORE_KANA |
- ::com::sun::star::i18n::TransliterationModules_IGNORE_WIDTH );
- if( !bIsInit )
- {
- aWrp.loadModuleIfNeeded( GetAppLang() );
- bIsInit = 1;
- }
- return aWrp;
-}
-static CollatorWrapper& GetCollatorWrapper()
-{
- static int bIsInit = 0;
- static CollatorWrapper aCollWrp( GetProcessFact() );
- if( !bIsInit )
- {
- aCollWrp.loadDefaultCollator( SvxCreateLocale( GetAppLang() ), 0 );
- bIsInit = 1;
- }
- return aCollWrp;
-}
-
-
-void SvxAutocorrWordList::DeleteAndDestroy( USHORT nP, USHORT nL )
-{
- if( nL )
- {
- DBG_ASSERT( nP < nA && nP + nL <= nA, "ERR_VAR_DEL" );
- for( USHORT n=nP; n < nP + nL; n++ )
- delete *((SvxAutocorrWordPtr*)pData+n);
- SvPtrarr::Remove( nP, nL );
- }
-}
-
-
-BOOL SvxAutocorrWordList::Seek_Entry( const SvxAutocorrWordPtr aE, USHORT* pP ) const
-{
- register USHORT nO = SvxAutocorrWordList_SAR::Count(),
- nM,
- nU = 0;
- if( nO > 0 )
- {
- CollatorWrapper& rCmp = ::GetCollatorWrapper();
- nO--;
- while( nU <= nO )
- {
- nM = nU + ( nO - nU ) / 2;
- long nCmp = rCmp.compareString( aE->GetShort(),
- (*((SvxAutocorrWordPtr*)pData + nM))->GetShort() );
- if( 0 == nCmp )
- {
- if( pP ) *pP = nM;
- return TRUE;
- }
- else if( 0 < nCmp )
- nU = nM + 1;
- else if( nM == 0 )
- {
- if( pP ) *pP = nU;
- return FALSE;
- }
- else
- nO = nM - 1;
- }
- }
- if( pP ) *pP = nU;
- return FALSE;
-}
-
-/* -----------------18.11.98 15:28-------------------
- *
- * --------------------------------------------------*/
-void lcl_ClearTable(SvxAutoCorrLanguageTable_Impl& rLangTable)
-{
- SvxAutoCorrectLanguageListsPtr pLists = rLangTable.Last();
- while(pLists)
- {
- delete pLists;
- pLists = rLangTable.Prev();
- }
- rLangTable.Clear();
-}
-
-/* -----------------03.11.06 10:15-------------------
- *
- * --------------------------------------------------*/
-
-sal_Bool SvxAutoCorrect::IsAutoCorrectChar( sal_Unicode cChar )
-{
- return cChar == '\0' || cChar == '\t' || cChar == 0x0a ||
- cChar == ' ' || cChar == '\'' || cChar == '\"' ||
- cChar == '*' || cChar == '_' ||
- cChar == '.' || cChar == ',' || cChar == ';' ||
- cChar == ':' || cChar == '?' || cChar == '!';
-}
-
-/* -----------------19.11.98 10:15-------------------
- *
- * --------------------------------------------------*/
-long SvxAutoCorrect::GetDefaultFlags()
-{
- long nRet = Autocorrect
- | CptlSttSntnc
- | CptlSttWrd
- | ChgFractionSymbol
- | ChgOrdinalNumber
- | ChgToEnEmDash
- | ChgWeightUnderl
- | SetINetAttr
- | ChgQuotes
- | SaveWordCplSttLst
- | SaveWordWrdSttLst;
- LanguageType eLang = GetAppLang();
- switch( eLang )
- {
- case LANGUAGE_ENGLISH:
- case LANGUAGE_ENGLISH_US:
- case LANGUAGE_ENGLISH_UK:
- case LANGUAGE_ENGLISH_AUS:
- case LANGUAGE_ENGLISH_CAN:
- case LANGUAGE_ENGLISH_NZ:
- case LANGUAGE_ENGLISH_EIRE:
- case LANGUAGE_ENGLISH_SAFRICA:
- case LANGUAGE_ENGLISH_JAMAICA:
- case LANGUAGE_ENGLISH_CARRIBEAN:
- nRet &= ~(ChgQuotes|ChgSglQuotes);
- break;
- }
- return nRet;
-}
-
-
-SvxAutoCorrect::SvxAutoCorrect( const String& rShareAutocorrFile,
- const String& rUserAutocorrFile )
- : sShareAutoCorrFile( rShareAutocorrFile ),
- sUserAutoCorrFile( rUserAutocorrFile ),
- pLangTable( new SvxAutoCorrLanguageTable_Impl ),
- pLastFileTable( new SvxAutoCorrLastFileAskTable_Impl ),
- pCharClass( 0 ),
- cStartDQuote( 0 ), cEndDQuote( 0 ), cStartSQuote( 0 ), cEndSQuote( 0 )
-{
- nFlags = SvxAutoCorrect::GetDefaultFlags();
-
- c1Div2 = ByteString::ConvertToUnicode( '\xBD', RTL_TEXTENCODING_MS_1252 );
- c1Div4 = ByteString::ConvertToUnicode( '\xBC', RTL_TEXTENCODING_MS_1252 );
- c3Div4 = ByteString::ConvertToUnicode( '\xBE', RTL_TEXTENCODING_MS_1252 );
- cEmDash = ByteString::ConvertToUnicode( '\x97', RTL_TEXTENCODING_MS_1252 );
- cEnDash = ByteString::ConvertToUnicode( '\x96', RTL_TEXTENCODING_MS_1252 );
-}
-
-SvxAutoCorrect::SvxAutoCorrect( const SvxAutoCorrect& rCpy )
-: sShareAutoCorrFile( rCpy.sShareAutoCorrFile ),
- sUserAutoCorrFile( rCpy.sUserAutoCorrFile ),
-
- aSwFlags( rCpy.aSwFlags ),
-
- pLangTable( new SvxAutoCorrLanguageTable_Impl ),
- pLastFileTable( new SvxAutoCorrLastFileAskTable_Impl ),
- pCharClass( 0 ),
-
- nFlags( rCpy.nFlags & ~(ChgWordLstLoad|CplSttLstLoad|WrdSttLstLoad)),
- cStartDQuote( rCpy.cStartDQuote ), cEndDQuote( rCpy.cEndDQuote ),
- cStartSQuote( rCpy.cStartSQuote ), cEndSQuote( rCpy.cEndSQuote ),
- c1Div2( rCpy.c1Div2 ), c1Div4( rCpy.c1Div4 ), c3Div4( rCpy.c3Div4 ),
- cEmDash( rCpy.cEmDash ), cEnDash( rCpy.cEnDash )
-{
-}
-
-
-SvxAutoCorrect::~SvxAutoCorrect()
-{
- lcl_ClearTable(*pLangTable);
- delete pLangTable;
- delete pLastFileTable;
- delete pCharClass;
-}
-
-void SvxAutoCorrect::_GetCharClass( LanguageType eLang )
-{
- delete pCharClass;
- pCharClass = new CharClass( SvxCreateLocale( eLang ));
- eCharClassLang = eLang;
-}
-
-void SvxAutoCorrect::SetAutoCorrFlag( long nFlag, BOOL bOn )
-{
- long nOld = nFlags;
- nFlags = bOn ? nFlags | nFlag
- : nFlags & ~nFlag;
-
- if( !bOn )
- {
- if( (nOld & CptlSttSntnc) != (nFlags & CptlSttSntnc) )
- nFlags &= ~CplSttLstLoad;
- if( (nOld & CptlSttWrd) != (nFlags & CptlSttWrd) )
- nFlags &= ~WrdSttLstLoad;
- if( (nOld & Autocorrect) != (nFlags & Autocorrect) )
- nFlags &= ~ChgWordLstLoad;
- }
-}
-
-
- // Zwei Grossbuchstaben am Wort-Anfang ??
-BOOL SvxAutoCorrect::FnCptlSttWrd( SvxAutoCorrDoc& rDoc, const String& rTxt,
- xub_StrLen nSttPos, xub_StrLen nEndPos,
- LanguageType eLang )
-{
- BOOL bRet = FALSE;
- CharClass& rCC = GetCharClass( eLang );
-
- // loesche alle nicht alpanum. Zeichen am Wortanfang/-ende und
- // teste dann ( erkennt: "(min.", "/min.", usw.)
- for( ; nSttPos < nEndPos; ++nSttPos )
- if( rCC.isLetterNumeric( rTxt, nSttPos ))
- break;
- for( ; nSttPos < nEndPos; --nEndPos )
- if( rCC.isLetterNumeric( rTxt, nEndPos - 1 ))
- break;
-
- // Zwei Grossbuchstaben am Wort-Anfang ??
- if( nSttPos+2 < nEndPos &&
- IsUpperLetter( rCC.getCharacterType( rTxt, nSttPos )) &&
- IsUpperLetter( rCC.getCharacterType( rTxt, ++nSttPos )) &&
- // ist das 3. Zeichen ein klein geschiebenes Alpha-Zeichen
- IsLowerLetter( rCC.getCharacterType( rTxt, nSttPos +1 )) &&
- // keine Sonder-Attribute ersetzen
- 0x1 != rTxt.GetChar( nSttPos ) && 0x2 != rTxt.GetChar( nSttPos ))
- {
- // teste ob das Wort in einer Ausnahmeliste steht
- String sWord( rTxt.Copy( nSttPos - 1, nEndPos - nSttPos + 1 ));
- if( !FindInWrdSttExceptList(eLang, sWord) )
- {
- sal_Unicode cSave = rTxt.GetChar( nSttPos );
- String sChar( cSave );
- rCC.toLower( sChar );
- if( sChar.GetChar(0) != cSave && rDoc.Replace( nSttPos, sChar ))
- {
- if( SaveWordWrdSttLst & nFlags )
- rDoc.SaveCpltSttWord( CptlSttWrd, nSttPos, sWord, cSave );
- bRet = TRUE;
- }
- }
- }
- return bRet;
-}
-
-
-BOOL SvxAutoCorrect::FnChgFractionSymbol(
- SvxAutoCorrDoc& rDoc, const String& rTxt,
- xub_StrLen nSttPos, xub_StrLen nEndPos )
-{
- sal_Unicode cChar = 0;
-
- for( ; nSttPos < nEndPos; ++nSttPos )
- if( !lcl_IsInAsciiArr( sImplSttSkipChars, rTxt.GetChar( nSttPos ) ))
- break;
- for( ; nSttPos < nEndPos; --nEndPos )
- if( !lcl_IsInAsciiArr( sImplEndSkipChars, rTxt.GetChar( nEndPos - 1 ) ))
- break;
-
- // 1/2, 1/4, ... ersetzen durch das entsprechende Zeichen vom Font
- if( 3 == nEndPos - nSttPos && '/' == rTxt.GetChar( nSttPos+1 ))
- {
- switch( ( rTxt.GetChar( nSttPos )) * 256 + rTxt.GetChar( nEndPos-1 ))
- {
- case '1' * 256 + '2': cChar = c1Div2; break;
- case '1' * 256 + '4': cChar = c1Div4; break;
- case '3' * 256 + '4': cChar = c3Div4; break;
- }
-
- if( cChar )
- {
- // also austauschen:
- rDoc.Delete( nSttPos+1, nEndPos );
- rDoc.Replace( nSttPos, cChar );
- }
- }
- return 0 != cChar;
-}
-
-
-BOOL SvxAutoCorrect::FnChgOrdinalNumber(
- SvxAutoCorrDoc& rDoc, const String& rTxt,
- xub_StrLen nSttPos, xub_StrLen nEndPos,
- LanguageType eLang )
-{
-// 1st, 2nd, 3rd, 4 - 0th
-// 201th oder 201st
-// 12th oder 12nd
- CharClass& rCC = GetCharClass( eLang );
- BOOL bChg = FALSE;
-
- for( ; nSttPos < nEndPos; ++nSttPos )
- if( !lcl_IsInAsciiArr( sImplSttSkipChars, rTxt.GetChar( nSttPos ) ))
- break;
- for( ; nSttPos < nEndPos; --nEndPos )
- if( !lcl_IsInAsciiArr( sImplEndSkipChars, rTxt.GetChar( nEndPos - 1 ) ))
- break;
-
- if( 2 < nEndPos - nSttPos &&
- rCC.isDigit( rTxt, nEndPos - 3 ) )
- {
- static sal_Char __READONLY_DATA
- sAll[] = "th", /* rest */
- sFirst[] = "st", /* 1 */
- sSecond[] = "nd", /* 2 */
- sThird[] = "rd"; /* 3 */
- static const sal_Char* __READONLY_DATA aNumberTab[ 4 ] =
- {
- sAll, sFirst, sSecond, sThird
- };
-
- sal_Unicode c = rTxt.GetChar( nEndPos - 3 );
- if( ( c -= '0' ) > 3 )
- c = 0;
-
- bChg = ( ((sal_Unicode)*((aNumberTab[ c ])+0)) ==
- rTxt.GetChar( nEndPos - 2 ) &&
- ((sal_Unicode)*((aNumberTab[ c ])+1)) ==
- rTxt.GetChar( nEndPos - 1 )) ||
- ( 3 < nEndPos - nSttPos &&
- ( ((sal_Unicode)*(sAll+0)) == rTxt.GetChar( nEndPos - 2 ) &&
- ((sal_Unicode)*(sAll+1)) == rTxt.GetChar( nEndPos - 1 )));
-
- if( bChg )
- {
- // dann pruefe mal, ob alle bis zum Start alle Zahlen sind
- for( xub_StrLen n = nEndPos - 3; nSttPos < n; )
- if( !rCC.isDigit( rTxt, --n ) )
- {
- bChg = !rCC.isLetter( rTxt, n );
- break;
- }
-
- if( bChg ) // dann setze mal das Escapement Attribut
- {
- SvxEscapementItem aSvxEscapementItem( DFLT_ESC_AUTO_SUPER,
- DFLT_ESC_PROP, SID_ATTR_CHAR_ESCAPEMENT );
- rDoc.SetAttr( nEndPos - 2, nEndPos,
- SID_ATTR_CHAR_ESCAPEMENT,
- aSvxEscapementItem);
- }
- }
-
- }
- return bChg;
-}
-
-
-BOOL SvxAutoCorrect::FnChgToEnEmDash(
- SvxAutoCorrDoc& rDoc, const String& rTxt,
- xub_StrLen nSttPos, xub_StrLen nEndPos,
- LanguageType eLang )
-{
- BOOL bRet = FALSE;
- CharClass& rCC = GetCharClass( eLang );
- if (eLang == LANGUAGE_SYSTEM)
- eLang = GetAppLang();
- bool bAlwaysUseEmDash = (cEmDash && (eLang == LANGUAGE_RUSSIAN || eLang == LANGUAGE_UKRAINIAN));
-
- // ersetze " - " oder " --" durch "enDash"
- if( cEnDash && 1 < nSttPos && 1 <= nEndPos - nSttPos )
- {
- sal_Unicode cCh = rTxt.GetChar( nSttPos );
- if( '-' == cCh )
- {
- if( ' ' == rTxt.GetChar( nSttPos-1 ) &&
- '-' == rTxt.GetChar( nSttPos+1 ))
- {
- xub_StrLen n;
- for( n = nSttPos+2; n < nEndPos && lcl_IsInAsciiArr(
- sImplSttSkipChars,(cCh = rTxt.GetChar( n )));
- ++n )
- ;
-
- // found: " --[<AnySttChars>][A-z0-9]
- if( rCC.isLetterNumeric( cCh ) )
- {
- for( n = nSttPos-1; n && lcl_IsInAsciiArr(
- sImplEndSkipChars,(cCh = rTxt.GetChar( --n ))); )
- ;
-
- // found: "[A-z0-9][<AnyEndChars>] --[<AnySttChars>][A-z0-9]
- if( rCC.isLetterNumeric( cCh ))
- {
- rDoc.Delete( nSttPos, nSttPos + 2 );
- rDoc.Insert( nSttPos, bAlwaysUseEmDash ? cEmDash : cEnDash );
- bRet = TRUE;
- }
- }
- }
- }
- else if( 3 < nSttPos &&
- ' ' == rTxt.GetChar( nSttPos-1 ) &&
- '-' == rTxt.GetChar( nSttPos-2 ))
- {
- xub_StrLen n, nLen = 1, nTmpPos = nSttPos - 2;
- if( '-' == ( cCh = rTxt.GetChar( nTmpPos-1 )) )
- {
- --nTmpPos;
- ++nLen;
- cCh = rTxt.GetChar( nTmpPos-1 );
- }
- if( ' ' == cCh )
- {
- for( n = nSttPos; n < nEndPos && lcl_IsInAsciiArr(
- sImplSttSkipChars,(cCh = rTxt.GetChar( n )));
- ++n )
- ;
-
- // found: " - [<AnySttChars>][A-z0-9]
- if( rCC.isLetterNumeric( cCh ) )
- {
- cCh = ' ';
- for( n = nTmpPos-1; n && lcl_IsInAsciiArr(
- sImplEndSkipChars,(cCh = rTxt.GetChar( --n ))); )
- ;
- // found: "[A-z0-9][<AnyEndChars>] - [<AnySttChars>][A-z0-9]
- if( rCC.isLetterNumeric( cCh ))
- {
- rDoc.Delete( nTmpPos, nTmpPos + nLen );
- rDoc.Insert( nTmpPos, bAlwaysUseEmDash ? cEmDash : cEnDash );
- bRet = TRUE;
- }
- }
- }
- }
- }
-
- // Replace [A-z0-9]--[A-z0-9] double dash with "emDash" or "enDash".
- // Finnish and Hungarian use enDash instead of emDash.
- bool bEnDash = (eLang == LANGUAGE_HUNGARIAN || eLang == LANGUAGE_FINNISH);
- if( ((cEmDash && !bEnDash) || (cEnDash && bEnDash)) && 4 <= nEndPos - nSttPos )
- {
- String sTmp( rTxt.Copy( nSttPos, nEndPos - nSttPos ) );
- xub_StrLen nFndPos = sTmp.SearchAscii( "--" );
- if( STRING_NOTFOUND != nFndPos && nFndPos &&
- nFndPos + 2 < sTmp.Len() &&
- ( rCC.isLetterNumeric( sTmp, nFndPos - 1 ) ||
- lcl_IsInAsciiArr( sImplEndSkipChars, rTxt.GetChar( nFndPos - 1 ) )) &&
- ( rCC.isLetterNumeric( sTmp, nFndPos + 2 ) ||
- lcl_IsInAsciiArr( sImplSttSkipChars, rTxt.GetChar( nFndPos + 2 ) )))
- {
- nSttPos = nSttPos + nFndPos;
- rDoc.Delete( nSttPos, nSttPos + 2 );
- rDoc.Insert( nSttPos, (bEnDash ? cEnDash : cEmDash) );
- bRet = TRUE;
- }
- }
- return bRet;
-}
-
-
-BOOL SvxAutoCorrect::FnSetINetAttr( SvxAutoCorrDoc& rDoc, const String& rTxt,
- xub_StrLen nSttPos, xub_StrLen nEndPos,
- LanguageType eLang )
-{
- String sURL( URIHelper::FindFirstURLInText( rTxt, nSttPos, nEndPos,
- GetCharClass( eLang ) ));
- BOOL bRet = 0 != sURL.Len();
- if( bRet ) // also Attribut setzen:
- rDoc.SetINetAttr( nSttPos, nEndPos, sURL );
- return bRet;
-}
-
-
-BOOL SvxAutoCorrect::FnChgWeightUnderl( SvxAutoCorrDoc& rDoc, const String& rTxt,
- xub_StrLen, xub_StrLen nEndPos,
- LanguageType eLang )
-{
- // Bedingung:
- // Am Anfang: _ oder * hinter Space mit nachfolgenden !Space
- // Am Ende: _ oder * vor Space (Worttrenner?)
-
- sal_Unicode c, cInsChar = rTxt.GetChar( nEndPos ); // unterstreichen oder fett
- if( ++nEndPos != rTxt.Len() &&
- !IsWordDelim( rTxt.GetChar( nEndPos ) ) )
- return FALSE;
-
- --nEndPos;
-
- BOOL bAlphaNum = FALSE;
- xub_StrLen nPos = nEndPos, nFndPos = STRING_NOTFOUND;
- CharClass& rCC = GetCharClass( eLang );
-
- while( nPos )
- {
- switch( c = rTxt.GetChar( --nPos ) )
- {
- case '_':
- case '*':
- if( c == cInsChar )
- {
- if( bAlphaNum && nPos+1 < nEndPos && ( !nPos ||
- IsWordDelim( rTxt.GetChar( nPos-1 ))) &&
- !IsWordDelim( rTxt.GetChar( nPos+1 )))
- nFndPos = nPos;
- else
- // Bedingung ist nicht erfuellt, also abbrechen
- nFndPos = STRING_NOTFOUND;
- nPos = 0;
- }
- break;
- default:
- if( !bAlphaNum )
- bAlphaNum = rCC.isLetterNumeric( rTxt, nPos );
- }
- }
-
- if( STRING_NOTFOUND != nFndPos )
- {
- // ueber den gefundenen Bereich das Attribut aufspannen und
- // das gefunde und am Ende stehende Zeichen loeschen
- if( '*' == cInsChar ) // Fett
- {
- SvxWeightItem aSvxWeightItem( WEIGHT_BOLD, SID_ATTR_CHAR_WEIGHT );
- rDoc.SetAttr( nFndPos + 1, nEndPos,
- SID_ATTR_CHAR_WEIGHT,
- aSvxWeightItem);
- }
- else // unterstrichen
- {
- SvxUnderlineItem aSvxUnderlineItem( UNDERLINE_SINGLE, SID_ATTR_CHAR_UNDERLINE );
- rDoc.SetAttr( nFndPos + 1, nEndPos,
- SID_ATTR_CHAR_UNDERLINE,
- aSvxUnderlineItem);
- }
- rDoc.Delete( nEndPos, nEndPos + 1 );
- rDoc.Delete( nFndPos, nFndPos + 1 );
- }
-
- return STRING_NOTFOUND != nFndPos;
-}
-
-
-BOOL SvxAutoCorrect::FnCptlSttSntnc( SvxAutoCorrDoc& rDoc,
- const String& rTxt, BOOL bNormalPos,
- xub_StrLen nSttPos, xub_StrLen nEndPos,
- LanguageType eLang )
-{
- // Grossbuchstabe am Satz-Anfang ??
- if( !rTxt.Len() || nEndPos <= nSttPos )
- return FALSE;
-
- CharClass& rCC = GetCharClass( eLang );
- String aText( rTxt );
- const sal_Unicode *pStart = aText.GetBuffer(),
- *pStr = pStart + nEndPos,
- *pWordStt = 0,
- *pDelim = 0;
-
- BOOL bAtStart = FALSE, bPrevPara = FALSE;
- do {
- --pStr;
- if( rCC.isLetter(
- aText, sal::static_int_cast< xub_StrLen >( pStr - pStart ) ) )
- {
- if( !pWordStt )
- pDelim = pStr+1;
- pWordStt = pStr;
- }
- else if( pWordStt &&
- !rCC.isDigit(
- aText,
- sal::static_int_cast< xub_StrLen >( pStr - pStart ) ) )
- {
- if( lcl_IsInAsciiArr( sImplWordChars, *pStr ) &&
- pWordStt - 1 == pStr &&
- // --> FME 2005-02-14 #i38971#
- // l'intallazione at beginning of paragraph. Replaced < by <=
- (long)(pStart + 1) <= (long)pStr &&
- // <--
- rCC.isLetter(
- aText,
- sal::static_int_cast< xub_StrLen >( pStr-1 - pStart ) ) )
- pWordStt = --pStr;
- else
- break;
- }
- } while( 0 == ( bAtStart = (pStart == pStr)) );
-
-
- if( !pWordStt ||
- rCC.isDigit(
- aText, sal::static_int_cast< xub_StrLen >( pStr - pStart ) ) ||
- IsUpperLetter(
- rCC.getCharacterType(
- aText,
- sal::static_int_cast< xub_StrLen >( pWordStt - pStart ) ) ) ||
- 0x1 == *pWordStt || 0x2 == *pWordStt )
- return FALSE; // kein zu ersetzendes Zeichen, oder schon ok
-
- // JP 27.10.97: wenn das Wort weniger als 3 Zeichen hat und der Trenner
- // ein "Num"-Trenner ist, dann nicht ersetzen!
- // Damit wird ein "a.", "a)", "a-a" nicht ersetzt!
- if( *pDelim && 2 >= pDelim - pWordStt &&
- lcl_IsInAsciiArr( ".-)>", *pDelim ) )
- return FALSE;
-
- if( !bAtStart ) // noch kein Absatz Anfang ?
- {
- if ( IsWordDelim( *pStr ) )
- {
- while( 0 == ( bAtStart = (pStart == pStr--) ) && IsWordDelim( *pStr ))
- ;
- }
- // Asian full stop, full width full stop, full width exclamation mark
- // and full width question marks are treated as word delimiters
- else if ( 0x3002 != *pStr && 0xFF0E != *pStr && 0xFF01 != *pStr &&
- 0xFF1F != *pStr )
- return FALSE; // kein gueltiger Trenner -> keine Ersetzung
- }
-
- if( bAtStart ) // am Absatz Anfang ?
- {
- // Ueberpruefe den vorherigen Absatz, wenn es diesen gibt.
- // Wenn ja, dann pruefe auf SatzTrenner am Ende.
- const String* pPrevPara = rDoc.GetPrevPara( bNormalPos );
- if( !pPrevPara )
- {
- // gueltiger Trenner -> Ersetze
- String sChar( *pWordStt );
- rCC.toUpper( sChar );
- return sChar != *pWordStt &&
- rDoc.Replace( xub_StrLen( pWordStt - pStart ), sChar );
- }
-
- aText = *pPrevPara;
- bPrevPara = TRUE;
- bAtStart = FALSE;
- pStart = aText.GetBuffer();
- pStr = pStart + aText.Len();
-
- do { // alle Blanks ueberlesen
- --pStr;
- if( !IsWordDelim( *pStr ))
- break;
- } while( 0 == ( bAtStart = (pStart == pStr)) );
-
- if( bAtStart )
- return FALSE; // kein gueltiger Trenner -> keine Ersetzung
- }
-
- // bis hierhier wurde [ \t]+[A-Z0-9]+ gefunden. Test jetzt auf den
- // Satztrenner. Es koennen alle 3 vorkommen, aber nicht mehrfach !!
- const sal_Unicode* pExceptStt = 0;
- if( !bAtStart )
- {
- BOOL bWeiter = TRUE;
- int nFlag = C_NONE;
- do {
- switch( *pStr )
- {
- // Western and Asian full stop
- case '.':
- case 0x3002 :
- case 0xFF0E :
- {
- if( nFlag & C_FULL_STOP )
- return FALSE; // kein gueltiger Trenner -> keine Ersetzung
- nFlag |= C_FULL_STOP;
- pExceptStt = pStr;
- }
- break;
- case '!':
- case 0xFF01 :
- {
- if( nFlag & C_EXCLAMATION_MARK )
- return FALSE; // kein gueltiger Trenner -> keine Ersetzung
- nFlag |= C_EXCLAMATION_MARK;
- }
- break;
- case '?':
- case 0xFF1F :
- {
- if( nFlag & C_QUESTION_MARK)
- return FALSE; // kein gueltiger Trenner -> keine Ersetzung
- nFlag |= C_QUESTION_MARK;
- }
- break;
- default:
- if( !nFlag )
- return FALSE; // kein gueltiger Trenner -> keine Ersetzung
- else
- bWeiter = FALSE;
- break;
- }
-
- if( bWeiter && pStr-- == pStart )
- {
-// !!! wenn am Anfang, dann nie ersetzen.
-// if( !nFlag )
- return FALSE; // kein gueltiger Trenner -> keine Ersetzung
-// ++pStr;
-// break; // Schleife beenden
- }
- } while( bWeiter );
- if( C_FULL_STOP != nFlag )
- pExceptStt = 0;
- }
-
- if( 2 > ( pStr - pStart ) )
- return FALSE;
-
- if( !rCC.isLetterNumeric(
- aText, sal::static_int_cast< xub_StrLen >( pStr-- - pStart ) ) )
- {
- BOOL bValid = FALSE, bAlphaFnd = FALSE;
- const sal_Unicode* pTmpStr = pStr;
- while( !bValid )
- {
- if( rCC.isDigit(
- aText,
- sal::static_int_cast< xub_StrLen >( pTmpStr - pStart ) ) )
- {
- bValid = TRUE;
- pStr = pTmpStr - 1;
- }
- else if( rCC.isLetter(
- aText,
- sal::static_int_cast< xub_StrLen >(
- pTmpStr - pStart ) ) )
- {
- if( bAlphaFnd )
- {
- bValid = TRUE;
- pStr = pTmpStr;
- }
- else
- bAlphaFnd = TRUE;
- }
- else if( bAlphaFnd || IsWordDelim( *pTmpStr ) )
- break;
-
- if( pTmpStr == pStart )
- break;
-
- --pTmpStr;
- }
-
- if( !bValid )
- return FALSE; // kein gueltiger Trenner -> keine Ersetzung
- }
-
- BOOL bNumericOnly = '0' <= *(pStr+1) && *(pStr+1) <= '9';
-
- // suche den Anfang vom Wort
- while( !IsWordDelim( *pStr ))
- {
- if( bNumericOnly &&
- rCC.isLetter(
- aText, sal::static_int_cast< xub_StrLen >( pStr - pStart ) ) )
- bNumericOnly = FALSE;
-
- if( pStart == pStr )
- break;
-
- --pStr;
- }
-
- if( bNumericOnly ) // besteht nur aus Zahlen, dann nicht
- return FALSE;
-
- if( IsWordDelim( *pStr ))
- ++pStr;
-
- String sWord;
-
- // ueberpruefe anhand der Exceptionliste
- if( pExceptStt )
- {
- sWord = String(
- pStr, sal::static_int_cast< xub_StrLen >( pExceptStt - pStr + 1 ) );
- if( FindInCplSttExceptList(eLang, sWord) )
- return FALSE;
-
- // loesche alle nicht alpanum. Zeichen am Wortanfang/-ende und
- // teste dann noch mal ( erkennt: "(min.", "/min.", usw.)
- String sTmp( sWord );
- while( sTmp.Len() &&
- !rCC.isLetterNumeric( sTmp, 0 ) )
- sTmp.Erase( 0, 1 );
-
- // alle hinteren nicht alphanumerische Zeichen bis auf das
- // Letzte entfernen
- xub_StrLen nLen = sTmp.Len();
- while( nLen && !rCC.isLetterNumeric( sTmp, nLen-1 ) )
- --nLen;
- if( nLen + 1 < sTmp.Len() )
- sTmp.Erase( nLen + 1 );
-
- if( sTmp.Len() && sTmp.Len() != sWord.Len() &&
- FindInCplSttExceptList(eLang, sTmp))
- return FALSE;
-
- if(FindInCplSttExceptList(eLang, sWord, TRUE))
- return FALSE;
- }
-
- // Ok, dann ersetze mal
- sal_Unicode cSave = *pWordStt;
- nSttPos = sal::static_int_cast< xub_StrLen >( pWordStt - rTxt.GetBuffer() );
- String sChar( cSave );
- rCC.toUpper( sChar );
- BOOL bRet = sChar.GetChar(0) != cSave && rDoc.Replace( nSttPos, sChar );
-
- // das Wort will vielleicht jemand haben
- if( bRet && SaveWordCplSttLst & nFlags )
- rDoc.SaveCpltSttWord( CptlSttSntnc, nSttPos, sWord, cSave );
-
- return bRet;
-}
-//The method below is renamed from _GetQuote to GetQuote by BerryJia for Bug95846 Time:2002-8-13 15:50
-sal_Unicode SvxAutoCorrect::GetQuote( sal_Unicode cInsChar, BOOL bSttQuote,
- LanguageType eLang ) const
-{
- sal_Unicode cRet = bSttQuote ? ( '\"' == cInsChar
- ? GetStartDoubleQuote()
- : GetStartSingleQuote() )
- : ( '\"' == cInsChar
- ? GetEndDoubleQuote()
- : GetEndSingleQuote() );
- if( !cRet )
- {
- // dann ueber die Language das richtige Zeichen heraussuchen
- if( LANGUAGE_NONE == eLang )
- cRet = cInsChar;
- else
- {
- LocaleDataWrapper& rLcl = GetLocaleDataWrapper( eLang );
- String sRet( bSttQuote
- ? ( '\"' == cInsChar
- ? rLcl.getDoubleQuotationMarkStart()
- : rLcl.getQuotationMarkStart() )
- : ( '\"' == cInsChar
- ? rLcl.getDoubleQuotationMarkEnd()
- : rLcl.getQuotationMarkEnd() ));
- cRet = sRet.Len() ? sRet.GetChar( 0 ) : cInsChar;
- }
- }
- return cRet;
-}
-
-void SvxAutoCorrect::InsertQuote( SvxAutoCorrDoc& rDoc, xub_StrLen nInsPos,
- sal_Unicode cInsChar, BOOL bSttQuote,
- BOOL bIns )
-{
- LanguageType eLang = rDoc.GetLanguage( nInsPos, FALSE );
- sal_Unicode cRet = GetQuote( cInsChar, bSttQuote, eLang );
-
- //JP 13.02.99: damit beim Undo das "einfuegte" Zeichen wieder erscheint,
- // wird es erstmal eingefuegt und dann ueberschrieben
- String sChg( cInsChar );
- if( bIns )
- rDoc.Insert( nInsPos, sChg );
- else
- rDoc.Replace( nInsPos, sChg );
-
- //JP 13.08.97: Bug 42477 - bei doppelten Anfuehrungszeichen muss bei
- // franzoesischer Sprache an Anfang ein Leerzeichen dahinter
- // und am Ende ein Leerzeichen dahinter eingefuegt werden.
- sChg = cRet;
-
- if( '\"' == cInsChar )
- {
- if( LANGUAGE_SYSTEM == eLang )
- eLang = GetAppLang();
- switch( eLang )
- {
- case LANGUAGE_FRENCH:
- case LANGUAGE_FRENCH_BELGIAN:
- case LANGUAGE_FRENCH_CANADIAN:
- case LANGUAGE_FRENCH_SWISS:
- case LANGUAGE_FRENCH_LUXEMBOURG:
- // JP 09.02.99: das zusaetzliche Zeichen immer per Insert einfuegen.
- // Es ueberschreibt nichts!
- {
- String s( static_cast< sal_Unicode >(0xA0) );
- // UNICODE code for no break space
- if( rDoc.Insert( bSttQuote ? nInsPos+1 : nInsPos, s ))
- {
- if( !bSttQuote )
- ++nInsPos;
- }
- }
- break;
- }
- }
-
- rDoc.Replace( nInsPos, sChg );
-}
-
-String SvxAutoCorrect::GetQuote( SvxAutoCorrDoc& rDoc, xub_StrLen nInsPos,
- sal_Unicode cInsChar, BOOL bSttQuote )
-{
- LanguageType eLang = rDoc.GetLanguage( nInsPos, FALSE );
- sal_Unicode cRet = GetQuote( cInsChar, bSttQuote, eLang );
-
- String sRet( cRet );
- //JP 13.08.97: Bug 42477 - bei doppelten Anfuehrungszeichen muss bei
- // franzoesischer Sprache an Anfang ein Leerzeichen dahinter
- // und am Ende ein Leerzeichen dahinter eingefuegt werden.
- if( '\"' == cInsChar )
- {
- if( LANGUAGE_SYSTEM == eLang )
- eLang = GetAppLang();
- switch( eLang )
- {
- case LANGUAGE_FRENCH:
- case LANGUAGE_FRENCH_BELGIAN:
- case LANGUAGE_FRENCH_CANADIAN:
- case LANGUAGE_FRENCH_SWISS:
- case LANGUAGE_FRENCH_LUXEMBOURG:
- if( bSttQuote )
- sRet += ' ';
- else
- sRet.Insert( ' ', 0 );
- break;
- }
- }
- return sRet;
-}
-
-ULONG SvxAutoCorrect::AutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
- xub_StrLen nInsPos, sal_Unicode cChar,
- BOOL bInsert )
-{
- ULONG nRet = 0;
- do{ // only for middle check loop !!
- if( cChar )
- {
- //JP 10.02.97: doppelte Spaces verhindern
- if( nInsPos && ' ' == cChar &&
- IsAutoCorrFlag( IngnoreDoubleSpace ) &&
- ' ' == rTxt.GetChar( nInsPos - 1 ) )
- {
- nRet = IngnoreDoubleSpace;
- break;
- }
-
- BOOL bSingle = '\'' == cChar;
- BOOL bIsReplaceQuote =
- (IsAutoCorrFlag( ChgQuotes ) && ('\"' == cChar )) ||
- (IsAutoCorrFlag( ChgSglQuotes ) && bSingle );
- if( bIsReplaceQuote )
- {
- sal_Unicode cPrev;
- BOOL bSttQuote = !nInsPos ||
- IsWordDelim( ( cPrev = rTxt.GetChar( nInsPos-1 ))) ||
-// os: #56034# - Warum kein schliessendes Anfuehrungszeichen nach dem Bindestrich?
-// strchr( "-([{", cPrev ) ||
- lcl_IsInAsciiArr( "([{", cPrev ) ||
- ( cEmDash && cEmDash == cPrev ) ||
- ( cEnDash && cEnDash == cPrev );
-
- InsertQuote( rDoc, nInsPos, cChar, bSttQuote, bInsert );
- nRet = bSingle ? ChgSglQuotes : ChgQuotes;
- break;
- }
-
- if( bInsert )
- rDoc.Insert( nInsPos, cChar );
- else
- rDoc.Replace( nInsPos, cChar );
- }
-
- if( !nInsPos )
- break;
-
- xub_StrLen nPos = nInsPos - 1;
-
- // Bug 19286: nur direkt hinter dem "Wort" aufsetzen
- if( IsWordDelim( rTxt.GetChar( nPos )))
- break;
-
- // automatisches Fett oder Unterstreichen setzen?
- if( '*' == cChar || '_' == cChar )
- {
- if( IsAutoCorrFlag( ChgWeightUnderl ) &&
- FnChgWeightUnderl( rDoc, rTxt, 0, nPos+1 ) )
- nRet = ChgWeightUnderl;
- break;
- }
-
- while( nPos && !IsWordDelim( rTxt.GetChar( --nPos )))
- ;
-
- // Absatz-Anfang oder ein Blank gefunden, suche nach dem Wort
- // Kuerzel im Auto
- xub_StrLen nCapLttrPos = nPos+1; // auf das 1. Zeichen
- if( !nPos && !IsWordDelim( rTxt.GetChar( 0 )))
- --nCapLttrPos; // Absatz Anfang und kein Blank !
-
- LanguageType eLang = rDoc.GetLanguage( nCapLttrPos, FALSE );
- if( LANGUAGE_SYSTEM == eLang )
- eLang = MsLangId::getSystemLanguage();
- CharClass& rCC = GetCharClass( eLang );
-
- // Bug 19285: Symbolzeichen nicht anfassen
- if( lcl_IsSymbolChar( rCC, rTxt, nCapLttrPos, nInsPos ))
- break;
-
- if( IsAutoCorrFlag( Autocorrect ) )
- {
- const String* pPara = 0;
- const String** ppPara = IsAutoCorrFlag(CptlSttSntnc) ? &pPara : 0;
-
- BOOL bChgWord = rDoc.ChgAutoCorrWord( nCapLttrPos, nInsPos,
- *this, ppPara );
- if( !bChgWord )
- {
- // JP 16.06.98: dann versuche mal alle !AlphaNum. Zeichen los zu
- // werden und teste dann nochmals
- //JP 22.04.99: Bug 63883 - entferne nur die "Klammern Start/-Anfaenge",
- // alle anderen Zeichen muessen drin bleiben.
- xub_StrLen nCapLttrPos1 = nCapLttrPos, nInsPos1 = nInsPos;
- while( nCapLttrPos1 < nInsPos &&
- lcl_IsInAsciiArr( sImplSttSkipChars, rTxt.GetChar( nCapLttrPos1 ) )
- )
- ++nCapLttrPos1;
- while( nCapLttrPos1 < nInsPos1 && nInsPos1 &&
- lcl_IsInAsciiArr( sImplEndSkipChars, rTxt.GetChar( nInsPos1-1 ) )
- )
- --nInsPos1;
-
- if( (nCapLttrPos1 != nCapLttrPos || nInsPos1 != nInsPos ) &&
- nCapLttrPos1 < nInsPos1 &&
- rDoc.ChgAutoCorrWord( nCapLttrPos1, nInsPos1, *this, ppPara ))
- {
- bChgWord = TRUE;
- nCapLttrPos = nCapLttrPos1;
- }
- }
-
- if( bChgWord )
- {
- nRet = Autocorrect;
- if( pPara )
- {
- xub_StrLen nEnd = nCapLttrPos;
- while( nEnd < pPara->Len() &&
- !IsWordDelim( pPara->GetChar( nEnd )))
- ++nEnd;
-
- // Grossbuchstabe am Satz-Anfang ??
- if( IsAutoCorrFlag( CptlSttSntnc ) &&
- FnCptlSttSntnc( rDoc, *pPara, FALSE,
- nCapLttrPos, nEnd, eLang ) )
- nRet |= CptlSttSntnc;
-
- if( IsAutoCorrFlag( ChgToEnEmDash ) &&
- FnChgToEnEmDash( rDoc, rTxt, nCapLttrPos, nEnd, eLang ) )
- nRet |= ChgToEnEmDash;
- }
- break;
- }
- }
-
- if( ( IsAutoCorrFlag( nRet = ChgFractionSymbol ) &&
- FnChgFractionSymbol( rDoc, rTxt, nCapLttrPos, nInsPos ) ) ||
- ( IsAutoCorrFlag( nRet = ChgOrdinalNumber ) &&
- FnChgOrdinalNumber( rDoc, rTxt, nCapLttrPos, nInsPos, eLang ) ) ||
- ( IsAutoCorrFlag( nRet = SetINetAttr ) &&
- ( ' ' == cChar || '\t' == cChar || 0x0a == cChar || !cChar ) &&
- FnSetINetAttr( rDoc, rTxt, nCapLttrPos, nInsPos, eLang ) ) )
- ;
- else
- {
- nRet = 0;
- // Grossbuchstabe am Satz-Anfang ??
- if( IsAutoCorrFlag( CptlSttSntnc ) &&
- FnCptlSttSntnc( rDoc, rTxt, TRUE, nCapLttrPos, nInsPos, eLang ) )
- nRet |= CptlSttSntnc;
-
- // Zwei Grossbuchstaben am Wort-Anfang ??
- if( IsAutoCorrFlag( CptlSttWrd ) &&
- FnCptlSttWrd( rDoc, rTxt, nCapLttrPos, nInsPos, eLang ) )
- nRet |= CptlSttWrd;
-
- if( IsAutoCorrFlag( ChgToEnEmDash ) &&
- FnChgToEnEmDash( rDoc, rTxt, nCapLttrPos, nInsPos, eLang ) )
- nRet |= ChgToEnEmDash;
- }
-
- } while( FALSE );
-
- SfxViewFrame* pVFrame;
- if( nRet && 0 != (pVFrame = SfxViewFrame::Current()) &&
- pVFrame->GetFrame() )
- {
- ULONG nHelpId = 0;
- if( nRet & ( Autocorrect|CptlSttSntnc|CptlSttWrd|ChgToEnEmDash ) )
- {
- // von 0 - 15
- if( nRet & ChgToEnEmDash )
- nHelpId += 8;
- if( nRet & Autocorrect )
- nHelpId += 4;
- if( nRet & CptlSttSntnc )
- nHelpId += 2;
- if( nRet & CptlSttWrd )
- nHelpId += 1;
- }
- else
- {
- if( nRet & ChgQuotes) nHelpId = 16;
- else if( nRet & ChgSglQuotes) nHelpId = 17;
- else if( nRet & SetINetAttr) nHelpId = 18;
- else if( nRet & IngnoreDoubleSpace) nHelpId = 19;
- else if( nRet & ChgWeightUnderl) nHelpId = 20;
- else if( nRet & ChgFractionSymbol ) nHelpId = 21;
- else if( nRet & ChgOrdinalNumber) nHelpId = 22;
- }
-
- if( nHelpId )
- {
- nHelpId += HID_AUTOCORR_HELP_START - 1;
- SfxHelp::OpenHelpAgent( pVFrame->GetFrame(), nHelpId );
- }
- }
-
-
- return nRet;
-}
-
-SvxAutoCorrectLanguageLists& SvxAutoCorrect::_GetLanguageList(
- LanguageType eLang )
-{
- if( !pLangTable->IsKeyValid( ULONG( eLang )))
- CreateLanguageFile( eLang, TRUE);
- return *pLangTable->Seek( ULONG( eLang ) );
-}
-
-void SvxAutoCorrect::SaveCplSttExceptList( LanguageType eLang )
-{
- if( pLangTable->IsKeyValid( ULONG( eLang )))
- {
- SvxAutoCorrectLanguageListsPtr pLists = pLangTable->Seek(ULONG(eLang));
- if( pLists )
- pLists->SaveCplSttExceptList();
- }
-#ifdef DBG_UTIL
- else
- {
- DBG_ERROR("speichern einer leeren Liste?");
- }
-#endif
-}
-
-void SvxAutoCorrect::SaveWrdSttExceptList(LanguageType eLang)
-{
- if(pLangTable->IsKeyValid(ULONG(eLang)))
- {
- SvxAutoCorrectLanguageListsPtr pLists = pLangTable->Seek(ULONG(eLang));
- if(pLists)
- pLists->SaveWrdSttExceptList();
- }
-#ifdef DBG_UTIL
- else
- {
- DBG_ERROR("speichern einer leeren Liste?");
- }
-#endif
-}
-
-
- // fuegt ein einzelnes Wort hinzu. Die Liste wird sofort
- // in die Datei geschrieben!
-BOOL SvxAutoCorrect::AddCplSttException( const String& rNew,
- LanguageType eLang )
-{
- SvxAutoCorrectLanguageListsPtr pLists = 0;
- //entweder die richtige Sprache ist vorhanden oder es kommt in die allg. Liste
- if( pLangTable->IsKeyValid(ULONG(eLang)))
- pLists = pLangTable->Seek(ULONG(eLang));
- else if(pLangTable->IsKeyValid(ULONG(LANGUAGE_DONTKNOW))||
- CreateLanguageFile(LANGUAGE_DONTKNOW, TRUE))
- {
- pLists = pLangTable->Seek(ULONG(LANGUAGE_DONTKNOW));
- }
- DBG_ASSERT(pLists, "keine Autokorrekturdatei");
- return pLists->AddToCplSttExceptList(rNew);
-}
-
-
- // fuegt ein einzelnes Wort hinzu. Die Liste wird sofort
- // in die Datei geschrieben!
-BOOL SvxAutoCorrect::AddWrtSttException( const String& rNew,
- LanguageType eLang )
-{
- SvxAutoCorrectLanguageListsPtr pLists = 0;
- //entweder die richtige Sprache ist vorhanden oder es kommt in die allg. Liste
- if(pLangTable->IsKeyValid(ULONG(eLang)))
- pLists = pLangTable->Seek(ULONG(eLang));
- else if(pLangTable->IsKeyValid(ULONG(LANGUAGE_DONTKNOW))||
- CreateLanguageFile(LANGUAGE_DONTKNOW, TRUE))
- pLists = pLangTable->Seek(ULONG(LANGUAGE_DONTKNOW));
- DBG_ASSERT(pLists, "keine Autokorrekturdatei");
- return pLists->AddToWrdSttExceptList(rNew);
-}
-
-
-
-
-void SvxAutoCorrect::SetUserAutoCorrFileName( const String& rNew )
-{
- if( sUserAutoCorrFile != rNew )
- {
- sUserAutoCorrFile = rNew;
-
- // sind die Listen gesetzt sind, so muessen sie jetzt geloescht
- // werden
- lcl_ClearTable(*pLangTable);
- nFlags &= ~(CplSttLstLoad | WrdSttLstLoad | ChgWordLstLoad );
- }
-}
-
-void SvxAutoCorrect::SetShareAutoCorrFileName( const String& rNew )
-{
- if( sShareAutoCorrFile != rNew )
- {
- sShareAutoCorrFile = rNew;
-
- // sind die Listen gesetzt sind, so muessen sie jetzt geloescht
- // werden
- lcl_ClearTable(*pLangTable);
- nFlags &= ~(CplSttLstLoad | WrdSttLstLoad | ChgWordLstLoad );
- }
-}
-
-
-BOOL SvxAutoCorrect::GetPrevAutoCorrWord( SvxAutoCorrDoc& rDoc,
- const String& rTxt, xub_StrLen nPos,
- String& rWord ) const
-{
- if( !nPos )
- return FALSE;
-
- xub_StrLen nEnde = nPos;
-
- // dahinter muss ein Blank oder Tab folgen!
- if( ( nPos < rTxt.Len() &&
- !IsWordDelim( rTxt.GetChar( nPos ))) ||
- IsWordDelim( rTxt.GetChar( --nPos )))
- return FALSE;
-
- while( nPos && !IsWordDelim( rTxt.GetChar( --nPos )))
- ;
-
- // Absatz-Anfang oder ein Blank gefunden, suche nach dem Wort
- // Kuerzel im Auto
- xub_StrLen nCapLttrPos = nPos+1; // auf das 1. Zeichen
- if( !nPos && !IsWordDelim( rTxt.GetChar( 0 )))
- --nCapLttrPos; // Absatz Anfang und kein Blank !
-
- while( lcl_IsInAsciiArr( sImplSttSkipChars, rTxt.GetChar( nCapLttrPos )) )
- if( ++nCapLttrPos >= nEnde )
- return FALSE;
-
- // Bug 19285: Symbolzeichen nicht anfassen
- // Interresant erst ab 3 Zeichen
- if( 3 > nEnde - nCapLttrPos )
- return FALSE;
-
- LanguageType eLang = rDoc.GetLanguage( nCapLttrPos, FALSE );
- if( LANGUAGE_SYSTEM == eLang )
- eLang = MsLangId::getSystemLanguage();
-
- SvxAutoCorrect* pThis = (SvxAutoCorrect*)this;
- CharClass& rCC = pThis->GetCharClass( eLang );
-
- if( lcl_IsSymbolChar( rCC, rTxt, nCapLttrPos, nEnde ))
- return FALSE;
-
- rWord = rTxt.Copy( nCapLttrPos, nEnde - nCapLttrPos );
- return TRUE;
-}
-
-BOOL SvxAutoCorrect::CreateLanguageFile( LanguageType eLang, BOOL bNewFile )
-{
- DBG_ASSERT(!pLangTable->IsKeyValid(ULONG(eLang)), "Sprache ist bereits vorhanden");
-
- String sUserDirFile( GetAutoCorrFileName( eLang, TRUE, FALSE )),
- sShareDirFile( sUserDirFile );
- SvxAutoCorrectLanguageListsPtr pLists = 0;
-
- Time nMinTime( 0, 2 ), nAktTime, nLastCheckTime;
- ULONG nFndPos;
- if( TABLE_ENTRY_NOTFOUND !=
- pLastFileTable->SearchKey( ULONG( eLang ), &nFndPos ) &&
- ( nLastCheckTime.SetTime( pLastFileTable->GetObject( nFndPos )),
- nLastCheckTime < nAktTime ) &&
- ( nAktTime - nLastCheckTime ) < nMinTime )
- {
- // no need to test the file, because the last check is not older then
- // 2 minutes.
- if( bNewFile )
- {
- sShareDirFile = sUserDirFile;
- pLists = new SvxAutoCorrectLanguageLists( *this, sShareDirFile,
- sUserDirFile, eLang );
- pLangTable->Insert( ULONG(eLang), pLists );
- pLastFileTable->Remove( ULONG( eLang ) );
- }
- }
- else if( ( FStatHelper::IsDocument( sUserDirFile ) ||
- FStatHelper::IsDocument( sShareDirFile =
- GetAutoCorrFileName( eLang, FALSE, FALSE ) ) ) ||
- ( sShareDirFile = sUserDirFile, bNewFile ))
- {
- pLists = new SvxAutoCorrectLanguageLists( *this, sShareDirFile,
- sUserDirFile, eLang );
- pLangTable->Insert( ULONG(eLang), pLists );
- pLastFileTable->Remove( ULONG( eLang ) );
- }
- else if( !bNewFile )
- {
- if( !pLastFileTable->Insert( ULONG( eLang ), nAktTime.GetTime() ))
- pLastFileTable->Replace( ULONG( eLang ), nAktTime.GetTime() );
- }
- return pLists != 0;
-}
-
-BOOL SvxAutoCorrect::PutText( const String& rShort, const String& rLong,
- LanguageType eLang )
-{
- BOOL bRet = FALSE;
- if( pLangTable->IsKeyValid( ULONG(eLang)) || CreateLanguageFile(eLang) )
- bRet = pLangTable->Seek( ULONG(eLang) )->PutText(rShort, rLong);
- return bRet;
-}
-
-
- // - loesche einen Eintrag
-BOOL SvxAutoCorrect::DeleteText( const String& rShort, LanguageType eLang )
-{
- BOOL bRet = FALSE;
- if( pLangTable->IsKeyValid( ULONG( eLang )) )
- bRet = pLangTable->Seek( ULONG( eLang ))->DeleteText( rShort );
- return bRet;
-}
-
-
- // - return den Ersetzungstext (nur fuer SWG-Format, alle anderen
- // koennen aus der Wortliste herausgeholt werden!)
-BOOL SvxAutoCorrect::GetLongText( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >&, const String&, const String& , String& )
-{
- return FALSE;
-}
-
- // - Text mit Attributierung (kann nur der SWG - SWG-Format!)
-BOOL SvxAutoCorrect::PutText( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >&, const String&, const String&, SfxObjectShell&,
- String& )
-{
- return FALSE;
-}
-
-void EncryptBlockName_Imp( String& rName )
-{
- xub_StrLen nLen, nPos = 1;
- rName.Insert( '#', 0 );
- sal_Unicode* pName = rName.GetBufferAccess();
- for ( nLen = rName.Len(), ++pName; nPos < nLen; ++nPos, ++pName )
- {
- if( lcl_IsInAsciiArr( "!/:.\\", *pName ))
- *pName &= 0x0f;
- }
-}
-
-/* This code is copied from SwXMLTextBlocks::GeneratePackageName */
-void GeneratePackageName ( const String& rShort, String& rPackageName )
-{
- rPackageName = rShort;
- xub_StrLen nPos = 0;
- sal_Unicode pDelims[] = { '!', '/', ':', '.', '\\', 0 };
- ByteString sByte ( rPackageName, RTL_TEXTENCODING_UTF7);
- rPackageName = String (sByte, RTL_TEXTENCODING_ASCII_US);
- while( STRING_NOTFOUND != ( nPos = rPackageName.SearchChar( pDelims, nPos )))
- {
- rPackageName.SetChar( nPos, '_' );
- ++nPos;
- }
-}
-
-void DecryptBlockName_Imp( String& rName )
-{
- if( '#' == rName.GetChar( 0 ) )
- {
- rName.Erase( 0, 1 );
- sal_Unicode* pName = rName.GetBufferAccess();
- xub_StrLen nLen, nPos;
- for ( nLen = rName.Len(), nPos = 0; nPos < nLen; ++nPos, ++pName )
- switch( *pName )
- {
- case 0x01: *pName = '!'; break;
- case 0x0A: *pName = ':'; break;
- case 0x0C: *pName = '\\'; break;
- case 0x0E: *pName = '.'; break;
- case 0x0F: *pName = '/'; break;
- }
- }
-}
-
-
-/* -----------------18.11.98 16:00-------------------
- *
- * --------------------------------------------------*/
-const SvxAutocorrWord* lcl_SearchWordsInList(
- SvxAutoCorrectLanguageListsPtr pList, const String& rTxt,
- xub_StrLen& rStt, xub_StrLen nEndPos, SvxAutoCorrDoc& )
-{
- const SvxAutocorrWordList* pAutoCorrWordList = pList->GetAutocorrWordList();
- TransliterationWrapper& rCmp = GetIgnoreTranslWrapper();
- for( xub_StrLen nPos = 0; nPos < pAutoCorrWordList->Count(); ++nPos )
- {
- const SvxAutocorrWord* pFnd = (*pAutoCorrWordList)[ nPos ];
- const String& rChk = pFnd->GetShort();
- if( nEndPos >= rChk.Len() )
- {
- xub_StrLen nCalcStt = nEndPos - rChk.Len();
- if( ( !nCalcStt || nCalcStt == rStt ||
- ( nCalcStt < rStt &&
- IsWordDelim( rTxt.GetChar(nCalcStt - 1 ) ))) )
- {
- String sWord( rTxt.GetBuffer() + nCalcStt, rChk.Len() );
- if( rCmp.isEqual( rChk, sWord ))
- {
- rStt = nCalcStt;
- return pFnd;
- }
- }
- }
- }
- return 0;
-}
-
-
-// suche das oder die Worte in der ErsetzungsTabelle
-const SvxAutocorrWord* SvxAutoCorrect::SearchWordsInList(
- const String& rTxt, xub_StrLen& rStt, xub_StrLen nEndPos,
- SvxAutoCorrDoc& rDoc, LanguageType& rLang )
-{
- LanguageType eLang = rLang;
- const SvxAutocorrWord* pRet = 0;
- if( LANGUAGE_SYSTEM == eLang )
- eLang = MsLangId::getSystemLanguage();
-
- // zuerst nach eLang suchen, dann nach der Obersprache
- // US-Englisch -> Englisch und zuletzt in LANGUAGE_DONTKNOW
-
- if( pLangTable->IsKeyValid( ULONG( eLang ) ) ||
- CreateLanguageFile( eLang, FALSE ))
- {
- //die Sprache ist vorhanden - also her damit
- SvxAutoCorrectLanguageListsPtr pList = pLangTable->Seek(ULONG(eLang));
- pRet = lcl_SearchWordsInList( pList, rTxt, rStt, nEndPos, rDoc );
- if( pRet )
- {
- rLang = eLang;
- return pRet;
- }
- }
-
- // wenn es hier noch nicht gefunden werden konnte, dann weitersuchen
- ULONG nTmpKey1 = eLang & 0x7ff, // die Hauptsprache in vielen Faellen u.B. DE
- nTmpKey2 = eLang & 0x3ff, // sonst z.B. EN
- nTmp;
-
- if( ((nTmp = nTmpKey1) != (ULONG)eLang &&
- ( pLangTable->IsKeyValid( nTmpKey1 ) ||
- CreateLanguageFile( LanguageType( nTmpKey1 ), FALSE ) )) ||
- (( nTmp = nTmpKey2) != (ULONG)eLang &&
- ( pLangTable->IsKeyValid( nTmpKey2 ) ||
- CreateLanguageFile( LanguageType( nTmpKey2 ), FALSE ) )) )
- {
- //die Sprache ist vorhanden - also her damit
- SvxAutoCorrectLanguageListsPtr pList = pLangTable->Seek( nTmp );
- pRet = lcl_SearchWordsInList( pList, rTxt, rStt, nEndPos, rDoc);
- if( pRet )
- {
- rLang = LanguageType( nTmp );
- return pRet;
- }
- }
- if( pLangTable->IsKeyValid( ULONG( LANGUAGE_DONTKNOW ) ) ||
- CreateLanguageFile( LANGUAGE_DONTKNOW, FALSE ) )
- {
- //die Sprache ist vorhanden - also her damit
- SvxAutoCorrectLanguageListsPtr pList = pLangTable->Seek(ULONG(LANGUAGE_DONTKNOW));
- pRet = lcl_SearchWordsInList( pList, rTxt, rStt, nEndPos, rDoc);
- if( pRet )
- {
- rLang = LANGUAGE_DONTKNOW;
- return pRet;
- }
- }
- return 0;
-}
-/* -----------------18.11.98 13:46-------------------
- *
- * --------------------------------------------------*/
-BOOL SvxAutoCorrect::FindInWrdSttExceptList( LanguageType eLang,
- const String& sWord )
-{
- //zuerst nach eLang suchen, dann nach der Obersprace US-Englisch -> Englisch
- //und zuletzt in LANGUAGE_DONTKNOW
- ULONG nTmpKey1 = eLang & 0x7ff; // die Hauptsprache in vielen Faellen u.B. DE
- ULONG nTmpKey2 = eLang & 0x3ff; // sonst z.B. EN
- String sTemp(sWord);
- if( pLangTable->IsKeyValid( ULONG( eLang )) ||
- CreateLanguageFile( eLang, FALSE ) )
- {
- //die Sprache ist vorhanden - also her damit
- SvxAutoCorrectLanguageListsPtr pList = pLangTable->Seek(ULONG(eLang));
- String _sTemp(sWord);
- if(pList->GetWrdSttExceptList()->Seek_Entry(&_sTemp))
- return TRUE;
-
- }
- // wenn es hier noch nicht gefunden werden konnte, dann weitersuchen
- ULONG nTmp;
- if( ((nTmp = nTmpKey1) != (ULONG)eLang &&
- ( pLangTable->IsKeyValid( nTmpKey1 ) ||
- CreateLanguageFile( LanguageType( nTmpKey1 ), FALSE ) )) ||
- (( nTmp = nTmpKey2) != (ULONG)eLang &&
- ( pLangTable->IsKeyValid( nTmpKey2 ) ||
- CreateLanguageFile( LanguageType( nTmpKey2 ), FALSE ) )) )
- {
- //die Sprache ist vorhanden - also her damit
- SvxAutoCorrectLanguageListsPtr pList = pLangTable->Seek(nTmp);
- if(pList->GetWrdSttExceptList()->Seek_Entry(&sTemp))
- return TRUE;
- }
- if(pLangTable->IsKeyValid(ULONG(LANGUAGE_DONTKNOW))|| CreateLanguageFile(LANGUAGE_DONTKNOW, FALSE))
- {
- //die Sprache ist vorhanden - also her damit
- SvxAutoCorrectLanguageListsPtr pList = pLangTable->Seek(ULONG(LANGUAGE_DONTKNOW));
- if(pList->GetWrdSttExceptList()->Seek_Entry(&sTemp))
- return TRUE;
- }
- return FALSE;
-}
-/* -----------------18.11.98 14:28-------------------
- *
- * --------------------------------------------------*/
-BOOL lcl_FindAbbreviation( const SvStringsISortDtor* pList, const String& sWord)
-{
- String sAbk( '~' );
- USHORT nPos;
- pList->Seek_Entry( &sAbk, &nPos );
- if( nPos < pList->Count() )
- {
- String sLowerWord( sWord ); sLowerWord.ToLowerAscii();
- const String* pAbk;
- for( USHORT n = nPos;
- n < pList->Count() &&
- '~' == ( pAbk = (*pList)[ n ])->GetChar( 0 );
- ++n )
- {
- // ~ und ~. sind nicht erlaubt!
- if( 2 < pAbk->Len() && pAbk->Len() - 1 <= sWord.Len() )
- {
- String sLowerAbk( *pAbk ); sLowerAbk.ToLowerAscii();
- for( xub_StrLen i = sLowerAbk.Len(), ii = sLowerWord.Len(); i; )
- {
- if( !--i ) // stimmt ueberein
- return TRUE;
-
- if( sLowerAbk.GetChar( i ) != sLowerWord.GetChar( --ii ))
- break;
- }
- }
- }
- }
- DBG_ASSERT( !(nPos && '~' == (*pList)[ --nPos ]->GetChar( 0 ) ),
- "falsch sortierte ExeptionListe?" );
- return FALSE;
-}
-/* -----------------18.11.98 14:49-------------------
- *
- * --------------------------------------------------*/
-BOOL SvxAutoCorrect::FindInCplSttExceptList(LanguageType eLang,
- const String& sWord, BOOL bAbbreviation)
-{
- //zuerst nach eLang suchen, dann nach der Obersprace US-Englisch -> Englisch
- //und zuletzt in LANGUAGE_DONTKNOW
- ULONG nTmpKey1 = eLang & 0x7ff; // die Hauptsprache in vielen Faellen u.B. DE
- ULONG nTmpKey2 = eLang & 0x3ff; // sonst z.B. EN
- String sTemp( sWord );
- if( pLangTable->IsKeyValid( ULONG( eLang )) ||
- CreateLanguageFile( eLang, FALSE ))
- {
- //die Sprache ist vorhanden - also her damit
- SvxAutoCorrectLanguageListsPtr pLists = pLangTable->Seek(ULONG(eLang));
- const SvStringsISortDtor* pList = pLists->GetCplSttExceptList();
- if(bAbbreviation ? lcl_FindAbbreviation( pList, sWord)
- : pList->Seek_Entry( &sTemp ) )
- return TRUE;
- }
- // wenn es hier noch nicht gefunden werden konnte, dann weitersuchen
- ULONG nTmp;
-
- if( ((nTmp = nTmpKey1) != (ULONG)eLang &&
- ( pLangTable->IsKeyValid( nTmpKey1 ) ||
- CreateLanguageFile( LanguageType( nTmpKey1 ), FALSE ) )) ||
- (( nTmp = nTmpKey2) != (ULONG)eLang &&
- ( pLangTable->IsKeyValid( nTmpKey2 ) ||
- CreateLanguageFile( LanguageType( nTmpKey2 ), FALSE ) )) )
- {
- //die Sprache ist vorhanden - also her damit
- SvxAutoCorrectLanguageListsPtr pLists = pLangTable->Seek(nTmp);
- const SvStringsISortDtor* pList = pLists->GetCplSttExceptList();
- if(bAbbreviation ? lcl_FindAbbreviation( pList, sWord)
- : pList->Seek_Entry( &sTemp ) )
- return TRUE;
- }
- if(pLangTable->IsKeyValid(ULONG(LANGUAGE_DONTKNOW))|| CreateLanguageFile(LANGUAGE_DONTKNOW, FALSE))
- {
- //die Sprache ist vorhanden - also her damit
- SvxAutoCorrectLanguageListsPtr pLists = pLangTable->Seek(LANGUAGE_DONTKNOW);
- const SvStringsISortDtor* pList = pLists->GetCplSttExceptList();
- if(bAbbreviation ? lcl_FindAbbreviation( pList, sWord)
- : pList->Seek_Entry( &sTemp ) )
- return TRUE;
- }
- return FALSE;
-
-}
-
-/* -----------------20.11.98 11:53-------------------
- *
- * --------------------------------------------------*/
-String SvxAutoCorrect::GetAutoCorrFileName( LanguageType eLang,
- BOOL bNewFile, BOOL bTst ) const
-{
- String sRet, sExt( MsLangId::convertLanguageToIsoString( eLang ) );
- sExt.Insert('_', 0);
- sExt.AppendAscii( ".dat" );
- if( bNewFile )
- ( sRet = sUserAutoCorrFile ) += sExt;
- else if( !bTst )
- ( sRet = sShareAutoCorrFile ) += sExt;
- else
- {
- // test first in the user directory - if not exist, then
- ( sRet = sUserAutoCorrFile ) += sExt;
- if( !FStatHelper::IsDocument( sRet ))
- ( sRet = sShareAutoCorrFile ) += sExt;
- }
- return sRet;
-}
-
-/* -----------------18.11.98 11:16-------------------
- *
- * --------------------------------------------------*/
-SvxAutoCorrectLanguageLists::SvxAutoCorrectLanguageLists(
- SvxAutoCorrect& rParent,
- const String& rShareAutoCorrectFile,
- const String& rUserAutoCorrectFile,
- LanguageType eLang)
-: sShareAutoCorrFile( rShareAutoCorrectFile ),
- sUserAutoCorrFile( rUserAutoCorrectFile ),
- eLanguage(eLang),
- pCplStt_ExcptLst( 0 ),
- pWrdStt_ExcptLst( 0 ),
- pAutocorr_List( 0 ),
- rAutoCorrect(rParent),
- nFlags(0)
-{
-}
-
-/* -----------------18.11.98 11:16-------------------
- *
- * --------------------------------------------------*/
-SvxAutoCorrectLanguageLists::~SvxAutoCorrectLanguageLists()
-{
- delete pCplStt_ExcptLst;
- delete pWrdStt_ExcptLst;
- delete pAutocorr_List;
-}
-
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-BOOL SvxAutoCorrectLanguageLists::IsFileChanged_Imp()
-{
- // nur alle 2 Minuten aufs FileSystem zugreifen um den
- // Dateistempel zu ueberpruefen
- BOOL bRet = FALSE;
-
- Time nMinTime( 0, 2 );
- Time nAktTime;
- if( aLastCheckTime > nAktTime || // ueberlauf ?
- ( nAktTime -= aLastCheckTime ) > nMinTime ) // min Zeit vergangen
- {
- Date aTstDate; Time aTstTime;
- if( FStatHelper::GetModifiedDateTimeOfFile( sShareAutoCorrFile,
- &aTstDate, &aTstTime ) &&
- ( aModifiedDate != aTstDate || aModifiedTime != aTstTime ))
- {
- bRet = TRUE;
- // dann mal schnell alle Listen entfernen!
- if( CplSttLstLoad & nFlags && pCplStt_ExcptLst )
- delete pCplStt_ExcptLst, pCplStt_ExcptLst = 0;
- if( WrdSttLstLoad & nFlags && pWrdStt_ExcptLst )
- delete pWrdStt_ExcptLst, pWrdStt_ExcptLst = 0;
- if( ChgWordLstLoad & nFlags && pAutocorr_List )
- delete pAutocorr_List, pAutocorr_List = 0;
- nFlags &= ~(CplSttLstLoad | WrdSttLstLoad | ChgWordLstLoad );
- }
- aLastCheckTime = Time();
- }
- return bRet;
-}
-
-void SvxAutoCorrectLanguageLists::LoadXMLExceptList_Imp(
- SvStringsISortDtor*& rpLst,
- const sal_Char* pStrmName,
- SotStorageRef& rStg)
-{
- if( rpLst )
- rpLst->DeleteAndDestroy( 0, rpLst->Count() );
- else
- rpLst = new SvStringsISortDtor( 16, 16 );
-
- {
- String sStrmName( pStrmName, RTL_TEXTENCODING_MS_1252 );
- String sTmp( sStrmName );
-
- if( rStg.Is() && rStg->IsStream( sStrmName ) )
- {
- SvStorageStreamRef xStrm = rStg->OpenSotStream( sTmp,
- ( STREAM_READ | STREAM_SHARE_DENYWRITE | STREAM_NOCREATE ) );
- if( SVSTREAM_OK != xStrm->GetError())
- {
- xStrm.Clear();
- rStg.Clear();
- RemoveStream_Imp( sStrmName );
- }
- else
- {
- uno::Reference< lang::XMultiServiceFactory > xServiceFactory =
- comphelper::getProcessServiceFactory();
- DBG_ASSERT( xServiceFactory.is(),
- "XMLReader::Read: got no service manager" );
- if( !xServiceFactory.is() )
- {
- // Throw an exception ?
- }
-
- xml::sax::InputSource aParserInput;
- aParserInput.sSystemId = sStrmName;
-
- xStrm->Seek( 0L );
- xStrm->SetBufferSize( 8 * 1024 );
- aParserInput.aInputStream = new utl::OInputStreamWrapper( *xStrm );
-
- // get parser
- uno::Reference< XInterface > xXMLParser = xServiceFactory->createInstance(
- OUString::createFromAscii("com.sun.star.xml.sax.Parser") );
- DBG_ASSERT( xXMLParser.is(),
- "XMLReader::Read: com.sun.star.xml.sax.Parser service missing" );
- if( !xXMLParser.is() )
- {
- // Maybe throw an exception?
- }
-
- // get filter
- // #110680#
- // uno::Reference< xml::sax::XDocumentHandler > xFilter = new SvXMLExceptionListImport ( *rpLst );
- uno::Reference< xml::sax::XDocumentHandler > xFilter = new SvXMLExceptionListImport ( xServiceFactory, *rpLst );
-
- // connect parser and filter
- uno::Reference< xml::sax::XParser > xParser( xXMLParser, UNO_QUERY );
- xParser->setDocumentHandler( xFilter );
-
- // parse
- try
- {
- xParser->parseStream( aParserInput );
- }
- catch( xml::sax::SAXParseException& )
- {
- // re throw ?
- }
- catch( xml::sax::SAXException& )
- {
- // re throw ?
- }
- catch( io::IOException& )
- {
- // re throw ?
- }
- }
- }
-
- // Zeitstempel noch setzen
- FStatHelper::GetModifiedDateTimeOfFile( sShareAutoCorrFile,
- &aModifiedDate, &aModifiedTime );
- aLastCheckTime = Time();
- }
-
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-void SvxAutoCorrectLanguageLists::SaveExceptList_Imp(
- const SvStringsISortDtor& rLst,
- const sal_Char* pStrmName,
- SotStorageRef &rStg,
- BOOL bConvert )
-{
- if( rStg.Is() )
- {
- String sStrmName( pStrmName, RTL_TEXTENCODING_MS_1252 );
- if( !rLst.Count() )
- {
- rStg->Remove( sStrmName );
- rStg->Commit();
- }
- else
- {
- SotStorageStreamRef xStrm = rStg->OpenSotStream( sStrmName,
- ( STREAM_READ | STREAM_WRITE | STREAM_SHARE_DENYWRITE ) );
- if( xStrm.Is() )
- {
- xStrm->SetSize( 0 );
- xStrm->SetBufferSize( 8192 );
- String aPropName( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM("MediaType") ) );
- OUString aMime( RTL_CONSTASCII_USTRINGPARAM("text/xml") );
- uno::Any aAny;
- aAny <<= aMime;
- xStrm->SetProperty( aPropName, aAny );
-
-
- uno::Reference< lang::XMultiServiceFactory > xServiceFactory =
- comphelper::getProcessServiceFactory();
- DBG_ASSERT( xServiceFactory.is(),
- "XMLReader::Read: got no service manager" );
- if( !xServiceFactory.is() )
- {
- // Throw an exception ?
- }
-
- uno::Reference < XInterface > xWriter (xServiceFactory->createInstance(
- OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Writer"))));
- DBG_ASSERT(xWriter.is(),"com.sun.star.xml.sax.Writer service missing");
- uno::Reference < io::XOutputStream> xOut = new utl::OOutputStreamWrapper( *xStrm );
- uno::Reference<io::XActiveDataSource> xSrc(xWriter, uno::UNO_QUERY);
- xSrc->setOutputStream(xOut);
-
- uno::Reference<xml::sax::XDocumentHandler> xHandler(xWriter, uno::UNO_QUERY);
-
- // #110680#
- // SvXMLExceptionListExport aExp(rLst, sStrmName, xHandler);
- SvXMLExceptionListExport aExp( xServiceFactory, rLst, sStrmName, xHandler );
-
- aExp.exportDoc( XML_BLOCK_LIST );
-
- xStrm->Commit();
- if( xStrm->GetError() == SVSTREAM_OK )
- {
- xStrm.Clear();
- if (!bConvert)
- {
- rStg->Commit();
- if( SVSTREAM_OK != rStg->GetError() )
- {
- rStg->Remove( sStrmName );
- rStg->Commit();
- }
- }
- }
- }
- }
- }
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-SvxAutocorrWordList* SvxAutoCorrectLanguageLists::LoadAutocorrWordList()
-{
- if( pAutocorr_List )
- pAutocorr_List->DeleteAndDestroy( 0, pAutocorr_List->Count() );
- else
- pAutocorr_List = new SvxAutocorrWordList( 16, 16 );
-
- SvStringsDtor aRemoveArr;
- try
- {
- uno::Reference < embed::XStorage > xStg = comphelper::OStorageHelper::GetStorageFromURL( sShareAutoCorrFile, embed::ElementModes::READ );
- String aXMLWordListName( pXMLImplAutocorr_ListStr, RTL_TEXTENCODING_MS_1252 );
- uno::Reference < io::XStream > xStrm = xStg->openStreamElement( aXMLWordListName, embed::ElementModes::READ );
- uno::Reference< lang::XMultiServiceFactory > xServiceFactory = comphelper::getProcessServiceFactory();
-
- xml::sax::InputSource aParserInput;
- aParserInput.sSystemId = aXMLWordListName;
- aParserInput.aInputStream = xStrm->getInputStream();
-
- // get parser
- uno::Reference< XInterface > xXMLParser = xServiceFactory->createInstance( OUString::createFromAscii("com.sun.star.xml.sax.Parser") );
- DBG_ASSERT( xXMLParser.is(), "XMLReader::Read: com.sun.star.xml.sax.Parser service missing" );
- if( xXMLParser.is() )
- {
- uno::Reference< xml::sax::XDocumentHandler > xFilter = new SvXMLAutoCorrectImport( xServiceFactory, pAutocorr_List, rAutoCorrect, xStg );
-
- // connect parser and filter
- uno::Reference< xml::sax::XParser > xParser( xXMLParser, UNO_QUERY );
- xParser->setDocumentHandler( xFilter );
-
- // parse
- xParser->parseStream( aParserInput );
- }
- }
- catch ( uno::Exception& )
- {
- }
-
- // Zeitstempel noch setzen
- FStatHelper::GetModifiedDateTimeOfFile( sShareAutoCorrFile,
- &aModifiedDate, &aModifiedTime );
- aLastCheckTime = Time();
-
- return pAutocorr_List;
-}
-
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-
-void SvxAutoCorrectLanguageLists::SetAutocorrWordList( SvxAutocorrWordList* pList )
-{
- if( pAutocorr_List && pList != pAutocorr_List )
- delete pAutocorr_List;
- pAutocorr_List = pList;
- if( !pAutocorr_List )
- {
- DBG_ASSERT( !this, "keine gueltige Liste" );
- pAutocorr_List = new SvxAutocorrWordList( 16, 16 );
- }
- nFlags |= ChgWordLstLoad;
-}
-
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-const SvxAutocorrWordList* SvxAutoCorrectLanguageLists::GetAutocorrWordList()
-{
- if( !( ChgWordLstLoad & nFlags ) || IsFileChanged_Imp() )
- SetAutocorrWordList( LoadAutocorrWordList() );
- return pAutocorr_List;
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-SvStringsISortDtor* SvxAutoCorrectLanguageLists::GetCplSttExceptList()
-{
- if( !( CplSttLstLoad & nFlags ) || IsFileChanged_Imp() )
- SetCplSttExceptList( LoadCplSttExceptList() );
- return pCplStt_ExcptLst;
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-BOOL SvxAutoCorrectLanguageLists::AddToCplSttExceptList(const String& rNew)
-{
- String* pNew = new String( rNew );
- if( rNew.Len() && GetCplSttExceptList()->Insert( pNew ) )
- {
- MakeUserStorage_Impl();
- SotStorageRef xStg = new SotStorage( sUserAutoCorrFile, STREAM_READWRITE, TRUE );
-
- SaveExceptList_Imp( *pCplStt_ExcptLst, pXMLImplCplStt_ExcptLstStr, xStg );
-
- xStg = 0;
- // Zeitstempel noch setzen
- FStatHelper::GetModifiedDateTimeOfFile( sUserAutoCorrFile,
- &aModifiedDate, &aModifiedTime );
- aLastCheckTime = Time();
- }
- else
- delete pNew, pNew = 0;
- return 0 != pNew;
-}
-/* -----------------18.11.98 15:20-------------------
- *
- * --------------------------------------------------*/
-BOOL SvxAutoCorrectLanguageLists::AddToWrdSttExceptList(const String& rNew)
-{
- String* pNew = new String( rNew );
- SvStringsISortDtor* pExceptList = LoadWrdSttExceptList();
- if( rNew.Len() && pExceptList && pExceptList->Insert( pNew ) )
- {
- MakeUserStorage_Impl();
- SotStorageRef xStg = new SotStorage( sUserAutoCorrFile, STREAM_READWRITE, TRUE );
-
- SaveExceptList_Imp( *pWrdStt_ExcptLst, pXMLImplWrdStt_ExcptLstStr, xStg );
-
- xStg = 0;
- // Zeitstempel noch setzen
- FStatHelper::GetModifiedDateTimeOfFile( sUserAutoCorrFile,
- &aModifiedDate, &aModifiedTime );
- aLastCheckTime = Time();
- }
- else
- delete pNew, pNew = 0;
- return 0 != pNew;
-}
-
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-SvStringsISortDtor* SvxAutoCorrectLanguageLists::LoadCplSttExceptList()
-{
- SotStorageRef xStg = new SotStorage( sShareAutoCorrFile, STREAM_READ | STREAM_SHARE_DENYNONE, TRUE );
- String sTemp ( RTL_CONSTASCII_USTRINGPARAM ( pXMLImplCplStt_ExcptLstStr ) );
- if( xStg.Is() && xStg->IsContained( sTemp ) )
- LoadXMLExceptList_Imp( pCplStt_ExcptLst, pXMLImplCplStt_ExcptLstStr, xStg );
-
- return pCplStt_ExcptLst;
-}
-
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-void SvxAutoCorrectLanguageLists::SaveCplSttExceptList()
-{
- MakeUserStorage_Impl();
- SotStorageRef xStg = new SotStorage( sUserAutoCorrFile, STREAM_READWRITE, TRUE );
-
- SaveExceptList_Imp( *pCplStt_ExcptLst, pXMLImplCplStt_ExcptLstStr, xStg );
-
- xStg = 0;
-
- // Zeitstempel noch setzen
- FStatHelper::GetModifiedDateTimeOfFile( sUserAutoCorrFile,
- &aModifiedDate, &aModifiedTime );
- aLastCheckTime = Time();
-}
-
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-void SvxAutoCorrectLanguageLists::SetCplSttExceptList( SvStringsISortDtor* pList )
-{
- if( pCplStt_ExcptLst && pList != pCplStt_ExcptLst )
- delete pCplStt_ExcptLst;
-
- pCplStt_ExcptLst = pList;
- if( !pCplStt_ExcptLst )
- {
- DBG_ASSERT( !this, "keine gueltige Liste" );
- pCplStt_ExcptLst = new SvStringsISortDtor( 16, 16 );
- }
- nFlags |= CplSttLstLoad;
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-SvStringsISortDtor* SvxAutoCorrectLanguageLists::LoadWrdSttExceptList()
-{
- SotStorageRef xStg = new SotStorage( sShareAutoCorrFile, STREAM_READ | STREAM_SHARE_DENYNONE, TRUE );
- String sTemp ( RTL_CONSTASCII_USTRINGPARAM ( pXMLImplWrdStt_ExcptLstStr ) );
- if( xStg.Is() && xStg->IsContained( sTemp ) )
- LoadXMLExceptList_Imp( pWrdStt_ExcptLst, pXMLImplWrdStt_ExcptLstStr, xStg );
- return pWrdStt_ExcptLst;
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-void SvxAutoCorrectLanguageLists::SaveWrdSttExceptList()
-{
- MakeUserStorage_Impl();
- SotStorageRef xStg = new SotStorage( sUserAutoCorrFile, STREAM_READWRITE, TRUE );
-
- SaveExceptList_Imp( *pWrdStt_ExcptLst, pXMLImplWrdStt_ExcptLstStr, xStg );
-
- xStg = 0;
- // Zeitstempel noch setzen
- FStatHelper::GetModifiedDateTimeOfFile( sUserAutoCorrFile,
- &aModifiedDate, &aModifiedTime );
- aLastCheckTime = Time();
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-void SvxAutoCorrectLanguageLists::SetWrdSttExceptList( SvStringsISortDtor* pList )
-{
- if( pWrdStt_ExcptLst && pList != pWrdStt_ExcptLst )
- delete pWrdStt_ExcptLst;
- pWrdStt_ExcptLst = pList;
- if( !pWrdStt_ExcptLst )
- {
- DBG_ASSERT( !this, "keine gueltige Liste" );
- pWrdStt_ExcptLst = new SvStringsISortDtor( 16, 16 );
- }
- nFlags |= WrdSttLstLoad;
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-SvStringsISortDtor* SvxAutoCorrectLanguageLists::GetWrdSttExceptList()
-{
- if( !( WrdSttLstLoad & nFlags ) || IsFileChanged_Imp() )
- SetWrdSttExceptList( LoadWrdSttExceptList() );
- return pWrdStt_ExcptLst;
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-void SvxAutoCorrectLanguageLists::RemoveStream_Imp( const String& rName )
-{
- if( sShareAutoCorrFile != sUserAutoCorrFile )
- {
- SotStorageRef xStg = new SotStorage( sUserAutoCorrFile, STREAM_READWRITE, TRUE );
- if( xStg.Is() && SVSTREAM_OK == xStg->GetError() &&
- xStg->IsStream( rName ) )
- {
- xStg->Remove( rName );
- xStg->Commit();
-
- xStg = 0;
- }
- }
-}
-
-void SvxAutoCorrectLanguageLists::MakeUserStorage_Impl()
-{
- // The conversion needs to happen if the file is already in the user
- // directory and is in the old format. Additionally it needs to
- // happen when the file is being copied from share to user.
-
- sal_Bool bError = sal_False, bConvert = sal_False, bCopy = sal_False;
- INetURLObject aDest;
- INetURLObject aSource;
-
-// String sDestPath = sUserAutoCorrFile.Copy ( 0, sUserAutoCorrFile.Len()-3);
-// sDestPath.AppendAscii ("bak");
-
-
- if (sUserAutoCorrFile != sShareAutoCorrFile )
- {
- aSource = INetURLObject ( sShareAutoCorrFile ); //aSource.setFSysPath ( sShareAutoCorrFile, INetURLObject::FSYS_DETECT );
- aDest = INetURLObject ( sUserAutoCorrFile );
- if ( SotStorage::IsOLEStorage ( sShareAutoCorrFile ) )
- {
- aDest.SetExtension ( String::CreateFromAscii ( "bak" ) );
- bConvert = sal_True;
- }
- bCopy = sal_True;
- }
- else if ( SotStorage::IsOLEStorage ( sUserAutoCorrFile ) )
- {
- aSource = INetURLObject ( sUserAutoCorrFile );
- aDest = INetURLObject ( sUserAutoCorrFile );
- aDest.SetExtension ( String::CreateFromAscii ( "bak" ) );
- bCopy = bConvert = sal_True;
- }
- if (bCopy)
- {
- try
- {
- String sMain(aDest.GetMainURL( INetURLObject::DECODE_TO_IURI ));
- sal_Unicode cSlash = '/';
- xub_StrLen nSlashPos = sMain.SearchBackward(cSlash);
- sMain.Erase(nSlashPos);
- ::ucbhelper::Content aNewContent( sMain, uno::Reference< XCommandEnvironment > ());
- Any aAny;
- TransferInfo aInfo;
- aInfo.NameClash = NameClash::OVERWRITE;
- aInfo.NewTitle = aDest.GetName();
- aInfo.SourceURL = aSource.GetMainURL( INetURLObject::DECODE_TO_IURI );
- aInfo.MoveData = FALSE;
- aAny <<= aInfo;
- aNewContent.executeCommand( OUString ( RTL_CONSTASCII_USTRINGPARAM( "transfer" ) ), aAny);
- }
- catch (...)
- {
- bError = sal_True;
- }
- }
- if (bConvert && !bError)
- {
- SotStorageRef xSrcStg = new SotStorage( aDest.GetMainURL( INetURLObject::DECODE_TO_IURI ), STREAM_READ, TRUE );
- SotStorageRef xDstStg = new SotStorage( sUserAutoCorrFile, STREAM_WRITE, TRUE );
-
- if( xSrcStg.Is() && xDstStg.Is() )
- {
- String sWord ( RTL_CONSTASCII_USTRINGPARAM ( pImplWrdStt_ExcptLstStr ) );
- String sSentence ( RTL_CONSTASCII_USTRINGPARAM ( pImplCplStt_ExcptLstStr ) );
- String sXMLWord ( RTL_CONSTASCII_USTRINGPARAM ( pXMLImplWrdStt_ExcptLstStr ) );
- String sXMLSentence ( RTL_CONSTASCII_USTRINGPARAM ( pXMLImplCplStt_ExcptLstStr ) );
- SvStringsISortDtor *pTmpWordList = NULL;
-
- if (xSrcStg->IsContained( sXMLWord ) )
- LoadXMLExceptList_Imp( pTmpWordList, pXMLImplWrdStt_ExcptLstStr, xSrcStg );
-
- if (pTmpWordList)
- {
- SaveExceptList_Imp( *pTmpWordList, pXMLImplWrdStt_ExcptLstStr, xDstStg, TRUE );
- pTmpWordList->DeleteAndDestroy( 0, pTmpWordList->Count() );
- pTmpWordList = NULL;
- }
-
-
- if (xSrcStg->IsContained( sXMLSentence ) )
- LoadXMLExceptList_Imp( pTmpWordList, pXMLImplCplStt_ExcptLstStr, xSrcStg );
-
- if (pTmpWordList)
- {
- SaveExceptList_Imp( *pTmpWordList, pXMLImplCplStt_ExcptLstStr, xDstStg, TRUE );
- pTmpWordList->DeleteAndDestroy( 0, pTmpWordList->Count() );
- }
-
- GetAutocorrWordList();
- MakeBlocklist_Imp( *xDstStg );
- // xDstStg is committed in MakeBlocklist_Imp
- /*xSrcStg->CopyTo( &xDstStg );*/
- sShareAutoCorrFile = sUserAutoCorrFile;
- xDstStg = 0;
- try
- {
- ::ucbhelper::Content aContent ( aDest.GetMainURL( INetURLObject::DECODE_TO_IURI ), uno::Reference < XCommandEnvironment > ());
- aContent.executeCommand ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "delete" ) ), makeAny ( sal_Bool (sal_True ) ) );
- }
- catch (...)
- {
- }
- }
- }
- else if( bCopy && !bError )
- sShareAutoCorrFile = sUserAutoCorrFile;
-}
-
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-BOOL SvxAutoCorrectLanguageLists::MakeBlocklist_Imp( SvStorage& rStg )
-{
- String sStrmName( pXMLImplAutocorr_ListStr, RTL_TEXTENCODING_MS_1252 );
- BOOL bRet = TRUE, bRemove = !pAutocorr_List || !pAutocorr_List->Count();
- if( !bRemove )
- {
- /*
- if ( rStg.IsContained( sStrmName) )
- {
- rStg.Remove ( sStrmName );
- rStg.Commit();
- }
- */
- SvStorageStreamRef refList = rStg.OpenSotStream( sStrmName,
- ( STREAM_READ | STREAM_WRITE | STREAM_SHARE_DENYWRITE ) );
- if( refList.Is() )
- {
- refList->SetSize( 0 );
- refList->SetBufferSize( 8192 );
- String aPropName( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM("MediaType") ) );
- OUString aMime( RTL_CONSTASCII_USTRINGPARAM("text/xml") );
- uno::Any aAny;
- aAny <<= aMime;
- refList->SetProperty( aPropName, aAny );
-
- uno::Reference< lang::XMultiServiceFactory > xServiceFactory =
- comphelper::getProcessServiceFactory();
- DBG_ASSERT( xServiceFactory.is(),
- "XMLReader::Read: got no service manager" );
- if( !xServiceFactory.is() )
- {
- // Throw an exception ?
- }
-
- uno::Reference < XInterface > xWriter (xServiceFactory->createInstance(
- OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Writer"))));
- DBG_ASSERT(xWriter.is(),"com.sun.star.xml.sax.Writer service missing");
- uno::Reference < io::XOutputStream> xOut = new utl::OOutputStreamWrapper( *refList );
- uno::Reference<io::XActiveDataSource> xSrc(xWriter, uno::UNO_QUERY);
- xSrc->setOutputStream(xOut);
-
- uno::Reference<xml::sax::XDocumentHandler> xHandler(xWriter, uno::UNO_QUERY);
-
- // #110680#
- // SvXMLAutoCorrectExport aExp(pAutocorr_List, sStrmName, xHandler);
- SvXMLAutoCorrectExport aExp( xServiceFactory, pAutocorr_List, sStrmName, xHandler );
-
- aExp.exportDoc( XML_BLOCK_LIST );
-
- refList->Commit();
- bRet = SVSTREAM_OK == refList->GetError();
- if( bRet )
- {
- refList.Clear();
- rStg.Commit();
- if( SVSTREAM_OK != rStg.GetError() )
- {
- bRemove = TRUE;
- bRet = FALSE;
- }
- }
-
- /*
- refList->SetSize( 0 );
- refList->SetBufferSize( 8192 );
- rtl_TextEncoding eEncoding = gsl_getSystemTextEncoding();
-
- String aDummy; // Erkennungszeichen fuer neue Streams
- refList->WriteByteString( aDummy, RTL_TEXTENCODING_MS_1252 )
- << (BYTE) 4 // Laenge des Headers (ohne den Leerstring)
- << (USHORT)WORDLIST_VERSION_358 // Version des Streams
- << (BYTE)eEncoding; // der Zeichensatz
-
- for( USHORT i = 0; i < pAutocorr_List->Count() &&
- SVSTREAM_OK == refList->GetError(); ++i )
- {
- SvxAutocorrWord* p = pAutocorr_List->GetObject( i );
- refList->WriteByteString( p->GetShort(), eEncoding ).
- WriteByteString( p->IsTextOnly()
- ? p->GetLong()
- : p->GetShort(), eEncoding );
- }
- refList->Commit();
- bRet = SVSTREAM_OK == refList->GetError();
- if( bRet )
- {
- refList.Clear();
- rStg.Commit();
- if( SVSTREAM_OK != rStg.GetError() )
- {
- bRemove = TRUE;
- bRet = FALSE;
- }
- }
- */
- }
- else
- bRet = FALSE;
- }
-
- if( bRemove )
- {
- rStg.Remove( sStrmName );
- rStg.Commit();
- }
-
- return bRet;
-}
-
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
-BOOL SvxAutoCorrectLanguageLists::PutText( const String& rShort,
- const String& rLong )
-{
- // erstmal akt. Liste besorgen!
- GetAutocorrWordList();
-
- MakeUserStorage_Impl();
- SotStorageRef xStg = new SotStorage( sUserAutoCorrFile, STREAM_READWRITE, TRUE );
-
- BOOL bRet = xStg.Is() && SVSTREAM_OK == xStg->GetError();
-
-/* if( bRet )
- {
- // PutText( *xStg, rShort );
- }
-*/
- // die Wortliste aktualisieren
- if( bRet )
- {
- USHORT nPos;
- SvxAutocorrWord* pNew = new SvxAutocorrWord( rShort, rLong, TRUE );
- if( pAutocorr_List->Seek_Entry( pNew, &nPos ) )
- {
- if( !(*pAutocorr_List)[ nPos ]->IsTextOnly() )
- {
- // dann ist der Storage noch zu entfernen
- String sStgNm( rShort );
- if (xStg->IsOLEStorage())
- EncryptBlockName_Imp( sStgNm );
- else
- GeneratePackageName ( rShort, sStgNm);
-
- if( xStg->IsContained( sStgNm ) )
- xStg->Remove( sStgNm );
- }
- pAutocorr_List->DeleteAndDestroy( nPos );
- }
-
- if( pAutocorr_List->Insert( pNew ) )
- {
- bRet = MakeBlocklist_Imp( *xStg );
- xStg = 0;
- }
- else
- {
- delete pNew;
- bRet = FALSE;
- }
- }
- return bRet;
-}
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
- // - Text mit Attributierung (kann nur der SWG - SWG-Format!)
-BOOL SvxAutoCorrectLanguageLists::PutText( const String& rShort,
- SfxObjectShell& rShell )
-{
- // erstmal akt. Liste besorgen!
- GetAutocorrWordList();
-
- MakeUserStorage_Impl();
-
- BOOL bRet = FALSE;
- String sLong;
- try
- {
- uno::Reference < embed::XStorage > xStg = comphelper::OStorageHelper::GetStorageFromURL( sUserAutoCorrFile, embed::ElementModes::READWRITE );
-// String aName( rShort );
-// EncryptBlockName_Imp( aName );
-// bRet = PutText( *xStg, aName, rShell, sLong );
- bRet = rAutoCorrect.PutText( xStg, sUserAutoCorrFile, rShort, rShell, sLong );
- xStg = 0;
-
- // die Wortliste aktualisieren
- if( bRet )
- {
- SvxAutocorrWord* pNew = new SvxAutocorrWord( rShort, sLong, FALSE );
- if( pAutocorr_List->Insert( pNew ) )
- {
- SotStorageRef xStor = new SotStorage( sUserAutoCorrFile, STREAM_READWRITE, TRUE );
- MakeBlocklist_Imp( *xStor );
- }
- else
- delete pNew;
- }
- }
- catch ( uno::Exception& )
- {
- }
-
- return bRet;
-}
-
-/* -----------------18.11.98 11:26-------------------
- *
- * --------------------------------------------------*/
- // - loesche einen Eintrag
-BOOL SvxAutoCorrectLanguageLists::DeleteText( const String& rShort )
-{
- // erstmal akt. Liste besorgen!
- GetAutocorrWordList();
-
- MakeUserStorage_Impl();
-
- SotStorageRef xStg = new SotStorage( sUserAutoCorrFile, STREAM_READWRITE, TRUE );
- BOOL bRet = xStg.Is() && SVSTREAM_OK == xStg->GetError();
- if( bRet )
- {
- USHORT nPos;
- SvxAutocorrWord aTmp( rShort, rShort );
- if( pAutocorr_List->Seek_Entry( &aTmp, &nPos ) )
- {
- SvxAutocorrWord* pFnd = (*pAutocorr_List)[ nPos ];
- if( !pFnd->IsTextOnly() )
- {
- String aName( rShort );
- if (xStg->IsOLEStorage())
- EncryptBlockName_Imp( aName );
- else
- GeneratePackageName ( rShort, aName );
- if( xStg->IsContained( aName ) )
- {
- xStg->Remove( aName );
- bRet = xStg->Commit();
- }
-
- }
- // die Wortliste aktualisieren
- pAutocorr_List->DeleteAndDestroy( nPos );
- MakeBlocklist_Imp( *xStg );
- xStg = 0;
- }
- else
- bRet = FALSE;
- }
- return bRet;
-}