diff options
author | jp <jp@openoffice.org> | 2000-12-21 08:34:37 +0000 |
---|---|---|
committer | jp <jp@openoffice.org> | 2000-12-21 08:34:37 +0000 |
commit | c061858e723f718a172e60c9f3aac0e3e7a6c330 (patch) | |
tree | f9c82c6b262b70340e8e1a4883de9b0a00183c7a /sw | |
parent | 52c520fd72373eb4d5ccd5edbb73e896c8731038 (diff) |
Iterator for script changes and attributes inclusive the script changes
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/txatritr.hxx | 137 | ||||
-rw-r--r-- | sw/source/core/txtnode/txatritr.cxx | 310 |
2 files changed, 447 insertions, 0 deletions
diff --git a/sw/inc/txatritr.hxx b/sw/inc/txatritr.hxx new file mode 100644 index 000000000000..97b3207c3836 --- /dev/null +++ b/sw/inc/txatritr.hxx @@ -0,0 +1,137 @@ +/************************************************************************* + * + * $RCSfile: txatritr.hxx,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: jp $ $Date: 2000-12-21 09:34:37 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef _TXATRITR_HXX +#define _TXATRITR_HXX + +#ifndef _SOLAR_H +#include <tools/solar.h> +#endif +#ifndef _SAL_TYPES_H_ +#include <sal/types.h> +#endif +#ifndef _SVARRAY_HXX +#include <svtools/svarray.hxx> +#endif + +class String; +class SwTxtNode; +class SwTxtAttr; +class SfxPoolItem; + + +class SwScriptIterator +{ + const String& rText; + xub_StrLen nChgPos; + sal_uInt16 nCurScript; + +public: + SwScriptIterator( const String& rStr, xub_StrLen nStart = 0 ); + + sal_Bool Next(); + + sal_uInt16 GetCurrScript() const { return nCurScript; } + xub_StrLen GetScriptChgPos() const { return nChgPos; } + const String& GetText() const { return rText; } +}; + + +class SwTxtAttrIterator +{ + SwScriptIterator aSIter; + SvPtrarr aStack; + const SwTxtNode& rTxtNd; + const SfxPoolItem *pParaItem, *pCurItem; + xub_StrLen nChgPos; + sal_uInt16 nAttrPos, nWhichId; + + USHORT GetWhichId() const; + void AddToStack( const SwTxtAttr& rAttr ); + void SearchNextChg(); + +public: + SwTxtAttrIterator( const SwTxtNode& rTxtNd, USHORT nWhichId, + xub_StrLen nStart = 0 ); + + sal_Bool Next(); + + const SfxPoolItem& GetAttr() const { return *pCurItem; } + xub_StrLen GetChgPos() const { return nChgPos; } +}; + + +#ifdef ITEMID_LANGUAGE + +class SwLanguageIterator : public SwTxtAttrIterator +{ +public: + SwLanguageIterator( const SwTxtNode& rTxtNd, xub_StrLen nStart = 0 ) + : SwTxtAttrIterator( rTxtNd, RES_CHRATR_LANGUAGE, nStart ) + {} + + sal_uInt16 GetLanguage() const + { return ((SvxLanguageItem&)GetAttr()).GetValue(); } +}; + +#endif + + +#endif diff --git a/sw/source/core/txtnode/txatritr.cxx b/sw/source/core/txtnode/txatritr.cxx new file mode 100644 index 000000000000..a160f52f8d8a --- /dev/null +++ b/sw/source/core/txtnode/txatritr.cxx @@ -0,0 +1,310 @@ +/************************************************************************* + * + * $RCSfile: txatritr.cxx,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: jp $ $Date: 2000-12-21 09:34:25 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _HINTIDS_HXX +#include <hintids.hxx> +#endif + +#ifndef _COM_SUN_STAR_I18N_SCRIPTTYPE_HDL_ +#include <com/sun/star/i18n/ScriptType.hdl> +#endif +#ifndef _STRING_HXX +#include <tools/string.hxx> +#endif +#ifndef _SVX_LANGITEM_HXX +#include <svx/langitem.hxx> +#endif + +#ifndef _TXATRITR_HXX +#include <txatritr.hxx> +#endif +#ifndef _FCHRFMT_HXX +#include <fchrfmt.hxx> +#endif +#ifndef _CHARFMT_HXX +#include <charfmt.hxx> +#endif +#ifndef _BREAKIT_HXX +#include <breakit.hxx> +#endif +#ifndef _NDTXT_HXX +#include <ndtxt.hxx> +#endif +#ifndef _TXATBASE_HXX +#include <txatbase.hxx> +#endif + +using namespace ::com::sun::star::i18n; + + +SwScriptIterator::SwScriptIterator( const String& rStr, xub_StrLen nStt ) + : rText( rStr ), nChgPos( rStr.Len() ), nCurScript( ScriptType::WEAK ) +{ + if( pBreakIt->xBreak.is() ) + { + xub_StrLen nPos = nStt; + nCurScript = pBreakIt->xBreak->getScriptType( rText, nPos ); + if( ScriptType::WEAK == nCurScript ) + { + if( nPos ) + { + nPos = (xub_StrLen)pBreakIt->xBreak->beginOfScript( + rText, nPos, nCurScript ); + if( nPos && nPos < rText.Len() ) + { + nStt = --nPos; + nCurScript = pBreakIt->xBreak->getScriptType( rText,nPos); + } + } + } + + nChgPos = (xub_StrLen)pBreakIt->xBreak->endOfScript( + rText, nStt, nCurScript ); + } +} + +sal_Bool SwScriptIterator::Next() +{ + sal_Bool bRet = sal_False; + if( pBreakIt->xBreak.is() && nChgPos < rText.Len() ) + { + nCurScript = pBreakIt->xBreak->getScriptType( rText, nChgPos ); + nChgPos = (xub_StrLen)pBreakIt->xBreak->endOfScript( + rText, nChgPos, nCurScript ); + bRet = sal_True; + } + else + nChgPos = rText.Len(); + return bRet; +} + +// -------------------------------------------------------------------- + +SwTxtAttrIterator::SwTxtAttrIterator( const SwTxtNode& rTNd, USHORT nWhchId, + xub_StrLen nStt ) + : aSIter( rTNd.GetTxt(), nStt ), rTxtNd( rTNd ), + nChgPos( nStt ), nAttrPos( 0 ), pParaItem( 0 ), nWhichId( nWhchId ) +{ + SearchNextChg(); +} + +sal_Bool SwTxtAttrIterator::Next() +{ + sal_Bool bRet = sal_False; + if( nChgPos < aSIter.GetText().Len() ) + { + bRet = sal_True; + if( aStack.Count() ) + { + do { + const SwTxtAttr* pHt = (SwTxtAttr*)aStack[ 0 ]; + USHORT nEndPos = *pHt->GetEnd(); + if( nChgPos >= nEndPos ) + aStack.Remove( 0 ); + else + break; + } while( aStack.Count() ); + } + + if( aStack.Count() ) + { + sal_uInt16 nSavePos = nAttrPos; + SearchNextChg(); + if( aStack.Count() ) + { + const SwTxtAttr* pHt = (SwTxtAttr*)aStack[ 0 ]; + USHORT nEndPos = *pHt->GetEnd(); + if( nChgPos >= nEndPos ) + { + nChgPos = nEndPos; + nAttrPos = nSavePos; + + if( RES_TXTATR_CHARFMT == pHt->Which() ) + pCurItem = &pHt->GetCharFmt().GetCharFmt()-> + GetAttr( GetWhichId() ); + else + pCurItem = &pHt->GetAttr(); + + aStack.Remove( 0 ); + } + } + } + else + SearchNextChg(); + } + return bRet; +} + +USHORT SwTxtAttrIterator::GetWhichId() const +{ + USHORT nRet = nWhichId; + switch( nRet ) + { + case RES_CHRATR_LANGUAGE: + switch( aSIter.GetCurrScript() ) + { + case ScriptType::ASIAN: nRet = RES_CHRATR_CJK_LANGUAGE; break; + case ScriptType::COMPLEX: nRet = RES_CHRATR_CTL_LANGUAGE; break; + } + break; + case RES_CHRATR_FONT: + switch( aSIter.GetCurrScript() ) + { + case ScriptType::ASIAN: nRet = RES_CHRATR_CJK_FONT; break; + case ScriptType::COMPLEX: nRet = RES_CHRATR_CTL_FONT; break; + } + break; + case RES_CHRATR_FONTSIZE: + switch( aSIter.GetCurrScript() ) + { + case ScriptType::ASIAN: nRet = RES_CHRATR_CJK_FONTSIZE; break; + case ScriptType::COMPLEX: nRet = RES_CHRATR_CTL_FONTSIZE; break; + } + break; + case RES_CHRATR_WEIGHT: + switch( aSIter.GetCurrScript() ) + { + case ScriptType::ASIAN: nRet = RES_CHRATR_CJK_WEIGHT; break; + case ScriptType::COMPLEX: nRet = RES_CHRATR_CTL_WEIGHT; break; + } + break; + case RES_CHRATR_POSTURE: + switch( aSIter.GetCurrScript() ) + { + case ScriptType::ASIAN: nRet = RES_CHRATR_CJK_POSTURE; break; + case ScriptType::COMPLEX: nRet = RES_CHRATR_CTL_POSTURE; break; + } + break; + } + return nRet; +} + +void SwTxtAttrIterator::AddToStack( const SwTxtAttr& rAttr ) +{ + void* pAdd = (void*)&rAttr; + USHORT nIns = 0, nEndPos = *rAttr.GetEnd(); + for( ; nIns < aStack.Count(); ++nIns ) + if( *((SwTxtAttr*)aStack[ nIns ] )->GetEnd() > nEndPos ) + break; + + aStack.Insert( pAdd, nIns ); +} + +void SwTxtAttrIterator::SearchNextChg() +{ + USHORT nWh = 0; + if( nChgPos == aSIter.GetScriptChgPos() ) + { + aSIter.Next(); + pParaItem = 0; + nAttrPos = 0; // must be restart at the beginning, because + // some attributes can start before or inside + // the current scripttype! + aStack.Remove( 0, aStack.Count() ); + } + if( !pParaItem ) + pParaItem = &rTxtNd.GetSwAttrSet().Get( nWh = GetWhichId() ); + + xub_StrLen nStt = nChgPos; + nChgPos = aSIter.GetScriptChgPos(); + pCurItem = pParaItem; + + const SwpHints* pHts = rTxtNd.GetpSwpHints(); + if( pHts ) + { + if( !nWh ) + nWh = GetWhichId(); + + const SfxPoolItem* pItem; + SwFmt* pFmt; + for( ; nAttrPos < pHts->Count(); ++nAttrPos ) + { + const SwTxtAttr* pHt = (*pHts)[ nAttrPos ]; + const USHORT* pEnd = pHt->GetEnd(); + const USHORT nHtStt = *pHt->GetStart(); + if( nHtStt < nStt && ( !pEnd || *pEnd <= nStt )) + continue; + + if( nHtStt >= nChgPos ) + break; + + if( ( nWh == pHt->Which() && 0 != (pItem = &pHt->GetAttr()) ) || + ( RES_TXTATR_CHARFMT == pHt->Which() && + 0 != (pFmt = pHt->GetCharFmt().GetCharFmt()) && + SFX_ITEM_SET == pFmt->GetItemState( nWh, TRUE, &pItem )) ) + { + if( nHtStt > nStt ) + { + if( nChgPos > nHtStt ) + nChgPos = nHtStt; + break; + } + AddToStack( *pHt ); + pCurItem = pItem; + if( *pEnd < nChgPos ) + nChgPos = *pEnd; + } + } + } +} + + |