/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #ifndef EE_SVXACORR_HXX #define EE_SVXACORR_HXX #include #include #include #include #include #include #include #include #include "editeng/editengdllapi.h" #include #include #include #include class CharClass; class SfxPoolItem; class SvxAutoCorrect; class SfxObjectShell; class SotStorageRef; class SotStorage; class Window; struct CompareSvStringsISortDtor { bool operator()( String* const& lhs, String* const& rhs ) const { return lhs->CompareIgnoreCaseToAscii( *rhs ) == COMPARE_LESS; } }; class SvStringsISortDtor : public o3tl::sorted_vector { public: ~SvStringsISortDtor() { DeleteAndDestroyAll(); } }; // Auto correct flags const long CptlSttSntnc = 0x00000001; // Capital letters at the beginning of a sentence const long CptlSttWrd = 0x00000002; // not two Capital letters at the beginning of a word const long AddNonBrkSpace = 0x00000004; // Add non breaking space before :;?!% const long ChgOrdinalNumber = 0x00000008; // Ordinal-Number 1st, 2nd,.. const long ChgToEnEmDash = 0x00000010; // - -> Endash/Emdash const long ChgWeightUnderl = 0x00000020; // * -> Bold, _ -> Underscore const long SetINetAttr = 0x00000040; // Set INetAttribut const long Autocorrect = 0x00000080; // Call AutoCorrect const long ChgQuotes = 0x00000100; // replace double quotes const long SaveWordCplSttLst= 0x00000200; // Save Auto correction of Capital letter at beginning of sentence. const long SaveWordWrdSttLst= 0x00000400; // Save Auto correction of 2 Capital letter at beginning of word. const long IgnoreDoubleSpace= 0x00000800; // Ignore 2 Spaces const long ChgSglQuotes = 0x00001000; // Replace simple quotes const long CorrectCapsLock = 0x00002000; // Correct accidental use of cAPS LOCK key const long ChgWordLstLoad = 0x20000000; // Replacement list loaded const long CplSttLstLoad = 0x40000000; // Exception list for Capital letters Start loaded const long WrdSttLstLoad = 0x80000000; // Exception list for Word Start loaded // TODO: handle unicodes > U+FFFF and check users of this class // only a mapping class class EDITENG_DLLPUBLIC SvxAutoCorrDoc { public: SvxAutoCorrDoc() {} virtual ~SvxAutoCorrDoc(); 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; virtual sal_Bool SetINetAttr( xub_StrLen nStt, xub_StrLen nEnd, const String& rURL ) = 0; // Return the text of a previous paragraph. This must not be empty! // If no paragraph exits or just an empty one, then return 0. // The flag indicates: // TRUE: before the normal insertion position (TRUE) // FALSE: in which the corrected word was inserted. // (Does not to have to be the same paragraph !!!!) virtual const String* GetPrevPara( sal_Bool bAtNormalPos ) = 0; virtual sal_Bool ChgAutoCorrWord( xub_StrLen& rSttPos, xub_StrLen nEndPos, SvxAutoCorrect& rACorrect, const String** ppPara ) = 0; // Is called after the change of the signs by the functions // - FnCptlSttWrd // - FnCptlSttSntnc // As an option, the words can then be inserted into the exception lists. virtual void SaveCpltSttWord( sal_uLong nFlag, xub_StrLen nPos, const String& rExceptWord, sal_Unicode cChar ); // which language at the position? virtual LanguageType GetLanguage( xub_StrLen nPos, sal_Bool bPrevPara = sal_False ) const; }; class EDITENG_DLLPUBLIC SvxAutocorrWord { String sShort, sLong; sal_Bool bIsTxtOnly; // Is pure ASCII - Text public: SvxAutocorrWord( const String& rS, const String& rL, sal_Bool bFlag = sal_True ) : sShort( rS ), sLong( rL ), bIsTxtOnly( bFlag ) {} const String& GetShort() const { return sShort; } const String& GetLong() const { return sLong; } sal_Bool IsTextOnly() const { return bIsTxtOnly; } }; struct CompareSvxAutocorrWordList { bool operator()( SvxAutocorrWord* const& lhs, SvxAutocorrWord* const& rhs ) const; }; typedef std::set SvxAutocorrWordList_Set; typedef ::boost::unordered_map< OUString, SvxAutocorrWord *, OUStringHash > SvxAutocorrWordList_Hash; class EDITENG_DLLPUBLIC SvxAutocorrWordList { // only one of these contains the data mutable SvxAutocorrWordList_Set maSet; mutable SvxAutocorrWordList_Hash maHash; // key is 'Short' bool WordMatches(const SvxAutocorrWord *pFnd, const String &rTxt, xub_StrLen &rStt, xub_StrLen nEndPos) const; public: // free any objects still in the set ~SvxAutocorrWordList(); void DeleteAndDestroyAll(); bool Insert(SvxAutocorrWord *pWord); SvxAutocorrWord* FindAndRemove(SvxAutocorrWord *pWord); void LoadEntry(String sWrong, String sRight, sal_Bool bOnlyTxt); bool empty() const; typedef std::vector Content; Content getSortedContent() const; const SvxAutocorrWord* SearchWordsInList(const String& rTxt, xub_StrLen& rStt, xub_StrLen nEndPos) const; }; class EDITENG_DLLPUBLIC SvxAutoCorrectLanguageLists { String sShareAutoCorrFile, sUserAutoCorrFile; // If the AutoCorr file is newer Date aModifiedDate; Time aModifiedTime, aLastCheckTime; SvStringsISortDtor* pCplStt_ExcptLst; SvStringsISortDtor* pWrdStt_ExcptLst; SvxAutocorrWordList* pAutocorr_List; SvxAutoCorrect& rAutoCorrect; long nFlags; sal_Bool IsFileChanged_Imp(); void LoadXMLExceptList_Imp( SvStringsISortDtor*& rpLst, const sal_Char* pStrmName, SotStorageRef& rStg); void SaveExceptList_Imp( const SvStringsISortDtor& rLst, const sal_Char* pStrmName, SotStorageRef& rStg, sal_Bool bConvert = sal_False); sal_Bool MakeBlocklist_Imp( SotStorage& rStg ); void RemoveStream_Imp( const String& rName ); void MakeUserStorage_Impl(); public: SvxAutoCorrectLanguageLists( SvxAutoCorrect& rParent, const String& rShareAutoCorrectFile, const String& rUserAutoCorrectFile); ~SvxAutoCorrectLanguageLists(); // Load, Set, Get - the replacement list SvxAutocorrWordList* LoadAutocorrWordList(); void SetAutocorrWordList( SvxAutocorrWordList* pList ); const SvxAutocorrWordList* GetAutocorrWordList(); // Load, Set, Get - the exception list for Capital letter at the // beginning of a sentence SvStringsISortDtor* LoadCplSttExceptList(); void SaveCplSttExceptList(); void SetCplSttExceptList( SvStringsISortDtor* pList ); SvStringsISortDtor* GetCplSttExceptList(); sal_Bool AddToCplSttExceptList(const String& rNew); // Load, Set, Get the exception list for 2 Capital letters at the // beginning of a word. SvStringsISortDtor* LoadWrdSttExceptList(); void SaveWrdSttExceptList(); void SetWrdSttExceptList( SvStringsISortDtor* pList ); SvStringsISortDtor* GetWrdSttExceptList(); sal_Bool AddToWrdSttExceptList(const String& rNew); // Save word substitutions: // Store these directly in the storage. The word list is updated // accordingly! // - pure Text sal_Bool PutText( const String& rShort, const String& rLong ); // - Text with attribution (only the SWG - SWG format!) sal_Bool PutText( const String& rShort, SfxObjectShell& ); // - Deleting an entry sal_Bool DeleteText( const String& rShort ); // - Make combined changes in one pass sal_Bool MakeCombinedChanges( std::vector& aNewEntries, std::vector& aDeleteEntries ); }; class EDITENG_DLLPUBLIC SvxAutoCorrect { friend class SvxAutoCorrectLanguageLists; String sShareAutoCorrFile, sUserAutoCorrFile; SvxSwAutoFmtFlags aSwFlags; // StarWriter AutoFormat Flags // all languages in a table boost::ptr_map* pLangTable; std::map aLastFileTable; CharClass* pCharClass; bool bRunNext; LanguageType eCharClassLang; long nFlags; sal_Unicode cStartDQuote, cEndDQuote, cStartSQuote, cEndSQuote, cEmDash, cEnDash; // private methods SvxAutoCorrectLanguageLists& _GetLanguageList( LanguageType eLang ); void _GetCharClass( LanguageType eLang ); protected: // - Text with attribution (only the SWG - SWG format!) // rShort is the stream name - encrypted! virtual sal_Bool PutText( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rStg, const String& rFileName, const String& rShort, SfxObjectShell& , String& ); // required language in the table add if possible only when the file exists sal_Bool CreateLanguageFile(LanguageType eLang, sal_Bool bNewFile = sal_True); // - Return the replacement text (only for SWG format, all others can be // taken from the word list!) // rShort is the stream name - encrypted! public: sal_Unicode GetQuote( sal_Unicode cInsChar, sal_Bool bSttQuote, LanguageType eLang ) const; virtual sal_Bool GetLongText( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rStg, const String& rFileName, const String& rShort, String& rLong ); TYPEINFO(); SvxAutoCorrect( const String& rShareAutocorrFile, const String& rUserAutocorrFile ); SvxAutoCorrect( const SvxAutoCorrect& ); virtual ~SvxAutoCorrect(); // Execute an AutoCorrect. // Returns what has been executed, according to the above flags sal_uLong AutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt, xub_StrLen nPos, sal_Unicode cInsChar, sal_Bool bInsert, Window* pFrameWin = NULL ); // Return for the autotext expansion the previous word, // AutoCorrect - corresponding algorithm sal_Bool GetPrevAutoCorrWord( SvxAutoCorrDoc& rDoc, const String& rTxt, xub_StrLen nPos, String& rWord ) const; // Search for or or the words in the replacement table. // rText - check in this text the words of the list // rStt - the detected starting position // nEnd - to check position - as of this item forward // rLang - Input: in which language is searched // Output: in which "language list" was it found const SvxAutocorrWord* SearchWordsInList( const String& rTxt, xub_StrLen& rStt, xub_StrLen nEndPos, SvxAutoCorrDoc& rDoc, LanguageType& rLang ); // Query/Set the Character for the Quote substitution sal_Unicode GetStartSingleQuote() const { return cStartSQuote; } sal_Unicode GetEndSingleQuote() const { return cEndSQuote; } sal_Unicode GetStartDoubleQuote() const { return cStartDQuote; } sal_Unicode GetEndDoubleQuote() const { return cEndDQuote; } void SetStartSingleQuote( const sal_Unicode cStart ) { cStartSQuote = cStart; } void SetEndSingleQuote( const sal_Unicode cEnd ) { cEndSQuote = cEnd; } void SetStartDoubleQuote( const sal_Unicode cStart ) { cStartDQuote = cStart; } void SetEndDoubleQuote( const sal_Unicode cEnd ) { cEndDQuote = cEnd; } String GetQuote( SvxAutoCorrDoc& rDoc, xub_StrLen nInsPos, sal_Unicode cInsChar, sal_Bool bSttQuote ); void InsertQuote( SvxAutoCorrDoc& rDoc, xub_StrLen nInsPos, sal_Unicode cInsChar, sal_Bool bSttQuote, sal_Bool bIns ); // Query/Set the name of the AutoCorrect file // the default is "autocorr.dat" OUString GetAutoCorrFileName( LanguageType eLang = LANGUAGE_SYSTEM, sal_Bool bNewFile = sal_False, sal_Bool bTstUserExist = sal_False ) const; // Query/Set the current settings of AutoCorrect long GetFlags() const { return nFlags; } inline SvxSwAutoFmtFlags& GetSwFlags() { return aSwFlags;} sal_Bool IsAutoCorrFlag( long nFlag ) const { return nFlags & nFlag ? sal_True : sal_False; } void SetAutoCorrFlag( long nFlag, sal_Bool bOn = sal_True ); // Load, Set, Get - the replacement list SvxAutocorrWordList* LoadAutocorrWordList( LanguageType eLang = LANGUAGE_SYSTEM ) { return _GetLanguageList( eLang ).LoadAutocorrWordList(); } const SvxAutocorrWordList* GetAutocorrWordList( LanguageType eLang = LANGUAGE_SYSTEM ) { return _GetLanguageList( eLang ).GetAutocorrWordList(); } // Save word substitutions: // Save these directly in the storage. The word list is updated // accordingly! // - pure Text sal_Bool PutText( const String& rShort, const String& rLong, LanguageType eLang = LANGUAGE_SYSTEM ); // - Text with attribution (only in the SWG - SWG format!) sal_Bool PutText( const String& rShort, SfxObjectShell& rShell, LanguageType eLang = LANGUAGE_SYSTEM ) { return _GetLanguageList( eLang ).PutText(rShort, rShell ); } sal_Bool MakeCombinedChanges( std::vector& aNewEntries, std::vector& aDeleteEntries, LanguageType eLang = LANGUAGE_SYSTEM ); // Load, Set, Get - the exception list for capital letters at the // beginning of a sentence void SaveCplSttExceptList( LanguageType eLang = LANGUAGE_SYSTEM ); SvStringsISortDtor* LoadCplSttExceptList( LanguageType eLang = LANGUAGE_SYSTEM) { return _GetLanguageList( eLang ).LoadCplSttExceptList(); } const SvStringsISortDtor* GetCplSttExceptList( LanguageType eLang = LANGUAGE_SYSTEM ) { return _GetLanguageList( eLang ).GetCplSttExceptList(); } // Adds a single word. The list will be immediately written to the file! sal_Bool AddCplSttException( const String& rNew, LanguageType eLang = LANGUAGE_SYSTEM ); // Load, Set, Get the exception list for 2 Capital letters at the // beginning of a word. void SaveWrdSttExceptList( LanguageType eLang = LANGUAGE_SYSTEM ); SvStringsISortDtor* LoadWrdSttExceptList( LanguageType eLang = LANGUAGE_SYSTEM ) { return _GetLanguageList( eLang ).LoadWrdSttExceptList(); } const SvStringsISortDtor* GetWrdSttExceptList( LanguageType eLang = LANGUAGE_SYSTEM ) { return _GetLanguageList( eLang ).GetWrdSttExceptList(); } // Adds a single word. The list will be immediately written to the file! sal_Bool AddWrtSttException( const String& rNew, LanguageType eLang = LANGUAGE_SYSTEM); // Search through the Languages for the entry sal_Bool FindInWrdSttExceptList( LanguageType eLang, const String& sWord ); sal_Bool FindInCplSttExceptList( LanguageType eLang, const String& sWord, sal_Bool bAbbreviation = sal_False); // Methods for the auto-correction sal_Bool FnCptlSttWrd( SvxAutoCorrDoc&, const String&, xub_StrLen nSttPos, xub_StrLen nEndPos, LanguageType eLang = LANGUAGE_SYSTEM ); sal_Bool FnChgOrdinalNumber( SvxAutoCorrDoc&, const String&, xub_StrLen nSttPos, xub_StrLen nEndPos, LanguageType eLang = LANGUAGE_SYSTEM ); sal_Bool FnChgToEnEmDash( SvxAutoCorrDoc&, const String&, xub_StrLen nSttPos, xub_StrLen nEndPos, LanguageType eLang = LANGUAGE_SYSTEM ); sal_Bool FnAddNonBrkSpace( SvxAutoCorrDoc&, const String&, xub_StrLen nSttPos, xub_StrLen nEndPos, LanguageType eLang = LANGUAGE_SYSTEM ); sal_Bool FnSetINetAttr( SvxAutoCorrDoc&, const String&, xub_StrLen nSttPos, xub_StrLen nEndPos, LanguageType eLang = LANGUAGE_SYSTEM ); sal_Bool FnChgWeightUnderl( SvxAutoCorrDoc&, const String&, xub_StrLen nSttPos, xub_StrLen nEndPos, LanguageType eLang = LANGUAGE_SYSTEM ); sal_Bool FnCptlSttSntnc( SvxAutoCorrDoc&, const String&, sal_Bool bNormalPos, xub_StrLen nSttPos, xub_StrLen nEndPos, LanguageType eLang = LANGUAGE_SYSTEM); bool FnCorrectCapsLock( SvxAutoCorrDoc&, const String&, xub_StrLen nSttPos, xub_StrLen nEndPos, LanguageType eLang = LANGUAGE_SYSTEM ); bool HasRunNext() { return bRunNext; } static long GetDefaultFlags(); // returns sal_True for characters where the function // 'SvxAutoCorrect::AutoCorrect' should be called. // (used to avoid occasional 'collisions' with (Thai) input-sequence-checking) static sal_Bool IsAutoCorrectChar( sal_Unicode cChar ); sal_Bool NeedsHardspaceAutocorr( sal_Unicode cChar ); CharClass& GetCharClass( LanguageType eLang ) { if( !pCharClass || eLang != eCharClassLang ) _GetCharClass( eLang ); return *pCharClass; } }; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */