diff options
Diffstat (limited to 'sw/source/core/inc/scriptinfo.hxx')
-rw-r--r-- | sw/source/core/inc/scriptinfo.hxx | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/sw/source/core/inc/scriptinfo.hxx b/sw/source/core/inc/scriptinfo.hxx new file mode 100644 index 000000000000..07d58e5a72ef --- /dev/null +++ b/sw/source/core/inc/scriptinfo.hxx @@ -0,0 +1,416 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * 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. + * + ************************************************************************/ +#ifndef _SCRIPTINFO_HXX +#define _SCRIPTINFO_HXX +#ifndef _SVSTDARR_HXX +#define _SVSTDARR_SHORTS +#define _SVSTDARR_BYTES +#define _SVSTDARR_USHORTS +#define _SVSTDARR_XUB_STRLEN +#include <svl/svstdarr.hxx> +#endif +#include <i18npool/lang.h> +#include <list> +#include <modeltoviewhelper.hxx> + +#include <errhdl.hxx> + +class SwTxtNode; +class Point; +class MultiSelection; +class String; +typedef std::list< xub_StrLen > PositionList; + +#define SPACING_PRECISION_FACTOR 100 + +/************************************************************************* + * class SwScanner + * Hilfsklasse, die beim Spellen die Worte im gewuenschten Bereich + * nacheinander zur Verfuegung stellt. + *************************************************************************/ + +class SwScanner +{ + XubString aWord; + const SwTxtNode& rNode; + const String& rText; + const LanguageType* pLanguage; + const ModelToViewHelper::ConversionMap* pConversionMap; + xub_StrLen nStartPos; + xub_StrLen nEndPos; + xub_StrLen nBegin; + xub_StrLen nLen; + LanguageType aCurrLang; + USHORT nWordType; + BOOL bClip; + +public: + SwScanner( const SwTxtNode& rNd, const String& rTxt, const LanguageType* pLang, + const ModelToViewHelper::ConversionMap* pConvMap, + USHORT nWordType, + xub_StrLen nStart, xub_StrLen nEnde, BOOL bClip = FALSE ); + + + // This next word function tries to find the language for the next word + // It should currently _not_ be used for spell checking, and works only for + // ! bReverse + BOOL NextWord(); + + const XubString& GetWord() const { return aWord; } + + xub_StrLen GetBegin() const { return nBegin; } + xub_StrLen GetEnd() const { return nBegin + nLen; } + xub_StrLen GetLen() const { return nLen; } + + LanguageType GetCurrentLanguage() const {return aCurrLang;} +}; + +/************************************************************************* + * class SwScriptInfo + * + * encapsultes information about script changes + *************************************************************************/ + +class SwScriptInfo +{ +private: + SvXub_StrLens aScriptChg; + SvBytes aScriptType; + SvXub_StrLens aDirChg; + SvBytes aDirType; + SvXub_StrLens aKashida; + SvXub_StrLens aKashidaInvalid; + SvXub_StrLens aNoKashidaLine; + SvXub_StrLens aNoKashidaLineEnd; + SvXub_StrLens aCompChg; + SvXub_StrLens aCompLen; + SvXub_StrLens aHiddenChg; + SvBytes aCompType; + xub_StrLen nInvalidityPos; + BYTE nDefaultDir; + + void UpdateBidiInfo( const String& rTxt ); + + sal_Bool IsKashidaValid ( xub_StrLen nKashPos ) const; + void MarkKashidaInvalid ( xub_StrLen nKashPos ); + void ClearKashidaInvalid ( xub_StrLen nKashPos ); + bool MarkOrClearKashidaInvalid( xub_StrLen nStt, xub_StrLen nLen, bool bMark, xub_StrLen nMarkCount ); + bool IsKashidaLine ( xub_StrLen nCharIdx ) const; + +public: + enum CompType { KANA, SPECIAL_LEFT, SPECIAL_RIGHT, NONE }; + + SwScriptInfo(); + ~SwScriptInfo(); + + // determines script changes + void InitScriptInfo( const SwTxtNode& rNode, sal_Bool bRTL ); + void InitScriptInfo( const SwTxtNode& rNode ); + + // set/get position from which data is invalid + inline void SetInvalidity( const xub_StrLen nPos ); + inline xub_StrLen GetInvalidity() const { return nInvalidityPos; }; + + // get default direction for paragraph + inline BYTE GetDefaultDir() const { return nDefaultDir; }; + + // array operations, nCnt refers to array position + inline USHORT CountScriptChg() const; + inline xub_StrLen GetScriptChg( const USHORT nCnt ) const; + inline BYTE GetScriptType( const USHORT nCnt ) const; + + inline USHORT CountDirChg() const; + inline xub_StrLen GetDirChg( const USHORT nCnt ) const; + inline BYTE GetDirType( const USHORT nCnt ) const; + + inline USHORT CountKashida() const; + inline xub_StrLen GetKashida( const USHORT nCnt ) const; + + inline USHORT CountCompChg() const; + inline xub_StrLen GetCompStart( const USHORT nCnt ) const; + inline xub_StrLen GetCompLen( const USHORT nCnt ) const; + inline BYTE GetCompType( const USHORT nCnt ) const; + + inline USHORT CountHiddenChg() const; + inline xub_StrLen GetHiddenChg( const USHORT nCnt ) const; + static void CalcHiddenRanges( const SwTxtNode& rNode, + MultiSelection& rHiddenMulti ); + + // "high" level operations, nPos refers to string position + xub_StrLen NextScriptChg( const xub_StrLen nPos ) const; + BYTE ScriptType( const xub_StrLen nPos ) const; + + // Returns the position of the next direction level change. + // If bLevel is set, the position of the next level which is smaller + // than the level at position nPos is returned. This is required to + // obtain the end of a SwBidiPortion + xub_StrLen NextDirChg( const xub_StrLen nPos, + const BYTE* pLevel = 0 ) const; + BYTE DirType( const xub_StrLen nPos ) const; + +#if OSL_DEBUG_LEVEL > 1 + BYTE CompType( const xub_StrLen nPos ) const; +#endif + + // + // HIDDEN TEXT STUFF START + // + +/** Hidden text range information - static and non-version + + @descr Determines if a given position is inside a hidden text range. The + static version tries to obtain a valid SwScriptInfo object + via the SwTxtNode, otherwise it calculates the values from scratch. + The non-static version uses the internally cached informatio + for the calculation. + + @param rNode + The text node. + @param nPos + The given position that should be checked. + @param rnStartPos + Return parameter for the start position of the hidden range. + STRING_LEN if nPos is not inside a hidden range. + @param rnEndPos + Return parameter for the end position of the hidden range. + 0 if nPos is not inside a hidden range. + @param rnEndPos + Return parameter that contains all the hidden text ranges. Optional. + @return + returns true if there are any hidden characters in this paragraph. + +*/ + static bool GetBoundsOfHiddenRange( const SwTxtNode& rNode, xub_StrLen nPos, + xub_StrLen& rnStartPos, xub_StrLen& rnEndPos, + PositionList* pList = 0 ); + bool GetBoundsOfHiddenRange( xub_StrLen nPos, xub_StrLen& rnStartPos, + xub_StrLen& rnEndPos, PositionList* pList = 0 ) const; + + static bool IsInHiddenRange( const SwTxtNode& rNode, xub_StrLen nPos ); + +/** Hidden text attribute handling + + @descr Takes a string and either deletes the hidden ranges or sets + a given character in place of the hidden characters. + + @param rNode + The text node. + @param nPos + The string to modify. + @param cChar + The character that should replace the hidden characters. + @param bDel + If set, the hidden ranges will be deleted from the text node. + */ + static USHORT MaskHiddenRanges( const SwTxtNode& rNode, XubString& rText, + const xub_StrLen nStt, const xub_StrLen nEnd, + const xub_Unicode cChar ); + +/** Hidden text attribute handling + + @descr Takes a SwTxtNode and deletes the hidden ranges from the node. + + @param rNode + The text node. + */ + static void DeleteHiddenRanges( SwTxtNode& rNode ); + + // + // HIDDEN TEXT STUFF END + // + + // examines the range [ nStart, nStart + nEnd ] if there are kanas + // returns start index of kana entry in array, otherwise USHRT_MAX + USHORT HasKana( xub_StrLen nStart, const xub_StrLen nEnd ) const; + + // modifies the kerning array according to a given compress value + long Compress( sal_Int32* pKernArray, xub_StrLen nIdx, xub_StrLen nLen, + const USHORT nCompress, const USHORT nFontHeight, + Point* pPoint = NULL ) const; + +/** Performes a kashida justification on the kerning array + + @descr Add some extra space for kashida justification to the + positions in the kerning array. + @param pKernArray + The printers kerning array. Optional. + @param pScrArray + The screen kerning array. Optional. + @param nStt + Start referring to the paragraph. + @param nLen + The number of characters to be considered. + @param nSpaceAdd + The value which has to be added to a kashida opportunity. + @return The number of kashida opportunities in the given range +*/ + USHORT KashidaJustify( sal_Int32* pKernArray, sal_Int32* pScrArray, + xub_StrLen nStt, xub_StrLen nLen, + long nSpaceAdd = 0) const; + +/** Clears array of kashidas marked as invalid + */ + inline void ClearKashidaInvalid ( xub_StrLen nStt, xub_StrLen nLen ) { MarkOrClearKashidaInvalid( nStt, nLen, false, 0 ); } + +/** Marks nCnt kashida positions as invalid + pKashidaPositions: array of char indices relative to the paragraph +*/ + bool MarkKashidasInvalid ( xub_StrLen nCnt, xub_StrLen* pKashidaPositions ); + +/** Marks nCnt kashida positions as invalid + in the given text range + */ + inline bool MarkKashidasInvalid ( xub_StrLen nCnt, xub_StrLen nStt, xub_StrLen nLen ) + { return MarkOrClearKashidaInvalid( nStt, nLen, true, nCnt ); } + +/** retrieves kashida opportunities for a given text range. + returns the number of kashida positions in the given text range + + pKashidaPositions: buffer to reveive the char indices of the + kashida opportunties relative to the paragraph +*/ + USHORT GetKashidaPositions ( xub_StrLen nStt, xub_StrLen nLen, + xub_StrLen* pKashidaPosition ); + + + + +/** Use regular blank justification instead of kashdida justification for the given line of text. + nStt Start char index of the line referring to the paragraph. + nLen Number of characters in the line +*/ + void SetNoKashidaLine ( xub_StrLen nStt, xub_StrLen nLen ); + +/** Clear forced blank justification for a given line. + nStt Start char index of the line referring to the paragraph. + nLen Number of characters in the line +*/ + void ClearNoKashidaLine ( xub_StrLen nStt, xub_StrLen nLen ); + +/** Checks if text is Arabic text. + + @descr Checks if text is Arabic text. + @param rTxt + The text to check + @param nStt + Start index of the text + @return Returns if the language is an Arabic language + */ + static sal_Bool IsArabicText( const XubString& rTxt, xub_StrLen nStt, xub_StrLen nLen ); + +/** Performes a thai justification on the kerning array + + @descr Add some extra space for thai justification to the + positions in the kerning array. + @param rTxt + The String + @param pKernArray + The printers kerning array. Optional. + @param pScrArray + The screen kerning array. Optional. + @param nIdx + Start referring to the paragraph. + @param nLen + The number of characters to be considered. + @param nSpaceAdd + The value which has to be added to the cells. + @return The number of extra spaces in the given range +*/ + static USHORT ThaiJustify( const XubString& rTxt, sal_Int32* pKernArray, + sal_Int32* pScrArray, xub_StrLen nIdx, + xub_StrLen nLen, xub_StrLen nNumberOfBlanks = 0, + long nSpaceAdd = 0 ); + + static SwScriptInfo* GetScriptInfo( const SwTxtNode& rNode, + sal_Bool bAllowInvalid = sal_False ); + + static BYTE WhichFont( xub_StrLen nIdx, const String* pTxt, const SwScriptInfo* pSI ); +}; + +inline void SwScriptInfo::SetInvalidity( const xub_StrLen nPos ) +{ + if ( nPos < nInvalidityPos ) + nInvalidityPos = nPos; +}; +inline USHORT SwScriptInfo::CountScriptChg() const { return aScriptChg.Count(); } +inline xub_StrLen SwScriptInfo::GetScriptChg( const USHORT nCnt ) const +{ + ASSERT( nCnt < aScriptChg.Count(),"No ScriptChange today!"); + return aScriptChg[ nCnt ]; +} +inline BYTE SwScriptInfo::GetScriptType( const xub_StrLen nCnt ) const +{ + ASSERT( nCnt < aScriptChg.Count(),"No ScriptType today!"); + return aScriptType[ nCnt ]; +} + +inline USHORT SwScriptInfo::CountDirChg() const { return aDirChg.Count(); } +inline xub_StrLen SwScriptInfo::GetDirChg( const USHORT nCnt ) const +{ + ASSERT( nCnt < aDirChg.Count(),"No DirChange today!"); + return aDirChg[ nCnt ]; +} +inline BYTE SwScriptInfo::GetDirType( const xub_StrLen nCnt ) const +{ + ASSERT( nCnt < aDirChg.Count(),"No DirType today!"); + return aDirType[ nCnt ]; +} + +inline USHORT SwScriptInfo::CountKashida() const { return aKashida.Count(); } +inline xub_StrLen SwScriptInfo::GetKashida( const USHORT nCnt ) const +{ + ASSERT( nCnt < aKashida.Count(),"No Kashidas today!"); + return aKashida[ nCnt ]; +} + +inline USHORT SwScriptInfo::CountCompChg() const { return aCompChg.Count(); }; +inline xub_StrLen SwScriptInfo::GetCompStart( const USHORT nCnt ) const +{ + ASSERT( nCnt < aCompChg.Count(),"No CompressionStart today!"); + return aCompChg[ nCnt ]; +} +inline xub_StrLen SwScriptInfo::GetCompLen( const USHORT nCnt ) const +{ + ASSERT( nCnt < aCompChg.Count(),"No CompressionLen today!"); + return aCompLen[ nCnt ]; +} + +inline BYTE SwScriptInfo::GetCompType( const USHORT nCnt ) const +{ + ASSERT( nCnt < aCompChg.Count(),"No CompressionType today!"); + return aCompType[ nCnt ]; +} + +inline USHORT SwScriptInfo::CountHiddenChg() const { return aHiddenChg.Count(); }; +inline xub_StrLen SwScriptInfo::GetHiddenChg( const USHORT nCnt ) const +{ + ASSERT( nCnt < aHiddenChg.Count(),"No HiddenChg today!"); + return aHiddenChg[ nCnt ]; +} + + +#endif |