xref: /aoo41x/main/editeng/source/editeng/editdoc.hxx (revision 95c02664)
1*95c02664SSteve Yin /**************************************************************
2*95c02664SSteve Yin  *
3*95c02664SSteve Yin  * Licensed to the Apache Software Foundation (ASF) under one
4*95c02664SSteve Yin  * or more contributor license agreements.  See the NOTICE file
5*95c02664SSteve Yin  * distributed with this work for additional information
6*95c02664SSteve Yin  * regarding copyright ownership.  The ASF licenses this file
7*95c02664SSteve Yin  * to you under the Apache License, Version 2.0 (the
8*95c02664SSteve Yin  * "License"); you may not use this file except in compliance
9*95c02664SSteve Yin  * with the License.  You may obtain a copy of the License at
10*95c02664SSteve Yin  *
11*95c02664SSteve Yin  *   http://www.apache.org/licenses/LICENSE-2.0
12*95c02664SSteve Yin  *
13*95c02664SSteve Yin  * Unless required by applicable law or agreed to in writing,
14*95c02664SSteve Yin  * software distributed under the License is distributed on an
15*95c02664SSteve Yin  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*95c02664SSteve Yin  * KIND, either express or implied.  See the License for the
17*95c02664SSteve Yin  * specific language governing permissions and limitations
18*95c02664SSteve Yin  * under the License.
19*95c02664SSteve Yin  *
20*95c02664SSteve Yin  *************************************************************/
21*95c02664SSteve Yin 
22*95c02664SSteve Yin 
23*95c02664SSteve Yin 
24*95c02664SSteve Yin #ifndef _EDITDOC_HXX
25*95c02664SSteve Yin #define _EDITDOC_HXX
26*95c02664SSteve Yin 
27*95c02664SSteve Yin #ifndef _COM_SUN_STAR_I18N_XEXTENDEDINPUTSEQUENCECHECKER_HDL_
28*95c02664SSteve Yin #include <com/sun/star/i18n/XExtendedInputSequenceChecker.hpp>
29*95c02664SSteve Yin #endif
30*95c02664SSteve Yin 
31*95c02664SSteve Yin #include <editattr.hxx>
32*95c02664SSteve Yin #include <edtspell.hxx>
33*95c02664SSteve Yin #include <editeng/svxfont.hxx>
34*95c02664SSteve Yin #include <svl/itemset.hxx>
35*95c02664SSteve Yin #include <svl/style.hxx>
36*95c02664SSteve Yin #include <svl/itempool.hxx>
37*95c02664SSteve Yin #include <tools/table.hxx>
38*95c02664SSteve Yin 
39*95c02664SSteve Yin #include <deque>
40*95c02664SSteve Yin 
41*95c02664SSteve Yin class ImpEditEngine;
42*95c02664SSteve Yin class SvxTabStop;
43*95c02664SSteve Yin class SvtCTLOptions;
44*95c02664SSteve Yin 
45*95c02664SSteve Yin DBG_NAMEEX( EE_TextPortion )
46*95c02664SSteve Yin 
47*95c02664SSteve Yin #define CHARPOSGROW		16
48*95c02664SSteve Yin #define DEFTAB 			720
49*95c02664SSteve Yin 
50*95c02664SSteve Yin void CreateFont( SvxFont& rFont, const SfxItemSet& rSet, bool bSearchInParent = true, short nScriptType = 0 );
51*95c02664SSteve Yin sal_uInt16 GetScriptItemId( sal_uInt16 nItemId, short nScriptType );
52*95c02664SSteve Yin sal_Bool IsScriptItemValid( sal_uInt16 nItemId, short nScriptType );
53*95c02664SSteve Yin 
54*95c02664SSteve Yin EditCharAttrib* MakeCharAttrib( SfxItemPool& rPool, const SfxPoolItem& rAttr, sal_uInt16 nS, sal_uInt16 nE );
55*95c02664SSteve Yin 
56*95c02664SSteve Yin class ContentNode;
57*95c02664SSteve Yin class EditDoc;
58*95c02664SSteve Yin 
59*95c02664SSteve Yin struct EPaM
60*95c02664SSteve Yin {
61*95c02664SSteve Yin 	sal_uInt16 nPara;
62*95c02664SSteve Yin 	sal_uInt16 nIndex;
63*95c02664SSteve Yin 
EPaMEPaM64*95c02664SSteve Yin 	EPaM()								{ nPara = 0; nIndex = 0; }
EPaMEPaM65*95c02664SSteve Yin 	EPaM( sal_uInt16 nP, sal_uInt16 nI )		{ nPara = nP; nIndex = nI; }
EPaMEPaM66*95c02664SSteve Yin 	EPaM( const EPaM& r)				{ nPara = r.nPara; nIndex = r.nIndex; }
operator =EPaM67*95c02664SSteve Yin 	EPaM& operator = ( const EPaM& r )	{ nPara = r.nPara; nIndex = r.nIndex; return *this; }
68*95c02664SSteve Yin 	inline sal_Bool operator == ( const EPaM& r ) const;
69*95c02664SSteve Yin 	inline sal_Bool operator < ( const EPaM& r ) const;
70*95c02664SSteve Yin };
71*95c02664SSteve Yin 
operator <(const EPaM & r) const72*95c02664SSteve Yin inline sal_Bool EPaM::operator < ( const EPaM& r ) const
73*95c02664SSteve Yin {
74*95c02664SSteve Yin 	return ( ( nPara < r.nPara ) ||
75*95c02664SSteve Yin 			 ( ( nPara == r.nPara ) && nIndex < r.nIndex ) ) ? sal_True : sal_False;
76*95c02664SSteve Yin }
77*95c02664SSteve Yin 
operator ==(const EPaM & r) const78*95c02664SSteve Yin inline sal_Bool EPaM::operator == ( const EPaM& r ) const
79*95c02664SSteve Yin {
80*95c02664SSteve Yin 	return ( ( nPara == r.nPara ) && ( nIndex == r.nIndex ) ) ? sal_True : sal_False;
81*95c02664SSteve Yin }
82*95c02664SSteve Yin 
83*95c02664SSteve Yin struct ScriptTypePosInfo
84*95c02664SSteve Yin {
85*95c02664SSteve Yin 	short	nScriptType;
86*95c02664SSteve Yin 	sal_uInt16	nStartPos;
87*95c02664SSteve Yin 	sal_uInt16	nEndPos;
88*95c02664SSteve Yin 
ScriptTypePosInfoScriptTypePosInfo89*95c02664SSteve Yin 	ScriptTypePosInfo( short _Type, sal_uInt16 _Start, sal_uInt16 _End )
90*95c02664SSteve Yin 	{
91*95c02664SSteve Yin 		nScriptType = _Type;
92*95c02664SSteve Yin 		nStartPos = _Start;
93*95c02664SSteve Yin 		nEndPos = _End;
94*95c02664SSteve Yin 	}
95*95c02664SSteve Yin };
96*95c02664SSteve Yin 
97*95c02664SSteve Yin typedef std::deque< ScriptTypePosInfo > ScriptTypePosInfos;
98*95c02664SSteve Yin 
99*95c02664SSteve Yin struct WritingDirectionInfo
100*95c02664SSteve Yin {
101*95c02664SSteve Yin 	sal_uInt8	nType;
102*95c02664SSteve Yin 	sal_uInt16	nStartPos;
103*95c02664SSteve Yin 	sal_uInt16	nEndPos;
104*95c02664SSteve Yin 
WritingDirectionInfoWritingDirectionInfo105*95c02664SSteve Yin 	WritingDirectionInfo( sal_uInt8 _Type, sal_uInt16 _Start, sal_uInt16 _End )
106*95c02664SSteve Yin 	{
107*95c02664SSteve Yin 		nType = _Type;
108*95c02664SSteve Yin 		nStartPos = _Start;
109*95c02664SSteve Yin 		nEndPos = _End;
110*95c02664SSteve Yin 	}
111*95c02664SSteve Yin };
112*95c02664SSteve Yin 
113*95c02664SSteve Yin 
114*95c02664SSteve Yin typedef std::deque< WritingDirectionInfo > WritingDirectionInfos;
115*95c02664SSteve Yin 
116*95c02664SSteve Yin typedef EditCharAttrib* EditCharAttribPtr;
117*95c02664SSteve Yin SV_DECL_PTRARR( CharAttribArray, EditCharAttribPtr, 0, 4 )
118*95c02664SSteve Yin 
119*95c02664SSteve Yin class ContentAttribsInfo
120*95c02664SSteve Yin {
121*95c02664SSteve Yin private:
122*95c02664SSteve Yin 	SfxItemSet			aPrevParaAttribs;
123*95c02664SSteve Yin 	CharAttribArray		aPrevCharAttribs;
124*95c02664SSteve Yin 
125*95c02664SSteve Yin public:
126*95c02664SSteve Yin 						ContentAttribsInfo( const SfxItemSet& rParaAttribs );
127*95c02664SSteve Yin 
GetPrevParaAttribs() const128*95c02664SSteve Yin 	const SfxItemSet&		GetPrevParaAttribs() const	{ return aPrevParaAttribs; }
GetPrevCharAttribs() const129*95c02664SSteve Yin 	const CharAttribArray&	GetPrevCharAttribs() const	{ return aPrevCharAttribs; }
130*95c02664SSteve Yin 
GetPrevCharAttribs()131*95c02664SSteve Yin 	CharAttribArray&		GetPrevCharAttribs() 		{ return aPrevCharAttribs; }
132*95c02664SSteve Yin };
133*95c02664SSteve Yin 
134*95c02664SSteve Yin typedef ContentAttribsInfo* ContentAttribsInfoPtr;
135*95c02664SSteve Yin SV_DECL_PTRARR( ContentInfoArray, ContentAttribsInfoPtr, 1, 1 )
136*95c02664SSteve Yin 
137*95c02664SSteve Yin //	----------------------------------------------------------------------
138*95c02664SSteve Yin //	class SvxFontTable
139*95c02664SSteve Yin //	----------------------------------------------------------------------
140*95c02664SSteve Yin DECLARE_TABLE( DummyFontTable, SvxFontItem* )
141*95c02664SSteve Yin class SvxFontTable : public DummyFontTable
142*95c02664SSteve Yin {
143*95c02664SSteve Yin public:
144*95c02664SSteve Yin 			SvxFontTable();
145*95c02664SSteve Yin 			~SvxFontTable();
146*95c02664SSteve Yin 
147*95c02664SSteve Yin 	sal_uLong	GetId( const SvxFontItem& rFont );
148*95c02664SSteve Yin };
149*95c02664SSteve Yin 
150*95c02664SSteve Yin //	----------------------------------------------------------------------
151*95c02664SSteve Yin //	class SvxColorList
152*95c02664SSteve Yin //	----------------------------------------------------------------------
153*95c02664SSteve Yin typedef ContentNode* ContentNodePtr;
154*95c02664SSteve Yin DECLARE_LIST( DummyColorList, SvxColorItem* )
155*95c02664SSteve Yin class SvxColorList : public DummyColorList
156*95c02664SSteve Yin {
157*95c02664SSteve Yin public:
158*95c02664SSteve Yin 			SvxColorList();
159*95c02664SSteve Yin 			~SvxColorList();
160*95c02664SSteve Yin 
161*95c02664SSteve Yin 	sal_uLong	GetId( const SvxColorItem& rColor );
162*95c02664SSteve Yin };
163*95c02664SSteve Yin 
164*95c02664SSteve Yin //	----------------------------------------------------------------------
165*95c02664SSteve Yin //	class ItemList
166*95c02664SSteve Yin //	----------------------------------------------------------------------
167*95c02664SSteve Yin typedef const SfxPoolItem* ConstPoolItemPtr;
168*95c02664SSteve Yin DECLARE_LIST( DummyItemList, ConstPoolItemPtr )
169*95c02664SSteve Yin class ItemList : public DummyItemList
170*95c02664SSteve Yin {
171*95c02664SSteve Yin public:
172*95c02664SSteve Yin 	const SfxPoolItem*	FindAttrib( sal_uInt16 nWhich );
173*95c02664SSteve Yin };
174*95c02664SSteve Yin 
175*95c02664SSteve Yin // -------------------------------------------------------------------------
176*95c02664SSteve Yin // class ContentAttribs
177*95c02664SSteve Yin // -------------------------------------------------------------------------
178*95c02664SSteve Yin class ContentAttribs
179*95c02664SSteve Yin {
180*95c02664SSteve Yin private:
181*95c02664SSteve Yin 	SfxStyleSheet*	pStyle;
182*95c02664SSteve Yin 	SfxItemSet		aAttribSet;
183*95c02664SSteve Yin 
184*95c02664SSteve Yin public:
185*95c02664SSteve Yin 					ContentAttribs( SfxItemPool& rItemPool );
186*95c02664SSteve Yin 					ContentAttribs( const ContentAttribs& );
187*95c02664SSteve Yin 					~ContentAttribs();	// erst bei umfangreicheren Tabs
188*95c02664SSteve Yin 
189*95c02664SSteve Yin 	SvxTabStop		FindTabStop( long nCurPos, sal_uInt16 nDefTab );
GetItems()190*95c02664SSteve Yin 	SfxItemSet&		GetItems()							{ return aAttribSet; }
GetStyleSheet() const191*95c02664SSteve Yin 	SfxStyleSheet*	GetStyleSheet() const				{ return pStyle; }
192*95c02664SSteve Yin 	void			SetStyleSheet( SfxStyleSheet* pS );
193*95c02664SSteve Yin 
194*95c02664SSteve Yin 	const SfxPoolItem&	GetItem( sal_uInt16 nWhich );
195*95c02664SSteve Yin 	sal_Bool				HasItem( sal_uInt16 nWhich );
196*95c02664SSteve Yin };
197*95c02664SSteve Yin 
198*95c02664SSteve Yin // -------------------------------------------------------------------------
199*95c02664SSteve Yin // class CharAttribList
200*95c02664SSteve Yin // -------------------------------------------------------------------------
201*95c02664SSteve Yin class CharAttribList
202*95c02664SSteve Yin {
203*95c02664SSteve Yin private:
204*95c02664SSteve Yin 	CharAttribArray	aAttribs;
205*95c02664SSteve Yin 	SvxFont			aDefFont;				// schneller, als jedesmal vom Pool!
206*95c02664SSteve Yin 	sal_Bool			bHasEmptyAttribs;
207*95c02664SSteve Yin 
CharAttribList(const CharAttribList &)208*95c02664SSteve Yin 					CharAttribList( const CharAttribList& ) {;}
209*95c02664SSteve Yin 
210*95c02664SSteve Yin public:
211*95c02664SSteve Yin 					CharAttribList();
212*95c02664SSteve Yin 					~CharAttribList();
213*95c02664SSteve Yin 
214*95c02664SSteve Yin 	void			DeleteEmptyAttribs(  SfxItemPool& rItemPool );
215*95c02664SSteve Yin 	void			RemoveItemsFromPool( SfxItemPool* pItemPool );
216*95c02664SSteve Yin 
217*95c02664SSteve Yin 	EditCharAttrib*	FindAttrib( sal_uInt16 nWhich, sal_uInt16 nPos );
218*95c02664SSteve Yin 	EditCharAttrib*	FindNextAttrib( sal_uInt16 nWhich, sal_uInt16 nFromPos ) const;
219*95c02664SSteve Yin 	EditCharAttrib*	FindEmptyAttrib( sal_uInt16 nWhich, sal_uInt16 nPos );
220*95c02664SSteve Yin 	EditCharAttrib*	FindFeature( sal_uInt16 nPos ) const;
221*95c02664SSteve Yin 
222*95c02664SSteve Yin 
223*95c02664SSteve Yin 	void			ResortAttribs();
224*95c02664SSteve Yin     void            OptimizeRanges( SfxItemPool& rItemPool );
225*95c02664SSteve Yin 
Count()226*95c02664SSteve Yin 	sal_uInt16			Count()					{ return aAttribs.Count(); }
Clear()227*95c02664SSteve Yin 	void			Clear()					{ aAttribs.Remove( 0, aAttribs.Count()); }
228*95c02664SSteve Yin 	void			InsertAttrib( EditCharAttrib* pAttrib );
229*95c02664SSteve Yin 
GetDefFont()230*95c02664SSteve Yin 	SvxFont&		GetDefFont() 			{ return aDefFont; }
231*95c02664SSteve Yin 
HasEmptyAttribs() const232*95c02664SSteve Yin 	sal_Bool			HasEmptyAttribs() const	{ return bHasEmptyAttribs; }
HasEmptyAttribs()233*95c02664SSteve Yin 	sal_Bool&			HasEmptyAttribs() 		{ return bHasEmptyAttribs; }
234*95c02664SSteve Yin 	sal_Bool			HasBoundingAttrib( sal_uInt16 nBound );
235*95c02664SSteve Yin 	sal_Bool 			HasAttrib( sal_uInt16 nWhich ) const;
236*95c02664SSteve Yin 	sal_Bool			HasAttrib( sal_uInt16 nStartPos, sal_uInt16 nEndPos ) const;
237*95c02664SSteve Yin 
GetAttribs()238*95c02664SSteve Yin 	CharAttribArray&		GetAttribs() 		{ return aAttribs; }
GetAttribs() const239*95c02664SSteve Yin 	const CharAttribArray&	GetAttribs() const	{ return aAttribs; }
240*95c02664SSteve Yin 
241*95c02664SSteve Yin 	// Debug:
242*95c02664SSteve Yin 	sal_Bool			DbgCheckAttribs();
243*95c02664SSteve Yin };
244*95c02664SSteve Yin 
245*95c02664SSteve Yin // -------------------------------------------------------------------------
246*95c02664SSteve Yin // class ContentNode
247*95c02664SSteve Yin // -------------------------------------------------------------------------
248*95c02664SSteve Yin class ContentNode : public XubString
249*95c02664SSteve Yin {
250*95c02664SSteve Yin private:
251*95c02664SSteve Yin 	ContentAttribs	aContentAttribs;
252*95c02664SSteve Yin 	CharAttribList	aCharAttribList;
253*95c02664SSteve Yin 	WrongList*		pWrongList;
254*95c02664SSteve Yin 
255*95c02664SSteve Yin public:
256*95c02664SSteve Yin 					ContentNode( SfxItemPool& rItemPool );
257*95c02664SSteve Yin 					ContentNode( const XubString& rStr, const ContentAttribs& rContentAttribs );
258*95c02664SSteve Yin 					~ContentNode();
259*95c02664SSteve Yin 
GetContentAttribs()260*95c02664SSteve Yin 	ContentAttribs&	GetContentAttribs() 	{ return aContentAttribs; }
GetCharAttribs()261*95c02664SSteve Yin 	CharAttribList&	GetCharAttribs()		{ return aCharAttribList; }
262*95c02664SSteve Yin 
263*95c02664SSteve Yin 	void			ExpandAttribs( sal_uInt16 nIndex, sal_uInt16 nNewChars, SfxItemPool& rItemPool );
264*95c02664SSteve Yin 	void			CollapsAttribs( sal_uInt16 nIndex, sal_uInt16 nDelChars, SfxItemPool& rItemPool );
265*95c02664SSteve Yin 	void			AppendAttribs( ContentNode* pNextNode );
266*95c02664SSteve Yin 	void			CopyAndCutAttribs( ContentNode* pPrevNode, SfxItemPool& rPool, sal_Bool bKeepEndingAttribs );
267*95c02664SSteve Yin 
268*95c02664SSteve Yin 	void			SetStyleSheet( SfxStyleSheet* pS, sal_Bool bRecalcFont = sal_True );
269*95c02664SSteve Yin 	void			SetStyleSheet( SfxStyleSheet* pS, const SvxFont& rFontFromStyle );
GetStyleSheet()270*95c02664SSteve Yin 	SfxStyleSheet*	GetStyleSheet()	{ return aContentAttribs.GetStyleSheet(); }
271*95c02664SSteve Yin 
272*95c02664SSteve Yin 	void			CreateDefFont();
273*95c02664SSteve Yin 
GetWrongList()274*95c02664SSteve Yin 	WrongList*		GetWrongList() 			{ return pWrongList; }
275*95c02664SSteve Yin 	void			SetWrongList( WrongList* p );
276*95c02664SSteve Yin 
277*95c02664SSteve Yin 	void			CreateWrongList();
278*95c02664SSteve Yin 	void			DestroyWrongList();
279*95c02664SSteve Yin 
IsFeature(sal_uInt16 nPos) const280*95c02664SSteve Yin 	sal_Bool			IsFeature( sal_uInt16 nPos ) const { return ( GetChar( nPos ) == CH_FEATURE ); }
281*95c02664SSteve Yin };
282*95c02664SSteve Yin 
283*95c02664SSteve Yin typedef ContentNode* ContentNodePtr;
284*95c02664SSteve Yin SV_DECL_PTRARR( DummyContentList, ContentNodePtr, 0, 4 )
285*95c02664SSteve Yin 
286*95c02664SSteve Yin class ContentList : public DummyContentList
287*95c02664SSteve Yin {
288*95c02664SSteve Yin   sal_uInt16 nLastCache;
289*95c02664SSteve Yin public:
ContentList()290*95c02664SSteve Yin   ContentList() : DummyContentList( 0, 4 ), nLastCache(0) {}
291*95c02664SSteve Yin   sal_uInt16 GetPos( const ContentNodePtr &rPtr ) const;
292*95c02664SSteve Yin };
293*95c02664SSteve Yin 
294*95c02664SSteve Yin // -------------------------------------------------------------------------
295*95c02664SSteve Yin // class EditPaM
296*95c02664SSteve Yin // -------------------------------------------------------------------------
297*95c02664SSteve Yin class EditPaM
298*95c02664SSteve Yin {
299*95c02664SSteve Yin private:
300*95c02664SSteve Yin 	ContentNode*	pNode;
301*95c02664SSteve Yin 	sal_uInt16			nIndex;
302*95c02664SSteve Yin 
303*95c02664SSteve Yin public:
EditPaM()304*95c02664SSteve Yin 					EditPaM() 							{ pNode = NULL; nIndex = 0; }
EditPaM(ContentNode * p,sal_uInt16 n)305*95c02664SSteve Yin 					EditPaM( ContentNode* p, sal_uInt16 n )	{ pNode = p; nIndex = n; }
306*95c02664SSteve Yin 
GetNode() const307*95c02664SSteve Yin 	ContentNode*	GetNode() const					{ return pNode; }
SetNode(ContentNode * p)308*95c02664SSteve Yin 	void			SetNode( ContentNode* p) 		{ pNode = p; }
309*95c02664SSteve Yin 
GetIndex() const310*95c02664SSteve Yin 	sal_uInt16			GetIndex() const				{ return nIndex; }
GetIndex()311*95c02664SSteve Yin 	sal_uInt16&			GetIndex() 						{ return nIndex; }
SetIndex(sal_uInt16 n)312*95c02664SSteve Yin 	void			SetIndex( sal_uInt16 n )			{ nIndex = n; }
313*95c02664SSteve Yin 
IsParaStart() const314*95c02664SSteve Yin 	sal_Bool			IsParaStart() const				{ return nIndex == 0; }
IsParaEnd() const315*95c02664SSteve Yin 	sal_Bool			IsParaEnd() const 				{ return nIndex == pNode->Len(); }
316*95c02664SSteve Yin 
317*95c02664SSteve Yin 	sal_Bool			DbgIsBuggy( EditDoc& rDoc );
318*95c02664SSteve Yin 
319*95c02664SSteve Yin 	EditPaM&	operator = ( const EditPaM& rPaM );
320*95c02664SSteve Yin 	friend sal_Bool operator == ( const EditPaM& r1,  const EditPaM& r2  );
321*95c02664SSteve Yin 	friend sal_Bool operator != ( const EditPaM& r1,  const EditPaM& r2  );
322*95c02664SSteve Yin };
323*95c02664SSteve Yin 
324*95c02664SSteve Yin #define PORTIONKIND_TEXT		0
325*95c02664SSteve Yin #define PORTIONKIND_TAB         1
326*95c02664SSteve Yin #define PORTIONKIND_LINEBREAK	2
327*95c02664SSteve Yin #define PORTIONKIND_FIELD		3
328*95c02664SSteve Yin #define PORTIONKIND_HYPHENATOR	4
329*95c02664SSteve Yin // #define PORTIONKIND_EXTRASPACE	5
330*95c02664SSteve Yin 
331*95c02664SSteve Yin #define DELMODE_SIMPLE			0
332*95c02664SSteve Yin #define DELMODE_RESTOFWORD		1
333*95c02664SSteve Yin #define DELMODE_RESTOFCONTENT	2
334*95c02664SSteve Yin 
335*95c02664SSteve Yin #define CHAR_NORMAL            0x00
336*95c02664SSteve Yin #define CHAR_KANA              0x01
337*95c02664SSteve Yin #define CHAR_PUNCTUATIONLEFT   0x02
338*95c02664SSteve Yin #define CHAR_PUNCTUATIONRIGHT  0x04
339*95c02664SSteve Yin 
340*95c02664SSteve Yin // -------------------------------------------------------------------------
341*95c02664SSteve Yin // struct ExtraPortionInfos
342*95c02664SSteve Yin // -------------------------------------------------------------------------
343*95c02664SSteve Yin struct ExtraPortionInfo
344*95c02664SSteve Yin {
345*95c02664SSteve Yin     long    nOrgWidth;
346*95c02664SSteve Yin     long    nWidthFullCompression;
347*95c02664SSteve Yin 
348*95c02664SSteve Yin     long    nPortionOffsetX;
349*95c02664SSteve Yin 
350*95c02664SSteve Yin     sal_uInt16  nMaxCompression100thPercent;
351*95c02664SSteve Yin 
352*95c02664SSteve Yin     sal_uInt8    nAsianCompressionTypes;
353*95c02664SSteve Yin     sal_Bool    bFirstCharIsRightPunktuation;
354*95c02664SSteve Yin     sal_Bool    bCompressed;
355*95c02664SSteve Yin 
356*95c02664SSteve Yin     sal_Int32*    pOrgDXArray;
357*95c02664SSteve Yin 
358*95c02664SSteve Yin 
359*95c02664SSteve Yin             ExtraPortionInfo();
360*95c02664SSteve Yin             ~ExtraPortionInfo();
361*95c02664SSteve Yin 
362*95c02664SSteve Yin     void    SaveOrgDXArray( const sal_Int32* pDXArray, sal_uInt16 nLen );
363*95c02664SSteve Yin     void    DestroyOrgDXArray();
364*95c02664SSteve Yin };
365*95c02664SSteve Yin 
366*95c02664SSteve Yin 
367*95c02664SSteve Yin // -------------------------------------------------------------------------
368*95c02664SSteve Yin // class TextPortion
369*95c02664SSteve Yin // -------------------------------------------------------------------------
370*95c02664SSteve Yin class TextPortion
371*95c02664SSteve Yin {
372*95c02664SSteve Yin private:
373*95c02664SSteve Yin     ExtraPortionInfo*   pExtraInfos;
374*95c02664SSteve Yin 	sal_uInt16		        nLen;
375*95c02664SSteve Yin 	Size		        aOutSz;
376*95c02664SSteve Yin 	sal_uInt8		        nKind;
377*95c02664SSteve Yin     sal_uInt8                nRightToLeft;
378*95c02664SSteve Yin 	sal_Unicode	        nExtraValue;
379*95c02664SSteve Yin 
380*95c02664SSteve Yin 
TextPortion()381*95c02664SSteve Yin 				TextPortion()				{ DBG_CTOR( EE_TextPortion, 0 );
382*95c02664SSteve Yin                                               pExtraInfos = NULL; nLen = 0; nKind = PORTIONKIND_TEXT; nExtraValue = 0; nRightToLeft = sal_False;}
383*95c02664SSteve Yin 
384*95c02664SSteve Yin public:
TextPortion(sal_uInt16 nL)385*95c02664SSteve Yin 				TextPortion( sal_uInt16 nL ) : aOutSz( -1, -1 )
386*95c02664SSteve Yin 											{	DBG_CTOR( EE_TextPortion, 0 );
387*95c02664SSteve Yin 												pExtraInfos = NULL; nLen = nL; nKind = PORTIONKIND_TEXT; nExtraValue = 0; nRightToLeft = sal_False;}
TextPortion(const TextPortion & r)388*95c02664SSteve Yin 				TextPortion( const TextPortion& r )	: aOutSz( r.aOutSz )
389*95c02664SSteve Yin 											{ DBG_CTOR( EE_TextPortion, 0 );
390*95c02664SSteve Yin 												pExtraInfos = NULL; nLen = r.nLen; nKind = r.nKind; nExtraValue = r.nExtraValue; nRightToLeft = r.nRightToLeft; }
391*95c02664SSteve Yin 
~TextPortion()392*95c02664SSteve Yin                 ~TextPortion()				{ 	DBG_DTOR( EE_TextPortion, 0 ); delete pExtraInfos; }
393*95c02664SSteve Yin 
GetLen() const394*95c02664SSteve Yin     sal_uInt16		GetLen() const				{ return nLen; }
GetLen()395*95c02664SSteve Yin 	sal_uInt16&		GetLen() 					{ return nLen; }
SetLen(sal_uInt16 nL)396*95c02664SSteve Yin 	void		SetLen( sal_uInt16 nL )			{ nLen = nL; }
397*95c02664SSteve Yin 
GetSize()398*95c02664SSteve Yin 	Size&		GetSize()					{ return aOutSz; }
GetSize() const399*95c02664SSteve Yin 	Size		GetSize() const				{ return aOutSz; }
400*95c02664SSteve Yin 
GetKind()401*95c02664SSteve Yin 	sal_uInt8&		GetKind()					{ return nKind; }
GetKind() const402*95c02664SSteve Yin 	sal_uInt8		GetKind() const				{ return nKind; }
403*95c02664SSteve Yin 
SetRightToLeft(sal_uInt8 b)404*95c02664SSteve Yin     void        SetRightToLeft( sal_uInt8 b )    { nRightToLeft = b; }
GetRightToLeft() const405*95c02664SSteve Yin     sal_uInt8        GetRightToLeft() const      { return nRightToLeft; }
IsRightToLeft() const406*95c02664SSteve Yin     sal_Bool        IsRightToLeft() const       { return (nRightToLeft&1); }
407*95c02664SSteve Yin 
GetExtraValue() const408*95c02664SSteve Yin 	sal_Unicode	GetExtraValue() const		{ return nExtraValue; }
SetExtraValue(sal_Unicode n)409*95c02664SSteve Yin 	void		SetExtraValue( sal_Unicode n ) 	{ nExtraValue = n; }
410*95c02664SSteve Yin 
HasValidSize() const411*95c02664SSteve Yin 	sal_Bool		HasValidSize() const		{ return aOutSz.Width() != (-1); }
412*95c02664SSteve Yin 
GetExtraInfos() const413*95c02664SSteve Yin     ExtraPortionInfo*   GetExtraInfos() const { return pExtraInfos; }
SetExtraInfos(ExtraPortionInfo * p)414*95c02664SSteve Yin     void                SetExtraInfos( ExtraPortionInfo* p ) { delete pExtraInfos; pExtraInfos = p; }
415*95c02664SSteve Yin };
416*95c02664SSteve Yin 
417*95c02664SSteve Yin // -------------------------------------------------------------------------
418*95c02664SSteve Yin // class TextPortionList
419*95c02664SSteve Yin // -------------------------------------------------------------------------
420*95c02664SSteve Yin typedef TextPortion* TextPortionPtr;
421*95c02664SSteve Yin SV_DECL_PTRARR( TextPortionArray, TextPortionPtr, 0, 8 )
422*95c02664SSteve Yin 
423*95c02664SSteve Yin class TextPortionList : public TextPortionArray
424*95c02664SSteve Yin {
425*95c02664SSteve Yin public:
426*95c02664SSteve Yin 			TextPortionList();
427*95c02664SSteve Yin 			~TextPortionList();
428*95c02664SSteve Yin 
429*95c02664SSteve Yin 	void	Reset();
430*95c02664SSteve Yin 	sal_uInt16	FindPortion( sal_uInt16 nCharPos, sal_uInt16& rPortionStart, sal_Bool bPreferStartingPortion = sal_False );
431*95c02664SSteve Yin     sal_uInt16  GetStartPos( sal_uInt16 nPortion );
432*95c02664SSteve Yin 	void	DeleteFromPortion( sal_uInt16 nDelFrom );
433*95c02664SSteve Yin };
434*95c02664SSteve Yin 
435*95c02664SSteve Yin class ParaPortion;
436*95c02664SSteve Yin 
437*95c02664SSteve Yin SV_DECL_VARARR( CharPosArray, sal_Int32, 0, CHARPOSGROW )
438*95c02664SSteve Yin 
439*95c02664SSteve Yin // ------------------------------------------------------------------------
440*95c02664SSteve Yin // class EditLine
441*95c02664SSteve Yin // -------------------------------------------------------------------------
442*95c02664SSteve Yin class EditLine
443*95c02664SSteve Yin {
444*95c02664SSteve Yin private:
445*95c02664SSteve Yin 	CharPosArray	aPositions;
446*95c02664SSteve Yin     long            nTxtWidth;
447*95c02664SSteve Yin 	sal_uInt16			nStartPosX;
448*95c02664SSteve Yin 	sal_uInt16			nStart;		// koennte durch nStartPortion ersetzt werden
449*95c02664SSteve Yin 	sal_uInt16			nEnd;       // koennte durch nEndPortion ersetzt werden
450*95c02664SSteve Yin 	sal_uInt16			nStartPortion;
451*95c02664SSteve Yin 	sal_uInt16 			nEndPortion;
452*95c02664SSteve Yin 	sal_uInt16			nHeight;	// Gesamthoehe der Zeile
453*95c02664SSteve Yin 	sal_uInt16			nTxtHeight;	// Reine Texthoehe
454*95c02664SSteve Yin 	sal_uInt16			nCrsrHeight;	// Bei Konturfluss hohe Zeilen => Cursor zu gro?.
455*95c02664SSteve Yin 	sal_uInt16			nMaxAscent;
456*95c02664SSteve Yin 	sal_Bool			bHangingPunctuation;
457*95c02664SSteve Yin 	sal_Bool			bInvalid;	// fuer geschickte Formatierung
458*95c02664SSteve Yin 
459*95c02664SSteve Yin public:
460*95c02664SSteve Yin 					EditLine();
461*95c02664SSteve Yin 					EditLine( const EditLine& );
462*95c02664SSteve Yin 					~EditLine();
463*95c02664SSteve Yin 
IsIn(sal_uInt16 nIndex) const464*95c02664SSteve Yin 	sal_Bool			IsIn( sal_uInt16 nIndex ) const
465*95c02664SSteve Yin 						{ return ( (nIndex >= nStart ) && ( nIndex < nEnd ) ); }
466*95c02664SSteve Yin 
IsIn(sal_uInt16 nIndex,sal_Bool bInclEnd) const467*95c02664SSteve Yin 	sal_Bool			IsIn( sal_uInt16 nIndex, sal_Bool bInclEnd ) const
468*95c02664SSteve Yin 						{ return ( ( nIndex >= nStart ) && ( bInclEnd ? ( nIndex <= nEnd ) : ( nIndex < nEnd ) ) ); }
469*95c02664SSteve Yin 
SetStart(sal_uInt16 n)470*95c02664SSteve Yin 	void			SetStart( sal_uInt16 n )			{ nStart = n; }
GetStart() const471*95c02664SSteve Yin 	sal_uInt16			GetStart() const				{ return nStart; }
GetStart()472*95c02664SSteve Yin 	sal_uInt16&			GetStart() 						{ return nStart; }
473*95c02664SSteve Yin 
SetEnd(sal_uInt16 n)474*95c02664SSteve Yin 	void			SetEnd( sal_uInt16 n )				{ nEnd = n; }
GetEnd() const475*95c02664SSteve Yin 	sal_uInt16			GetEnd() const					{ return nEnd; }
GetEnd()476*95c02664SSteve Yin 	sal_uInt16&			GetEnd() 						{ return nEnd; }
477*95c02664SSteve Yin 
SetStartPortion(sal_uInt16 n)478*95c02664SSteve Yin 	void			SetStartPortion( sal_uInt16 n )		{ nStartPortion = n; }
GetStartPortion() const479*95c02664SSteve Yin 	sal_uInt16			GetStartPortion() const			{ return nStartPortion; }
GetStartPortion()480*95c02664SSteve Yin 	sal_uInt16&			GetStartPortion() 				{ return nStartPortion; }
481*95c02664SSteve Yin 
SetEndPortion(sal_uInt16 n)482*95c02664SSteve Yin 	void			SetEndPortion( sal_uInt16 n )		{ nEndPortion = n; }
GetEndPortion() const483*95c02664SSteve Yin 	sal_uInt16			GetEndPortion() const			{ return nEndPortion; }
GetEndPortion()484*95c02664SSteve Yin 	sal_uInt16&			GetEndPortion() 				{ return nEndPortion; }
485*95c02664SSteve Yin 
SetHeight(sal_uInt16 nH,sal_uInt16 nTxtH=0,sal_uInt16 nCrsrH=0)486*95c02664SSteve Yin 	void			SetHeight( sal_uInt16 nH, sal_uInt16 nTxtH = 0, sal_uInt16 nCrsrH = 0 )
487*95c02664SSteve Yin 					{ 	nHeight = nH;
488*95c02664SSteve Yin 						nTxtHeight = ( nTxtH ? nTxtH : nH );
489*95c02664SSteve Yin 						nCrsrHeight = ( nCrsrH ? nCrsrH : nTxtHeight );
490*95c02664SSteve Yin 					}
GetHeight() const491*95c02664SSteve Yin 	sal_uInt16			GetHeight() const				{ return nHeight; }
GetTxtHeight() const492*95c02664SSteve Yin 	sal_uInt16			GetTxtHeight() const			{ return nTxtHeight; }
GetCrsrHeight() const493*95c02664SSteve Yin 	sal_uInt16			GetCrsrHeight() const			{ return nCrsrHeight; }
494*95c02664SSteve Yin 
SetTextWidth(long n)495*95c02664SSteve Yin     void            SetTextWidth( long n )          { nTxtWidth = n; }
GetTextWidth() const496*95c02664SSteve Yin     long            GetTextWidth() const            { return nTxtWidth; }
497*95c02664SSteve Yin 
SetMaxAscent(sal_uInt16 n)498*95c02664SSteve Yin 	void			SetMaxAscent( sal_uInt16 n )		{ nMaxAscent = n; }
GetMaxAscent() const499*95c02664SSteve Yin 	sal_uInt16			GetMaxAscent() const			{ return nMaxAscent; }
500*95c02664SSteve Yin 
SetHangingPunctuation(sal_Bool b)501*95c02664SSteve Yin 	void			SetHangingPunctuation( sal_Bool b )		{ bHangingPunctuation = b; }
IsHangingPunctuation() const502*95c02664SSteve Yin 	sal_Bool			IsHangingPunctuation() const		{ return bHangingPunctuation; }
503*95c02664SSteve Yin 
GetLen() const504*95c02664SSteve Yin 	sal_uInt16			GetLen() const					{ return nEnd - nStart; }
505*95c02664SSteve Yin 
GetStartPosX() const506*95c02664SSteve Yin 	sal_uInt16			GetStartPosX() const			{ return nStartPosX; }
SetStartPosX(sal_uInt16 start)507*95c02664SSteve Yin 	void			SetStartPosX( sal_uInt16 start )	{ nStartPosX = start; }
508*95c02664SSteve Yin 
509*95c02664SSteve Yin 	Size			CalcTextSize( ParaPortion& rParaPortion );
510*95c02664SSteve Yin 
IsInvalid() const511*95c02664SSteve Yin 	sal_Bool			IsInvalid()	const				{ return bInvalid; }
IsValid() const512*95c02664SSteve Yin 	sal_Bool			IsValid() const					{ return !bInvalid; }
SetInvalid()513*95c02664SSteve Yin 	void			SetInvalid()					{ bInvalid = sal_True; }
SetValid()514*95c02664SSteve Yin 	void			SetValid()						{ bInvalid = sal_False; }
515*95c02664SSteve Yin 
IsEmpty() const516*95c02664SSteve Yin 	sal_Bool			IsEmpty() const					{ return (nEnd > nStart) ? sal_False : sal_True; }
517*95c02664SSteve Yin 
GetCharPosArray()518*95c02664SSteve Yin 	CharPosArray&	GetCharPosArray()				{ return aPositions; }
519*95c02664SSteve Yin 
520*95c02664SSteve Yin 	EditLine*		Clone() const;
521*95c02664SSteve Yin 
522*95c02664SSteve Yin 	EditLine&	operator = ( const EditLine& rLine );
523*95c02664SSteve Yin 	friend sal_Bool operator == ( const EditLine& r1,  const EditLine& r2  );
524*95c02664SSteve Yin 	friend sal_Bool operator != ( const EditLine& r1,  const EditLine& r2  );
525*95c02664SSteve Yin };
526*95c02664SSteve Yin 
527*95c02664SSteve Yin 
528*95c02664SSteve Yin // -------------------------------------------------------------------------
529*95c02664SSteve Yin // class LineList
530*95c02664SSteve Yin // -------------------------------------------------------------------------
531*95c02664SSteve Yin typedef EditLine* EditLinePtr;
532*95c02664SSteve Yin SV_DECL_PTRARR( LineArray, EditLinePtr, 0, 4 )
533*95c02664SSteve Yin 
534*95c02664SSteve Yin class EditLineList : public LineArray
535*95c02664SSteve Yin {
536*95c02664SSteve Yin public:
537*95c02664SSteve Yin 			EditLineList();
538*95c02664SSteve Yin 			~EditLineList();
539*95c02664SSteve Yin 
540*95c02664SSteve Yin 	void	Reset();
541*95c02664SSteve Yin 	void	DeleteFromLine( sal_uInt16 nDelFrom );
542*95c02664SSteve Yin 	sal_uInt16	FindLine( sal_uInt16 nChar, sal_Bool bInclEnd );
543*95c02664SSteve Yin };
544*95c02664SSteve Yin 
545*95c02664SSteve Yin // -------------------------------------------------------------------------
546*95c02664SSteve Yin // class ParaPortion
547*95c02664SSteve Yin // -------------------------------------------------------------------------
548*95c02664SSteve Yin class ParaPortion
549*95c02664SSteve Yin {
550*95c02664SSteve Yin 	friend class ImpEditEngine;	// zum Einstellen der Hoehe
551*95c02664SSteve Yin private:
552*95c02664SSteve Yin 	EditLineList		aLineList;
553*95c02664SSteve Yin 	TextPortionList		aTextPortionList;
554*95c02664SSteve Yin 	ContentNode*		pNode;
555*95c02664SSteve Yin 	long				nHeight;
556*95c02664SSteve Yin 
557*95c02664SSteve Yin 	ScriptTypePosInfos	    aScriptInfos;
558*95c02664SSteve Yin     WritingDirectionInfos   aWritingDirectionInfos;
559*95c02664SSteve Yin 
560*95c02664SSteve Yin 	sal_uInt16				nInvalidPosStart;
561*95c02664SSteve Yin 	sal_uInt16				nFirstLineOffset;	// Fuer Writer-LineSpacing-Interpretation
562*95c02664SSteve Yin 	sal_uInt16				nBulletX;
563*95c02664SSteve Yin 	short				nInvalidDiff;
564*95c02664SSteve Yin 
565*95c02664SSteve Yin 	sal_Bool				bInvalid 			: 1;
566*95c02664SSteve Yin 	sal_Bool				bSimple				: 1;	// nur lineares Tippen
567*95c02664SSteve Yin 	sal_Bool				bVisible			: 1;	// MT 05/00: Gehoert an den Node!!!
568*95c02664SSteve Yin 	sal_Bool				bForceRepaint		: 1;
569*95c02664SSteve Yin 
570*95c02664SSteve Yin 						ParaPortion( const ParaPortion& );
571*95c02664SSteve Yin 
572*95c02664SSteve Yin public:
573*95c02664SSteve Yin 						ParaPortion( ContentNode* pNode );
574*95c02664SSteve Yin 						~ParaPortion();
575*95c02664SSteve Yin 
576*95c02664SSteve Yin 	sal_uInt16				GetLineNumber( sal_uInt16 nIndex );
577*95c02664SSteve Yin 
GetLines()578*95c02664SSteve Yin 	EditLineList&		GetLines()					{ return aLineList; }
579*95c02664SSteve Yin 
IsInvalid() const580*95c02664SSteve Yin 	sal_Bool				IsInvalid()	const			{ return bInvalid; }
IsSimpleInvalid() const581*95c02664SSteve Yin 	sal_Bool				IsSimpleInvalid()	const	{ return bSimple; }
SetValid()582*95c02664SSteve Yin 	void				SetValid()					{ bInvalid = sal_False; bSimple = sal_True;}
583*95c02664SSteve Yin 
MustRepaint() const584*95c02664SSteve Yin 	sal_Bool				MustRepaint() const			{ return bForceRepaint; }
SetMustRepaint(sal_Bool bRP)585*95c02664SSteve Yin 	void				SetMustRepaint( sal_Bool bRP )	{ bForceRepaint = bRP; }
586*95c02664SSteve Yin 
GetBulletX() const587*95c02664SSteve Yin 	sal_uInt16				GetBulletX() const			{ return nBulletX; }
SetBulletX(sal_uInt16 n)588*95c02664SSteve Yin 	void				SetBulletX( sal_uInt16 n ) 		{ nBulletX = n; }
589*95c02664SSteve Yin 
590*95c02664SSteve Yin 	void				MarkInvalid( sal_uInt16 nStart, short nDiff);
591*95c02664SSteve Yin 	void				MarkSelectionInvalid( sal_uInt16 nStart, sal_uInt16 nEnd );
592*95c02664SSteve Yin 
593*95c02664SSteve Yin 	void				SetVisible( sal_Bool bVisible );
IsVisible()594*95c02664SSteve Yin 	sal_Bool				IsVisible()					{ return bVisible; }
595*95c02664SSteve Yin 
GetHeight() const596*95c02664SSteve Yin 	long				GetHeight() const 			{ return ( bVisible ? nHeight : 0 ); }
GetFirstLineOffset() const597*95c02664SSteve Yin 	sal_uInt16				GetFirstLineOffset() const 	{ return ( bVisible ? nFirstLineOffset : 0 ); }
ResetHeight()598*95c02664SSteve Yin 	void				ResetHeight()	{ nHeight = 0; nFirstLineOffset = 0; }
599*95c02664SSteve Yin 
GetNode() const600*95c02664SSteve Yin 	ContentNode*		GetNode() const				{ return pNode; }
GetTextPortions()601*95c02664SSteve Yin 	TextPortionList&	GetTextPortions() 			{ return aTextPortionList; }
602*95c02664SSteve Yin 
GetInvalidPosStart() const603*95c02664SSteve Yin 	sal_uInt16				GetInvalidPosStart() const	{ return nInvalidPosStart; }
GetInvalidDiff() const604*95c02664SSteve Yin 	short				GetInvalidDiff() const 		{ return nInvalidDiff; }
605*95c02664SSteve Yin 
606*95c02664SSteve Yin 	void				CorrectValuesBehindLastFormattedLine( sal_uInt16 nLastFormattedLine );
607*95c02664SSteve Yin 
608*95c02664SSteve Yin 	sal_Bool				DbgCheckTextPortions();
609*95c02664SSteve Yin };
610*95c02664SSteve Yin 
611*95c02664SSteve Yin typedef ParaPortion* ParaPortionPtr;
612*95c02664SSteve Yin SV_DECL_PTRARR( DummyParaPortionList, ParaPortionPtr, 0, 4 )
613*95c02664SSteve Yin 
614*95c02664SSteve Yin // -------------------------------------------------------------------------
615*95c02664SSteve Yin // class ParaPortionList
616*95c02664SSteve Yin // -------------------------------------------------------------------------
617*95c02664SSteve Yin class ParaPortionList : public DummyParaPortionList
618*95c02664SSteve Yin {
619*95c02664SSteve Yin 	sal_uInt16 nLastCache;
620*95c02664SSteve Yin public:
621*95c02664SSteve Yin 					ParaPortionList();
622*95c02664SSteve Yin 					~ParaPortionList();
623*95c02664SSteve Yin 
624*95c02664SSteve Yin 	void			Reset();
625*95c02664SSteve Yin 	long			GetYOffset( ParaPortion* pPPortion );
626*95c02664SSteve Yin 	sal_uInt16			FindParagraph( long nYOffset );
627*95c02664SSteve Yin 
SaveGetObject(sal_uInt16 nPos) const628*95c02664SSteve Yin 	inline ParaPortion*	SaveGetObject( sal_uInt16 nPos ) const
629*95c02664SSteve Yin 		{ return ( nPos < Count() ) ? GetObject( nPos ) : 0; }
630*95c02664SSteve Yin 
631*95c02664SSteve Yin 	sal_uInt16                  GetPos( const ParaPortionPtr &rPtr ) const;
632*95c02664SSteve Yin 
633*95c02664SSteve Yin 	// temporaer:
634*95c02664SSteve Yin 	void			DbgCheck( EditDoc& rDoc );
635*95c02664SSteve Yin };
636*95c02664SSteve Yin 
637*95c02664SSteve Yin // -------------------------------------------------------------------------
638*95c02664SSteve Yin // class EditSelection
639*95c02664SSteve Yin // -------------------------------------------------------------------------
640*95c02664SSteve Yin class EditSelection
641*95c02664SSteve Yin {
642*95c02664SSteve Yin private:
643*95c02664SSteve Yin 	EditPaM 		aStartPaM;
644*95c02664SSteve Yin 	EditPaM 		aEndPaM;
645*95c02664SSteve Yin 
646*95c02664SSteve Yin public:
647*95c02664SSteve Yin 					EditSelection();	// kein CCTOR und DTOR, geht autom. richtig!
648*95c02664SSteve Yin 					EditSelection( const EditPaM& rStartAndAnd );
649*95c02664SSteve Yin 					EditSelection( const EditPaM& rStart, const EditPaM& rEnd );
650*95c02664SSteve Yin 
Min()651*95c02664SSteve Yin 	EditPaM&		Min()				{ return aStartPaM; }
Max()652*95c02664SSteve Yin 	EditPaM&		Max()				{ return aEndPaM; }
653*95c02664SSteve Yin 
Min() const654*95c02664SSteve Yin 	const EditPaM&	Min() const			{ return aStartPaM; }
Max() const655*95c02664SSteve Yin 	const EditPaM&	Max() const			{ return aEndPaM; }
656*95c02664SSteve Yin 
HasRange() const657*95c02664SSteve Yin 	sal_Bool			HasRange() const	{ return aStartPaM != aEndPaM; }
658*95c02664SSteve Yin     sal_Bool            IsInvalid() const;
659*95c02664SSteve Yin 	sal_Bool			DbgIsBuggy( EditDoc& rDoc );
660*95c02664SSteve Yin 
661*95c02664SSteve Yin 	sal_Bool			Adjust( const ContentList& rNodes );
662*95c02664SSteve Yin 
663*95c02664SSteve Yin 	EditSelection&	operator = ( const EditPaM& r );
operator ==(const EditSelection & r) const664*95c02664SSteve Yin 	sal_Bool 			operator == ( const EditSelection& r ) const
665*95c02664SSteve Yin 					{ return ( ( aStartPaM == r.aStartPaM ) && ( aEndPaM == r.aEndPaM ) )
666*95c02664SSteve Yin 							? sal_True : sal_False; }
operator !=(const EditSelection & r) const667*95c02664SSteve Yin 	sal_Bool 			operator != ( const EditSelection& r ) const { return !( r == *this ); }
668*95c02664SSteve Yin };
669*95c02664SSteve Yin 
670*95c02664SSteve Yin // -------------------------------------------------------------------------
671*95c02664SSteve Yin // class DeletedNodeInfo
672*95c02664SSteve Yin // -------------------------------------------------------------------------
673*95c02664SSteve Yin class DeletedNodeInfo
674*95c02664SSteve Yin {
675*95c02664SSteve Yin private:
676*95c02664SSteve Yin 	sal_uIntPtr 	nInvalidAdressPtr;
677*95c02664SSteve Yin 	sal_uInt16	nInvalidParagraph;
678*95c02664SSteve Yin 
679*95c02664SSteve Yin public:
DeletedNodeInfo(sal_uIntPtr nInvAdr,sal_uInt16 nPos)680*95c02664SSteve Yin 			DeletedNodeInfo( sal_uIntPtr nInvAdr, sal_uInt16 nPos )
681*95c02664SSteve Yin 											{ 	nInvalidAdressPtr = nInvAdr;
682*95c02664SSteve Yin 												nInvalidParagraph = nPos; }
683*95c02664SSteve Yin 
GetInvalidAdress()684*95c02664SSteve Yin 	sal_uIntPtr	GetInvalidAdress()				{	return nInvalidAdressPtr; }
GetPosition()685*95c02664SSteve Yin 	sal_uInt16	GetPosition()					{	return nInvalidParagraph; }
686*95c02664SSteve Yin };
687*95c02664SSteve Yin 
688*95c02664SSteve Yin typedef DeletedNodeInfo* DeletedNodeInfoPtr;
689*95c02664SSteve Yin SV_DECL_PTRARR( DeletedNodesList, DeletedNodeInfoPtr, 0, 4 )
690*95c02664SSteve Yin 
691*95c02664SSteve Yin // -------------------------------------------------------------------------
692*95c02664SSteve Yin // class EditDoc
693*95c02664SSteve Yin // -------------------------------------------------------------------------
694*95c02664SSteve Yin class EditDoc : public ContentList
695*95c02664SSteve Yin {
696*95c02664SSteve Yin private:
697*95c02664SSteve Yin 	SfxItemPool*	pItemPool;
698*95c02664SSteve Yin     Link            aModifyHdl;
699*95c02664SSteve Yin 
700*95c02664SSteve Yin 	SvxFont			aDefFont;			//schneller, als jedesmal vom Pool!
701*95c02664SSteve Yin 	sal_uInt16			nDefTab;
702*95c02664SSteve Yin 	sal_Bool			bIsVertical;
703*95c02664SSteve Yin 	sal_Bool			bIsFixedCellHeight;
704*95c02664SSteve Yin 
705*95c02664SSteve Yin 	sal_Bool			bOwnerOfPool;
706*95c02664SSteve Yin 	sal_Bool			bModified;
707*95c02664SSteve Yin 
708*95c02664SSteve Yin protected:
709*95c02664SSteve Yin 	void			ImplDestroyContents();
710*95c02664SSteve Yin 
711*95c02664SSteve Yin public:
712*95c02664SSteve Yin 					EditDoc( SfxItemPool* pItemPool );
713*95c02664SSteve Yin 					~EditDoc();
714*95c02664SSteve Yin 
IsModified() const715*95c02664SSteve Yin 	sal_Bool			IsModified() const		{ return bModified; }
716*95c02664SSteve Yin 	void			SetModified( sal_Bool b );
717*95c02664SSteve Yin 
SetModifyHdl(const Link & rLink)718*95c02664SSteve Yin     void            SetModifyHdl( const Link& rLink ) { aModifyHdl = rLink; }
GetModifyHdl() const719*95c02664SSteve Yin     Link            GetModifyHdl() const { return aModifyHdl; }
720*95c02664SSteve Yin 
721*95c02664SSteve Yin 	void			CreateDefFont( sal_Bool bUseStyles );
GetDefFont()722*95c02664SSteve Yin 	const SvxFont&	GetDefFont() { return aDefFont; }
723*95c02664SSteve Yin 
SetDefTab(sal_uInt16 nTab)724*95c02664SSteve Yin 	void			SetDefTab( sal_uInt16 nTab )	{ nDefTab = nTab ? nTab : DEFTAB; }
GetDefTab() const725*95c02664SSteve Yin 	sal_uInt16			GetDefTab() const 			{ return nDefTab; }
726*95c02664SSteve Yin 
SetVertical(sal_Bool bVertical)727*95c02664SSteve Yin 	void			SetVertical( sal_Bool bVertical )	{ bIsVertical = bVertical; }
IsVertical() const728*95c02664SSteve Yin 	sal_Bool			IsVertical() const 				{ return bIsVertical; }
729*95c02664SSteve Yin 
SetFixedCellHeight(sal_Bool bUseFixedCellHeight)730*95c02664SSteve Yin 	void			SetFixedCellHeight( sal_Bool bUseFixedCellHeight )	{ bIsFixedCellHeight = bUseFixedCellHeight; }
IsFixedCellHeight() const731*95c02664SSteve Yin 	sal_Bool			IsFixedCellHeight() const 				{ return bIsFixedCellHeight; }
732*95c02664SSteve Yin 
733*95c02664SSteve Yin 	EditPaM			Clear();
734*95c02664SSteve Yin 	EditPaM			RemoveText();
735*95c02664SSteve Yin 	EditPaM			RemoveChars( EditPaM aPaM, sal_uInt16 nChars );
736*95c02664SSteve Yin     void            InsertText( const EditPaM& rPaM, xub_Unicode c );
737*95c02664SSteve Yin 	EditPaM			InsertText( EditPaM aPaM, const XubString& rStr );
738*95c02664SSteve Yin 	EditPaM			InsertParaBreak( EditPaM aPaM, sal_Bool bKeepEndingAttribs );
739*95c02664SSteve Yin 	EditPaM			InsertFeature( EditPaM aPaM, const SfxPoolItem& rItem );
740*95c02664SSteve Yin 	EditPaM			ConnectParagraphs( ContentNode* pLeft, ContentNode* pRight );
741*95c02664SSteve Yin 
742*95c02664SSteve Yin 	String			GetText( LineEnd eEnd ) const;
743*95c02664SSteve Yin 	sal_uLong			GetTextLen() const;
744*95c02664SSteve Yin 
745*95c02664SSteve Yin 	XubString 		GetParaAsString( sal_uInt16 nNode ) const;
746*95c02664SSteve Yin 	XubString 		GetParaAsString( ContentNode* pNode, sal_uInt16 nStartPos = 0, sal_uInt16 nEndPos = 0xFFFF, sal_Bool bResolveFields = sal_True ) const;
747*95c02664SSteve Yin 
748*95c02664SSteve Yin 	inline EditPaM	GetStartPaM() const;
749*95c02664SSteve Yin 	inline EditPaM	GetEndPaM() const;
750*95c02664SSteve Yin 
GetItemPool()751*95c02664SSteve Yin 	SfxItemPool&		GetItemPool()					{ return *pItemPool; }
GetItemPool() const752*95c02664SSteve Yin 	const SfxItemPool&	GetItemPool() const				{ return *pItemPool; }
753*95c02664SSteve Yin 
754*95c02664SSteve Yin 	void			RemoveItemsFromPool( ContentNode* pNode );
755*95c02664SSteve Yin 
756*95c02664SSteve Yin 	void			InsertAttrib( const SfxPoolItem& rItem, ContentNode* pNode, sal_uInt16 nStart, sal_uInt16 nEnd );
757*95c02664SSteve Yin 	void 			InsertAttrib( ContentNode* pNode, sal_uInt16 nStart, sal_uInt16 nEnd, const SfxPoolItem& rPoolItem );
758*95c02664SSteve Yin 	void			InsertAttribInSelection( ContentNode* pNode, sal_uInt16 nStart, sal_uInt16 nEnd, const SfxPoolItem& rPoolItem );
759*95c02664SSteve Yin 	sal_Bool			RemoveAttribs( ContentNode* pNode, sal_uInt16 nStart, sal_uInt16 nEnd, sal_uInt16 nWhich = 0 );
760*95c02664SSteve Yin 	sal_Bool			RemoveAttribs( ContentNode* pNode, sal_uInt16 nStart, sal_uInt16 nEnd, EditCharAttrib*& rpStarting, EditCharAttrib*& rpEnding, sal_uInt16 nWhich = 0 );
761*95c02664SSteve Yin 	void			FindAttribs( ContentNode* pNode, sal_uInt16 nStartPos, sal_uInt16 nEndPos, SfxItemSet& rCurSet );
762*95c02664SSteve Yin 
GetPos(ContentNode * pNode) const763*95c02664SSteve Yin 	sal_uInt16			GetPos( ContentNode* pNode ) const { return ContentList::GetPos(pNode); }
SaveGetObject(sal_uInt16 nPos) const764*95c02664SSteve Yin 	ContentNode*	SaveGetObject( sal_uInt16 nPos ) const { return ( nPos < Count() ) ? GetObject( nPos ) : 0; }
765*95c02664SSteve Yin 
766*95c02664SSteve Yin 	static XubString	GetSepStr( LineEnd eEnd );
767*95c02664SSteve Yin };
768*95c02664SSteve Yin 
GetStartPaM() const769*95c02664SSteve Yin inline EditPaM EditDoc::GetStartPaM() const
770*95c02664SSteve Yin {
771*95c02664SSteve Yin 	return EditPaM( GetObject( 0 ), 0 );
772*95c02664SSteve Yin }
773*95c02664SSteve Yin 
GetEndPaM() const774*95c02664SSteve Yin inline EditPaM EditDoc::GetEndPaM() const
775*95c02664SSteve Yin {
776*95c02664SSteve Yin 	ContentNode* pLastNode = GetObject( Count()-1 );
777*95c02664SSteve Yin 	return EditPaM( pLastNode, pLastNode->Len() );
778*95c02664SSteve Yin }
779*95c02664SSteve Yin 
GetAttrib(const CharAttribArray & rAttribs,sal_uInt16 nAttr)780*95c02664SSteve Yin inline EditCharAttrib* GetAttrib( const CharAttribArray& rAttribs, sal_uInt16 nAttr )
781*95c02664SSteve Yin {
782*95c02664SSteve Yin 	return ( nAttr < rAttribs.Count() ) ? rAttribs[nAttr] : 0;
783*95c02664SSteve Yin }
784*95c02664SSteve Yin 
785*95c02664SSteve Yin sal_Bool CheckOrderedList( CharAttribArray& rAttribs, sal_Bool bStart );
786*95c02664SSteve Yin 
787*95c02664SSteve Yin // -------------------------------------------------------------------------
788*95c02664SSteve Yin // class EditEngineItemPool
789*95c02664SSteve Yin // -------------------------------------------------------------------------
790*95c02664SSteve Yin class EditEngineItemPool : public SfxItemPool
791*95c02664SSteve Yin {
792*95c02664SSteve Yin public:
793*95c02664SSteve Yin 						EditEngineItemPool( sal_Bool bPersistenRefCounts );
794*95c02664SSteve Yin protected:
795*95c02664SSteve Yin 						virtual ~EditEngineItemPool();
796*95c02664SSteve Yin public:
797*95c02664SSteve Yin 
798*95c02664SSteve Yin 	virtual SvStream&	Store( SvStream& rStream ) const;
799*95c02664SSteve Yin };
800*95c02664SSteve Yin 
801*95c02664SSteve Yin #endif // _EDITDOC_HXX
802