summaryrefslogtreecommitdiff
path: root/svx/source/editeng/editdoc.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/editeng/editdoc.cxx')
-rw-r--r--svx/source/editeng/editdoc.cxx2318
1 files changed, 0 insertions, 2318 deletions
diff --git a/svx/source/editeng/editdoc.cxx b/svx/source/editeng/editdoc.cxx
deleted file mode 100644
index c43c91a02d1f..000000000000
--- a/svx/source/editeng/editdoc.cxx
+++ /dev/null
@@ -1,2318 +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: editdoc.cxx,v $
- * $Revision: 1.48.148.1 $
- *
- * 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 <eeng_pch.hxx>
-
-#include <svx/tstpitem.hxx>
-#include <svx/colritem.hxx>
-#include <fontitem.hxx>
-#include <svx/crsditem.hxx>
-#include <svx/fhgtitem.hxx>
-#include <svx/postitem.hxx>
-#include <svx/kernitem.hxx>
-#include <svx/wrlmitem.hxx>
-#include <svx/wghtitem.hxx>
-#include <svx/udlnitem.hxx>
-#include <svx/cntritem.hxx>
-#include <svx/escpitem.hxx>
-#include <svx/shdditem.hxx>
-#include <svx/akrnitem.hxx>
-#include <svx/cscoitem.hxx>
-#include <svx/langitem.hxx>
-#include <svx/emphitem.hxx>
-#include <svx/charscaleitem.hxx>
-#include <svx/charreliefitem.hxx>
-#include <xmlcnitm.hxx>
-
-#include <editdoc.hxx>
-#include <editdbg.hxx>
-#include <eerdll.hxx>
-#include <eerdll2.hxx>
-#include <tools/stream.hxx>
-
-#include <tools/debug.hxx>
-#include <tools/shl.hxx>
-#include <vcl/svapp.hxx>
-
-#ifndef _COM_SUN_STAR_TEXT_SCRIPTTYPE_HPP_
-#include <com/sun/star/i18n/ScriptType.hpp>
-#endif
-
-#include <stdlib.h> // qsort
-
-using namespace ::com::sun::star;
-
-
-// ------------------------------------------------------------
-
-USHORT GetScriptItemId( USHORT nItemId, short nScriptType )
-{
- USHORT nId = nItemId;
-
- if ( ( nScriptType == i18n::ScriptType::ASIAN ) ||
- ( nScriptType == i18n::ScriptType::COMPLEX ) )
- {
- switch ( nItemId )
- {
- case EE_CHAR_LANGUAGE:
- nId = ( nScriptType == i18n::ScriptType::ASIAN ) ? EE_CHAR_LANGUAGE_CJK : EE_CHAR_LANGUAGE_CTL;
- break;
- case EE_CHAR_FONTINFO:
- nId = ( nScriptType == i18n::ScriptType::ASIAN ) ? EE_CHAR_FONTINFO_CJK : EE_CHAR_FONTINFO_CTL;
- break;
- case EE_CHAR_FONTHEIGHT:
- nId = ( nScriptType == i18n::ScriptType::ASIAN ) ? EE_CHAR_FONTHEIGHT_CJK : EE_CHAR_FONTHEIGHT_CTL;
- break;
- case EE_CHAR_WEIGHT:
- nId = ( nScriptType == i18n::ScriptType::ASIAN ) ? EE_CHAR_WEIGHT_CJK : EE_CHAR_WEIGHT_CTL;
- break;
- case EE_CHAR_ITALIC:
- nId = ( nScriptType == i18n::ScriptType::ASIAN ) ? EE_CHAR_ITALIC_CJK : EE_CHAR_ITALIC_CTL;
- break;
- }
- }
-
- return nId;
-}
-
-BOOL IsScriptItemValid( USHORT nItemId, short nScriptType )
-{
- BOOL bValid = TRUE;
-
- switch ( nItemId )
- {
- case EE_CHAR_LANGUAGE:
- bValid = nScriptType == i18n::ScriptType::LATIN;
- break;
- case EE_CHAR_LANGUAGE_CJK:
- bValid = nScriptType == i18n::ScriptType::ASIAN;
- break;
- case EE_CHAR_LANGUAGE_CTL:
- bValid = nScriptType == i18n::ScriptType::COMPLEX;
- break;
- case EE_CHAR_FONTINFO:
- bValid = nScriptType == i18n::ScriptType::LATIN;
- break;
- case EE_CHAR_FONTINFO_CJK:
- bValid = nScriptType == i18n::ScriptType::ASIAN;
- break;
- case EE_CHAR_FONTINFO_CTL:
- bValid = nScriptType == i18n::ScriptType::COMPLEX;
- break;
- case EE_CHAR_FONTHEIGHT:
- bValid = nScriptType == i18n::ScriptType::LATIN;
- break;
- case EE_CHAR_FONTHEIGHT_CJK:
- bValid = nScriptType == i18n::ScriptType::ASIAN;
- break;
- case EE_CHAR_FONTHEIGHT_CTL:
- bValid = nScriptType == i18n::ScriptType::COMPLEX;
- break;
- case EE_CHAR_WEIGHT:
- bValid = nScriptType == i18n::ScriptType::LATIN;
- break;
- case EE_CHAR_WEIGHT_CJK:
- bValid = nScriptType == i18n::ScriptType::ASIAN;
- break;
- case EE_CHAR_WEIGHT_CTL:
- bValid = nScriptType == i18n::ScriptType::COMPLEX;
- break;
- case EE_CHAR_ITALIC:
- bValid = nScriptType == i18n::ScriptType::LATIN;
- break;
- case EE_CHAR_ITALIC_CJK:
- bValid = nScriptType == i18n::ScriptType::ASIAN;
- break;
- case EE_CHAR_ITALIC_CTL:
- bValid = nScriptType == i18n::ScriptType::COMPLEX;
- break;
- }
-
- return bValid;
-}
-
-
-// ------------------------------------------------------------
-
-// Sollte spaeter zentral nach TOOLS/STRING (Aktuell: 303)
-// fuer Grep: WS_TARGET
-
-DBG_NAME( EE_TextPortion );
-DBG_NAME( EE_EditLine );
-DBG_NAME( EE_ContentNode );
-DBG_NAME( EE_CharAttribList );
-
-SfxItemInfo aItemInfos[EDITITEMCOUNT] = {
- { SID_ATTR_FRAMEDIRECTION, SFX_ITEM_POOLABLE }, // EE_PARA_WRITINGDIR
- { 0, SFX_ITEM_POOLABLE }, // EE_PARA_XMLATTRIBS
- { SID_ATTR_PARA_HANGPUNCTUATION, SFX_ITEM_POOLABLE }, // EE_PARA_HANGINGPUNCTUATION
- { SID_ATTR_PARA_FORBIDDEN_RULES, SFX_ITEM_POOLABLE },
- { SID_ATTR_PARA_SCRIPTSPACE, SFX_ITEM_POOLABLE }, // EE_PARA_ASIANCJKSPACING
- { SID_ATTR_NUMBERING_RULE, SFX_ITEM_POOLABLE }, // EE_PARA_NUMBULL
- { 0, SFX_ITEM_POOLABLE }, // EE_PARA_HYPHENATE
- { 0, SFX_ITEM_POOLABLE }, // EE_PARA_BULLETSTATE
- { 0, SFX_ITEM_POOLABLE }, // EE_PARA_OUTLLRSPACE
- { SID_ATTR_PARA_OUTLLEVEL, SFX_ITEM_POOLABLE },
- { SID_ATTR_PARA_BULLET, SFX_ITEM_POOLABLE },
- { SID_ATTR_LRSPACE, SFX_ITEM_POOLABLE },
- { SID_ATTR_ULSPACE, SFX_ITEM_POOLABLE },
- { SID_ATTR_PARA_LINESPACE, SFX_ITEM_POOLABLE },
- { SID_ATTR_PARA_ADJUST, SFX_ITEM_POOLABLE },
- { SID_ATTR_TABSTOP, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_COLOR, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_FONT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_FONTHEIGHT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_SCALEWIDTH, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_WEIGHT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_UNDERLINE, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_STRIKEOUT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_POSTURE, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CONTOUR, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_SHADOWED, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_ESCAPEMENT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_AUTOKERN, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_KERNING, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_WORDLINEMODE, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_LANGUAGE, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CJK_LANGUAGE, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CTL_LANGUAGE, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CJK_FONT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CTL_FONT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CJK_FONTHEIGHT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CTL_FONTHEIGHT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CJK_WEIGHT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CTL_WEIGHT, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CJK_POSTURE, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_CTL_POSTURE, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_EMPHASISMARK, SFX_ITEM_POOLABLE },
- { SID_ATTR_CHAR_RELIEF, SFX_ITEM_POOLABLE },
- { 0, SFX_ITEM_POOLABLE }, // EE_CHAR_RUBI_DUMMY
- { 0, SFX_ITEM_POOLABLE }, // EE_CHAR_XMLATTRIBS
- { SID_ATTR_CHAR_OVERLINE, SFX_ITEM_POOLABLE },
- { 0, SFX_ITEM_POOLABLE }, // EE_FEATURE_TAB
- { 0, SFX_ITEM_POOLABLE }, // EE_FEATURE_LINEBR
- { SID_ATTR_CHAR_CHARSETCOLOR, SFX_ITEM_POOLABLE }, // EE_FEATURE_NOTCONV
- { SID_FIELD, SFX_ITEM_POOLABLE }
-};
-
-USHORT aV1Map[] = {
- 3999, 4001, 4002, 4003, 4004, 4005, 4006,
- 4007, 4008, 4009, 4010, 4011, 4012, 4013, 4017, 4018, 4019 // MI: 4019?
-};
-
-USHORT aV2Map[] = {
- 3999, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009,
- 4010, 4011, 4012, 4013, 4014, 4015, 4016, 4018, 4019, 4020
-};
-
-USHORT aV3Map[] = {
- 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007,
- 4009, 4010, 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019,
- 4020, 4021
-};
-
-USHORT aV4Map[] = {
- 3994, 3995, 3996, 3997, 3998, 3999, 4000, 4001, 4002, 4003,
- 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013,
- 4014, 4015, 4016, 4017, 4018,
- /* CJK Items inserted here: EE_CHAR_LANGUAGE - EE_CHAR_XMLATTRIBS */
- 4034, 4035, 4036, 4037
-};
-
-USHORT aV5Map[] = {
- 3994, 3995, 3996, 3997, 3998, 3999, 4000, 4001, 4002, 4003,
- 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013,
- 4014, 4015, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023,
- 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033,
- /* EE_CHAR_OVERLINE inserted here */
- 4035, 4036, 4037, 4038
-};
-
-SV_IMPL_PTRARR( DummyContentList, ContentNode* );
-SV_IMPL_VARARR( ScriptTypePosInfos, ScriptTypePosInfo );
-SV_IMPL_VARARR( WritingDirectionInfos, WritingDirectionInfo );
-// SV_IMPL_VARARR( ExtraCharInfos, ExtraCharInfo );
-
-
-int SAL_CALL CompareStart( const void* pFirst, const void* pSecond )
-{
- if ( (*((EditCharAttrib**)pFirst))->GetStart() < (*((EditCharAttrib**)pSecond))->GetStart() )
- return (-1);
- else if ( (*((EditCharAttrib**)pFirst))->GetStart() > (*((EditCharAttrib**)pSecond))->GetStart() )
- return (1);
- return 0;
-}
-
-EditCharAttrib* MakeCharAttrib( SfxItemPool& rPool, const SfxPoolItem& rAttr, USHORT nS, USHORT nE )
-{
- // das neue Attribut im Pool anlegen
- const SfxPoolItem& rNew = rPool.Put( rAttr );
-
- EditCharAttrib* pNew = 0;
- switch( rNew.Which() )
- {
- case EE_CHAR_LANGUAGE:
- case EE_CHAR_LANGUAGE_CJK:
- case EE_CHAR_LANGUAGE_CTL:
- {
- pNew = new EditCharAttribLanguage( (const SvxLanguageItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_COLOR:
- {
- pNew = new EditCharAttribColor( (const SvxColorItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_FONTINFO:
- case EE_CHAR_FONTINFO_CJK:
- case EE_CHAR_FONTINFO_CTL:
- {
- pNew = new EditCharAttribFont( (const SvxFontItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_FONTHEIGHT:
- case EE_CHAR_FONTHEIGHT_CJK:
- case EE_CHAR_FONTHEIGHT_CTL:
- {
- pNew = new EditCharAttribFontHeight( (const SvxFontHeightItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_FONTWIDTH:
- {
- pNew = new EditCharAttribFontWidth( (const SvxCharScaleWidthItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_WEIGHT:
- case EE_CHAR_WEIGHT_CJK:
- case EE_CHAR_WEIGHT_CTL:
- {
- pNew = new EditCharAttribWeight( (const SvxWeightItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_UNDERLINE:
- {
- pNew = new EditCharAttribUnderline( (const SvxUnderlineItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_OVERLINE:
- {
- pNew = new EditCharAttribOverline( (const SvxOverlineItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_EMPHASISMARK:
- {
- pNew = new EditCharAttribEmphasisMark( (const SvxEmphasisMarkItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_RELIEF:
- {
- pNew = new EditCharAttribRelief( (const SvxCharReliefItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_STRIKEOUT:
- {
- pNew = new EditCharAttribStrikeout( (const SvxCrossedOutItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_ITALIC:
- case EE_CHAR_ITALIC_CJK:
- case EE_CHAR_ITALIC_CTL:
- {
- pNew = new EditCharAttribItalic( (const SvxPostureItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_OUTLINE:
- {
- pNew = new EditCharAttribOutline( (const SvxContourItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_SHADOW:
- {
- pNew = new EditCharAttribShadow( (const SvxShadowedItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_ESCAPEMENT:
- {
- pNew = new EditCharAttribEscapement( (const SvxEscapementItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_PAIRKERNING:
- {
- pNew = new EditCharAttribPairKerning( (const SvxAutoKernItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_KERNING:
- {
- pNew = new EditCharAttribKerning( (const SvxKerningItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_WLM:
- {
- pNew = new EditCharAttribWordLineMode( (const SvxWordLineModeItem&)rNew, nS, nE );
- }
- break;
- case EE_CHAR_XMLATTRIBS:
- {
- pNew = new EditCharAttrib( rNew, nS, nE ); // Attrib is only for holding XML information...
- }
- break;
- case EE_FEATURE_TAB:
- {
- pNew = new EditCharAttribTab( (const SfxVoidItem&)rNew, nS );
- }
- break;
- case EE_FEATURE_LINEBR:
- {
- pNew = new EditCharAttribLineBreak( (const SfxVoidItem&)rNew, nS );
- }
- break;
- case EE_FEATURE_FIELD:
- {
- pNew = new EditCharAttribField( (const SvxFieldItem&)rNew, nS );
- }
- break;
- default:
- {
- DBG_ERROR( "Ungueltiges Attribut!" );
- }
- }
- return pNew;
-}
-
-// -------------------------------------------------------------------------
-// class EditLine
-// -------------------------------------------------------------------------
-
-EditLine::EditLine()
-{
- DBG_CTOR( EE_EditLine, 0 );
-
- nStart = nEnd = 0;
- nStartPortion = 0; // damit in ungueltiger Zeile ohne Portions von einer gueltigen Zeile mit der Portion Nr0 unterscieden werden kann.
- nEndPortion = 0;
- nHeight = 0;
- nStartPosX = 0;
- nTxtHeight = 0;
- nTxtWidth = 0;
- nCrsrHeight = 0;
- nMaxAscent = 0;
- bHangingPunctuation = FALSE;
- bInvalid = TRUE;
-}
-
-EditLine::EditLine( const EditLine& r )
-{
- DBG_CTOR( EE_EditLine, 0 );
-
- nEnd = r.nEnd;
- nStart = r.nStart;
- nStartPortion = r.nStartPortion;
- nEndPortion = r.nEndPortion;
- bHangingPunctuation = r.bHangingPunctuation;
-
- nHeight = 0;
- nStartPosX = 0;
- nTxtHeight = 0;
- nTxtWidth = 0;
- nCrsrHeight = 0;
- nMaxAscent = 0;
- bInvalid = TRUE;
-}
-
-EditLine::~EditLine()
-{
- DBG_DTOR( EE_EditLine, 0 );
-}
-
-EditLine* EditLine::Clone() const
-{
- EditLine* pL = new EditLine;
- if ( aPositions.Count() )
- {
- pL->aPositions.Insert (aPositions.GetData(), aPositions.Count(), 0);
- }
- pL->nStartPosX = nStartPosX;
- pL->nStart = nStart;
- pL->nEnd = nEnd;
- pL->nStartPortion = nStartPortion;
- pL->nEndPortion = nEndPortion;
- pL->nHeight = nHeight;
- pL->nTxtWidth = nTxtWidth;
- pL->nTxtHeight = nTxtHeight;
- pL->nCrsrHeight = nCrsrHeight;
- pL->nMaxAscent = nMaxAscent;
-
- return pL;
-}
-
-BOOL operator == ( const EditLine& r1, const EditLine& r2 )
-{
- if ( r1.nStart != r2.nStart )
- return FALSE;
-
- if ( r1.nEnd != r2.nEnd )
- return FALSE;
-
- if ( r1.nStartPortion != r2.nStartPortion )
- return FALSE;
-
- if ( r1.nEndPortion != r2.nEndPortion )
- return FALSE;
-
- return TRUE;
-}
-
-EditLine& EditLine::operator = ( const EditLine& r )
-{
- nEnd = r.nEnd;
- nStart = r.nStart;
- nEndPortion = r.nEndPortion;
- nStartPortion = r.nStartPortion;
- return *this;
-}
-
-
-BOOL operator != ( const EditLine& r1, const EditLine& r2 )
-{
- return !( r1 == r2 );
-}
-
-Size EditLine::CalcTextSize( ParaPortion& rParaPortion )
-{
- Size aSz;
- Size aTmpSz;
- TextPortion* pPortion;
-
- USHORT nIndex = GetStart();
-
- DBG_ASSERT( rParaPortion.GetTextPortions().Count(), "GetTextSize vor CreatePortions !" );
-
- for ( USHORT n = nStartPortion; n <= nEndPortion; n++ )
- {
- pPortion = rParaPortion.GetTextPortions().GetObject(n);
- switch ( pPortion->GetKind() )
- {
- case PORTIONKIND_TEXT:
- case PORTIONKIND_FIELD:
- case PORTIONKIND_HYPHENATOR:
- {
- aTmpSz = pPortion->GetSize();
- aSz.Width() += aTmpSz.Width();
- if ( aSz.Height() < aTmpSz.Height() )
- aSz.Height() = aTmpSz.Height();
- }
- break;
- case PORTIONKIND_TAB:
-// case PORTIONKIND_EXTRASPACE:
- {
- aSz.Width() += pPortion->GetSize().Width();
- }
- break;
- }
- nIndex = nIndex + pPortion->GetLen();
- }
-
- SetHeight( (USHORT)aSz.Height() );
- return aSz;
-}
-
- // -------------------------------------------------------------------------
-// class EditLineList
-// -------------------------------------------------------------------------
-EditLineList::EditLineList()
-{
-}
-
-EditLineList::~EditLineList()
-{
- Reset();
-}
-
-void EditLineList::Reset()
-{
- for ( USHORT nLine = 0; nLine < Count(); nLine++ )
- delete GetObject(nLine);
- Remove( 0, Count() );
-}
-
-void EditLineList::DeleteFromLine( USHORT nDelFrom )
-{
- DBG_ASSERT( nDelFrom <= (Count() - 1), "DeleteFromLine: Out of range" );
- for ( USHORT nL = nDelFrom; nL < Count(); nL++ )
- delete GetObject(nL);
- Remove( nDelFrom, Count()-nDelFrom );
-}
-
-USHORT EditLineList::FindLine( USHORT nChar, BOOL bInclEnd )
-{
- for ( USHORT nLine = 0; nLine < Count(); nLine++ )
- {
- EditLine* pLine = GetObject( nLine );
- if ( ( bInclEnd && ( pLine->GetEnd() >= nChar ) ) ||
- ( pLine->GetEnd() > nChar ) )
- {
- return nLine;
- }
- }
-
- DBG_ASSERT( !bInclEnd, "Zeile nicht gefunden: FindLine" );
- return ( Count() - 1 );
-}
-
- // -------------------------------------------------------------------------
-// class EditSelection
-// -------------------------------------------------------------------------
-BOOL EditPaM::DbgIsBuggy( EditDoc& rDoc )
-{
- if ( !pNode )
- return TRUE;
- if ( rDoc.GetPos( pNode ) >= rDoc.Count() )
- return TRUE;
- if ( nIndex > pNode->Len() )
- return TRUE;
-
- return FALSE;
-}
-
-BOOL EditSelection::DbgIsBuggy( EditDoc& rDoc )
-{
- if ( aStartPaM.DbgIsBuggy( rDoc ) )
- return TRUE;
- if ( aEndPaM.DbgIsBuggy( rDoc ) )
- return TRUE;
-
- return FALSE;
-}
-
-EditSelection::EditSelection()
-{
-}
-
-EditSelection::EditSelection( const EditPaM& rStartAndAnd )
-{
- // koennte noch optimiert werden!
- // nicht erst Def-CTOR vom PaM rufen!
- aStartPaM = rStartAndAnd;
- aEndPaM = rStartAndAnd;
-}
-
-EditSelection::EditSelection( const EditPaM& rStart, const EditPaM& rEnd )
-{
- // koennte noch optimiert werden!
- aStartPaM = rStart;
- aEndPaM = rEnd;
-}
-
-EditSelection& EditSelection::operator = ( const EditPaM& rPaM )
-{
- aStartPaM = rPaM;
- aEndPaM = rPaM;
- return *this;
-}
-
-BOOL EditSelection::IsInvalid() const
-{
- EditPaM aEmptyPaM;
-
- if ( aStartPaM == aEmptyPaM )
- return TRUE;
-
- if ( aEndPaM == aEmptyPaM )
- return TRUE;
-
- return FALSE;
-}
-
-BOOL EditSelection::Adjust( const ContentList& rNodes )
-{
- DBG_ASSERT( aStartPaM.GetIndex() <= aStartPaM.GetNode()->Len(), "Index im Wald in Adjust(1)" );
- DBG_ASSERT( aEndPaM.GetIndex() <= aEndPaM.GetNode()->Len(), "Index im Wald in Adjust(2)" );
-
- ContentNode* pStartNode = aStartPaM.GetNode();
- ContentNode* pEndNode = aEndPaM.GetNode();
-
- USHORT nStartNode = rNodes.GetPos( pStartNode );
- USHORT nEndNode = rNodes.GetPos( pEndNode );
-
- DBG_ASSERT( nStartNode != USHRT_MAX, "Node im Wald in Adjust(1)" );
- DBG_ASSERT( nEndNode != USHRT_MAX, "Node im Wald in Adjust(2)" );
-
- BOOL bSwap = FALSE;
- if ( nStartNode > nEndNode )
- bSwap = TRUE;
- else if ( ( nStartNode == nEndNode ) && ( aStartPaM.GetIndex() > aEndPaM.GetIndex() ) )
- bSwap = TRUE;
-
- if ( bSwap )
- {
- EditPaM aTmpPaM( aStartPaM );
- aStartPaM = aEndPaM;
- aEndPaM = aTmpPaM;
- }
-
- return bSwap;
-}
-
-
- // -------------------------------------------------------------------------
-// class EditPaM
-// -------------------------------------------------------------------------
-BOOL operator == ( const EditPaM& r1, const EditPaM& r2 )
-{
- if ( r1.GetNode() != r2.GetNode() )
- return FALSE;
-
- if ( r1.GetIndex() != r2.GetIndex() )
- return FALSE;
-
- return TRUE;
-}
-
-EditPaM& EditPaM::operator = ( const EditPaM& rPaM )
-{
- nIndex = rPaM.nIndex;
- pNode = rPaM.pNode;
- return *this;
-}
-
-BOOL operator != ( const EditPaM& r1, const EditPaM& r2 )
-{
- return !( r1 == r2 );
-}
-
-
- // -------------------------------------------------------------------------
-// class ContentNode
-// -------------------------------------------------------------------------
-ContentNode::ContentNode( SfxItemPool& rPool ) : aContentAttribs( rPool )
-{
- DBG_CTOR( EE_ContentNode, 0 );
- pWrongList = NULL;
-}
-
-ContentNode::ContentNode( const XubString& rStr, const ContentAttribs& rContentAttribs ) :
- XubString( rStr ), aContentAttribs( rContentAttribs )
-{
- DBG_CTOR( EE_ContentNode, 0 );
- pWrongList = NULL;
-}
-
-ContentNode::~ContentNode()
-{
- DBG_DTOR( EE_ContentNode, 0 );
-#ifndef SVX_LIGHT
- delete pWrongList;
-#endif
-}
-
-void ContentNode::ExpandAttribs( USHORT nIndex, USHORT nNew, SfxItemPool& rItemPool )
-{
- if ( !nNew )
- return;
-
- // Da Features anders behandelt werden als normale Zeichenattribute,
- // kann sich hier auch die Sortierung der Start-Liste aendern!
- // In jedem if..., in dem weiter (n) Moeglichkeiten aufgrund von
- // bFeature oder Spezialfall existieren,
- // muessen (n-1) Moeglichkeiten mit bResort versehen werden.
- // Die wahrscheinlichste Moeglichkeit erhaelt kein bResort,
- // so dass nicht neu sortiert wird, wenn sich alle Attribute
- // gleich verhalten.
- BOOL bResort = FALSE;
- BOOL bExpandedEmptyAtIndexNull = FALSE;
-
- USHORT nAttr = 0;
- EditCharAttrib* pAttrib = GetAttrib( aCharAttribList.GetAttribs(), nAttr );
- while ( pAttrib )
- {
- if ( pAttrib->GetEnd() >= nIndex )
- {
- // Alle Attribute hinter der Einfuegeposition verschieben...
- if ( pAttrib->GetStart() > nIndex )
- {
- pAttrib->MoveForward( nNew );
- }
- // 0: Leeres Attribut expandieren, wenn an Einfuegestelle
- else if ( pAttrib->IsEmpty() )
- {
- // Index nicht pruefen, leeres durfte nur dort liegen.
- // Wenn spaeter doch Ueberpruefung:
- // Spezialfall: Start == 0; AbsLen == 1, nNew = 1 => Expand, weil durch Absatzumbruch!
- // Start <= nIndex, End >= nIndex => Start=End=nIndex!
-// if ( pAttrib->GetStart() == nIndex )
- pAttrib->Expand( nNew );
- if ( pAttrib->GetStart() == 0 )
- bExpandedEmptyAtIndexNull = TRUE;
- }
- // 1: Attribut startet davor, geht bis Index...
- else if ( pAttrib->GetEnd() == nIndex ) // Start muss davor liegen
- {
- // Nur expandieren, wenn kein Feature,
- // und wenn nicht in ExcludeListe!
- // Sonst geht z.B. ein UL bis zum neuen ULDB, beide expandieren
-// if ( !pAttrib->IsFeature() && !rExclList.FindAttrib( pAttrib->Which() ) )
- if ( !pAttrib->IsFeature() && !aCharAttribList.FindEmptyAttrib( pAttrib->Which(), nIndex ) )
- {
- if ( !pAttrib->IsEdge() )
- pAttrib->Expand( nNew );
- }
- else
- bResort = TRUE;
- }
- // 2: Attribut startet davor, geht hinter Index...
- else if ( ( pAttrib->GetStart() < nIndex ) && ( pAttrib->GetEnd() > nIndex ) )
- {
- DBG_ASSERT( !pAttrib->IsFeature(), "Grosses Feature?!" );
- pAttrib->Expand( nNew );
- }
- // 3: Attribut startet auf Index...
- else if ( pAttrib->GetStart() == nIndex )
- {
- if ( pAttrib->IsFeature() )
- {
- pAttrib->MoveForward( nNew );
- bResort = TRUE;
- }
- else
- {
- BOOL bExpand = FALSE;
- if ( nIndex == 0 )
- {
- bExpand = TRUE;
- if( bExpandedEmptyAtIndexNull )
- {
- // Check if this kind of attribut was empty and expanded here...
- USHORT nW = pAttrib->GetItem()->Which();
- for ( USHORT nA = 0; nA < nAttr; nA++ )
- {
- EditCharAttrib* pA = aCharAttribList.GetAttribs()[nA];
- if ( ( pA->GetStart() == 0 ) && ( pA->GetItem()->Which() == nW ) )
- {
- bExpand = FALSE;
- break;
- }
- }
-
- }
- }
- if ( bExpand )
- {
- pAttrib->Expand( nNew );
- bResort = TRUE;
- }
- else
- {
- pAttrib->MoveForward( nNew );
- }
- }
- }
- }
-
- if ( pAttrib->IsEdge() )
- pAttrib->SetEdge( FALSE );
-
- DBG_ASSERT( !pAttrib->IsFeature() || ( pAttrib->GetLen() == 1 ), "Expand: FeaturesLen != 1" );
-
- DBG_ASSERT( pAttrib->GetStart() <= pAttrib->GetEnd(), "Expand: Attribut verdreht!" );
- DBG_ASSERT( ( pAttrib->GetEnd() <= Len() ), "Expand: Attrib groesser als Absatz!" );
- if ( pAttrib->IsEmpty() )
- {
- DBG_ERROR( "Leeres Attribut nach ExpandAttribs?" );
- bResort = TRUE;
- aCharAttribList.GetAttribs().Remove( nAttr );
- rItemPool.Remove( *pAttrib->GetItem() );
- delete pAttrib;
- nAttr--;
- }
- nAttr++;
- pAttrib = GetAttrib( aCharAttribList.GetAttribs(), nAttr );
- }
-
- if ( bResort )
- aCharAttribList.ResortAttribs();
-
-#ifndef SVX_LIGHT
- if ( pWrongList )
- {
- BOOL bSep = ( GetChar( nIndex ) == ' ' ) || IsFeature( nIndex );
- pWrongList->TextInserted( nIndex, nNew, bSep );
- }
-#endif // !SVX_LIGHT
-
-#ifdef EDITDEBUG
- DBG_ASSERT( CheckOrderedList( aCharAttribList.GetAttribs(), TRUE ), "Expand: Start-Liste verdreht" );
-#endif
-}
-
-void ContentNode::CollapsAttribs( USHORT nIndex, USHORT nDeleted, SfxItemPool& rItemPool )
-{
- if ( !nDeleted )
- return;
-
- // Da Features anders behandelt werden als normale Zeichenattribute,
- // kann sich hier auch die Sortierung der Start-Liste aendern!
- BOOL bResort = FALSE;
- BOOL bDelAttr = FALSE;
- USHORT nEndChanges = nIndex+nDeleted;
-
- USHORT nAttr = 0;
- EditCharAttrib* pAttrib = GetAttrib( aCharAttribList.GetAttribs(), nAttr );
- while ( pAttrib )
- {
- bDelAttr = FALSE;
- if ( pAttrib->GetEnd() >= nIndex )
- {
- // Alles Attribute hinter der Einfuegeposition verschieben...
- if ( pAttrib->GetStart() >= nEndChanges )
- {
- pAttrib->MoveBackward( nDeleted );
- }
- // 1. Innenliegende Attribute loeschen...
- else if ( ( pAttrib->GetStart() >= nIndex ) && ( pAttrib->GetEnd() <= nEndChanges ) )
- {
- // Spezialfall: Attrubt deckt genau den Bereich ab
- // => als leeres Attribut behalten.
- if ( !pAttrib->IsFeature() && ( pAttrib->GetStart() == nIndex ) && ( pAttrib->GetEnd() == nEndChanges ) )
- pAttrib->GetEnd() = nIndex; // leer
- else
- bDelAttr = TRUE;
- }
- // 2. Attribut beginnt davor, endet drinnen oder dahinter...
- else if ( ( pAttrib->GetStart() <= nIndex ) && ( pAttrib->GetEnd() > nIndex ) )
- {
- DBG_ASSERT( !pAttrib->IsFeature(), "Collapsing Feature!" );
- if ( pAttrib->GetEnd() <= nEndChanges ) // endet drinnen
- pAttrib->GetEnd() = nIndex;
- else
- pAttrib->Collaps( nDeleted ); // endet dahinter
- }
- // 3. Attribut beginnt drinnen, endet dahinter...
- else if ( ( pAttrib->GetStart() >= nIndex ) && ( pAttrib->GetEnd() > nEndChanges ) )
- {
- // Features duerfen nicht expandieren!
- if ( pAttrib->IsFeature() )
- {
- pAttrib->MoveBackward( nDeleted );
- bResort = TRUE;
- }
- else
- {
- pAttrib->GetStart() = nEndChanges;
- pAttrib->MoveBackward( nDeleted );
- }
- }
- }
- DBG_ASSERT( !pAttrib->IsFeature() || ( pAttrib->GetLen() == 1 ), "Expand: FeaturesLen != 1" );
-
- DBG_ASSERT( pAttrib->GetStart() <= pAttrib->GetEnd(), "Collaps: Attribut verdreht!" );
- DBG_ASSERT( ( pAttrib->GetEnd() <= Len()) || bDelAttr, "Collaps: Attrib groesser als Absatz!" );
- if ( bDelAttr /* || pAttrib->IsEmpty() */ )
- {
- bResort = TRUE;
- aCharAttribList.GetAttribs().Remove( nAttr );
- rItemPool.Remove( *pAttrib->GetItem() );
- delete pAttrib;
- nAttr--;
- }
- else if ( pAttrib->IsEmpty() )
- aCharAttribList.HasEmptyAttribs() = TRUE;
-
- nAttr++;
- pAttrib = GetAttrib( aCharAttribList.GetAttribs(), nAttr );
- }
-
- if ( bResort )
- aCharAttribList.ResortAttribs();
-
-#ifndef SVX_LIGHT
- if ( pWrongList )
- pWrongList->TextDeleted( nIndex, nDeleted );
-#endif // !SVX_LIGHT
-
-#ifdef EDITDEBUG
- DBG_ASSERT( CheckOrderedList( aCharAttribList.GetAttribs(), TRUE ), "Collaps: Start-Liste verdreht" );
-#endif
-}
-
-void ContentNode::CopyAndCutAttribs( ContentNode* pPrevNode, SfxItemPool& rPool, BOOL bKeepEndingAttribs )
-{
- DBG_ASSERT( pPrevNode, "kopieren von Attributen auf einen NULL-Pointer ?" );
-
- xub_StrLen nCut = pPrevNode->Len();
-
- USHORT nAttr = 0;
- EditCharAttrib* pAttrib = GetAttrib( pPrevNode->GetCharAttribs().GetAttribs(), nAttr );
- while ( pAttrib )
- {
- if ( pAttrib->GetEnd() < nCut )
- {
- // bleiben unveraendert....
- ;
- }
- else if ( pAttrib->GetEnd() == nCut )
- {
- // muessen als leeres Attribut kopiert werden.
- if ( bKeepEndingAttribs && !pAttrib->IsFeature() && !aCharAttribList.FindAttrib( pAttrib->GetItem()->Which(), 0 ) )
- {
- EditCharAttrib* pNewAttrib = MakeCharAttrib( rPool, *(pAttrib->GetItem()), 0, 0 );
- DBG_ASSERT( pNewAttrib, "MakeCharAttrib fehlgeschlagen!" );
- aCharAttribList.InsertAttrib( pNewAttrib );
- }
- }
- else if ( pAttrib->IsInside( nCut ) || ( !nCut && !pAttrib->GetStart() && !pAttrib->IsFeature() ) )
- {
- // Wenn ganz vorne gecuttet wird, muss das Attribut erhalten bleiben!
- // muessen kopiert und geaendert werden
- EditCharAttrib* pNewAttrib = MakeCharAttrib( rPool, *(pAttrib->GetItem()), 0, pAttrib->GetEnd()-nCut );
- DBG_ASSERT( pNewAttrib, "MakeCharAttrib fehlgeschlagen!" );
- aCharAttribList.InsertAttrib( pNewAttrib );
- // stutzen:
- pAttrib->GetEnd() = nCut;
- }
- else
- {
- // alle dahinter verschieben in den neuen Node (this)
-// pPrevNode->GetCharAttribs().RemoveAttrib( pAttrib );
- pPrevNode->GetCharAttribs().GetAttribs().Remove( nAttr );
- aCharAttribList.InsertAttrib( pAttrib );
- DBG_ASSERT( pAttrib->GetStart() >= nCut, "Start < nCut!" );
- DBG_ASSERT( pAttrib->GetEnd() >= nCut, "End < nCut!" );
- pAttrib->GetStart() = pAttrib->GetStart() - nCut;
- pAttrib->GetEnd() = pAttrib->GetEnd() - nCut;
- nAttr--;
- }
- nAttr++;
- pAttrib = GetAttrib( pPrevNode->GetCharAttribs().GetAttribs(), nAttr );
- }
-}
-
-void ContentNode::AppendAttribs( ContentNode* pNextNode )
-{
- DBG_ASSERT( pNextNode, "kopieren von Attributen von einen NULL-Pointer ?" );
-
- USHORT nNewStart = Len();
-
-#ifdef EDITDEBUG
- DBG_ASSERT( aCharAttribList.DbgCheckAttribs(), "Attribute VOR AppendAttribs kaputt" );
-#endif
-
- USHORT nAttr = 0;
- EditCharAttrib* pAttrib = GetAttrib( pNextNode->GetCharAttribs().GetAttribs(), nAttr );
- while ( pAttrib )
- {
- // alle Attribute verschieben in den aktuellen Node (this)
- BOOL bMelted = FALSE;
- if ( ( pAttrib->GetStart() == 0 ) && ( !pAttrib->IsFeature() ) )
- {
- // Evtl koennen Attribute zusammengefasst werden:
- USHORT nTmpAttr = 0;
- EditCharAttrib* pTmpAttrib = GetAttrib( aCharAttribList.GetAttribs(), nTmpAttr );
- while ( !bMelted && pTmpAttrib )
- {
- if ( pTmpAttrib->GetEnd() == nNewStart )
- {
- if ( ( pTmpAttrib->Which() == pAttrib->Which() ) &&
- ( *(pTmpAttrib->GetItem()) == *(pAttrib->GetItem() ) ) )
- {
- pTmpAttrib->GetEnd() =
- pTmpAttrib->GetEnd() + pAttrib->GetLen();
- pNextNode->GetCharAttribs().GetAttribs().Remove( nAttr );
- // Vom Pool abmelden ?!
- delete pAttrib;
- bMelted = TRUE;
- }
- }
- ++nTmpAttr;
- pTmpAttrib = GetAttrib( aCharAttribList.GetAttribs(), nTmpAttr );
- }
- }
-
- if ( !bMelted )
- {
- pAttrib->GetStart() = pAttrib->GetStart() + nNewStart;
- pAttrib->GetEnd() = pAttrib->GetEnd() + nNewStart;
- aCharAttribList.InsertAttrib( pAttrib );
- ++nAttr;
- }
- pAttrib = GetAttrib( pNextNode->GetCharAttribs().GetAttribs(), nAttr );
- }
- // Fuer die Attribute, die nur ruebergewandert sind:
- pNextNode->GetCharAttribs().Clear();
-
-#ifdef EDITDEBUG
- DBG_ASSERT( aCharAttribList.DbgCheckAttribs(), "Attribute NACH AppendAttribs kaputt" );
-#endif
-}
-
-void ContentNode::CreateDefFont()
-{
- // Erst alle Informationen aus dem Style verwenden...
- SfxStyleSheet* pS = aContentAttribs.GetStyleSheet();
- if ( pS )
- CreateFont( GetCharAttribs().GetDefFont(), pS->GetItemSet() );
-
- // ... dann die harte Absatzformatierung rueberbuegeln...
- CreateFont( GetCharAttribs().GetDefFont(),
- GetContentAttribs().GetItems(), pS == NULL );
-}
-
-void ContentNode::SetStyleSheet( SfxStyleSheet* pS, const SvxFont& rFontFromStyle )
-{
- aContentAttribs.SetStyleSheet( pS );
-
- // Erst alle Informationen aus dem Style verwenden...
- GetCharAttribs().GetDefFont() = rFontFromStyle;
- // ... dann die harte Absatzformatierung rueberbuegeln...
- CreateFont( GetCharAttribs().GetDefFont(),
- GetContentAttribs().GetItems(), pS == NULL );
-}
-
-void ContentNode::SetStyleSheet( SfxStyleSheet* pS, BOOL bRecalcFont )
-{
- aContentAttribs.SetStyleSheet( pS );
- if ( bRecalcFont )
- CreateDefFont();
-}
-
-void ContentNode::DestroyWrongList()
-{
-#ifndef SVX_LIGHT
- delete pWrongList;
-#endif
- pWrongList = NULL;
-}
-
-void ContentNode::CreateWrongList()
-{
- DBG_ASSERT( !pWrongList, "WrongList existiert schon!" );
-#ifndef SVX_LIGHT
- pWrongList = new WrongList;
-#endif
-}
-
-void ContentNode::SetWrongList( WrongList* p )
-{
- DBG_ASSERT( !pWrongList, "WrongList existiert schon!" );
- pWrongList = p;
-}
-
- // -------------------------------------------------------------------------
-// class ContentAttribs
-// -------------------------------------------------------------------------
-ContentAttribs::ContentAttribs( SfxItemPool& rPool ) :
- aAttribSet( rPool, EE_PARA_START, EE_CHAR_END )
-{
- pStyle = 0;
-}
-
-ContentAttribs::ContentAttribs( const ContentAttribs& rRef ) :
- aAttribSet( rRef.aAttribSet )
-{
- pStyle = rRef.pStyle;
-}
-
-ContentAttribs::~ContentAttribs()
-{
-}
-
-SvxTabStop ContentAttribs::FindTabStop( long nCurPos, USHORT nDefTab )
-{
- const SvxTabStopItem& rTabs = (const SvxTabStopItem&) GetItem( EE_PARA_TABS );
- for ( USHORT i = 0; i < rTabs.Count(); i++ )
- {
- const SvxTabStop& rTab = rTabs[i];
- if ( rTab.GetTabPos() > nCurPos )
- return rTab;
- }
-
- // DefTab ermitteln...
- SvxTabStop aTabStop;
- long x = nCurPos / nDefTab + 1;
- aTabStop.GetTabPos() = nDefTab * x;
- return aTabStop;
-}
-
-void ContentAttribs::SetStyleSheet( SfxStyleSheet* pS )
-{
- BOOL bStyleChanged = ( pStyle != pS );
- pStyle = pS;
- // #104799# Only when other style sheet, not when current style sheet modified
- if ( pStyle && bStyleChanged )
- {
- // Gezielt die Attribute aus der Absatzformatierung entfernen, die im Style
- // spezifiziert sind, damit die Attribute des Styles wirken koennen.
- const SfxItemSet& rStyleAttribs = pStyle->GetItemSet();
- for ( USHORT nWhich = EE_PARA_START; nWhich <= EE_CHAR_END; nWhich++ )
- {
- // #99635# Don't change bullet on/off
- if ( ( nWhich != EE_PARA_BULLETSTATE ) && ( rStyleAttribs.GetItemState( nWhich ) == SFX_ITEM_ON ) )
- aAttribSet.ClearItem( nWhich );
- }
- }
-}
-
-const SfxPoolItem& ContentAttribs::GetItem( USHORT nWhich )
-{
- // Harte Absatzattribute haben Vorrang!
- SfxItemSet* pTakeFrom = &aAttribSet;
- if ( pStyle && ( aAttribSet.GetItemState( nWhich, FALSE ) != SFX_ITEM_ON ) )
- pTakeFrom = &pStyle->GetItemSet();
-
- return pTakeFrom->Get( nWhich );
-}
-
-BOOL ContentAttribs::HasItem( USHORT nWhich )
-{
- BOOL bHasItem = FALSE;
- if ( aAttribSet.GetItemState( nWhich, FALSE ) == SFX_ITEM_ON )
- bHasItem = TRUE;
- else if ( pStyle && pStyle->GetItemSet().GetItemState( nWhich ) == SFX_ITEM_ON )
- bHasItem = TRUE;
-
- return bHasItem;
-}
-
-
-
- // ----------------------------------------------------------------------
-// class ItemList
-// ----------------------------------------------------------------------
-const SfxPoolItem* ItemList::FindAttrib( USHORT nWhich )
-{
- const SfxPoolItem* pItem = First();
- while ( pItem && ( pItem->Which() != nWhich ) )
- pItem = Next();
-
- return pItem;
-}
-
- // -------------------------------------------------------------------------
-// class EditDoc
-// -------------------------------------------------------------------------
-EditDoc::EditDoc( SfxItemPool* pPool )
-{
- if ( pPool )
- {
- pItemPool = pPool;
- bOwnerOfPool = FALSE;
- }
- else
- {
- pItemPool = new EditEngineItemPool( FALSE );
- bOwnerOfPool = TRUE;
- }
-
- nDefTab = DEFTAB;
- bIsVertical = FALSE;
- bIsFixedCellHeight = FALSE;
-
- // Don't create a empty node, Clear() will be called in EditEngine-CTOR
-
- SetModified( FALSE );
-};
-
-EditDoc::~EditDoc()
-{
- ImplDestroyContents();
- if ( bOwnerOfPool )
- SfxItemPool::Free(pItemPool);
-}
-
-void EditDoc::ImplDestroyContents()
-{
- for ( USHORT nNode = Count(); nNode; )
- RemoveItemsFromPool( GetObject( --nNode ) );
- DeleteAndDestroy( 0, Count() );
-}
-
-void EditDoc::RemoveItemsFromPool( ContentNode* pNode )
-{
- for ( USHORT nAttr = 0; nAttr < pNode->GetCharAttribs().Count(); nAttr++ )
- {
- EditCharAttrib* pAttr = pNode->GetCharAttribs().GetAttribs()[nAttr];
- GetItemPool().Remove( *pAttr->GetItem() );
- }
-}
-
-void CreateFont( SvxFont& rFont, const SfxItemSet& rSet, bool bSearchInParent, short nScriptType )
-{
- Font aPrevFont( rFont );
- rFont.SetAlign( ALIGN_BASELINE );
- rFont.SetTransparent( TRUE );
-
- USHORT nWhich_FontInfo = GetScriptItemId( EE_CHAR_FONTINFO, nScriptType );
- USHORT nWhich_Language = GetScriptItemId( EE_CHAR_LANGUAGE, nScriptType );
- USHORT nWhich_FontHeight = GetScriptItemId( EE_CHAR_FONTHEIGHT, nScriptType );
- USHORT nWhich_Weight = GetScriptItemId( EE_CHAR_WEIGHT, nScriptType );
- USHORT nWhich_Italic = GetScriptItemId( EE_CHAR_ITALIC, nScriptType );
-
- if ( bSearchInParent || ( rSet.GetItemState( nWhich_FontInfo ) == SFX_ITEM_ON ) )
- {
- const SvxFontItem& rFontItem = (const SvxFontItem&)rSet.Get( nWhich_FontInfo );
- rFont.SetName( rFontItem.GetFamilyName() );
- rFont.SetFamily( rFontItem.GetFamily() );
- rFont.SetPitch( rFontItem.GetPitch() );
- rFont.SetCharSet( rFontItem.GetCharSet() );
- }
- if ( bSearchInParent || ( rSet.GetItemState( nWhich_Language ) == SFX_ITEM_ON ) )
- rFont.SetLanguage( ((const SvxLanguageItem&)rSet.Get( nWhich_Language )).GetLanguage() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_COLOR ) == SFX_ITEM_ON ) )
- rFont.SetColor( ((const SvxColorItem&)rSet.Get( EE_CHAR_COLOR )).GetValue() );
- if ( bSearchInParent || ( rSet.GetItemState( nWhich_FontHeight ) == SFX_ITEM_ON ) )
- rFont.SetSize( Size( rFont.GetSize().Width(), ((const SvxFontHeightItem&)rSet.Get( nWhich_FontHeight ) ).GetHeight() ) );
- if ( bSearchInParent || ( rSet.GetItemState( nWhich_Weight ) == SFX_ITEM_ON ) )
- rFont.SetWeight( ((const SvxWeightItem&)rSet.Get( nWhich_Weight )).GetWeight() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_UNDERLINE ) == SFX_ITEM_ON ) )
- rFont.SetUnderline( ((const SvxUnderlineItem&)rSet.Get( EE_CHAR_UNDERLINE )).GetLineStyle() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_OVERLINE ) == SFX_ITEM_ON ) )
- rFont.SetOverline( ((const SvxOverlineItem&)rSet.Get( EE_CHAR_OVERLINE )).GetLineStyle() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_STRIKEOUT ) == SFX_ITEM_ON ) )
- rFont.SetStrikeout( ((const SvxCrossedOutItem&)rSet.Get( EE_CHAR_STRIKEOUT )).GetStrikeout() );
- if ( bSearchInParent || ( rSet.GetItemState( nWhich_Italic ) == SFX_ITEM_ON ) )
- rFont.SetItalic( ((const SvxPostureItem&)rSet.Get( nWhich_Italic )).GetPosture() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_OUTLINE ) == SFX_ITEM_ON ) )
- rFont.SetOutline( ((const SvxContourItem&)rSet.Get( EE_CHAR_OUTLINE )).GetValue() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_SHADOW ) == SFX_ITEM_ON ) )
- rFont.SetShadow( ((const SvxShadowedItem&)rSet.Get( EE_CHAR_SHADOW )).GetValue() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_ESCAPEMENT ) == SFX_ITEM_ON ) )
- {
- const SvxEscapementItem& rEsc = (const SvxEscapementItem&) rSet.Get( EE_CHAR_ESCAPEMENT );
-
- USHORT nProp = rEsc.GetProp();
- rFont.SetPropr( (BYTE)nProp );
-
- short nEsc = rEsc.GetEsc();
- if ( nEsc == DFLT_ESC_AUTO_SUPER )
- nEsc = 100 - nProp;
- else if ( nEsc == DFLT_ESC_AUTO_SUB )
- nEsc = sal::static_int_cast< short >( -( 100 - nProp ) );
- rFont.SetEscapement( nEsc );
- }
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_PAIRKERNING ) == SFX_ITEM_ON ) )
- rFont.SetKerning( ((const SvxAutoKernItem&)rSet.Get( EE_CHAR_PAIRKERNING )).GetValue() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_KERNING ) == SFX_ITEM_ON ) )
- rFont.SetFixKerning( ((const SvxKerningItem&)rSet.Get( EE_CHAR_KERNING )).GetValue() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_WLM ) == SFX_ITEM_ON ) )
- rFont.SetWordLineMode( ((const SvxWordLineModeItem&)rSet.Get( EE_CHAR_WLM )).GetValue() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_EMPHASISMARK ) == SFX_ITEM_ON ) )
- rFont.SetEmphasisMark( ((const SvxEmphasisMarkItem&)rSet.Get( EE_CHAR_EMPHASISMARK )).GetValue() );
- if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_RELIEF ) == SFX_ITEM_ON ) )
- rFont.SetRelief( (FontRelief)((const SvxCharReliefItem&)rSet.Get( EE_CHAR_RELIEF )).GetValue() );
-
- // Ob ich jetzt den ganzen Font vergleiche, oder vor jeder Aenderung
- // pruefe, ob der Wert sich aendert, bleibt sich relativ gleich.
- // So ggf ein MakeUniqFont im Font mehr, dafuer bei Aenderung schnellerer
- // Abbruch der Abfrage, oder ich musste noch jedesmal ein bChanged pflegen.
- if ( rFont == aPrevFont )
- rFont = aPrevFont; // => Gleicher ImpPointer fuer IsSameInstance
-}
-
-void EditDoc::CreateDefFont( BOOL bUseStyles )
-{
- SfxItemSet aTmpSet( GetItemPool(), EE_PARA_START, EE_CHAR_END );
- CreateFont( aDefFont, aTmpSet );
- aDefFont.SetVertical( IsVertical() );
- aDefFont.SetOrientation( IsVertical() ? 2700 : 0 );
-
- for ( USHORT nNode = 0; nNode < Count(); nNode++ )
- {
- ContentNode* pNode = GetObject( nNode );
- pNode->GetCharAttribs().GetDefFont() = aDefFont;
- if ( bUseStyles )
- pNode->CreateDefFont();
- }
-}
-
-static const sal_Unicode aCR[] = { 0x0d, 0x00 };
-static const sal_Unicode aLF[] = { 0x0a, 0x00 };
-static const sal_Unicode aCRLF[] = { 0x0d, 0x0a, 0x00 };
-
-XubString EditDoc::GetSepStr( LineEnd eEnd )
-{
- XubString aSep;
- if ( eEnd == LINEEND_CR )
- aSep = aCR;
- else if ( eEnd == LINEEND_LF )
- aSep = aLF;
- else
- aSep = aCRLF;
- return aSep;
-}
-
-XubString EditDoc::GetText( LineEnd eEnd ) const
-{
- ULONG nLen = GetTextLen();
- USHORT nNodes = Count();
-
- String aSep = EditDoc::GetSepStr( eEnd );
- USHORT nSepSize = aSep.Len();
-
- if ( nSepSize )
- nLen += nNodes * nSepSize;
- if ( nLen > 0xFFFb / sizeof(xub_Unicode) )
- {
- DBG_ERROR( "Text zu gross fuer String" );
- return XubString();
- }
- xub_Unicode* pStr = new xub_Unicode[nLen+1];
- xub_Unicode* pCur = pStr;
- USHORT nLastNode = nNodes-1;
- for ( USHORT nNode = 0; nNode < nNodes; nNode++ )
- {
- XubString aTmp( GetParaAsString( GetObject(nNode) ) );
- memcpy( pCur, aTmp.GetBuffer(), aTmp.Len()*sizeof(sal_Unicode) );
- pCur += aTmp.Len();
- if ( nSepSize && ( nNode != nLastNode ) )
- {
- memcpy( pCur, aSep.GetBuffer(), nSepSize*sizeof(sal_Unicode ) );
- pCur += nSepSize;
- }
- }
- *pCur = '\0';
- XubString aASCIIText( pStr );
- delete[] pStr;
- return aASCIIText;
-}
-
-XubString EditDoc::GetParaAsString( USHORT nNode ) const
-{
- return GetParaAsString( SaveGetObject( nNode ) );
-}
-
-XubString EditDoc::GetParaAsString( ContentNode* pNode, USHORT nStartPos, USHORT nEndPos, BOOL bResolveFields ) const
-{
- if ( nEndPos > pNode->Len() )
- nEndPos = pNode->Len();
-
- DBG_ASSERT( nStartPos <= nEndPos, "Start und Ende vertauscht?" );
-
- USHORT nIndex = nStartPos;
- XubString aStr;
- EditCharAttrib* pNextFeature = pNode->GetCharAttribs().FindFeature( nIndex );
- while ( nIndex < nEndPos )
- {
- USHORT nEnd = nEndPos;
- if ( pNextFeature && ( pNextFeature->GetStart() < nEnd ) )
- nEnd = pNextFeature->GetStart();
- else
- pNextFeature = 0; // Feature interessiert unten nicht
-
- DBG_ASSERT( nEnd >= nIndex, "Ende vorm Index?" );
- //!! beware of sub string length of -1 which is also defined as STRING_LEN and
- //!! thus would result in adding the whole sub string up to the end of the node !!
- if (nEnd > nIndex)
- aStr += XubString( *pNode, nIndex, nEnd - nIndex );
-
- if ( pNextFeature )
- {
- switch ( pNextFeature->GetItem()->Which() )
- {
- case EE_FEATURE_TAB: aStr += '\t';
- break;
- case EE_FEATURE_LINEBR: aStr += '\x0A';
- break;
- case EE_FEATURE_FIELD: if ( bResolveFields )
- aStr += ((EditCharAttribField*)pNextFeature)->GetFieldValue();
- break;
- default: DBG_ERROR( "Was fuer ein Feature ?" );
- }
- pNextFeature = pNode->GetCharAttribs().FindFeature( ++nEnd );
- }
- nIndex = nEnd;
- }
- return aStr;
-}
-
-ULONG EditDoc::GetTextLen() const
-{
- ULONG nLen = 0;
- for ( USHORT nNode = 0; nNode < Count(); nNode++ )
- {
- ContentNode* pNode = GetObject( nNode );
- nLen += pNode->Len();
- // Felder knnen laenger sein als der Platzhalter im Node.
- const CharAttribArray& rAttrs = pNode->GetCharAttribs().GetAttribs();
- for ( USHORT nAttr = rAttrs.Count(); nAttr; )
- {
- EditCharAttrib* pAttr = rAttrs[--nAttr];
- if ( pAttr->Which() == EE_FEATURE_FIELD )
- {
- USHORT nFieldLen = ((EditCharAttribField*)pAttr)->GetFieldValue().Len();
- if ( !nFieldLen )
- nLen--;
- else
- nLen += nFieldLen-1;
- }
- }
- }
- return nLen;
-}
-
-EditPaM EditDoc::Clear()
-{
- ImplDestroyContents();
-
- ContentNode* pNode = new ContentNode( GetItemPool() );
- Insert( pNode, 0 );
-
- CreateDefFont( FALSE );
-
- SetModified( FALSE );
-
- EditPaM aPaM( pNode, 0 );
- return aPaM;
-}
-
-void EditDoc::SetModified( BOOL b )
-{
- bModified = b;
- if ( bModified )
- {
- aModifyHdl.Call( NULL );
- }
-}
-
-EditPaM EditDoc::RemoveText()
-{
- // Das alte ItemSetmerken, damit z.B. im Chart Font behalten bleibt
- ContentNode* pPrevFirstNode = GetObject(0);
- SfxStyleSheet* pPrevStyle = pPrevFirstNode->GetStyleSheet();
- SfxItemSet aPrevSet( pPrevFirstNode->GetContentAttribs().GetItems() );
- Font aPrevFont( pPrevFirstNode->GetCharAttribs().GetDefFont() );
-
- ImplDestroyContents();
-
- ContentNode* pNode = new ContentNode( GetItemPool() );
- Insert( pNode, 0 );
-
- pNode->SetStyleSheet( pPrevStyle, FALSE );
- pNode->GetContentAttribs().GetItems().Set( aPrevSet );
- pNode->GetCharAttribs().GetDefFont() = aPrevFont;
-
- SetModified( TRUE );
-
- EditPaM aPaM( pNode, 0 );
- return aPaM;
-}
-
-void EditDoc::InsertText( const EditPaM& rPaM, xub_Unicode c )
-{
- DBG_ASSERT( c != 0x0A, "EditDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" );
- DBG_ASSERT( c != 0x0D, "EditDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" );
- DBG_ASSERT( c != '\t', "EditDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" );
-
- rPaM.GetNode()->Insert( c, rPaM.GetIndex() );
- rPaM.GetNode()->ExpandAttribs( rPaM.GetIndex(), 1, GetItemPool() );
-
- SetModified( TRUE );
-}
-
-EditPaM EditDoc::InsertText( EditPaM aPaM, const XubString& rStr )
-{
- DBG_ASSERT( rStr.Search( 0x0A ) == STRING_NOTFOUND, "EditDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" );
- DBG_ASSERT( rStr.Search( 0x0D ) == STRING_NOTFOUND, "EditDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" );
- DBG_ASSERT( rStr.Search( '\t' ) == STRING_NOTFOUND, "EditDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" );
- DBG_ASSERT( aPaM.GetNode(), "Blinder PaM in EditDoc::InsertText1" );
-
- aPaM.GetNode()->Insert( rStr, aPaM.GetIndex() );
- aPaM.GetNode()->ExpandAttribs( aPaM.GetIndex(), rStr.Len(), GetItemPool() );
- aPaM.GetIndex() = aPaM.GetIndex() + rStr.Len();
-
- SetModified( TRUE );
-
- return aPaM;
-}
-
-EditPaM EditDoc::InsertParaBreak( EditPaM aPaM, BOOL bKeepEndingAttribs )
-{
- DBG_ASSERT( aPaM.GetNode(), "Blinder PaM in EditDoc::InsertParaBreak" );
- ContentNode* pCurNode = aPaM.GetNode();
- USHORT nPos = GetPos( pCurNode );
- XubString aStr = aPaM.GetNode()->Copy( aPaM.GetIndex() );
- aPaM.GetNode()->Erase( aPaM.GetIndex() );
-
- // the paragraph attributes...
- ContentAttribs aContentAttribs( aPaM.GetNode()->GetContentAttribs() );
-
- // for a new paragraph we like to have the bullet/numbering visible by default
- aContentAttribs.GetItems().Put( SfxBoolItem( EE_PARA_BULLETSTATE, TRUE), EE_PARA_BULLETSTATE );
-
- // ContenNode-CTOR kopiert auch die Absatzattribute
- ContentNode* pNode = new ContentNode( aStr, aContentAttribs );
-
- // Den Default-Font kopieren
- pNode->GetCharAttribs().GetDefFont() = aPaM.GetNode()->GetCharAttribs().GetDefFont();
- SfxStyleSheet* pStyle = aPaM.GetNode()->GetStyleSheet();
- if ( pStyle )
- {
- XubString aFollow( pStyle->GetFollow() );
- if ( aFollow.Len() && ( aFollow != pStyle->GetName() ) )
- {
- SfxStyleSheetBase* pNext = pStyle->GetPool().Find( aFollow, pStyle->GetFamily() );
- pNode->SetStyleSheet( (SfxStyleSheet*)pNext );
- }
- }
-
- // Zeichenattribute muessen ggf. kopiert bzw gestutzt werden:
- pNode->CopyAndCutAttribs( aPaM.GetNode(), GetItemPool(), bKeepEndingAttribs );
-
- Insert( pNode, nPos+1 );
-
- SetModified( TRUE );
-
- aPaM.SetNode( pNode );
- aPaM.SetIndex( 0 );
- return aPaM;
-}
-
-EditPaM EditDoc::InsertFeature( EditPaM aPaM, const SfxPoolItem& rItem )
-{
- DBG_ASSERT( aPaM.GetNode(), "Blinder PaM in EditDoc::InsertFeature" );
-
- aPaM.GetNode()->Insert( CH_FEATURE, aPaM.GetIndex() );
- aPaM.GetNode()->ExpandAttribs( aPaM.GetIndex(), 1, GetItemPool() );
-
- // Fuer das Feature ein Feature-Attribut anlegen...
- EditCharAttrib* pAttrib = MakeCharAttrib( GetItemPool(), rItem, aPaM.GetIndex(), aPaM.GetIndex()+1 );
- DBG_ASSERT( pAttrib, "Warum kann ich kein Feature anlegen ?" );
- aPaM.GetNode()->GetCharAttribs().InsertAttrib( pAttrib );
-
- SetModified( TRUE );
-
- aPaM.GetIndex()++;
- return aPaM;
-}
-
-EditPaM EditDoc::ConnectParagraphs( ContentNode* pLeft, ContentNode* pRight )
-{
- const EditPaM aPaM( pLeft, pLeft->Len() );
-
- // Erst die Attribute, da sonst nLen nicht stimmt!
- pLeft->AppendAttribs( pRight );
- // Dann den Text...
- *pLeft += *pRight;
-
- // der rechte verschwindet.
- RemoveItemsFromPool( pRight );
- USHORT nRight = GetPos( pRight );
- Remove( nRight );
- delete pRight;
-
- SetModified( TRUE );
-
- return aPaM;
-}
-
-EditPaM EditDoc::RemoveChars( EditPaM aPaM, USHORT nChars )
-{
- // Evtl. Features entfernen!
- aPaM.GetNode()->Erase( aPaM.GetIndex(), nChars );
- aPaM.GetNode()->CollapsAttribs( aPaM.GetIndex(), nChars, GetItemPool() );
-
- SetModified( TRUE );
-
- return aPaM;
-}
-
-void EditDoc::InsertAttribInSelection( ContentNode* pNode, USHORT nStart, USHORT nEnd, const SfxPoolItem& rPoolItem )
-{
- DBG_ASSERT( pNode, "Wohin mit dem Attribut?" );
- DBG_ASSERT( nEnd <= pNode->Len(), "InsertAttrib: Attribut zu gross!" );
-
- // fuer Optimierung:
- // dieses endet am Anfang der Selektion => kann erweitert werden
- EditCharAttrib* pEndingAttrib = 0;
- // dieses startet am Ende der Selektion => kann erweitert werden
- EditCharAttrib* pStartingAttrib = 0;
-
- DBG_ASSERT( nStart <= nEnd, "Kleiner Rechenfehler in InsertAttribInSelection" );
-
- RemoveAttribs( pNode, nStart, nEnd, pStartingAttrib, pEndingAttrib, rPoolItem.Which() );
-
- if ( pStartingAttrib && pEndingAttrib &&
- ( *(pStartingAttrib->GetItem()) == rPoolItem ) &&
- ( *(pEndingAttrib->GetItem()) == rPoolItem ) )
- {
- // wird ein groesses Attribut.
- pEndingAttrib->GetEnd() = pStartingAttrib->GetEnd();
- GetItemPool().Remove( *(pStartingAttrib->GetItem()) );
- pNode->GetCharAttribs().GetAttribs().Remove( pNode->GetCharAttribs().GetAttribs().GetPos( pStartingAttrib ) );
- delete pStartingAttrib;
- }
- else if ( pStartingAttrib && ( *(pStartingAttrib->GetItem()) == rPoolItem ) )
- pStartingAttrib->GetStart() = nStart;
- else if ( pEndingAttrib && ( *(pEndingAttrib->GetItem()) == rPoolItem ) )
- pEndingAttrib->GetEnd() = nEnd;
- else
- InsertAttrib( rPoolItem, pNode, nStart, nEnd );
-
- if ( pStartingAttrib )
- pNode->GetCharAttribs().ResortAttribs();
-
- SetModified( TRUE );
-}
-
-BOOL EditDoc::RemoveAttribs( ContentNode* pNode, USHORT nStart, USHORT nEnd, USHORT nWhich )
-{
- EditCharAttrib* pStarting;
- EditCharAttrib* pEnding;
- return RemoveAttribs( pNode, nStart, nEnd, pStarting, pEnding, nWhich );
-}
-
-BOOL EditDoc::RemoveAttribs( ContentNode* pNode, USHORT nStart, USHORT nEnd, EditCharAttrib*& rpStarting, EditCharAttrib*& rpEnding, USHORT nWhich )
-{
- DBG_ASSERT( pNode, "Wohin mit dem Attribut?" );
- DBG_ASSERT( nEnd <= pNode->Len(), "InsertAttrib: Attribut zu gross!" );
-
- // dieses endet am Anfang der Selektion => kann erweitert werden
- rpEnding = 0;
- // dieses startet am Ende der Selektion => kann erweitert werden
- rpStarting = 0;
-
- BOOL bChanged = FALSE;
-
- DBG_ASSERT( nStart <= nEnd, "Kleiner Rechenfehler in InsertAttribInSelection" );
-
- // ueber die Attribute iterieren...
- USHORT nAttr = 0;
- EditCharAttrib* pAttr = GetAttrib( pNode->GetCharAttribs().GetAttribs(), nAttr );
- while ( pAttr )
- {
- BOOL bRemoveAttrib = FALSE;
- // MT 11.9.97:
- // Ich denke dass in dieser Methode generell keine Features geloescht
- // werden sollen.
- // => Dann koennen die Feature-Abfragen weiter unten entfallen
- USHORT nAttrWhich = pAttr->Which();
- if ( ( nAttrWhich < EE_FEATURE_START ) && ( !nWhich || ( nAttrWhich == nWhich ) ) )
- {
- // Attribut beginnt in Selection
- if ( ( pAttr->GetStart() >= nStart ) && ( pAttr->GetStart() <= nEnd ) )
- {
- bChanged = TRUE;
- if ( pAttr->GetEnd() > nEnd )
- {
- pAttr->GetStart() = nEnd; // dann faengt es dahinter an
- rpStarting = pAttr;
- if ( nWhich )
- break; // es kann kein weiteres Attrib hier liegen
- }
- else if ( !pAttr->IsFeature() || ( pAttr->GetStart() == nStart ) )
- {
- // Feature nur loeschen, wenn genau an der Stelle
- bRemoveAttrib = TRUE;
- }
- }
-
- // Attribut endet in Selection
- else if ( ( pAttr->GetEnd() >= nStart ) && ( pAttr->GetEnd() <= nEnd ) )
- {
- bChanged = TRUE;
- if ( ( pAttr->GetStart() < nStart ) && !pAttr->IsFeature() )
- {
- pAttr->GetEnd() = nStart; // dann hoert es hier auf
- rpEnding = pAttr;
- }
- else if ( !pAttr->IsFeature() || ( pAttr->GetStart() == nStart ) )
- {
- // Feature nur loeschen, wenn genau an der Stelle
- bRemoveAttrib = TRUE;
- }
- }
- // Attribut ueberlappt die Selektion
- else if ( ( pAttr->GetStart() <= nStart ) && ( pAttr->GetEnd() >= nEnd ) )
- {
- bChanged = TRUE;
- if ( pAttr->GetStart() == nStart )
- {
- pAttr->GetStart() = nEnd;
- rpStarting = pAttr;
- if ( nWhich )
- break; // es kann weitere Attribute geben!
- }
- else if ( pAttr->GetEnd() == nEnd )
- {
- pAttr->GetEnd() = nStart;
- rpEnding = pAttr;
- if ( nWhich )
- break; // es kann weitere Attribute geben!
- }
- else // Attribut muss gesplittet werden...
- {
- USHORT nOldEnd = pAttr->GetEnd();
- pAttr->GetEnd() = nStart;
- rpEnding = pAttr;
- InsertAttrib( *pAttr->GetItem(), pNode, nEnd, nOldEnd );
- if ( nWhich )
- break; // es kann weitere Attribute geben!
- }
- }
- }
- if ( bRemoveAttrib )
- {
- DBG_ASSERT( ( pAttr != rpStarting ) && ( pAttr != rpEnding ), "Loeschen und behalten des gleichen Attributs ?" );
- DBG_ASSERT( !pAttr->IsFeature(), "RemoveAttribs: Remove a feature?!" );
- pNode->GetCharAttribs().GetAttribs().Remove(nAttr);
- GetItemPool().Remove( *pAttr->GetItem() );
- delete pAttr;
- nAttr--;
- }
- nAttr++;
- pAttr = GetAttrib( pNode->GetCharAttribs().GetAttribs(), nAttr );
- }
-
- if ( bChanged )
- {
- // char attributes need to be sorted by start again
- pNode->GetCharAttribs().ResortAttribs();
-
- SetModified( TRUE );
- }
-
- return bChanged;
-}
-
-void EditDoc::InsertAttrib( const SfxPoolItem& rPoolItem, ContentNode* pNode, USHORT nStart, USHORT nEnd )
-{
- // Diese Methode prueft nicht mehr, ob ein entspr. Attribut
- // schon an der Stelle existiert!
-
- EditCharAttrib* pAttrib = MakeCharAttrib( GetItemPool(), rPoolItem, nStart, nEnd );
- DBG_ASSERT( pAttrib, "MakeCharAttrib fehlgeschlagen!" );
- pNode->GetCharAttribs().InsertAttrib( pAttrib );
-
- SetModified( TRUE );
-}
-
-void EditDoc::InsertAttrib( ContentNode* pNode, USHORT nStart, USHORT nEnd, const SfxPoolItem& rPoolItem )
-{
- if ( nStart != nEnd )
- {
- InsertAttribInSelection( pNode, nStart, nEnd, rPoolItem );
- }
- else
- {
- // Pruefen, ob schon ein neues Attribut mit der WhichId an der Stelle:
- EditCharAttrib* pAttr = pNode->GetCharAttribs().FindEmptyAttrib( rPoolItem.Which(), nStart );
- if ( pAttr )
- {
- // Attribut entfernen....
- pNode->GetCharAttribs().GetAttribs().Remove(
- pNode->GetCharAttribs().GetAttribs().GetPos( pAttr ) );
- }
-
- // pruefen, ob ein 'gleiches' Attribut an der Stelle liegt.
- pAttr = pNode->GetCharAttribs().FindAttrib( rPoolItem.Which(), nStart );
- if ( pAttr )
- {
- if ( pAttr->IsInside( nStart ) ) // splitten
- {
- // ???????????????????????????????
- // eigentlich noch pruefen, ob wirklich splittet, oder return !
- // ???????????????????????????????
- USHORT nOldEnd = pAttr->GetEnd();
- pAttr->GetEnd() = nStart;
- pAttr = MakeCharAttrib( GetItemPool(), *(pAttr->GetItem()), nStart, nOldEnd );
- pNode->GetCharAttribs().InsertAttrib( pAttr );
- }
- else if ( pAttr->GetEnd() == nStart )
- {
- DBG_ASSERT( !pAttr->IsEmpty(), "Doch noch ein leeres Attribut?" );
- // pruefen, ob genau das gleiche Attribut
- if ( *(pAttr->GetItem()) == rPoolItem )
- return;
- }
- }
- InsertAttrib( rPoolItem, pNode, nStart, nStart );
- }
-
- SetModified( TRUE );
-}
-
-void EditDoc::FindAttribs( ContentNode* pNode, USHORT nStartPos, USHORT nEndPos, SfxItemSet& rCurSet )
-{
- DBG_ASSERT( pNode, "Wo soll ich suchen ?" );
- DBG_ASSERT( nStartPos <= nEndPos, "Ungueltiger Bereich!" );
-
- USHORT nAttr = 0;
- EditCharAttrib* pAttr = GetAttrib( pNode->GetCharAttribs().GetAttribs(), nAttr );
- // keine Selection...
- if ( nStartPos == nEndPos )
- {
- while ( pAttr && ( pAttr->GetStart() <= nEndPos) )
- {
- const SfxPoolItem* pItem = 0;
- // Attribut liegt dadrueber...
- if ( ( pAttr->GetStart() < nStartPos ) && ( pAttr->GetEnd() > nStartPos ) )
- pItem = pAttr->GetItem();
- // Attribut endet hier, ist nicht leer
- else if ( ( pAttr->GetStart() < nStartPos ) && ( pAttr->GetEnd() == nStartPos ) )
- {
- if ( !pNode->GetCharAttribs().FindEmptyAttrib( pAttr->GetItem()->Which(), nStartPos ) )
- pItem = pAttr->GetItem();
- }
- // Attribut endet hier, ist leer
- else if ( ( pAttr->GetStart() == nStartPos ) && ( pAttr->GetEnd() == nStartPos ) )
- {
- pItem = pAttr->GetItem();
- }
- // Attribut beginnt hier
- else if ( ( pAttr->GetStart() == nStartPos ) && ( pAttr->GetEnd() > nStartPos ) )
- {
- if ( nStartPos == 0 ) // Sonderfall
- pItem = pAttr->GetItem();
- }
-
- if ( pItem )
- {
- USHORT nWhich = pItem->Which();
- if ( rCurSet.GetItemState( nWhich ) == SFX_ITEM_OFF )
- {
- rCurSet.Put( *pItem );
- }
- else if ( rCurSet.GetItemState( nWhich ) == SFX_ITEM_ON )
- {
- const SfxPoolItem& rItem = rCurSet.Get( nWhich );
- if ( rItem != *pItem )
- {
- rCurSet.InvalidateItem( nWhich );
- }
- }
- }
- nAttr++;
- pAttr = GetAttrib( pNode->GetCharAttribs().GetAttribs(), nAttr );
- }
- }
- else // Selektion
- {
- while ( pAttr && ( pAttr->GetStart() < nEndPos) )
- {
- const SfxPoolItem* pItem = 0;
- // Attribut liegt dadrueber...
- if ( ( pAttr->GetStart() <= nStartPos ) && ( pAttr->GetEnd() >= nEndPos ) )
- pItem = pAttr->GetItem();
- // Attribut startet mitten drin...
- else if ( pAttr->GetStart() >= nStartPos )
- {
- // !!! pItem = pAttr->GetItem();
- // einfach nur pItem reicht nicht, da ich z.B. bei Shadow
- // niemals ein ungleiches Item finden wuerde, da ein solche
- // seine Anwesenheit durch Abwesenheit repraesentiert!
- // if ( ... )
- // Es muesste geprueft werden, on genau das gleiche Attribut
- // an der Bruchstelle aufsetzt, was recht aufwendig ist.
- // Da ich beim Einfuegen von Attributen aber etwas optimiere
- // tritt der Fall nicht so schnell auf...
- // Also aus Geschwindigkeitsgruenden:
- rCurSet.InvalidateItem( pAttr->GetItem()->Which() );
-
- }
- // Attribut endet mitten drin...
- else if ( pAttr->GetEnd() > nStartPos )
- {
- // pItem = pAttr->GetItem();
- // s.o.
- /*-----------------31.05.95 16:01-------------------
- Ist falsch, wenn das gleiche Attribut sofort wieder
- eingestellt wird!
- => Sollte am besten nicht vorkommen, also gleich beim
- Setzen von Attributen richtig machen!
- --------------------------------------------------*/
- rCurSet.InvalidateItem( pAttr->GetItem()->Which() );
- }
-
- if ( pItem )
- {
- USHORT nWhich = pItem->Which();
- if ( rCurSet.GetItemState( nWhich ) == SFX_ITEM_OFF )
- {
- rCurSet.Put( *pItem );
- }
- else if ( rCurSet.GetItemState( nWhich ) == SFX_ITEM_ON )
- {
- const SfxPoolItem& rItem = rCurSet.Get( nWhich );
- if ( rItem != *pItem )
- {
- rCurSet.InvalidateItem( nWhich );
- }
- }
- }
- nAttr++;
- pAttr = GetAttrib( pNode->GetCharAttribs().GetAttribs(), nAttr );
- }
- }
-}
-
-
- // -------------------------------------------------------------------------
-// class EditCharAttribList
-// -------------------------------------------------------------------------
-
-CharAttribList::CharAttribList()
-{
- DBG_CTOR( EE_CharAttribList, 0 );
- bHasEmptyAttribs = FALSE;
-}
-
-CharAttribList::~CharAttribList()
-{
- DBG_DTOR( EE_CharAttribList, 0 );
-
- USHORT nAttr = 0;
- EditCharAttrib* pAttr = GetAttrib( aAttribs, nAttr );
- while ( pAttr )
- {
- delete pAttr;
- ++nAttr;
- pAttr = GetAttrib( aAttribs, nAttr );
- }
- Clear();
-}
-
-void CharAttribList::InsertAttrib( EditCharAttrib* pAttrib )
-{
-// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-// optimieren: binaere Suche ? !
-// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
- // MT: 26.11.98
- // Vielleicht aber auch einfach nur rueckwaerts iterieren:
- // Der haeufigste und kritischste Fall: Attribute kommen bereits
- // sortiert an (InsertBinTextObject!)
- // Hier waere auch binaere Suche nicht optimal.
- // => Wuerde einiges bringen!
-
- const USHORT nCount = Count();
- const USHORT nStart = pAttrib->GetStart(); // vielleicht besser fuer Comp.Opt.
-
- if ( pAttrib->IsEmpty() )
- bHasEmptyAttribs = TRUE;
-
- BOOL bInserted = FALSE;
- for ( USHORT x = 0; x < nCount; x++ )
- {
- EditCharAttribPtr pCurAttrib = aAttribs[x];
- if ( pCurAttrib->GetStart() > nStart )
- {
- aAttribs.Insert( pAttrib, x );
- bInserted = TRUE;
- break;
- }
- }
- if ( !bInserted )
- aAttribs.Insert( pAttrib, nCount );
-}
-
-void CharAttribList::ResortAttribs()
-{
- if ( Count() )
- {
-#if defined __SUNPRO_CC
-#pragma disable_warn
-#endif
- qsort( (void*)aAttribs.GetData(), aAttribs.Count(), sizeof( EditCharAttrib* ), CompareStart );
-#if defined __SUNPRO_CC
-#pragma enable_warn
-#endif
- }
-}
-
-void CharAttribList::OptimizeRanges( SfxItemPool& rItemPool )
-{
- for ( USHORT n = 0; n < aAttribs.Count(); n++ )
- {
- EditCharAttrib* pAttr = aAttribs.GetObject( n );
- for ( USHORT nNext = n+1; nNext < aAttribs.Count(); nNext++ )
- {
- EditCharAttrib* p = aAttribs.GetObject( nNext );
- if ( !pAttr->IsFeature() && ( p->GetStart() == pAttr->GetEnd() ) && ( p->Which() == pAttr->Which() ) )
- {
- if ( *p->GetItem() == *pAttr->GetItem() )
- {
- pAttr->GetEnd() = p->GetEnd();
- aAttribs.Remove( nNext );
- rItemPool.Remove( *p->GetItem() );
- delete p;
- }
- break; // only 1 attr with same which can start here.
- }
- else if ( p->GetStart() > pAttr->GetEnd() )
- {
- break;
- }
- }
- }
-}
-
-EditCharAttrib* CharAttribList::FindAttrib( USHORT nWhich, USHORT nPos )
-{
- // Rueckwaerts, falls eins dort endet, das naechste startet.
- // => Das startende gilt...
- USHORT nAttr = aAttribs.Count()-1;
- EditCharAttrib* pAttr = GetAttrib( aAttribs, nAttr );
- while ( pAttr )
- {
- if ( ( pAttr->Which() == nWhich ) && pAttr->IsIn(nPos) )
- return pAttr;
- pAttr = GetAttrib( aAttribs, --nAttr );
- }
- return 0;
-}
-
-EditCharAttrib* CharAttribList::FindNextAttrib( USHORT nWhich, USHORT nFromPos ) const
-{
- DBG_ASSERT( nWhich, "FindNextAttrib: Which?" );
- const USHORT nAttribs = aAttribs.Count();
- for ( USHORT nAttr = 0; nAttr < nAttribs; nAttr++ )
- {
- EditCharAttrib* pAttr = aAttribs[ nAttr ];
- if ( ( pAttr->GetStart() >= nFromPos ) && ( pAttr->Which() == nWhich ) )
- return pAttr;
- }
- return 0;
-}
-
-BOOL CharAttribList::HasAttrib( USHORT nWhich ) const
-{
- for ( USHORT nAttr = aAttribs.Count(); nAttr; )
- {
- const EditCharAttrib* pAttr = aAttribs[--nAttr];
- if ( pAttr->Which() == nWhich )
- return TRUE;
- }
- return FALSE;
-}
-
-BOOL CharAttribList::HasAttrib( USHORT nStartPos, USHORT nEndPos ) const
-{
- BOOL bAttr = FALSE;
- for ( USHORT nAttr = aAttribs.Count(); nAttr && !bAttr; )
- {
- const EditCharAttrib* pAttr = aAttribs[--nAttr];
- if ( ( pAttr->GetStart() < nEndPos ) && ( pAttr->GetEnd() > nStartPos ) )
- return bAttr = TRUE;
- }
- return bAttr;
-}
-
-
-BOOL CharAttribList::HasBoundingAttrib( USHORT nBound )
-{
- // Rueckwaerts, falls eins dort endet, das naechste startet.
- // => Das startende gilt...
- USHORT nAttr = aAttribs.Count()-1;
- EditCharAttrib* pAttr = GetAttrib( aAttribs, nAttr );
- while ( pAttr && ( pAttr->GetEnd() >= nBound ) )
- {
- if ( ( pAttr->GetStart() == nBound ) || ( pAttr->GetEnd() == nBound ) )
- return TRUE;
- pAttr = GetAttrib( aAttribs, --nAttr );
- }
- return FALSE;
-}
-
-EditCharAttrib* CharAttribList::FindEmptyAttrib( USHORT nWhich, USHORT nPos )
-{
- if ( !bHasEmptyAttribs )
- return 0;
- USHORT nAttr = 0;
- EditCharAttrib* pAttr = GetAttrib( aAttribs, nAttr );
- while ( pAttr && ( pAttr->GetStart() <= nPos ) )
- {
- if ( ( pAttr->GetStart() == nPos ) && ( pAttr->GetEnd() == nPos ) && ( pAttr->Which() == nWhich ) )
- return pAttr;
- nAttr++;
- pAttr = GetAttrib( aAttribs, nAttr );
- }
- return 0;
-}
-
-EditCharAttrib* CharAttribList::FindFeature( USHORT nPos ) const
-{
-
- USHORT nAttr = 0;
- EditCharAttrib* pNextAttrib = GetAttrib( aAttribs, nAttr );
-
- // erstmal zur gewuenschten Position...
- while ( pNextAttrib && ( pNextAttrib->GetStart() < nPos ) )
- {
- nAttr++;
- pNextAttrib = GetAttrib( aAttribs, nAttr );
- }
-
- // jetzt das Feature suchen...
- while ( pNextAttrib && !pNextAttrib->IsFeature() )
- {
- nAttr++;
- pNextAttrib = GetAttrib( aAttribs, nAttr );
- }
-
- return pNextAttrib;
-}
-
-
-void CharAttribList::DeleteEmptyAttribs( SfxItemPool& rItemPool )
-{
- for ( USHORT nAttr = 0; nAttr < aAttribs.Count(); nAttr++ )
- {
- EditCharAttrib* pAttr = aAttribs[nAttr];
- if ( pAttr->IsEmpty() )
- {
- rItemPool.Remove( *pAttr->GetItem() );
- aAttribs.Remove( nAttr );
- delete pAttr;
- nAttr--;
- }
- }
- bHasEmptyAttribs = FALSE;
-}
-
-BOOL CharAttribList::DbgCheckAttribs()
-{
-#ifdef DBG_UTIL
- BOOL bOK = TRUE;
- for ( USHORT nAttr = 0; nAttr < aAttribs.Count(); nAttr++ )
- {
- EditCharAttrib* pAttr = aAttribs[nAttr];
- if ( pAttr->GetStart() > pAttr->GetEnd() )
- {
- bOK = FALSE;
- DBG_ERROR( "Attr verdreht" );
- }
- else if ( pAttr->IsFeature() && ( pAttr->GetLen() != 1 ) )
- {
- bOK = FALSE;
- DBG_ERROR( "Feature, Len != 1" );
- }
- }
- return bOK;
-#else
- return TRUE;
-#endif
-}
-
-
-
-SvxFontTable::SvxFontTable()
-{
-}
-
-SvxFontTable::~SvxFontTable()
-{
- SvxFontItem* pItem = First();
- while( pItem )
- {
- delete pItem;
- pItem = Next();
- }
-}
-
-ULONG SvxFontTable::GetId( const SvxFontItem& rFontItem )
-{
- SvxFontItem* pItem = First();
- while ( pItem )
- {
- if ( *pItem == rFontItem )
- return GetCurKey();
- pItem = Next();
- }
- DBG_WARNING( "Font nicht gefunden: GetId()" );
- return 0;
-}
-
-SvxColorList::SvxColorList()
-{
-}
-
-SvxColorList::~SvxColorList()
-{
- SvxColorItem* pItem = First();
- while( pItem )
- {
- delete pItem;
- pItem = Next();
- }
-}
-
-ULONG SvxColorList::GetId( const SvxColorItem& rColorItem )
-{
- SvxColorItem* pItem = First();
- while ( pItem )
- {
- if ( *pItem == rColorItem )
- return GetCurPos();
- pItem = Next();
- }
- DBG_WARNING( "Color nicht gefunden: GetId()" );
- return 0;
-}
-
-EditEngineItemPool::EditEngineItemPool( BOOL bPersistenRefCounts )
- : SfxItemPool( String( "EditEngineItemPool", RTL_TEXTENCODING_ASCII_US ), EE_ITEMS_START, EE_ITEMS_END,
- aItemInfos, 0, bPersistenRefCounts )
-{
- SetVersionMap( 1, 3999, 4015, aV1Map );
- SetVersionMap( 2, 3999, 4019, aV2Map );
- SetVersionMap( 3, 3997, 4020, aV3Map );
- SetVersionMap( 4, 3994, 4022, aV4Map );
- SetVersionMap( 5, 3994, 4037, aV5Map );
-
- DBG_ASSERT( EE_DLL(), "EditDLL?!" );
- SfxPoolItem** ppDefItems = EE_DLL()->GetGlobalData()->GetDefItems();
- SetDefaults( ppDefItems );
-}
-
-EditEngineItemPool::~EditEngineItemPool()
-{
-}
-
-SvStream& EditEngineItemPool::Store( SvStream& rStream ) const
-{
- // Bei einem 3.1-Export muess ein Hack eingebaut werden, da BUG im
- // SfxItemSet::Load, aber nicht nachtraeglich in 3.1 fixbar.
-
- // Der eingestellte Range muss nach Store erhalten bleiben, weil dann
- // erst die ItemSets gespeichert werden...
-
- long nVersion = rStream.GetVersion();
- BOOL b31Format = ( nVersion && ( nVersion <= SOFFICE_FILEFORMAT_31 ) )
- ? TRUE : FALSE;
-
- EditEngineItemPool* pThis = (EditEngineItemPool*)this;
- if ( b31Format )
- pThis->SetStoringRange( 3997, 4022 );
- else
- pThis->SetStoringRange( EE_ITEMS_START, EE_ITEMS_END );
-
- return SfxItemPool::Store( rStream );
-}