diff options
Diffstat (limited to 'sw/source/core/tox/txmsrt.cxx')
-rw-r--r-- | sw/source/core/tox/txmsrt.cxx | 952 |
1 files changed, 952 insertions, 0 deletions
diff --git a/sw/source/core/tox/txmsrt.cxx b/sw/source/core/tox/txmsrt.cxx new file mode 100644 index 000000000000..61f873b010b7 --- /dev/null +++ b/sw/source/core/tox/txmsrt.cxx @@ -0,0 +1,952 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + + +#include <tools/resid.hxx> +#include <unotools/charclass.hxx> +#include <com/sun/star/i18n/CollatorOptions.hpp> +#include <editeng/unolingu.hxx> +#include <txtfld.hxx> +#include <doc.hxx> +#include <docary.hxx> +#include <cntfrm.hxx> +#include <node.hxx> +#include <frmatr.hxx> +#include <pam.hxx> +#include <txttxmrk.hxx> +#include <frmfmt.hxx> +#include <fmtfld.hxx> +#include <txmsrt.hxx> +#include <ndtxt.hxx> +#include <txtatr.hxx> +#include <swtable.hxx> +#include <expfld.hxx> +#include <authfld.hxx> +#include <toxwrap.hxx> + +#ifndef _COMCORE_HRC +#include <comcore.hrc> +#endif +#include <numrule.hxx> + +extern BOOL IsFrameBehind( const SwTxtNode& rMyNd, xub_StrLen nMySttPos, + const SwTxtNode& rBehindNd, xub_StrLen nSttPos ); + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using ::rtl::OUString; +/*-------------------------------------------------------------------- + Beschreibung: Strings initialisieren + --------------------------------------------------------------------*/ + +USHORT SwTOXSortTabBase::nOpt = 0; + +SV_IMPL_VARARR( SwTOXSources, SwTOXSource ) + + +SwTOXInternational::SwTOXInternational( LanguageType nLang, USHORT nOpt, + const String& rSortAlgorithm ) : + eLang( nLang ), + sSortAlgorithm(rSortAlgorithm), + nOptions( nOpt ) +{ + Init(); +} + +SwTOXInternational::SwTOXInternational( const SwTOXInternational& rIntl ) : + eLang( rIntl.eLang ), + sSortAlgorithm(rIntl.sSortAlgorithm), + nOptions( rIntl.nOptions ) +{ + Init(); +} + +void SwTOXInternational::Init() +{ + pIndexWrapper = new IndexEntrySupplierWrapper(); + + const lang::Locale aLcl( SvxCreateLocale( eLang ) ); + pIndexWrapper->SetLocale( aLcl ); + + if(!sSortAlgorithm.Len()) + { + Sequence < OUString > aSeq( pIndexWrapper->GetAlgorithmList( aLcl )); + if(aSeq.getLength()) + sSortAlgorithm = aSeq.getConstArray()[0]; + } + + if ( nOptions & nsSwTOIOptions::TOI_CASE_SENSITIVE ) + pIndexWrapper->LoadAlgorithm( aLcl, sSortAlgorithm, 0 ); + else + pIndexWrapper->LoadAlgorithm( aLcl, sSortAlgorithm, SW_COLLATOR_IGNORES ); + + pCharClass = new CharClass( aLcl ); + +} + +SwTOXInternational::~SwTOXInternational() +{ + delete pCharClass; + delete pIndexWrapper; +} + +String SwTOXInternational::ToUpper( const String& rStr, xub_StrLen nPos ) const +{ + return pCharClass->toUpper( rStr, nPos, 1 ); +} +inline BOOL SwTOXInternational::IsNumeric( const String& rStr ) const +{ + return pCharClass->isNumeric( rStr ); +} + +sal_Int32 SwTOXInternational::Compare( const String& rTxt1, const String& rTxtReading1, + const lang::Locale& rLocale1, + const String& rTxt2, const String& rTxtReading2, + const lang::Locale& rLocale2 ) const +{ + return pIndexWrapper->CompareIndexEntry( rTxt1, rTxtReading1, rLocale1, + rTxt2, rTxtReading2, rLocale2 ); +} + +String SwTOXInternational::GetIndexKey( const String& rTxt, const String& rTxtReading, + const lang::Locale& rLocale ) const +{ + return pIndexWrapper->GetIndexKey( rTxt, rTxtReading, rLocale ); +} + +String SwTOXInternational::GetFollowingText( BOOL bMorePages ) const +{ + return pIndexWrapper->GetFollowingText( bMorePages ); +} + +/*-------------------------------------------------------------------- + Beschreibung: SortierElement fuer Verzeichniseintraege + --------------------------------------------------------------------*/ + + +SwTOXSortTabBase::SwTOXSortTabBase( TOXSortType nTyp, const SwCntntNode* pNd, + const SwTxtTOXMark* pMark, + const SwTOXInternational* pInter, + const lang::Locale* pLocale ) + : pTOXNd( 0 ), pTxtMark( pMark ), pTOXIntl( pInter ), + nPos( 0 ), nCntPos( 0 ), nType( static_cast<USHORT>(nTyp) ), bValidTxt( FALSE ) +{ + if ( pLocale ) + aLocale = *pLocale; + + if( pNd ) + { + xub_StrLen n = 0; + if( pTxtMark ) + n = *pTxtMark->GetStart(); + SwTOXSource aTmp( pNd, n, + pTxtMark ? pTxtMark->GetTOXMark().IsMainEntry() : FALSE ); + aTOXSources.Insert( aTmp, aTOXSources.Count() ); + + nPos = pNd->GetIndex(); + + switch( nTyp ) + { + case TOX_SORT_CONTENT: + case TOX_SORT_PARA: + case TOX_SORT_TABLE: + // falls sie in Sonderbereichen stehen, sollte man die + // Position im Body besorgen + if( nPos < pNd->GetNodes().GetEndOfExtras().GetIndex() ) + { + // dann die "Anker" (Body) Position holen. + Point aPt; + const SwCntntFrm* pFrm = pNd->GetFrm( &aPt, 0, FALSE ); + if( pFrm ) + { + SwPosition aPos( *pNd ); + const SwDoc& rDoc = *pNd->GetDoc(); +#ifdef DBG_UTIL + ASSERT( GetBodyTxtNode( rDoc, aPos, *pFrm ), + "wo steht der Absatz" ); +#else + GetBodyTxtNode( rDoc, aPos, *pFrm ); +#endif + nPos = aPos.nNode.GetIndex(); + nCntPos = aPos.nContent.GetIndex(); + } + } + else + nCntPos = n; + break; + default: break; + } + } +} + + +String SwTOXSortTabBase::GetURL() const +{ + return aEmptyStr; +} + +void SwTOXSortTabBase::FillText( SwTxtNode& rNd, const SwIndex& rInsPos, + USHORT ) const +{ + String sMyTxt; + String sMyTxtReading; + + GetTxt( sMyTxt, sMyTxtReading ); + + rNd.InsertText( sMyTxt, rInsPos ); +} + +BOOL SwTOXSortTabBase::operator==( const SwTOXSortTabBase& rCmp ) +{ + BOOL bRet = nPos == rCmp.nPos && nCntPos == rCmp.nCntPos && + (!aTOXSources[0].pNd || !rCmp.aTOXSources[0].pNd || + aTOXSources[0].pNd == rCmp.aTOXSources[0].pNd ); + + if( TOX_SORT_CONTENT == nType ) + { + bRet = bRet && pTxtMark && rCmp.pTxtMark && + *pTxtMark->GetStart() == *rCmp.pTxtMark->GetStart(); + + if( bRet ) + { + // beide Pointer vorhanden -> vergleiche Text + // beide Pointer nicht vorhanden -> vergleiche AlternativText + const xub_StrLen *pEnd = pTxtMark->GetEnd(), + *pEndCmp = rCmp.pTxtMark->GetEnd(); + + String sMyTxt; + String sMyTxtReading; + GetTxt( sMyTxt, sMyTxtReading ); + + String sOtherTxt; + String sOtherTxtReading; + rCmp.GetTxt( sOtherTxt, sOtherTxtReading ); + + bRet = ( ( pEnd && pEndCmp ) || ( !pEnd && !pEndCmp ) ) && + pTOXIntl->IsEqual( sMyTxt, sMyTxtReading, GetLocale(), + sOtherTxt, sOtherTxtReading, rCmp.GetLocale() ); + } + } + return bRet; +} + +BOOL SwTOXSortTabBase::operator<( const SwTOXSortTabBase& rCmp ) +{ + if( nPos < rCmp.nPos ) + return TRUE; + + if( nPos == rCmp.nPos ) + { + if( nCntPos < rCmp.nCntPos ) + return TRUE; + + if( nCntPos == rCmp.nCntPos ) + { + const SwNode* pFirst = aTOXSources[0].pNd; + const SwNode* pNext = rCmp.aTOXSources[0].pNd; + + if( pFirst && pFirst == pNext ) + { + if( TOX_SORT_CONTENT == nType && pTxtMark && rCmp.pTxtMark ) + { + if( *pTxtMark->GetStart() < *rCmp.pTxtMark->GetStart() ) + return TRUE; + + if( *pTxtMark->GetStart() == *rCmp.pTxtMark->GetStart() ) + { + const xub_StrLen *pEnd = pTxtMark->GetEnd(), + *pEndCmp = rCmp.pTxtMark->GetEnd(); + + String sMyTxt; + String sMyTxtReading; + GetTxt( sMyTxt, sMyTxtReading ); + + String sOtherTxt; + String sOtherTxtReading; + rCmp.GetTxt( sOtherTxt, sOtherTxtReading ); + + // beide Pointer vorhanden -> vergleiche Text + // beide Pointer nicht vorhanden -> vergleiche AlternativText + if( ( pEnd && pEndCmp ) || ( !pEnd && !pEndCmp ) ) + pTOXIntl->IsEqual( sMyTxt, sMyTxtReading, GetLocale(), + sOtherTxt, sOtherTxtReading, rCmp.GetLocale() ); + + if( pEnd && !pEndCmp ) + return TRUE; + } + } + } + else if( pFirst && pFirst->IsTxtNode() && + pNext && pNext->IsTxtNode() ) + return ::IsFrameBehind( *(SwTxtNode*)pNext, nCntPos, + *(SwTxtNode*)pFirst, nCntPos ); + } + } + return FALSE; +} + +/*-------------------------------------------------------------------- + Beschreibung: sortierter Stichworteintrag + --------------------------------------------------------------------*/ + + +SwTOXIndex::SwTOXIndex( const SwTxtNode& rNd, + const SwTxtTOXMark* pMark, USHORT nOptions, + BYTE nKyLevel, + const SwTOXInternational& rIntl, + const lang::Locale& rLocale ) + : SwTOXSortTabBase( TOX_SORT_INDEX, &rNd, pMark, &rIntl, &rLocale ), + nKeyLevel(nKyLevel) +{ + nPos = rNd.GetIndex(); + nOpt = nOptions; +} + +// +// Stichworte vergleichen. Bezieht sich nur auf den Text +// + + +BOOL SwTOXIndex::operator==( const SwTOXSortTabBase& rCmpBase ) +{ + SwTOXIndex& rCmp = (SwTOXIndex&)rCmpBase; + + // In Abhaengigkeit von den Optionen Grosskleinschreibung beachten + if(GetLevel() != rCmp.GetLevel() || nKeyLevel != rCmp.nKeyLevel) + return FALSE; + + ASSERT(pTxtMark, "pTxtMark == 0, Kein Stichwort"); + + String sMyTxt; + String sMyTxtReading; + GetTxt( sMyTxt, sMyTxtReading ); + + String sOtherTxt; + String sOtherTxtReading; + rCmp.GetTxt( sOtherTxt, sOtherTxtReading ); + + BOOL bRet = pTOXIntl->IsEqual( sMyTxt, sMyTxtReading, GetLocale(), + sOtherTxt, sOtherTxtReading, rCmp.GetLocale() ); + + // Wenn nicht zusammengefasst wird muss die Pos aus gewertet werden + if(bRet && !(GetOptions() & nsSwTOIOptions::TOI_SAME_ENTRY)) + bRet = nPos == rCmp.nPos; + + return bRet; +} + +// +// kleiner haengt nur vom Text ab + + +// + +BOOL SwTOXIndex::operator<( const SwTOXSortTabBase& rCmpBase ) +{ + SwTOXIndex& rCmp = (SwTOXIndex&)rCmpBase; + + ASSERT(pTxtMark, "pTxtMark == 0, Kein Stichwort"); + + String sMyTxt; + String sMyTxtReading; + GetTxt( sMyTxt, sMyTxtReading ); + + String sOtherTxt; + String sOtherTxtReading; + rCmp.GetTxt( sOtherTxt, sOtherTxtReading ); + + BOOL bRet = GetLevel() == rCmp.GetLevel() && + pTOXIntl->IsLess( sMyTxt, sMyTxtReading, GetLocale(), + sOtherTxt, sOtherTxtReading, rCmp.GetLocale() ); + + // Wenn nicht zusammengefasst wird muss die Pos aus gewertet werden + if( !bRet && !(GetOptions() & nsSwTOIOptions::TOI_SAME_ENTRY) ) + { + bRet = pTOXIntl->IsEqual( sMyTxt, sMyTxtReading, GetLocale(), + sOtherTxt, sOtherTxtReading, rCmp.GetLocale() ) && + nPos < rCmp.nPos; + } + + return bRet; +} + +// +// Das Stichwort selbst + + +// + +void SwTOXIndex::_GetText( String& rTxt, String& rTxtReading ) +{ + ASSERT(pTxtMark, "pTxtMark == 0, Kein Stichwort"); + const SwTOXMark& rTOXMark = pTxtMark->GetTOXMark(); + switch(nKeyLevel) + { + case FORM_PRIMARY_KEY : + { + rTxt = rTOXMark.GetPrimaryKey(); + rTxtReading = rTOXMark.GetPrimaryKeyReading(); + } + break; + case FORM_SECONDARY_KEY : + { + rTxt = rTOXMark.GetSecondaryKey(); + rTxtReading = rTOXMark.GetSecondaryKeyReading(); + } + break; + case FORM_ENTRY : + { + rTxt = rTOXMark.GetText(); + rTxtReading = rTOXMark.GetTextReading(); + } + break; + } + // if TOI_INITIAL_CAPS is set, first character is to be capitalized + if( nsSwTOIOptions::TOI_INITIAL_CAPS & nOpt && pTOXIntl ) + { + String sUpper( pTOXIntl->ToUpper( rTxt, 0 )); + rTxt.Erase( 0, 1 ).Insert( sUpper, 0 ); + } +} + +void SwTOXIndex::FillText( SwTxtNode& rNd, const SwIndex& rInsPos, USHORT ) const +{ + const xub_StrLen* pEnd = pTxtMark->GetEnd(); + String sTmp; + String sTmpReading; + if( pEnd && !pTxtMark->GetTOXMark().IsAlternativeText() && + 0 == (GetOptions() & nsSwTOIOptions::TOI_KEY_AS_ENTRY)) + { + sTmp = ((SwTxtNode*)aTOXSources[0].pNd)->GetExpandTxt( + *pTxtMark->GetStart(), + *pEnd - *pTxtMark->GetStart()); + if(nsSwTOIOptions::TOI_INITIAL_CAPS&nOpt && pTOXIntl) + { + String sUpper( pTOXIntl->ToUpper( sTmp, 0 )); + sTmp.Erase( 0, 1 ).Insert( sUpper, 0 ); + } + } + else + GetTxt( sTmp, sTmpReading ); + + rNd.InsertText( sTmp, rInsPos ); +} + + + +USHORT SwTOXIndex::GetLevel() const +{ + ASSERT(pTxtMark, "pTxtMark == 0, Kein Stichwort"); + + USHORT nForm = FORM_PRIMARY_KEY; + + if( 0 == (GetOptions() & nsSwTOIOptions::TOI_KEY_AS_ENTRY)&& + pTxtMark->GetTOXMark().GetPrimaryKey().Len() ) + { + nForm = FORM_SECONDARY_KEY; + if( pTxtMark->GetTOXMark().GetSecondaryKey().Len() ) + nForm = FORM_ENTRY; + } + return nForm; +} + +/*-------------------------------------------------------------------- + Beschreibung: Schluessel und Trennzeichen + --------------------------------------------------------------------*/ + + +SwTOXCustom::SwTOXCustom(const String& rStr, const String& rReading, + USHORT nLevel, + const SwTOXInternational& rIntl, + const lang::Locale& rLocale ) + : SwTOXSortTabBase( TOX_SORT_CUSTOM, 0, 0, &rIntl, &rLocale ), + aKey(rStr), sReading(rReading), nLev(nLevel) +{ +} + + +BOOL SwTOXCustom::operator==(const SwTOXSortTabBase& rCmpBase) +{ + String sMyTxt; + String sMyTxtReading; + GetTxt( sMyTxt, sMyTxtReading ); + + String sOtherTxt; + String sOtherTxtReading; + rCmpBase.GetTxt( sOtherTxt, sOtherTxtReading ); + + return GetLevel() == rCmpBase.GetLevel() && + pTOXIntl->IsEqual( sMyTxt, sMyTxtReading, GetLocale(), + sOtherTxt, sOtherTxtReading, rCmpBase.GetLocale() ); +} + + +BOOL SwTOXCustom::operator < (const SwTOXSortTabBase& rCmpBase) +{ + String sMyTxt; + String sMyTxtReading; + GetTxt( sMyTxt, sMyTxtReading ); + + String sOtherTxt; + String sOtherTxtReading; + rCmpBase.GetTxt( sOtherTxt, sOtherTxtReading ); + + return GetLevel() <= rCmpBase.GetLevel() && + pTOXIntl->IsLess( sMyTxt, sMyTxtReading, GetLocale(), + sOtherTxt, sOtherTxtReading, rCmpBase.GetLocale() ); +} + + +USHORT SwTOXCustom::GetLevel() const +{ + return nLev; +} + + +void SwTOXCustom::_GetText( String& rTxt, String &rTxtReading ) +{ + rTxt = aKey; + rTxtReading = sReading; + /// !!!!!!!!!!!!!! +} + + +/*-------------------------------------------------------------------- + Beschreibung: sortierter Inhaltsverz. Eintrag + --------------------------------------------------------------------*/ + + +SwTOXContent::SwTOXContent( const SwTxtNode& rNd, const SwTxtTOXMark* pMark, + const SwTOXInternational& rIntl) + : SwTOXSortTabBase( TOX_SORT_CONTENT, &rNd, pMark, &rIntl ) +{ +} + + +// Der Text des Inhalts +// + +void SwTOXContent::_GetText( String& rTxt, String& rTxtReading ) +{ + const xub_StrLen* pEnd = pTxtMark->GetEnd(); + if( pEnd && !pTxtMark->GetTOXMark().IsAlternativeText() ) + { + rTxt = ((SwTxtNode*)aTOXSources[0].pNd)->GetExpandTxt( + *pTxtMark->GetStart(), + *pEnd - *pTxtMark->GetStart() ); + + rTxtReading = pTxtMark->GetTOXMark().GetTextReading(); + } + else + rTxt = pTxtMark->GetTOXMark().GetAlternativeText(); +} + +void SwTOXContent::FillText( SwTxtNode& rNd, const SwIndex& rInsPos, USHORT ) const +{ + const xub_StrLen* pEnd = pTxtMark->GetEnd(); + if( pEnd && !pTxtMark->GetTOXMark().IsAlternativeText() ) + ((SwTxtNode*)aTOXSources[0].pNd)->GetExpandTxt( rNd, &rInsPos, + *pTxtMark->GetStart(), + *pEnd - *pTxtMark->GetStart() ); + else + { + String sTmp, sTmpReading; + GetTxt( sTmp, sTmpReading ); + rNd.InsertText( sTmp, rInsPos ); + } +} + +// +// Die Ebene fuer Anzeige +// + + +USHORT SwTOXContent::GetLevel() const +{ + return pTxtMark->GetTOXMark().GetLevel(); +} + +/*-------------------------------------------------------------------- + Beschreibung: Verzeichnis aus Absaetzen zusammengesammelt + --------------------------------------------------------------------*/ + +// bei Sortierung von OLE/Grafiken aufpassen !!! +// Die Position darf nicht die im Dokument, +// sondern muss die vom "Henkel" sein !! + + +SwTOXPara::SwTOXPara( const SwCntntNode& rNd, SwTOXElement eT, USHORT nLevel ) + : SwTOXSortTabBase( TOX_SORT_PARA, &rNd, 0, 0 ), + eType( eT ), + m_nLevel(nLevel), + nStartIndex(0), + nEndIndex(STRING_LEN) +{ +} + + +void SwTOXPara::_GetText( String& rTxt, String& ) +{ + const SwCntntNode* pNd = aTOXSources[0].pNd; + switch( eType ) + { + case nsSwTOXElement::TOX_SEQUENCE: + case nsSwTOXElement::TOX_TEMPLATE: + case nsSwTOXElement::TOX_OUTLINELEVEL: + { + xub_StrLen nStt = nStartIndex; +/* JP 22.01.98: + Tabs ueberspringen - macht aber keinen Sinn, solange in der TOX-Form + nicht die KapitelNummer eingestellt werden kann + const String& rTmp = ((SwTxtNode*)pNd)->GetTxt(); + while( '\t' == rTmp.GetChar( nStt ) && nStt < rTmp.Len() ) + ++nStt; +*/ + rTxt = ((SwTxtNode*)pNd)->GetExpandTxt( + nStt, + STRING_NOTFOUND == nEndIndex ? STRING_LEN : nEndIndex - nStt); + } + break; + + case nsSwTOXElement::TOX_OLE: + case nsSwTOXElement::TOX_GRAPHIC: + case nsSwTOXElement::TOX_FRAME: + { + // suche das FlyFormat, dort steht der Object/Grafik-Name + SwFrmFmt* pFly = pNd->GetFlyFmt(); + if( pFly ) + rTxt = pFly->GetName(); + else + { + ASSERT( !this, "Grafik/Object ohne Namen" ) + USHORT nId = nsSwTOXElement::TOX_OLE == eType + ? STR_OBJECT_DEFNAME + : nsSwTOXElement::TOX_GRAPHIC == eType + ? STR_GRAPHIC_DEFNAME + : STR_FRAME_DEFNAME; + rTxt = SW_RESSTR( nId ); + } + } + break; + default: break; + } +} + +void SwTOXPara::FillText( SwTxtNode& rNd, const SwIndex& rInsPos, USHORT ) const +{ + if( nsSwTOXElement::TOX_TEMPLATE == eType || nsSwTOXElement::TOX_SEQUENCE == eType || nsSwTOXElement::TOX_OUTLINELEVEL == eType) + { + SwTxtNode* pSrc = (SwTxtNode*)aTOXSources[0].pNd; + xub_StrLen nStt = nStartIndex; +/* JP 22.01.98: + Tabs ueberspringen - macht aber keinen Sinn, solange in der TOX-Form + nicht die KapitelNummer eingestellt werden kann + const String& rTxt = pSrc->GetTxt(); + while( '\t' == rTxt.GetChar( nStt ) && nStt < rTxt.Len() ) + ++nStt; +*/ + pSrc->GetExpandTxt( rNd, &rInsPos, nStt, + nEndIndex == STRING_LEN ? STRING_LEN : nEndIndex - nStt, + FALSE, FALSE, TRUE ); + } + else + { + String sTmp, sTmpReading; + GetTxt( sTmp, sTmpReading ); + sTmp.SearchAndReplaceAll('\t', ' '); + rNd.InsertText( sTmp, rInsPos ); + } +} + + +USHORT SwTOXPara::GetLevel() const +{ + USHORT nRet = m_nLevel; + const SwCntntNode* pNd = aTOXSources[0].pNd; + + if( nsSwTOXElement::TOX_OUTLINELEVEL == eType && pNd->GetTxtNode() ) + { + //USHORT nTmp = ((SwTxtNode*)pNd)->GetTxtColl()->GetOutlineLevel();//#outline level,zhaojianwei + //if(nTmp < NO_NUMBERING) + // nRet = nTmp + 1; + const int nTmp = ((SwTxtNode*)pNd)->GetAttrOutlineLevel();//#outline level,zhaojianwei???? + if(nTmp != 0 ) + nRet = static_cast<USHORT>(nTmp); + } + return nRet; +} + + +String SwTOXPara::GetURL() const +{ + String aTxt; + const SwCntntNode* pNd = aTOXSources[0].pNd; + switch( eType ) + { + case nsSwTOXElement::TOX_TEMPLATE: + case nsSwTOXElement::TOX_OUTLINELEVEL: + { + const SwTxtNode * pTxtNd = static_cast<const SwTxtNode *>(pNd); + + // --> OD 2009-08-05 #i103265# +// //if( MAXLEVEL >= pTxtNd->GetTxtColl()->GetOutlineLevel()) //#outline level,zhaojianwei +// if ( pTxtNd->GetAttrOutlineLevel() > 0) //<-end,zhaojianwei +// { +// aTxt = '#'; +// const SwNumRule * pRule = pTxtNd->GetNumRule(); +// if( pRule ) +// { +// // dann noch die rel. Nummer davor setzen +// const USHORT nCurrLevel = static_cast<USHORT>(pTxtNd->GetActualListLevel()); +// if(nCurrLevel <= MAXLEVEL) +// { +// // --> OD 2005-11-02 #i51089 - TUNING# +// if ( pTxtNd->GetNum() ) +// { +// SwNumberTree::tNumberVector aNumVector = +// pTxtNd->GetNumberVector(); + +// for( USHORT n = 0; n <= nCurrLevel; ++n ) +// { +// int nNum = aNumVector[ n ]; +// nNum -= ( pRule->Get( n ).GetStart() - 1 ); +// ( aTxt += String::CreateFromInt32( nNum )) += '.'; +// } +// } +// else +// { +// ASSERT( false, +// "<SwTOXPara::GetURL()> - text node with numbering rule, but without number. This is a serious defect -> inform OD" ); +// } +// } +// } +// aTxt += pTxtNd->GetExpandTxt(); +// ( aTxt += cMarkSeperator ).AppendAscii( pMarkToOutline ); +// } + SwDoc* pDoc = const_cast<SwDoc*>( pTxtNd->GetDoc() ); + ::sw::mark::IMark const * const pMark = pDoc->getIDocumentMarkAccess()->getMarkForTxtNode( + *(pTxtNd), + IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK); + aTxt = '#'; + const String aMarkName( pMark->GetName() ); + aTxt += aMarkName; + // <-- + } + break; + + case nsSwTOXElement::TOX_OLE: + case nsSwTOXElement::TOX_GRAPHIC: + case nsSwTOXElement::TOX_FRAME: + { + // suche das FlyFormat, dort steht der Object/Grafik-Name + SwFrmFmt* pFly = pNd->GetFlyFmt(); + if( pFly ) + { + (( aTxt = '#' ) += pFly->GetName() ) += cMarkSeperator; + const sal_Char* pStr; + switch( eType ) + { + case nsSwTOXElement::TOX_OLE: pStr = pMarkToOLE; break; + case nsSwTOXElement::TOX_GRAPHIC: pStr = pMarkToGraphic; break; + case nsSwTOXElement::TOX_FRAME: pStr = pMarkToFrame; break; + default: pStr = 0; + } + if( pStr ) + aTxt.AppendAscii( pStr ); + } + } + break; + default: break; + } + return aTxt; +} + + +/*-------------------------------------------------------------------- + Beschreibung: Tabelle + --------------------------------------------------------------------*/ + + +SwTOXTable::SwTOXTable( const SwCntntNode& rNd ) + : SwTOXSortTabBase( TOX_SORT_TABLE, &rNd, 0, 0 ), + nLevel(FORM_ALPHA_DELIMITTER) +{ +} + + +void SwTOXTable::_GetText( String& rTxt, String& ) +{ + const SwNode* pNd = aTOXSources[0].pNd; + if( pNd && 0 != ( pNd = pNd->FindTableNode() ) ) + { + rTxt = ((SwTableNode*)pNd)->GetTable().GetFrmFmt()->GetName(); + } + else + { + ASSERT( !this, "Wo ist meine Tabelle geblieben?" ) + rTxt = SW_RESSTR( STR_TABLE_DEFNAME ); + } +} + +USHORT SwTOXTable::GetLevel() const +{ + return nLevel; +} + + +String SwTOXTable::GetURL() const +{ + String aTxt; + const SwNode* pNd = aTOXSources[0].pNd; + if( pNd && 0 != ( pNd = pNd->FindTableNode() ) ) + { + aTxt = ((SwTableNode*)pNd)->GetTable().GetFrmFmt()->GetName(); + if( aTxt.Len() ) + { + ( aTxt.Insert( '#', 0 ) += cMarkSeperator ). + AppendAscii( pMarkToTable ); + } + } + return aTxt; +} +/*-- 15.09.99 14:28:08--------------------------------------------------- + + -----------------------------------------------------------------------*/ + +SwTOXAuthority::SwTOXAuthority( const SwCntntNode& rNd, + SwFmtFld& rField, const SwTOXInternational& rIntl ) : + SwTOXSortTabBase( TOX_SORT_AUTHORITY, &rNd, 0, &rIntl ), + m_rField(rField) +{ + if(rField.GetTxtFld()) + nCntPos = *rField.GetTxtFld()->GetStart(); +} + +USHORT SwTOXAuthority::GetLevel() const +{ + String sText(((SwAuthorityField*)m_rField.GetFld())-> + GetFieldText(AUTH_FIELD_AUTHORITY_TYPE)); + //#i18655# the level '0' is the heading level therefor the values are incremented here + USHORT nRet = 1; + if( pTOXIntl->IsNumeric( sText ) ) + { + nRet = (USHORT)sText.ToInt32(); + nRet++; + } + //illegal values are also set to 'ARTICLE' as non-numeric values are + if(nRet > AUTH_TYPE_END) + nRet = 1; + return nRet; +} +/*-- 15.09.99 14:28:08--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwTOXAuthority::_GetText( String& rTxt, String& ) +{ + bool const isClipBoard( + m_rField.GetTxtFld()->GetTxtNode().GetDoc()->IsClipBoard()); + rTxt = m_rField.GetFld()->ExpandField(isClipBoard); +} + +/* -----------------21.09.99 12:50------------------- + + --------------------------------------------------*/ +void SwTOXAuthority::FillText( SwTxtNode& rNd, + const SwIndex& rInsPos, USHORT nAuthField ) const +{ + SwAuthorityField* pField = (SwAuthorityField*)m_rField.GetFld(); + String sText; + if(AUTH_FIELD_IDENTIFIER == nAuthField) + { + sText = pField->Expand(); + const SwAuthorityFieldType* pType = (const SwAuthorityFieldType*)pField->GetTyp(); + sal_Unicode cChar = pType->GetPrefix(); + if(cChar && cChar != ' ') + sText.Erase(0, 1); + cChar = pType->GetSuffix(); + if(cChar && cChar != ' ') + sText.Erase(sText.Len() - 1, 1); + } + else if(AUTH_FIELD_AUTHORITY_TYPE == nAuthField) + { + USHORT nLevel = GetLevel(); + if(nLevel) + sText = SwAuthorityFieldType::GetAuthTypeName((ToxAuthorityType) --nLevel); + } + else + sText = (pField->GetFieldText((ToxAuthorityField) nAuthField)); + rNd.InsertText( sText, rInsPos ); +} +/* -----------------14.10.99 09:35------------------- + + --------------------------------------------------*/ +BOOL SwTOXAuthority::operator==( const SwTOXSortTabBase& rCmp) +{ + return nType == rCmp.nType && + ((SwAuthorityField*)m_rField.GetFld())->GetHandle() == + ((SwAuthorityField*)((SwTOXAuthority&)rCmp).m_rField.GetFld())->GetHandle(); +} +/* -----------------21.10.99 09:52------------------- + + --------------------------------------------------*/ +BOOL SwTOXAuthority::operator<( const SwTOXSortTabBase& rBase) +{ + BOOL bRet = FALSE; + SwAuthorityField* pField = (SwAuthorityField*)m_rField.GetFld(); + SwAuthorityFieldType* pType = (SwAuthorityFieldType*) + pField->GetTyp(); + if(pType->IsSortByDocument()) + bRet = SwTOXSortTabBase::operator<(rBase); + else + { + SwAuthorityField* pCmpField = (SwAuthorityField*) + ((SwTOXAuthority&)rBase).m_rField.GetFld(); + + + for(USHORT i = 0; i < pType->GetSortKeyCount(); i++) + { + const SwTOXSortKey* pKey = pType->GetSortKey(i); + String sMyTxt = pField->GetFieldText(pKey->eField); + String sMyTxtReading; + String sOtherTxt = pCmpField->GetFieldText(pKey->eField); + String sOtherTxtReading; + + sal_Int32 nComp = pTOXIntl->Compare( sMyTxt, sMyTxtReading, GetLocale(), + sOtherTxt, sOtherTxtReading, rBase.GetLocale() ); + + if( nComp ) + { + bRet = (-1 == nComp) == pKey->bSortAscending; + break; + } + } + } + return bRet; +} |