1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_editeng.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <svl/intitem.hxx>
28*b1cdbd2cSJim Jagielski #include <editeng/editeng.hxx>
29*b1cdbd2cSJim Jagielski #include <editeng/editview.hxx>
30*b1cdbd2cSJim Jagielski #include <editeng/editdata.hxx>
31*b1cdbd2cSJim Jagielski #include <editeng/eerdll.hxx>
32*b1cdbd2cSJim Jagielski #include <editeng/lrspitem.hxx>
33*b1cdbd2cSJim Jagielski #include <editeng/fhgtitem.hxx>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include <math.h>
36*b1cdbd2cSJim Jagielski #include <svl/style.hxx>
37*b1cdbd2cSJim Jagielski #include <vcl/wrkwin.hxx>
38*b1cdbd2cSJim Jagielski #define _OUTLINER_CXX
39*b1cdbd2cSJim Jagielski #include <editeng/outliner.hxx>
40*b1cdbd2cSJim Jagielski #include <paralist.hxx>
41*b1cdbd2cSJim Jagielski #include <editeng/outlobj.hxx>
42*b1cdbd2cSJim Jagielski #include <outleeng.hxx>
43*b1cdbd2cSJim Jagielski #include <outlundo.hxx>
44*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
45*b1cdbd2cSJim Jagielski #include <editeng/editstat.hxx>
46*b1cdbd2cSJim Jagielski #include <editeng/scripttypeitem.hxx>
47*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
48*b1cdbd2cSJim Jagielski #include <svl/itemset.hxx>
49*b1cdbd2cSJim Jagielski #include <svl/whiter.hxx>
50*b1cdbd2cSJim Jagielski #include <vcl/metric.hxx>
51*b1cdbd2cSJim Jagielski #include <editeng/numitem.hxx>
52*b1cdbd2cSJim Jagielski #include <editeng/adjitem.hxx>
53*b1cdbd2cSJim Jagielski #include <vcl/graph.hxx>
54*b1cdbd2cSJim Jagielski #include <vcl/gdimtf.hxx>
55*b1cdbd2cSJim Jagielski #include <vcl/metaact.hxx>
56*b1cdbd2cSJim Jagielski #include <svtools/grfmgr.hxx>
57*b1cdbd2cSJim Jagielski #include <editeng/svxfont.hxx>
58*b1cdbd2cSJim Jagielski #include <editeng/brshitem.hxx>
59*b1cdbd2cSJim Jagielski #include <svl/itempool.hxx>
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski // #101498# calculate if it's RTL or not
62*b1cdbd2cSJim Jagielski #include <unicode/ubidi.h>
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #define DEFAULT_SCALE	75
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski static const sal_uInt16 nDefStyles = 3;	// Sonderbehandlung fuer die ersten 3 Ebenen
67*b1cdbd2cSJim Jagielski static const sal_uInt16 nDefBulletIndent = 800;
68*b1cdbd2cSJim Jagielski static const sal_uInt16 nDefBulletWidth = 700;
69*b1cdbd2cSJim Jagielski static const sal_uInt16	pDefBulletIndents[nDefStyles]= 	{ 1400, 800, 800 };
70*b1cdbd2cSJim Jagielski static const sal_uInt16	pDefBulletWidths[nDefStyles] = 	{ 1000, 850, 700 };
71*b1cdbd2cSJim Jagielski 
lcl_ImplGetDefBulletWidth(sal_Int16 nDepth)72*b1cdbd2cSJim Jagielski sal_uInt16 lcl_ImplGetDefBulletWidth( sal_Int16 nDepth )
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski 	return ( nDepth < nDefStyles ) ? pDefBulletWidths[nDepth] : nDefBulletWidth;
75*b1cdbd2cSJim Jagielski }
76*b1cdbd2cSJim Jagielski 
lcl_ImplGetDefBulletIndent(sal_Int16 nDepth)77*b1cdbd2cSJim Jagielski sal_uInt16 lcl_ImplGetDefBulletIndent( sal_Int16 nDepth )
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski 	sal_uInt16 nI = 0;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski 	if( nDepth >= 0 )
82*b1cdbd2cSJim Jagielski 	{
83*b1cdbd2cSJim Jagielski 		for ( sal_Int16 n = 0; n <= nDepth; n++ )
84*b1cdbd2cSJim Jagielski 			nI = nI +
85*b1cdbd2cSJim Jagielski 				( ( n < nDefStyles ) ? pDefBulletIndents[n] : nDefBulletIndent );
86*b1cdbd2cSJim Jagielski 	}
87*b1cdbd2cSJim Jagielski 	return nI;
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------
92*b1cdbd2cSJim Jagielski // Outliner
93*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------
94*b1cdbd2cSJim Jagielski DBG_NAME(Outliner);
95*b1cdbd2cSJim Jagielski 
ImplCheckDepth(sal_Int16 & rnDepth) const96*b1cdbd2cSJim Jagielski void Outliner::ImplCheckDepth( sal_Int16& rnDepth ) const
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski 	if( rnDepth < nMinDepth )
99*b1cdbd2cSJim Jagielski 		rnDepth = nMinDepth;
100*b1cdbd2cSJim Jagielski 	else if( rnDepth > nMaxDepth )
101*b1cdbd2cSJim Jagielski 		rnDepth = nMaxDepth;
102*b1cdbd2cSJim Jagielski }
103*b1cdbd2cSJim Jagielski 
Insert(const XubString & rText,sal_uLong nAbsPos,sal_Int16 nDepth)104*b1cdbd2cSJim Jagielski Paragraph* Outliner::Insert(const XubString& rText, sal_uLong nAbsPos, sal_Int16 nDepth)
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
107*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pParaList->GetParagraphCount(),"Insert:No Paras");
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 	Paragraph* pPara;
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski     ImplCheckDepth( nDepth );
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski 	sal_uLong nParagraphCount = pParaList->GetParagraphCount();
114*b1cdbd2cSJim Jagielski 	if( nAbsPos > nParagraphCount )
115*b1cdbd2cSJim Jagielski 		nAbsPos = nParagraphCount;
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 	if( bFirstParaIsEmpty )
118*b1cdbd2cSJim Jagielski 	{
119*b1cdbd2cSJim Jagielski 		pPara = pParaList->GetParagraph( 0 );
120*b1cdbd2cSJim Jagielski 		if( pPara->GetDepth() != nDepth )
121*b1cdbd2cSJim Jagielski 		{
122*b1cdbd2cSJim Jagielski 			nDepthChangedHdlPrevDepth = pPara->GetDepth();
123*b1cdbd2cSJim Jagielski 			mnDepthChangeHdlPrevFlags = pPara->nFlags;
124*b1cdbd2cSJim Jagielski 			pPara->SetDepth( nDepth );
125*b1cdbd2cSJim Jagielski 			pHdlParagraph = pPara;
126*b1cdbd2cSJim Jagielski 			DepthChangedHdl();
127*b1cdbd2cSJim Jagielski 		}
128*b1cdbd2cSJim Jagielski 		pPara->nFlags |= PARAFLAG_HOLDDEPTH;
129*b1cdbd2cSJim Jagielski 		SetText( rText, pPara );
130*b1cdbd2cSJim Jagielski 	}
131*b1cdbd2cSJim Jagielski 	else
132*b1cdbd2cSJim Jagielski 	{
133*b1cdbd2cSJim Jagielski 		sal_Bool bUpdate = pEditEngine->GetUpdateMode();
134*b1cdbd2cSJim Jagielski 		pEditEngine->SetUpdateMode( sal_False );
135*b1cdbd2cSJim Jagielski         ImplBlockInsertionCallbacks( sal_True );
136*b1cdbd2cSJim Jagielski 		pPara = new Paragraph( nDepth );
137*b1cdbd2cSJim Jagielski 		pParaList->Insert( pPara, nAbsPos );
138*b1cdbd2cSJim Jagielski 		pEditEngine->InsertParagraph( (sal_uInt16)nAbsPos, String() );
139*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pPara==pParaList->GetParagraph(nAbsPos),"Insert:Failed");
140*b1cdbd2cSJim Jagielski 		ImplInitDepth( (sal_uInt16)nAbsPos, nDepth, sal_False );
141*b1cdbd2cSJim Jagielski 		pHdlParagraph = pPara;
142*b1cdbd2cSJim Jagielski 		ParagraphInsertedHdl();
143*b1cdbd2cSJim Jagielski 		pPara->nFlags |= PARAFLAG_HOLDDEPTH;
144*b1cdbd2cSJim Jagielski 		SetText( rText, pPara );
145*b1cdbd2cSJim Jagielski 		ImplBlockInsertionCallbacks( sal_False );
146*b1cdbd2cSJim Jagielski 		pEditEngine->SetUpdateMode( bUpdate );
147*b1cdbd2cSJim Jagielski 	}
148*b1cdbd2cSJim Jagielski 	bFirstParaIsEmpty = sal_False;
149*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pEditEngine->GetParagraphCount()==pParaList->GetParagraphCount(),"SetText failed");
150*b1cdbd2cSJim Jagielski 	return pPara;
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 
ParagraphInserted(sal_uInt16 nPara)154*b1cdbd2cSJim Jagielski void Outliner::ParagraphInserted( sal_uInt16 nPara )
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 	if ( bBlockInsCallback )
159*b1cdbd2cSJim Jagielski 		return;
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	if( bPasting || pEditEngine->IsInUndo() )
162*b1cdbd2cSJim Jagielski 	{
163*b1cdbd2cSJim Jagielski 		Paragraph* pPara = new Paragraph( -1 );
164*b1cdbd2cSJim Jagielski 		pParaList->Insert( pPara, nPara );
165*b1cdbd2cSJim Jagielski 		if( pEditEngine->IsInUndo() )
166*b1cdbd2cSJim Jagielski 		{
167*b1cdbd2cSJim Jagielski 			pPara->nFlags = PARAFLAG_SETBULLETTEXT;
168*b1cdbd2cSJim Jagielski 			pPara->bVisible = sal_True;
169*b1cdbd2cSJim Jagielski 			const SfxInt16Item& rLevel = (const SfxInt16Item&) pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL );
170*b1cdbd2cSJim Jagielski 			pPara->SetDepth( rLevel.GetValue() );
171*b1cdbd2cSJim Jagielski 		}
172*b1cdbd2cSJim Jagielski 	}
173*b1cdbd2cSJim Jagielski 	else
174*b1cdbd2cSJim Jagielski 	{
175*b1cdbd2cSJim Jagielski 		sal_Int16 nDepth = -1;
176*b1cdbd2cSJim Jagielski 		Paragraph* pParaBefore = pParaList->GetParagraph( nPara-1 );
177*b1cdbd2cSJim Jagielski 		if ( pParaBefore )
178*b1cdbd2cSJim Jagielski 			nDepth = pParaBefore->GetDepth();
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 		Paragraph* pPara = new Paragraph( nDepth );
181*b1cdbd2cSJim Jagielski 		pParaList->Insert( pPara, nPara );
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 		if( !pEditEngine->IsInUndo() )
184*b1cdbd2cSJim Jagielski 		{
185*b1cdbd2cSJim Jagielski 			ImplCalcBulletText( nPara, sal_True, sal_False );
186*b1cdbd2cSJim Jagielski 			pHdlParagraph = pPara;
187*b1cdbd2cSJim Jagielski 			ParagraphInsertedHdl();
188*b1cdbd2cSJim Jagielski 		}
189*b1cdbd2cSJim Jagielski 	}
190*b1cdbd2cSJim Jagielski }
191*b1cdbd2cSJim Jagielski 
ParagraphDeleted(sal_uInt16 nPara)192*b1cdbd2cSJim Jagielski void Outliner::ParagraphDeleted( sal_uInt16 nPara )
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 	if ( bBlockInsCallback || ( nPara == EE_PARA_ALL ) )
197*b1cdbd2cSJim Jagielski 		return;
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
200*b1cdbd2cSJim Jagielski         if (!pPara)
201*b1cdbd2cSJim Jagielski             return;
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski 	sal_Int16 nDepth = pPara->GetDepth();
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 	if( !pEditEngine->IsInUndo() )
206*b1cdbd2cSJim Jagielski 	{
207*b1cdbd2cSJim Jagielski 		pHdlParagraph = pPara;
208*b1cdbd2cSJim Jagielski 		ParagraphRemovingHdl();
209*b1cdbd2cSJim Jagielski 	}
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 	pParaList->Remove( nPara );
212*b1cdbd2cSJim Jagielski 	delete pPara;
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 	if( !pEditEngine->IsInUndo() && !bPasting )
215*b1cdbd2cSJim Jagielski 	{
216*b1cdbd2cSJim Jagielski 		pPara = pParaList->GetParagraph( nPara );
217*b1cdbd2cSJim Jagielski 		if ( pPara && ( pPara->GetDepth() > nDepth ) )
218*b1cdbd2cSJim Jagielski 		{
219*b1cdbd2cSJim Jagielski 			ImplCalcBulletText( nPara, sal_True, sal_False );
220*b1cdbd2cSJim Jagielski 			// naechsten auf gleicher Ebene suchen...
221*b1cdbd2cSJim Jagielski 			while ( pPara && pPara->GetDepth() > nDepth )
222*b1cdbd2cSJim Jagielski 				pPara = pParaList->GetParagraph( ++nPara );
223*b1cdbd2cSJim Jagielski 		}
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 		if ( pPara && ( pPara->GetDepth() == nDepth ) )
226*b1cdbd2cSJim Jagielski 			ImplCalcBulletText( nPara, sal_True, sal_False );
227*b1cdbd2cSJim Jagielski 	}
228*b1cdbd2cSJim Jagielski }
229*b1cdbd2cSJim Jagielski 
Init(sal_uInt16 nMode)230*b1cdbd2cSJim Jagielski void Outliner::Init( sal_uInt16 nMode )
231*b1cdbd2cSJim Jagielski {
232*b1cdbd2cSJim Jagielski 	nOutlinerMode = nMode;
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 	Clear();
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 	sal_uLong nCtrl = pEditEngine->GetControlWord();
237*b1cdbd2cSJim Jagielski 	nCtrl &= ~(EE_CNTRL_OUTLINER|EE_CNTRL_OUTLINER2);
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 	SetMaxDepth( 9 );
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 	switch ( ImplGetOutlinerMode() )
242*b1cdbd2cSJim Jagielski 	{
243*b1cdbd2cSJim Jagielski 		case OUTLINERMODE_TEXTOBJECT:
244*b1cdbd2cSJim Jagielski 		case OUTLINERMODE_TITLEOBJECT:
245*b1cdbd2cSJim Jagielski 			break;
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski 		case OUTLINERMODE_OUTLINEOBJECT:
248*b1cdbd2cSJim Jagielski 			nCtrl |= EE_CNTRL_OUTLINER2;
249*b1cdbd2cSJim Jagielski 			break;
250*b1cdbd2cSJim Jagielski 		case OUTLINERMODE_OUTLINEVIEW:
251*b1cdbd2cSJim Jagielski 			nCtrl |= EE_CNTRL_OUTLINER;
252*b1cdbd2cSJim Jagielski 			break;
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 		default: DBG_ERROR( "Outliner::Init - Invalid Mode!" );
255*b1cdbd2cSJim Jagielski 	}
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 	pEditEngine->SetControlWord( nCtrl );
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski     const bool bWasUndoEnabled(IsUndoEnabled());
260*b1cdbd2cSJim Jagielski     EnableUndo(false);
261*b1cdbd2cSJim Jagielski 	ImplInitDepth( 0, GetMinDepth(), sal_False );
262*b1cdbd2cSJim Jagielski 	GetUndoManager().Clear();
263*b1cdbd2cSJim Jagielski     EnableUndo(bWasUndoEnabled);
264*b1cdbd2cSJim Jagielski }
265*b1cdbd2cSJim Jagielski 
SetMaxDepth(sal_Int16 nDepth,sal_Bool bCheckParagraphs)266*b1cdbd2cSJim Jagielski void Outliner::SetMaxDepth( sal_Int16 nDepth, sal_Bool bCheckParagraphs )
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski 	if( nMaxDepth != nDepth )
269*b1cdbd2cSJim Jagielski 	{
270*b1cdbd2cSJim Jagielski 		nMaxDepth = Min( nDepth, (sal_Int16)(SVX_MAX_NUM-1) );
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 		if( bCheckParagraphs )
273*b1cdbd2cSJim Jagielski 		{
274*b1cdbd2cSJim Jagielski 			sal_uInt16 nParagraphs = (sal_uInt16)pParaList->GetParagraphCount();
275*b1cdbd2cSJim Jagielski 			for ( sal_uInt16 nPara = 0; nPara < nParagraphs; nPara++ )
276*b1cdbd2cSJim Jagielski 			{
277*b1cdbd2cSJim Jagielski 				Paragraph* pPara = pParaList->GetParagraph( nPara );
278*b1cdbd2cSJim Jagielski 				if( pPara && pPara->GetDepth() > nMaxDepth )
279*b1cdbd2cSJim Jagielski 				{
280*b1cdbd2cSJim Jagielski 					SetDepth( pPara, nMaxDepth );
281*b1cdbd2cSJim Jagielski 				}
282*b1cdbd2cSJim Jagielski 			}
283*b1cdbd2cSJim Jagielski 		}
284*b1cdbd2cSJim Jagielski 	}
285*b1cdbd2cSJim Jagielski }
286*b1cdbd2cSJim Jagielski 
GetDepth(sal_uLong nPara) const287*b1cdbd2cSJim Jagielski sal_Int16 Outliner::GetDepth( sal_uLong nPara ) const
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
290*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pPara, "Outliner::GetDepth - Paragraph not found!" );
291*b1cdbd2cSJim Jagielski 	return pPara ? pPara->GetDepth() : -1;
292*b1cdbd2cSJim Jagielski }
293*b1cdbd2cSJim Jagielski 
SetDepth(Paragraph * pPara,sal_Int16 nNewDepth)294*b1cdbd2cSJim Jagielski void Outliner::SetDepth( Paragraph* pPara, sal_Int16 nNewDepth )
295*b1cdbd2cSJim Jagielski {
296*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski     ImplCheckDepth( nNewDepth );
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski 	if ( nNewDepth != pPara->GetDepth() )
301*b1cdbd2cSJim Jagielski 	{
302*b1cdbd2cSJim Jagielski 		nDepthChangedHdlPrevDepth = pPara->GetDepth();
303*b1cdbd2cSJim Jagielski 		mnDepthChangeHdlPrevFlags = pPara->nFlags;
304*b1cdbd2cSJim Jagielski 		pHdlParagraph = pPara;
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski         sal_uInt16 nPara = (sal_uInt16)GetAbsPos( pPara );
307*b1cdbd2cSJim Jagielski 		ImplInitDepth( nPara, nNewDepth, sal_True );
308*b1cdbd2cSJim Jagielski 		ImplCalcBulletText( nPara, sal_False, sal_False );
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski 		if ( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT )
311*b1cdbd2cSJim Jagielski 			ImplSetLevelDependendStyleSheet( nPara );
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 		DepthChangedHdl();
314*b1cdbd2cSJim Jagielski 	}
315*b1cdbd2cSJim Jagielski }
316*b1cdbd2cSJim Jagielski 
GetNumberingStartValue(sal_uInt16 nPara)317*b1cdbd2cSJim Jagielski sal_Int16 Outliner::GetNumberingStartValue( sal_uInt16 nPara )
318*b1cdbd2cSJim Jagielski {
319*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
320*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pPara, "Outliner::GetNumberingStartValue - Paragraph not found!" );
321*b1cdbd2cSJim Jagielski 	return pPara ? pPara->GetNumberingStartValue() : -1;
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski 
SetNumberingStartValue(sal_uInt16 nPara,sal_Int16 nNumberingStartValue)324*b1cdbd2cSJim Jagielski void Outliner::SetNumberingStartValue( sal_uInt16 nPara, sal_Int16 nNumberingStartValue )
325*b1cdbd2cSJim Jagielski {
326*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
327*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pPara, "Outliner::GetNumberingStartValue - Paragraph not found!" );
328*b1cdbd2cSJim Jagielski 	if( pPara && pPara->GetNumberingStartValue() != nNumberingStartValue )
329*b1cdbd2cSJim Jagielski     {
330*b1cdbd2cSJim Jagielski         if( IsUndoEnabled() && !IsInUndo() )
331*b1cdbd2cSJim Jagielski             InsertUndo( new OutlinerUndoChangeParaNumberingRestart( this, nPara,
332*b1cdbd2cSJim Jagielski                 pPara->GetNumberingStartValue(), nNumberingStartValue,
333*b1cdbd2cSJim Jagielski                 pPara->IsParaIsNumberingRestart(), pPara->IsParaIsNumberingRestart() ) );
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski         pPara->SetNumberingStartValue( nNumberingStartValue );
336*b1cdbd2cSJim Jagielski         // --> OD 2009-03-10 #i100014#
337*b1cdbd2cSJim Jagielski         // It is not a good idea to substract 1 from a count and cast the result
338*b1cdbd2cSJim Jagielski         // to sal_uInt16 without check, if the count is 0.
339*b1cdbd2cSJim Jagielski         ImplCheckParagraphs( nPara, (sal_uInt16) (pParaList->GetParagraphCount()) );
340*b1cdbd2cSJim Jagielski         // <--
341*b1cdbd2cSJim Jagielski         pEditEngine->SetModified();
342*b1cdbd2cSJim Jagielski     }
343*b1cdbd2cSJim Jagielski }
344*b1cdbd2cSJim Jagielski 
IsParaIsNumberingRestart(sal_uInt16 nPara)345*b1cdbd2cSJim Jagielski sal_Bool Outliner::IsParaIsNumberingRestart( sal_uInt16 nPara )
346*b1cdbd2cSJim Jagielski {
347*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
348*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pPara, "Outliner::IsParaIsNumberingRestart - Paragraph not found!" );
349*b1cdbd2cSJim Jagielski 	return pPara ? pPara->IsParaIsNumberingRestart() : sal_False;
350*b1cdbd2cSJim Jagielski }
351*b1cdbd2cSJim Jagielski 
SetParaIsNumberingRestart(sal_uInt16 nPara,sal_Bool bParaIsNumberingRestart)352*b1cdbd2cSJim Jagielski void Outliner::SetParaIsNumberingRestart( sal_uInt16 nPara, sal_Bool bParaIsNumberingRestart )
353*b1cdbd2cSJim Jagielski {
354*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
355*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pPara, "Outliner::SetParaIsNumberingRestart - Paragraph not found!" );
356*b1cdbd2cSJim Jagielski 	if( pPara && (pPara->IsParaIsNumberingRestart() != bParaIsNumberingRestart) )
357*b1cdbd2cSJim Jagielski     {
358*b1cdbd2cSJim Jagielski         if( IsUndoEnabled() && !IsInUndo() )
359*b1cdbd2cSJim Jagielski             InsertUndo( new OutlinerUndoChangeParaNumberingRestart( this, nPara,
360*b1cdbd2cSJim Jagielski                 pPara->GetNumberingStartValue(), pPara->GetNumberingStartValue(),
361*b1cdbd2cSJim Jagielski                 pPara->IsParaIsNumberingRestart(), bParaIsNumberingRestart ) );
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski         pPara->SetParaIsNumberingRestart( bParaIsNumberingRestart );
364*b1cdbd2cSJim Jagielski         // --> OD 2009-03-10 #i100014#
365*b1cdbd2cSJim Jagielski         // It is not a good idea to substract 1 from a count and cast the result
366*b1cdbd2cSJim Jagielski         // to sal_uInt16 without check, if the count is 0.
367*b1cdbd2cSJim Jagielski         ImplCheckParagraphs( nPara, (sal_uInt16) (pParaList->GetParagraphCount()) );
368*b1cdbd2cSJim Jagielski         // <--
369*b1cdbd2cSJim Jagielski         pEditEngine->SetModified();
370*b1cdbd2cSJim Jagielski     }
371*b1cdbd2cSJim Jagielski }
372*b1cdbd2cSJim Jagielski 
GetBulletsNumberingStatus(const sal_uInt16 nParaStart,const sal_uInt16 nParaEnd) const373*b1cdbd2cSJim Jagielski sal_Int16 Outliner::GetBulletsNumberingStatus(
374*b1cdbd2cSJim Jagielski     const sal_uInt16 nParaStart,
375*b1cdbd2cSJim Jagielski     const sal_uInt16 nParaEnd ) const
376*b1cdbd2cSJim Jagielski {
377*b1cdbd2cSJim Jagielski     if ( nParaStart > nParaEnd
378*b1cdbd2cSJim Jagielski          || nParaEnd >= pParaList->GetParagraphCount() )
379*b1cdbd2cSJim Jagielski     {
380*b1cdbd2cSJim Jagielski         DBG_ASSERT( false,"<Outliner::GetBulletsNumberingStatus> - unexpected parameter values" );
381*b1cdbd2cSJim Jagielski         return 2;
382*b1cdbd2cSJim Jagielski     }
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski     sal_uInt16 nBulletsCount = 0;
385*b1cdbd2cSJim Jagielski     sal_uInt16 nNumberingCount = 0;
386*b1cdbd2cSJim Jagielski     for (sal_uInt16 nPara = nParaStart; nPara <= nParaEnd; nPara++)
387*b1cdbd2cSJim Jagielski     {
388*b1cdbd2cSJim Jagielski         if ( !pParaList->GetParagraph(nPara) )
389*b1cdbd2cSJim Jagielski         {
390*b1cdbd2cSJim Jagielski             break;
391*b1cdbd2cSJim Jagielski         }
392*b1cdbd2cSJim Jagielski         const SvxNumberFormat* pFmt = GetNumberFormat(nPara);
393*b1cdbd2cSJim Jagielski         if (!pFmt)
394*b1cdbd2cSJim Jagielski         {
395*b1cdbd2cSJim Jagielski             // At least, exists one paragraph that has no Bullets/Numbering.
396*b1cdbd2cSJim Jagielski             break;
397*b1cdbd2cSJim Jagielski         }
398*b1cdbd2cSJim Jagielski         else if ((pFmt->GetNumberingType() == SVX_NUM_BITMAP) || (pFmt->GetNumberingType() == SVX_NUM_CHAR_SPECIAL))
399*b1cdbd2cSJim Jagielski         {
400*b1cdbd2cSJim Jagielski             // Having Bullets in this paragraph.
401*b1cdbd2cSJim Jagielski             nBulletsCount++;
402*b1cdbd2cSJim Jagielski         }
403*b1cdbd2cSJim Jagielski         else
404*b1cdbd2cSJim Jagielski         {
405*b1cdbd2cSJim Jagielski             // Having Numbering in this paragraph.
406*b1cdbd2cSJim Jagielski             nNumberingCount++;
407*b1cdbd2cSJim Jagielski         }
408*b1cdbd2cSJim Jagielski     }
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski     const sal_uInt16 nParaCount = nParaEnd - nParaStart + 1;
411*b1cdbd2cSJim Jagielski     if ( nBulletsCount == nParaCount )
412*b1cdbd2cSJim Jagielski     {
413*b1cdbd2cSJim Jagielski         return 0;
414*b1cdbd2cSJim Jagielski     }
415*b1cdbd2cSJim Jagielski     else if ( nNumberingCount == nParaCount )
416*b1cdbd2cSJim Jagielski     {
417*b1cdbd2cSJim Jagielski         return 1;
418*b1cdbd2cSJim Jagielski     }
419*b1cdbd2cSJim Jagielski     return 2;
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
GetBulletsNumberingStatus() const422*b1cdbd2cSJim Jagielski sal_Int16 Outliner::GetBulletsNumberingStatus() const
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski     return pParaList->GetParagraphCount() > 0
425*b1cdbd2cSJim Jagielski            ? GetBulletsNumberingStatus( 0, pParaList->GetParagraphCount()-1 )
426*b1cdbd2cSJim Jagielski            : 2;
427*b1cdbd2cSJim Jagielski }
428*b1cdbd2cSJim Jagielski 
CreateParaObject(sal_uInt16 nStartPara,sal_uInt16 nCount) const429*b1cdbd2cSJim Jagielski OutlinerParaObject* Outliner::CreateParaObject( sal_uInt16 nStartPara, sal_uInt16 nCount ) const
430*b1cdbd2cSJim Jagielski {
431*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski 	if ( sal::static_int_cast< sal_uLong >( nStartPara + nCount ) >
434*b1cdbd2cSJim Jagielski          pParaList->GetParagraphCount() )
435*b1cdbd2cSJim Jagielski 		nCount = sal::static_int_cast< sal_uInt16 >(
436*b1cdbd2cSJim Jagielski             pParaList->GetParagraphCount() - nStartPara );
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski 	// When a new OutlinerParaObject is created because a paragraph is just beeing deleted,
439*b1cdbd2cSJim Jagielski 	// it can happen that the ParaList is not updated yet...
440*b1cdbd2cSJim Jagielski 	if ( ( nStartPara + nCount ) > pEditEngine->GetParagraphCount() )
441*b1cdbd2cSJim Jagielski 		nCount = pEditEngine->GetParagraphCount() - nStartPara;
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 	if( !nCount )
444*b1cdbd2cSJim Jagielski 		return NULL;
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski     EditTextObject* pText = pEditEngine->CreateTextObject( nStartPara, nCount );
447*b1cdbd2cSJim Jagielski     const bool bIsEditDoc(OUTLINERMODE_TEXTOBJECT == ImplGetOutlinerMode());
448*b1cdbd2cSJim Jagielski     ParagraphDataVector aParagraphDataVector(nCount);
449*b1cdbd2cSJim Jagielski 	const sal_uInt16 nLastPara(nStartPara + nCount - 1);
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski     for(sal_uInt16 nPara(nStartPara); nPara <= nLastPara; nPara++)
452*b1cdbd2cSJim Jagielski     {
453*b1cdbd2cSJim Jagielski         aParagraphDataVector[nPara-nStartPara] = *GetParagraph(nPara);
454*b1cdbd2cSJim Jagielski     }
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski     OutlinerParaObject* pPObj = new OutlinerParaObject(*pText, aParagraphDataVector, bIsEditDoc);
457*b1cdbd2cSJim Jagielski     pPObj->SetOutlinerMode(GetMode());
458*b1cdbd2cSJim Jagielski     delete pText;
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski 	return pPObj;
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski 
SetText(const XubString & rText,Paragraph * pPara)463*b1cdbd2cSJim Jagielski void Outliner::SetText( const XubString& rText, Paragraph* pPara )
464*b1cdbd2cSJim Jagielski {
465*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
466*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pPara,"SetText:No Para");
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski 	sal_Bool bUpdate = pEditEngine->GetUpdateMode();
469*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( sal_False );
470*b1cdbd2cSJim Jagielski 	ImplBlockInsertionCallbacks( sal_True );
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski 	sal_uInt16 nPara = (sal_uInt16)pParaList->GetAbsPos( pPara );
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski 	if( !rText.Len() )
475*b1cdbd2cSJim Jagielski 	{
476*b1cdbd2cSJim Jagielski 		pEditEngine->SetText( nPara, rText );
477*b1cdbd2cSJim Jagielski 		ImplInitDepth( nPara, pPara->GetDepth(), sal_False );
478*b1cdbd2cSJim Jagielski 	}
479*b1cdbd2cSJim Jagielski 	else
480*b1cdbd2cSJim Jagielski 	{
481*b1cdbd2cSJim Jagielski 		XubString aText( rText );
482*b1cdbd2cSJim Jagielski 		aText.ConvertLineEnd( LINEEND_LF );
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski 		if( aText.GetChar( aText.Len()-1 ) == '\x0A' )
485*b1cdbd2cSJim Jagielski 			aText.Erase( aText.Len()-1, 1 ); // letzten Umbruch loeschen
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = aText.GetTokenCount( '\x0A' );
488*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = 0;
489*b1cdbd2cSJim Jagielski 		sal_uInt16 nInsPos = nPara+1;
490*b1cdbd2cSJim Jagielski 		while( nCount > nPos )
491*b1cdbd2cSJim Jagielski 		{
492*b1cdbd2cSJim Jagielski 			XubString aStr = aText.GetToken( nPos, '\x0A' );
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 			sal_Int16 nCurDepth;
495*b1cdbd2cSJim Jagielski 			if( nPos )
496*b1cdbd2cSJim Jagielski 			{
497*b1cdbd2cSJim Jagielski 				pPara = new Paragraph( -1 );
498*b1cdbd2cSJim Jagielski 				nCurDepth = -1;
499*b1cdbd2cSJim Jagielski 			}
500*b1cdbd2cSJim Jagielski 			else
501*b1cdbd2cSJim Jagielski 				nCurDepth = pPara->GetDepth();
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski 			// Im Outliner-Modus die Tabulatoren filtern und die
504*b1cdbd2cSJim Jagielski 			// Einrueckung ueber ein LRSpaceItem einstellen
505*b1cdbd2cSJim Jagielski 			// Im EditEngine-Modus ueber Maltes Tabulatoren einruecken
506*b1cdbd2cSJim Jagielski 			if( ( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT ) ||
507*b1cdbd2cSJim Jagielski 				( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEVIEW ) )
508*b1cdbd2cSJim Jagielski 			{
509*b1cdbd2cSJim Jagielski 				// Tabs raus
510*b1cdbd2cSJim Jagielski 				sal_uInt16 nTabs = 0;
511*b1cdbd2cSJim Jagielski 				while ( ( nTabs < aStr.Len() ) && ( aStr.GetChar( nTabs ) == '\t' ) )
512*b1cdbd2cSJim Jagielski 					nTabs++;
513*b1cdbd2cSJim Jagielski 				if ( nTabs )
514*b1cdbd2cSJim Jagielski 					aStr.Erase( 0, nTabs );
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski 				// Tiefe beibehalten ?  (siehe Outliner::Insert)
517*b1cdbd2cSJim Jagielski 				if( !(pPara->nFlags & PARAFLAG_HOLDDEPTH) )
518*b1cdbd2cSJim Jagielski 				{
519*b1cdbd2cSJim Jagielski 					nCurDepth = nTabs-1;
520*b1cdbd2cSJim Jagielski 					ImplCheckDepth( nCurDepth );
521*b1cdbd2cSJim Jagielski 					pPara->SetDepth( nCurDepth );
522*b1cdbd2cSJim Jagielski 					pPara->nFlags &= (~PARAFLAG_HOLDDEPTH);
523*b1cdbd2cSJim Jagielski 				}
524*b1cdbd2cSJim Jagielski 			}
525*b1cdbd2cSJim Jagielski 			if( nPos ) // nicht mit dem ersten Absatz
526*b1cdbd2cSJim Jagielski 			{
527*b1cdbd2cSJim Jagielski 				pParaList->Insert( pPara, nInsPos );
528*b1cdbd2cSJim Jagielski 				pEditEngine->InsertParagraph( nInsPos, aStr );
529*b1cdbd2cSJim Jagielski 				pHdlParagraph = pPara;
530*b1cdbd2cSJim Jagielski 				ParagraphInsertedHdl();
531*b1cdbd2cSJim Jagielski 			}
532*b1cdbd2cSJim Jagielski 			else
533*b1cdbd2cSJim Jagielski 			{
534*b1cdbd2cSJim Jagielski 				nInsPos--;
535*b1cdbd2cSJim Jagielski 				pEditEngine->SetText( nInsPos, aStr );
536*b1cdbd2cSJim Jagielski 			}
537*b1cdbd2cSJim Jagielski 			ImplInitDepth( nInsPos, nCurDepth, sal_False );
538*b1cdbd2cSJim Jagielski 			nInsPos++;
539*b1cdbd2cSJim Jagielski 			nPos++;
540*b1cdbd2cSJim Jagielski 		}
541*b1cdbd2cSJim Jagielski 	}
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pParaList->GetParagraphCount()==pEditEngine->GetParagraphCount(),"SetText failed!");
544*b1cdbd2cSJim Jagielski 	bFirstParaIsEmpty = sal_False;
545*b1cdbd2cSJim Jagielski 	ImplBlockInsertionCallbacks( sal_False );
546*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( bUpdate );
547*b1cdbd2cSJim Jagielski }
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski // pView == 0 -> Tabulatoren nicht beachten
550*b1cdbd2cSJim Jagielski 
ImpConvertEdtToOut(sal_uInt32 nPara,EditView * pView)551*b1cdbd2cSJim Jagielski bool Outliner::ImpConvertEdtToOut( sal_uInt32 nPara,EditView* pView)
552*b1cdbd2cSJim Jagielski {
553*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski 	bool bConverted = false;
556*b1cdbd2cSJim Jagielski 	sal_uInt16 nTabs = 0;
557*b1cdbd2cSJim Jagielski 	ESelection aDelSel;
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski //	const SfxItemSet& rAttrs = pEditEngine->GetParaAttribs( (sal_uInt16)nPara );
560*b1cdbd2cSJim Jagielski //	bool bAlreadyOutliner = rAttrs.GetItemState( EE_PARA_OUTLLRSPACE ) == SFX_ITEM_ON ? true : false;
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski 	XubString aName;
563*b1cdbd2cSJim Jagielski 	XubString aHeading_US( RTL_CONSTASCII_USTRINGPARAM( "heading" ) );
564*b1cdbd2cSJim Jagielski 	XubString aNumber_US( RTL_CONSTASCII_USTRINGPARAM( "Numbering" ) );
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski 	XubString aStr( pEditEngine->GetText( (sal_uInt16)nPara ) );
567*b1cdbd2cSJim Jagielski 	xub_Unicode* pPtr = (xub_Unicode*)aStr.GetBuffer();
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski 	sal_uInt16 nHeadingNumberStart = 0;
570*b1cdbd2cSJim Jagielski 	sal_uInt16 nNumberingNumberStart = 0;
571*b1cdbd2cSJim Jagielski 	SfxStyleSheet* pStyle= pEditEngine->GetStyleSheet( (sal_uInt16)nPara );
572*b1cdbd2cSJim Jagielski 	if( pStyle )
573*b1cdbd2cSJim Jagielski 	{
574*b1cdbd2cSJim Jagielski 		aName = pStyle->GetName();
575*b1cdbd2cSJim Jagielski 		sal_uInt16 nSearch;
576*b1cdbd2cSJim Jagielski 		if ( ( nSearch = aName.Search( aHeading_US ) ) != STRING_NOTFOUND )
577*b1cdbd2cSJim Jagielski 			nHeadingNumberStart = nSearch + aHeading_US.Len();
578*b1cdbd2cSJim Jagielski 		else if ( ( nSearch = aName.Search( aNumber_US ) ) != STRING_NOTFOUND )
579*b1cdbd2cSJim Jagielski 			nNumberingNumberStart = nSearch + aNumber_US.Len();
580*b1cdbd2cSJim Jagielski 	}
581*b1cdbd2cSJim Jagielski 
582*b1cdbd2cSJim Jagielski 	if ( nHeadingNumberStart || nNumberingNumberStart )
583*b1cdbd2cSJim Jagielski 	{
584*b1cdbd2cSJim Jagielski 		// PowerPoint-Import ?
585*b1cdbd2cSJim Jagielski 		if( nHeadingNumberStart && ( aStr.Len() >= 2 ) &&
586*b1cdbd2cSJim Jagielski 				( pPtr[0] != '\t' ) && ( pPtr[1] == '\t' ) )
587*b1cdbd2cSJim Jagielski 		{
588*b1cdbd2cSJim Jagielski 			// Bullet & Tab raus
589*b1cdbd2cSJim Jagielski 			aDelSel = ESelection( (sal_uInt16)nPara, 0, (sal_uInt16)nPara, 2 );
590*b1cdbd2cSJim Jagielski 		}
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = nHeadingNumberStart ? nHeadingNumberStart : nNumberingNumberStart;
593*b1cdbd2cSJim Jagielski 		String aLevel = aName.Copy( nPos );
594*b1cdbd2cSJim Jagielski 		aLevel.EraseLeadingChars( ' ' );
595*b1cdbd2cSJim Jagielski 		nTabs = sal::static_int_cast< sal_uInt16 >(aLevel.ToInt32());
596*b1cdbd2cSJim Jagielski 		if( nTabs )
597*b1cdbd2cSJim Jagielski 			nTabs--; // ebene 0 = "heading 1"
598*b1cdbd2cSJim Jagielski 		bConverted = sal_True;
599*b1cdbd2cSJim Jagielski 	}
600*b1cdbd2cSJim Jagielski 	else
601*b1cdbd2cSJim Jagielski 	{
602*b1cdbd2cSJim Jagielski 		//  Fuehrende Tabulatoren filtern
603*b1cdbd2cSJim Jagielski 		while( *pPtr == '\t' )
604*b1cdbd2cSJim Jagielski 		{
605*b1cdbd2cSJim Jagielski 			pPtr++;
606*b1cdbd2cSJim Jagielski 			nTabs++;
607*b1cdbd2cSJim Jagielski 		}
608*b1cdbd2cSJim Jagielski 		// Tabulatoren aus dem Text entfernen
609*b1cdbd2cSJim Jagielski 		if( nTabs )
610*b1cdbd2cSJim Jagielski 			aDelSel = ESelection( (sal_uInt16)nPara, 0, (sal_uInt16)nPara, nTabs );
611*b1cdbd2cSJim Jagielski 	}
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski 	if ( aDelSel.HasRange() )
614*b1cdbd2cSJim Jagielski 	{
615*b1cdbd2cSJim Jagielski 		if ( pView )
616*b1cdbd2cSJim Jagielski 		{
617*b1cdbd2cSJim Jagielski 			pView->SetSelection( aDelSel );
618*b1cdbd2cSJim Jagielski 			pView->DeleteSelected();
619*b1cdbd2cSJim Jagielski 		}
620*b1cdbd2cSJim Jagielski 		else
621*b1cdbd2cSJim Jagielski 			pEditEngine->QuickDelete( aDelSel );
622*b1cdbd2cSJim Jagielski 	}
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski     const SfxInt16Item& rLevel = (const SfxInt16Item&) pEditEngine->GetParaAttrib( sal::static_int_cast< sal_uInt16 >(nPara), EE_PARA_OUTLLEVEL );
625*b1cdbd2cSJim Jagielski     sal_Int16 nOutlLevel = rLevel.GetValue();
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski     ImplCheckDepth( nOutlLevel );
628*b1cdbd2cSJim Jagielski 	ImplInitDepth( sal::static_int_cast< sal_uInt16 >(nPara), nOutlLevel, sal_False );
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski 	return bConverted;
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski 
SetText(const OutlinerParaObject & rPObj)633*b1cdbd2cSJim Jagielski void Outliner::SetText( const OutlinerParaObject& rPObj )
634*b1cdbd2cSJim Jagielski {
635*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 	sal_Bool bUpdate = pEditEngine->GetUpdateMode();
638*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( sal_False );
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski 	sal_Bool bUndo = pEditEngine->IsUndoEnabled();
641*b1cdbd2cSJim Jagielski 	EnableUndo( sal_False );
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski 	Init( rPObj.GetOutlinerMode() );
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski 	ImplBlockInsertionCallbacks( sal_True );
646*b1cdbd2cSJim Jagielski 	pEditEngine->SetText(rPObj.GetTextObject());
647*b1cdbd2cSJim Jagielski 	if( rPObj.Count() != pEditEngine->GetParagraphCount() )
648*b1cdbd2cSJim Jagielski 	{
649*b1cdbd2cSJim Jagielski 		int nop=0;nop++;
650*b1cdbd2cSJim Jagielski 	}
651*b1cdbd2cSJim Jagielski 
652*b1cdbd2cSJim Jagielski 	bFirstParaIsEmpty = sal_False;
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski 	pParaList->Clear( sal_True );
655*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCurPara = 0; nCurPara < rPObj.Count(); nCurPara++ )
656*b1cdbd2cSJim Jagielski 	{
657*b1cdbd2cSJim Jagielski 		Paragraph* pPara = new Paragraph( rPObj.GetParagraphData(nCurPara));
658*b1cdbd2cSJim Jagielski         ImplCheckDepth( pPara->nDepth );
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski 		pParaList->Insert( pPara, LIST_APPEND );
661*b1cdbd2cSJim Jagielski 		ImplCheckNumBulletItem( nCurPara );
662*b1cdbd2cSJim Jagielski 	}
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski     // --> OD 2009-03-10 #i100014#
665*b1cdbd2cSJim Jagielski     // It is not a good idea to substract 1 from a count and cast the result
666*b1cdbd2cSJim Jagielski     // to sal_uInt16 without check, if the count is 0.
667*b1cdbd2cSJim Jagielski     ImplCheckParagraphs( 0, (sal_uInt16) (pParaList->GetParagraphCount()) );
668*b1cdbd2cSJim Jagielski     // <--
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski 	EnableUndo( bUndo );
671*b1cdbd2cSJim Jagielski 	ImplBlockInsertionCallbacks( sal_False );
672*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( bUpdate );
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pParaList->GetParagraphCount()==rPObj.Count(),"SetText failed");
675*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pEditEngine->GetParagraphCount()==rPObj.Count(),"SetText failed");
676*b1cdbd2cSJim Jagielski }
677*b1cdbd2cSJim Jagielski 
AddText(const OutlinerParaObject & rPObj)678*b1cdbd2cSJim Jagielski void Outliner::AddText( const OutlinerParaObject& rPObj )
679*b1cdbd2cSJim Jagielski {
680*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
681*b1cdbd2cSJim Jagielski 	Paragraph* pPara;
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski 	sal_Bool bUpdate = pEditEngine->GetUpdateMode();
684*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( sal_False );
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski 	ImplBlockInsertionCallbacks( sal_True );
687*b1cdbd2cSJim Jagielski 	sal_uLong nPara;
688*b1cdbd2cSJim Jagielski 	if( bFirstParaIsEmpty )
689*b1cdbd2cSJim Jagielski 	{
690*b1cdbd2cSJim Jagielski 		pParaList->Clear( sal_True );
691*b1cdbd2cSJim Jagielski 		pEditEngine->SetText(rPObj.GetTextObject());
692*b1cdbd2cSJim Jagielski 		nPara = 0;
693*b1cdbd2cSJim Jagielski 	}
694*b1cdbd2cSJim Jagielski 	else
695*b1cdbd2cSJim Jagielski 	{
696*b1cdbd2cSJim Jagielski 		nPara = pParaList->GetParagraphCount();
697*b1cdbd2cSJim Jagielski 		pEditEngine->InsertParagraph( EE_PARA_APPEND, rPObj.GetTextObject() );
698*b1cdbd2cSJim Jagielski 	}
699*b1cdbd2cSJim Jagielski 	bFirstParaIsEmpty = sal_False;
700*b1cdbd2cSJim Jagielski 
701*b1cdbd2cSJim Jagielski 	for( sal_uInt16 n = 0; n < rPObj.Count(); n++ )
702*b1cdbd2cSJim Jagielski 	{
703*b1cdbd2cSJim Jagielski 		pPara = new Paragraph( rPObj.GetParagraphData(n) );
704*b1cdbd2cSJim Jagielski 		pParaList->Insert( pPara, LIST_APPEND );
705*b1cdbd2cSJim Jagielski 		sal_uInt16 nP = sal::static_int_cast< sal_uInt16 >(nPara+n);
706*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pParaList->GetAbsPos(pPara)==nP,"AddText:Out of sync");
707*b1cdbd2cSJim Jagielski 		ImplInitDepth( nP, pPara->GetDepth(), sal_False );
708*b1cdbd2cSJim Jagielski 	}
709*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pEditEngine->GetParagraphCount()==pParaList->GetParagraphCount(), "SetText: OutOfSync" );
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski     // --> OD 2009-03-10 #i100014#
712*b1cdbd2cSJim Jagielski     // It is not a good idea to substract 1 from a count and cast the result
713*b1cdbd2cSJim Jagielski     // to sal_uInt16 without check, if the count is 0.
714*b1cdbd2cSJim Jagielski     ImplCheckParagraphs( (sal_uInt16)nPara, (sal_uInt16) (pParaList->GetParagraphCount()) );
715*b1cdbd2cSJim Jagielski     // <--
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 	ImplBlockInsertionCallbacks( sal_False );
718*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( bUpdate );
719*b1cdbd2cSJim Jagielski }
720*b1cdbd2cSJim Jagielski 
FieldClicked(const SvxFieldItem & rField,sal_uInt16 nPara,sal_uInt16 nPos)721*b1cdbd2cSJim Jagielski void __EXPORT Outliner::FieldClicked( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos )
722*b1cdbd2cSJim Jagielski {
723*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski 	if ( aFieldClickedHdl.IsSet() )
726*b1cdbd2cSJim Jagielski 	{
727*b1cdbd2cSJim Jagielski 		EditFieldInfo aFldInfo( this, rField, nPara, nPos );
728*b1cdbd2cSJim Jagielski 		aFldInfo.SetSimpleClick( sal_True );
729*b1cdbd2cSJim Jagielski 		aFieldClickedHdl.Call( &aFldInfo );
730*b1cdbd2cSJim Jagielski 	}
731*b1cdbd2cSJim Jagielski }
732*b1cdbd2cSJim Jagielski 
733*b1cdbd2cSJim Jagielski 
FieldSelected(const SvxFieldItem & rField,sal_uInt16 nPara,sal_uInt16 nPos)734*b1cdbd2cSJim Jagielski void __EXPORT Outliner::FieldSelected( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos )
735*b1cdbd2cSJim Jagielski {
736*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
737*b1cdbd2cSJim Jagielski 	if ( !aFieldClickedHdl.IsSet() )
738*b1cdbd2cSJim Jagielski 		return;
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski 	EditFieldInfo aFldInfo( this, rField, nPara, nPos );
741*b1cdbd2cSJim Jagielski 	aFldInfo.SetSimpleClick( sal_False );
742*b1cdbd2cSJim Jagielski 	aFieldClickedHdl.Call( &aFldInfo );
743*b1cdbd2cSJim Jagielski }
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski 
CalcFieldValue(const SvxFieldItem & rField,sal_uInt16 nPara,sal_uInt16 nPos,Color * & rpTxtColor,Color * & rpFldColor)746*b1cdbd2cSJim Jagielski XubString __EXPORT Outliner::CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos, Color*& rpTxtColor, Color*& rpFldColor )
747*b1cdbd2cSJim Jagielski {
748*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
749*b1cdbd2cSJim Jagielski 	if ( !aCalcFieldValueHdl.IsSet() )
750*b1cdbd2cSJim Jagielski 		return String( ' ' );
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski 	EditFieldInfo aFldInfo( this, rField, nPara, nPos );
753*b1cdbd2cSJim Jagielski 	// Die FldColor ist mit COL_LIGHTGRAY voreingestellt.
754*b1cdbd2cSJim Jagielski 	if ( rpFldColor )
755*b1cdbd2cSJim Jagielski 		aFldInfo.SetFldColor( *rpFldColor );
756*b1cdbd2cSJim Jagielski 
757*b1cdbd2cSJim Jagielski 	aCalcFieldValueHdl.Call( &aFldInfo );
758*b1cdbd2cSJim Jagielski 	if ( aFldInfo.GetTxtColor() )
759*b1cdbd2cSJim Jagielski 	{
760*b1cdbd2cSJim Jagielski 		delete rpTxtColor;
761*b1cdbd2cSJim Jagielski 		rpTxtColor = new Color( *aFldInfo.GetTxtColor() );
762*b1cdbd2cSJim Jagielski 	}
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski 	delete rpFldColor;
765*b1cdbd2cSJim Jagielski 	rpFldColor = aFldInfo.GetFldColor() ? new Color( *aFldInfo.GetFldColor() ) : 0;
766*b1cdbd2cSJim Jagielski 
767*b1cdbd2cSJim Jagielski 	return aFldInfo.GetRepresentation();
768*b1cdbd2cSJim Jagielski }
769*b1cdbd2cSJim Jagielski 
SetStyleSheet(sal_uLong nPara,SfxStyleSheet * pStyle)770*b1cdbd2cSJim Jagielski void Outliner::SetStyleSheet( sal_uLong nPara, SfxStyleSheet* pStyle )
771*b1cdbd2cSJim Jagielski {
772*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
773*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
774*b1cdbd2cSJim Jagielski         if (pPara)
775*b1cdbd2cSJim Jagielski         {
776*b1cdbd2cSJim Jagielski             pEditEngine->SetStyleSheet( (sal_uInt16)nPara, pStyle );
777*b1cdbd2cSJim Jagielski             pPara->nFlags |= PARAFLAG_SETBULLETTEXT;
778*b1cdbd2cSJim Jagielski             ImplCheckNumBulletItem( (sal_uInt16) nPara );
779*b1cdbd2cSJim Jagielski         }
780*b1cdbd2cSJim Jagielski }
781*b1cdbd2cSJim Jagielski 
SetVisible(Paragraph * pPara,sal_Bool bVisible)782*b1cdbd2cSJim Jagielski void Outliner::SetVisible( Paragraph* pPara, sal_Bool bVisible )
783*b1cdbd2cSJim Jagielski {
784*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
785*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pPara, "SetVisible: pPara = NULL" );
786*b1cdbd2cSJim Jagielski 
787*b1cdbd2cSJim Jagielski         if (pPara)
788*b1cdbd2cSJim Jagielski         {
789*b1cdbd2cSJim Jagielski             pPara->bVisible = bVisible;
790*b1cdbd2cSJim Jagielski             sal_uLong nPara = pParaList->GetAbsPos( pPara );
791*b1cdbd2cSJim Jagielski             pEditEngine->ShowParagraph( (sal_uInt16)nPara, bVisible );
792*b1cdbd2cSJim Jagielski         }
793*b1cdbd2cSJim Jagielski }
794*b1cdbd2cSJim Jagielski 
ImplCheckNumBulletItem(sal_uInt16 nPara)795*b1cdbd2cSJim Jagielski void Outliner::ImplCheckNumBulletItem( sal_uInt16 nPara )
796*b1cdbd2cSJim Jagielski {
797*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
798*b1cdbd2cSJim Jagielski         if (pPara)
799*b1cdbd2cSJim Jagielski             pPara->aBulSize.Width() = -1;
800*b1cdbd2cSJim Jagielski }
801*b1cdbd2cSJim Jagielski 
ImplSetLevelDependendStyleSheet(sal_uInt16 nPara,SfxStyleSheet * pLevelStyle)802*b1cdbd2cSJim Jagielski void Outliner::ImplSetLevelDependendStyleSheet( sal_uInt16 nPara, SfxStyleSheet* pLevelStyle )
803*b1cdbd2cSJim Jagielski {
804*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski 	DBG_ASSERT( ( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT ) || ( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEVIEW ), "SetLevelDependendStyleSheet: Wrong Mode!" );
807*b1cdbd2cSJim Jagielski 
808*b1cdbd2cSJim Jagielski     SfxStyleSheet* pStyle = pLevelStyle;
809*b1cdbd2cSJim Jagielski     if ( !pStyle )
810*b1cdbd2cSJim Jagielski         pStyle = GetStyleSheet( nPara );
811*b1cdbd2cSJim Jagielski 
812*b1cdbd2cSJim Jagielski 	if ( pStyle )
813*b1cdbd2cSJim Jagielski 	{
814*b1cdbd2cSJim Jagielski 		sal_Int16 nDepth = GetDepth( nPara );
815*b1cdbd2cSJim Jagielski 		if( nDepth < 0 )
816*b1cdbd2cSJim Jagielski 			nDepth = 0;
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 		String aNewStyleSheetName( pStyle->GetName() );
819*b1cdbd2cSJim Jagielski 		aNewStyleSheetName.Erase( aNewStyleSheetName.Len()-1, 1 );
820*b1cdbd2cSJim Jagielski 		aNewStyleSheetName += String::CreateFromInt32( nDepth+1 );
821*b1cdbd2cSJim Jagielski 		SfxStyleSheet* pNewStyle = (SfxStyleSheet*)GetStyleSheetPool()->Find( aNewStyleSheetName, pStyle->GetFamily() );
822*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pNewStyle, "AutoStyleSheetName - Style not found!" );
823*b1cdbd2cSJim Jagielski 		if ( pNewStyle && ( pNewStyle != GetStyleSheet( nPara ) ) )
824*b1cdbd2cSJim Jagielski 		{
825*b1cdbd2cSJim Jagielski  			SfxItemSet aOldAttrs( GetParaAttribs( nPara ) );
826*b1cdbd2cSJim Jagielski 			SetStyleSheet( nPara, pNewStyle );
827*b1cdbd2cSJim Jagielski 			if ( aOldAttrs.GetItemState( EE_PARA_NUMBULLET ) == SFX_ITEM_ON )
828*b1cdbd2cSJim Jagielski 			{
829*b1cdbd2cSJim Jagielski 				SfxItemSet aAttrs( GetParaAttribs( nPara ) );
830*b1cdbd2cSJim Jagielski 				aAttrs.Put( aOldAttrs.Get( EE_PARA_NUMBULLET ) );
831*b1cdbd2cSJim Jagielski 				SetParaAttribs( nPara, aAttrs );
832*b1cdbd2cSJim Jagielski 			}
833*b1cdbd2cSJim Jagielski 		}
834*b1cdbd2cSJim Jagielski 	}
835*b1cdbd2cSJim Jagielski }
836*b1cdbd2cSJim Jagielski 
ImplInitDepth(sal_uInt16 nPara,sal_Int16 nDepth,sal_Bool bCreateUndo,sal_Bool bUndoAction)837*b1cdbd2cSJim Jagielski void Outliner::ImplInitDepth( sal_uInt16 nPara, sal_Int16 nDepth, sal_Bool bCreateUndo, sal_Bool bUndoAction )
838*b1cdbd2cSJim Jagielski {
839*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
840*b1cdbd2cSJim Jagielski 
841*b1cdbd2cSJim Jagielski     DBG_ASSERT( ( nDepth >= nMinDepth ) && ( nDepth <= nMaxDepth ), "ImplInitDepth - Depth is invalid!" );
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
844*b1cdbd2cSJim Jagielski         if (!pPara)
845*b1cdbd2cSJim Jagielski             return;
846*b1cdbd2cSJim Jagielski 	sal_Int16 nOldDepth = pPara->GetDepth();
847*b1cdbd2cSJim Jagielski 	pPara->SetDepth( nDepth );
848*b1cdbd2cSJim Jagielski 
849*b1cdbd2cSJim Jagielski 	// Bei IsInUndo brauchen Attribute und Style nicht eingestellt werden,
850*b1cdbd2cSJim Jagielski 	// dort werden die alten Werte durch die EditEngine restauriert.
851*b1cdbd2cSJim Jagielski 
852*b1cdbd2cSJim Jagielski 	if( !IsInUndo() )
853*b1cdbd2cSJim Jagielski 	{
854*b1cdbd2cSJim Jagielski 		sal_Bool bUpdate = pEditEngine->GetUpdateMode();
855*b1cdbd2cSJim Jagielski 		pEditEngine->SetUpdateMode( sal_False );
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski 		sal_Bool bUndo = bCreateUndo && IsUndoEnabled();
858*b1cdbd2cSJim Jagielski 		if ( bUndo && bUndoAction )
859*b1cdbd2cSJim Jagielski 			UndoActionStart( OLUNDO_DEPTH );
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski 		SfxItemSet aAttrs( pEditEngine->GetParaAttribs( nPara ) );
862*b1cdbd2cSJim Jagielski 		aAttrs.Put( SfxInt16Item( EE_PARA_OUTLLEVEL, nDepth ) );
863*b1cdbd2cSJim Jagielski 		pEditEngine->SetParaAttribs( nPara, aAttrs );
864*b1cdbd2cSJim Jagielski 		ImplCheckNumBulletItem( nPara );
865*b1cdbd2cSJim Jagielski 		ImplCalcBulletText( nPara, sal_False, sal_False );
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski 		if ( bUndo )
868*b1cdbd2cSJim Jagielski 		{
869*b1cdbd2cSJim Jagielski 			InsertUndo( new OutlinerUndoChangeDepth( this, nPara, nOldDepth, nDepth ) );
870*b1cdbd2cSJim Jagielski 			if ( bUndoAction )
871*b1cdbd2cSJim Jagielski 				UndoActionEnd( OLUNDO_DEPTH );
872*b1cdbd2cSJim Jagielski 		}
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski 		pEditEngine->SetUpdateMode( bUpdate );
875*b1cdbd2cSJim Jagielski 	}
876*b1cdbd2cSJim Jagielski }
877*b1cdbd2cSJim Jagielski 
SetParaAttribs(sal_uInt16 nPara,const SfxItemSet & rSet)878*b1cdbd2cSJim Jagielski void Outliner::SetParaAttribs( sal_uInt16 nPara, const SfxItemSet& rSet )
879*b1cdbd2cSJim Jagielski {
880*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski     pEditEngine->SetParaAttribs( nPara, rSet );
883*b1cdbd2cSJim Jagielski }
884*b1cdbd2cSJim Jagielski 
Expand(Paragraph * pPara)885*b1cdbd2cSJim Jagielski sal_Bool Outliner::Expand( Paragraph* pPara )
886*b1cdbd2cSJim Jagielski {
887*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
888*b1cdbd2cSJim Jagielski 
889*b1cdbd2cSJim Jagielski 	if ( pParaList->HasHiddenChilds( pPara ) )
890*b1cdbd2cSJim Jagielski 	{
891*b1cdbd2cSJim Jagielski 		OLUndoExpand* pUndo = 0;
892*b1cdbd2cSJim Jagielski 		sal_Bool bUndo = IsUndoEnabled() && !IsInUndo();
893*b1cdbd2cSJim Jagielski 		if( bUndo )
894*b1cdbd2cSJim Jagielski 		{
895*b1cdbd2cSJim Jagielski 			UndoActionStart( OLUNDO_EXPAND );
896*b1cdbd2cSJim Jagielski 			pUndo = new OLUndoExpand( this, OLUNDO_EXPAND );
897*b1cdbd2cSJim Jagielski 			pUndo->pParas = 0;
898*b1cdbd2cSJim Jagielski 			pUndo->nCount = (sal_uInt16)pParaList->GetAbsPos( pPara );
899*b1cdbd2cSJim Jagielski 		}
900*b1cdbd2cSJim Jagielski 		pHdlParagraph = pPara;
901*b1cdbd2cSJim Jagielski 		bIsExpanding = sal_True;
902*b1cdbd2cSJim Jagielski 		pParaList->Expand( pPara );
903*b1cdbd2cSJim Jagielski 		ExpandHdl();
904*b1cdbd2cSJim Jagielski 		InvalidateBullet( pPara, pParaList->GetAbsPos(pPara) );
905*b1cdbd2cSJim Jagielski 		if( bUndo )
906*b1cdbd2cSJim Jagielski 		{
907*b1cdbd2cSJim Jagielski 			InsertUndo( pUndo );
908*b1cdbd2cSJim Jagielski 			UndoActionEnd( OLUNDO_EXPAND );
909*b1cdbd2cSJim Jagielski 		}
910*b1cdbd2cSJim Jagielski 		return sal_True;
911*b1cdbd2cSJim Jagielski 	}
912*b1cdbd2cSJim Jagielski 	return sal_False;
913*b1cdbd2cSJim Jagielski }
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski 
Collapse(Paragraph * pPara)916*b1cdbd2cSJim Jagielski sal_Bool Outliner::Collapse( Paragraph* pPara )
917*b1cdbd2cSJim Jagielski {
918*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
919*b1cdbd2cSJim Jagielski 	if ( pParaList->HasVisibleChilds( pPara ) )	// expandiert
920*b1cdbd2cSJim Jagielski 	{
921*b1cdbd2cSJim Jagielski 		OLUndoExpand* pUndo = 0;
922*b1cdbd2cSJim Jagielski 		sal_Bool bUndo = sal_False;
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski 		if( !IsInUndo() && IsUndoEnabled() )
925*b1cdbd2cSJim Jagielski 			bUndo = sal_True;
926*b1cdbd2cSJim Jagielski 		if( bUndo )
927*b1cdbd2cSJim Jagielski 		{
928*b1cdbd2cSJim Jagielski 			UndoActionStart( OLUNDO_COLLAPSE );
929*b1cdbd2cSJim Jagielski 			pUndo = new OLUndoExpand( this, OLUNDO_COLLAPSE );
930*b1cdbd2cSJim Jagielski 			pUndo->pParas = 0;
931*b1cdbd2cSJim Jagielski 			pUndo->nCount = (sal_uInt16)pParaList->GetAbsPos( pPara );
932*b1cdbd2cSJim Jagielski 		}
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski 		pHdlParagraph = pPara;
935*b1cdbd2cSJim Jagielski 		bIsExpanding = sal_False;
936*b1cdbd2cSJim Jagielski 		pParaList->Collapse( pPara );
937*b1cdbd2cSJim Jagielski 		ExpandHdl();
938*b1cdbd2cSJim Jagielski 		InvalidateBullet( pPara, pParaList->GetAbsPos(pPara) );
939*b1cdbd2cSJim Jagielski 		if( bUndo )
940*b1cdbd2cSJim Jagielski 		{
941*b1cdbd2cSJim Jagielski 			InsertUndo( pUndo );
942*b1cdbd2cSJim Jagielski 			UndoActionEnd( OLUNDO_COLLAPSE );
943*b1cdbd2cSJim Jagielski 		}
944*b1cdbd2cSJim Jagielski 		return sal_True;
945*b1cdbd2cSJim Jagielski 	}
946*b1cdbd2cSJim Jagielski 	return sal_False;
947*b1cdbd2cSJim Jagielski }
948*b1cdbd2cSJim Jagielski 
949*b1cdbd2cSJim Jagielski 
ImpCalcBulletFont(sal_uInt16 nPara) const950*b1cdbd2cSJim Jagielski Font Outliner::ImpCalcBulletFont( sal_uInt16 nPara ) const
951*b1cdbd2cSJim Jagielski {
952*b1cdbd2cSJim Jagielski     const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
953*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pFmt && ( pFmt->GetNumberingType() != SVX_NUM_BITMAP ) && ( pFmt->GetNumberingType() != SVX_NUM_NUMBER_NONE ), "ImpCalcBulletFont: Missing or BitmapBullet!" );
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski     Font aStdFont;  //#107508#
956*b1cdbd2cSJim Jagielski     if ( !pEditEngine->IsFlatMode() )
957*b1cdbd2cSJim Jagielski     {
958*b1cdbd2cSJim Jagielski         ESelection aSel( nPara, 0, nPara, 0 );
959*b1cdbd2cSJim Jagielski         aStdFont = EditEngine::CreateFontFromItemSet( pEditEngine->GetAttribs( aSel ), GetScriptType( aSel ) );
960*b1cdbd2cSJim Jagielski     }
961*b1cdbd2cSJim Jagielski     else
962*b1cdbd2cSJim Jagielski     {
963*b1cdbd2cSJim Jagielski         aStdFont = pEditEngine->GetStandardFont( nPara );
964*b1cdbd2cSJim Jagielski     }
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski 	Font aBulletFont;
967*b1cdbd2cSJim Jagielski 	if ( pFmt->GetNumberingType() == SVX_NUM_CHAR_SPECIAL )
968*b1cdbd2cSJim Jagielski     {
969*b1cdbd2cSJim Jagielski 		aBulletFont = *pFmt->GetBulletFont();
970*b1cdbd2cSJim Jagielski     }
971*b1cdbd2cSJim Jagielski 	else
972*b1cdbd2cSJim Jagielski     {
973*b1cdbd2cSJim Jagielski 		aBulletFont = aStdFont;
974*b1cdbd2cSJim Jagielski         aBulletFont.SetUnderline( UNDERLINE_NONE );
975*b1cdbd2cSJim Jagielski         aBulletFont.SetOverline( UNDERLINE_NONE );
976*b1cdbd2cSJim Jagielski         aBulletFont.SetStrikeout( STRIKEOUT_NONE );
977*b1cdbd2cSJim Jagielski         aBulletFont.SetEmphasisMark( EMPHASISMARK_NONE );
978*b1cdbd2cSJim Jagielski         aBulletFont.SetRelief( RELIEF_NONE );
979*b1cdbd2cSJim Jagielski     }
980*b1cdbd2cSJim Jagielski 
981*b1cdbd2cSJim Jagielski     // #107508# Use original scale...
982*b1cdbd2cSJim Jagielski 	sal_uInt16 nScale = /* pEditEngine->IsFlatMode() ? DEFAULT_SCALE : */ pFmt->GetBulletRelSize();
983*b1cdbd2cSJim Jagielski 	sal_uLong nScaledLineHeight = aStdFont.GetSize().Height();
984*b1cdbd2cSJim Jagielski 	nScaledLineHeight *= nScale*10;
985*b1cdbd2cSJim Jagielski 	nScaledLineHeight /= 1000;
986*b1cdbd2cSJim Jagielski 
987*b1cdbd2cSJim Jagielski     aBulletFont.SetAlign( ALIGN_BOTTOM );
988*b1cdbd2cSJim Jagielski 	aBulletFont.SetSize( Size( 0, nScaledLineHeight ) );
989*b1cdbd2cSJim Jagielski 	sal_Bool bVertical = IsVertical();
990*b1cdbd2cSJim Jagielski     aBulletFont.SetVertical( bVertical );
991*b1cdbd2cSJim Jagielski     aBulletFont.SetOrientation( bVertical ? 2700 : 0 );
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski 	Color aColor( COL_AUTO );
994*b1cdbd2cSJim Jagielski 	if( !pEditEngine->IsFlatMode() && !( pEditEngine->GetControlWord() & EE_CNTRL_NOCOLORS ) )
995*b1cdbd2cSJim Jagielski     {
996*b1cdbd2cSJim Jagielski 		aColor = pFmt->GetBulletColor();
997*b1cdbd2cSJim Jagielski     }
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski     if ( ( aColor == COL_AUTO ) || ( IsForceAutoColor() ) )
1000*b1cdbd2cSJim Jagielski         aColor = pEditEngine->GetAutoColor();
1001*b1cdbd2cSJim Jagielski 
1002*b1cdbd2cSJim Jagielski     aBulletFont.SetColor( aColor );
1003*b1cdbd2cSJim Jagielski 	return aBulletFont;
1004*b1cdbd2cSJim Jagielski }
1005*b1cdbd2cSJim Jagielski 
PaintBullet(sal_uInt16 nPara,const Point & rStartPos,const Point & rOrigin,short nOrientation,OutputDevice * pOutDev)1006*b1cdbd2cSJim Jagielski void Outliner::PaintBullet( sal_uInt16 nPara, const Point& rStartPos,
1007*b1cdbd2cSJim Jagielski 	const Point& rOrigin, short nOrientation, OutputDevice* pOutDev )
1008*b1cdbd2cSJim Jagielski {
1009*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1010*b1cdbd2cSJim Jagielski 
1011*b1cdbd2cSJim Jagielski     bool bDrawBullet = false;
1012*b1cdbd2cSJim Jagielski     if (pEditEngine)
1013*b1cdbd2cSJim Jagielski     {
1014*b1cdbd2cSJim Jagielski         const SfxBoolItem& rBulletState = (const SfxBoolItem&) pEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE );
1015*b1cdbd2cSJim Jagielski         bDrawBullet = rBulletState.GetValue() ? true : false;
1016*b1cdbd2cSJim Jagielski     }
1017*b1cdbd2cSJim Jagielski 
1018*b1cdbd2cSJim Jagielski     if ( ImplHasNumberFormat( nPara ) && bDrawBullet)
1019*b1cdbd2cSJim Jagielski 	{
1020*b1cdbd2cSJim Jagielski 		sal_Bool bVertical = IsVertical();
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski         sal_Bool bRightToLeftPara = pEditEngine->IsRightToLeft( nPara );
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski 		Rectangle aBulletArea( ImpCalcBulletArea( nPara, sal_True, sal_False ) );
1025*b1cdbd2cSJim Jagielski 
1026*b1cdbd2cSJim Jagielski         Paragraph* pPara = pParaList->GetParagraph( nPara );
1027*b1cdbd2cSJim Jagielski         const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
1028*b1cdbd2cSJim Jagielski 		if ( pFmt && ( pFmt->GetNumberingType() != SVX_NUM_NUMBER_NONE ) )
1029*b1cdbd2cSJim Jagielski 		{
1030*b1cdbd2cSJim Jagielski 			if( pFmt->GetNumberingType() != SVX_NUM_BITMAP )
1031*b1cdbd2cSJim Jagielski 			{
1032*b1cdbd2cSJim Jagielski 				Font aBulletFont( ImpCalcBulletFont( nPara ) );
1033*b1cdbd2cSJim Jagielski                 // #2338# Use base line
1034*b1cdbd2cSJim Jagielski                 sal_Bool bSymbol = pFmt->GetNumberingType() == SVX_NUM_CHAR_SPECIAL;
1035*b1cdbd2cSJim Jagielski                 aBulletFont.SetAlign( bSymbol ? ALIGN_BOTTOM : ALIGN_BASELINE );
1036*b1cdbd2cSJim Jagielski 				Font aOldFont = pOutDev->GetFont();
1037*b1cdbd2cSJim Jagielski 				pOutDev->SetFont( aBulletFont );
1038*b1cdbd2cSJim Jagielski 
1039*b1cdbd2cSJim Jagielski                 ParagraphInfos 	aParaInfos = pEditEngine->GetParagraphInfos( nPara );
1040*b1cdbd2cSJim Jagielski 				Point aTextPos;
1041*b1cdbd2cSJim Jagielski 				if ( !bVertical )
1042*b1cdbd2cSJim Jagielski                 {
1043*b1cdbd2cSJim Jagielski //					aTextPos.Y() = rStartPos.Y() + aBulletArea.Bottom();
1044*b1cdbd2cSJim Jagielski                     aTextPos.Y() = rStartPos.Y() + ( bSymbol ? aBulletArea.Bottom() : aParaInfos.nFirstLineMaxAscent );
1045*b1cdbd2cSJim Jagielski                     if ( !bRightToLeftPara )
1046*b1cdbd2cSJim Jagielski 					    aTextPos.X() = rStartPos.X() + aBulletArea.Left();
1047*b1cdbd2cSJim Jagielski                     else
1048*b1cdbd2cSJim Jagielski                         aTextPos.X() = rStartPos.X() + GetPaperSize().Width() - aBulletArea.Left();
1049*b1cdbd2cSJim Jagielski                 }
1050*b1cdbd2cSJim Jagielski 				else
1051*b1cdbd2cSJim Jagielski 				{
1052*b1cdbd2cSJim Jagielski //					aTextPos.X() = rStartPos.X() - aBulletArea.Bottom();
1053*b1cdbd2cSJim Jagielski 					aTextPos.X() = rStartPos.X() - ( bSymbol ? aBulletArea.Bottom() : aParaInfos.nFirstLineMaxAscent );
1054*b1cdbd2cSJim Jagielski 					aTextPos.Y() = rStartPos.Y() + aBulletArea.Left();
1055*b1cdbd2cSJim Jagielski 				}
1056*b1cdbd2cSJim Jagielski 
1057*b1cdbd2cSJim Jagielski 				if ( nOrientation )
1058*b1cdbd2cSJim Jagielski 				{
1059*b1cdbd2cSJim Jagielski 					// Sowohl TopLeft als auch BottomLeft nicht ganz richtig, da
1060*b1cdbd2cSJim Jagielski 					// in EditEngine BaseLine...
1061*b1cdbd2cSJim Jagielski 					double nRealOrientation = nOrientation*F_PI1800;
1062*b1cdbd2cSJim Jagielski 					double nCos = cos( nRealOrientation );
1063*b1cdbd2cSJim Jagielski 					double nSin = sin( nRealOrientation );
1064*b1cdbd2cSJim Jagielski 					Point aRotatedPos;
1065*b1cdbd2cSJim Jagielski 					// Translation...
1066*b1cdbd2cSJim Jagielski 					aTextPos -= rOrigin;
1067*b1cdbd2cSJim Jagielski 					// Rotation...
1068*b1cdbd2cSJim Jagielski 					aRotatedPos.X()=(long)   (nCos*aTextPos.X() + nSin*aTextPos.Y());
1069*b1cdbd2cSJim Jagielski 					aRotatedPos.Y()=(long) - (nSin*aTextPos.X() - nCos*aTextPos.Y());
1070*b1cdbd2cSJim Jagielski 					aTextPos = aRotatedPos;
1071*b1cdbd2cSJim Jagielski 					// Translation...
1072*b1cdbd2cSJim Jagielski 					aTextPos += rOrigin;
1073*b1cdbd2cSJim Jagielski 					Font aRotatedFont( aBulletFont );
1074*b1cdbd2cSJim Jagielski 					aRotatedFont.SetOrientation( nOrientation );
1075*b1cdbd2cSJim Jagielski 					pOutDev->SetFont( aRotatedFont );
1076*b1cdbd2cSJim Jagielski 				}
1077*b1cdbd2cSJim Jagielski 
1078*b1cdbd2cSJim Jagielski                 // #105803# VCL will care for brackets and so on...
1079*b1cdbd2cSJim Jagielski                 sal_uLong nLayoutMode = pOutDev->GetLayoutMode();
1080*b1cdbd2cSJim Jagielski                 nLayoutMode &= ~(TEXT_LAYOUT_BIDI_RTL|TEXT_LAYOUT_COMPLEX_DISABLED|TEXT_LAYOUT_BIDI_STRONG);
1081*b1cdbd2cSJim Jagielski                 if ( bRightToLeftPara )
1082*b1cdbd2cSJim Jagielski                     nLayoutMode |= TEXT_LAYOUT_BIDI_RTL;
1083*b1cdbd2cSJim Jagielski                 pOutDev->SetLayoutMode( nLayoutMode );
1084*b1cdbd2cSJim Jagielski 
1085*b1cdbd2cSJim Jagielski                 if(bStrippingPortions)
1086*b1cdbd2cSJim Jagielski                 {
1087*b1cdbd2cSJim Jagielski 				    const Font aSvxFont(pOutDev->GetFont());
1088*b1cdbd2cSJim Jagielski 				    sal_Int32* pBuf = new sal_Int32[ pPara->GetText().Len() ];
1089*b1cdbd2cSJim Jagielski 				    pOutDev->GetTextArray( pPara->GetText(), pBuf );
1090*b1cdbd2cSJim Jagielski 
1091*b1cdbd2cSJim Jagielski                     if(bSymbol)
1092*b1cdbd2cSJim Jagielski                     {
1093*b1cdbd2cSJim Jagielski                 		// aTextPos is Bottom, go to Baseline
1094*b1cdbd2cSJim Jagielski 			            FontMetric aMetric(pOutDev->GetFontMetric());
1095*b1cdbd2cSJim Jagielski 			            aTextPos.Y() -= aMetric.GetDescent();
1096*b1cdbd2cSJim Jagielski                     }
1097*b1cdbd2cSJim Jagielski 
1098*b1cdbd2cSJim Jagielski 				    DrawingText(aTextPos, pPara->GetText(), 0, pPara->GetText().Len(), pBuf,
1099*b1cdbd2cSJim Jagielski                         aSvxFont, nPara, 0xFFFF, 0xFF, 0, 0, false, false, true, 0, Color(), Color());
1100*b1cdbd2cSJim Jagielski 
1101*b1cdbd2cSJim Jagielski                     delete[] pBuf;
1102*b1cdbd2cSJim Jagielski                 }
1103*b1cdbd2cSJim Jagielski                 else
1104*b1cdbd2cSJim Jagielski                 {
1105*b1cdbd2cSJim Jagielski 					pOutDev->DrawText( aTextPos, pPara->GetText() );
1106*b1cdbd2cSJim Jagielski                 }
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski                 pOutDev->SetFont( aOldFont );
1109*b1cdbd2cSJim Jagielski 			}
1110*b1cdbd2cSJim Jagielski 			else
1111*b1cdbd2cSJim Jagielski 			{
1112*b1cdbd2cSJim Jagielski 				if ( pFmt->GetBrush()->GetGraphicObject() )
1113*b1cdbd2cSJim Jagielski                 {
1114*b1cdbd2cSJim Jagielski 			        Point aBulletPos;
1115*b1cdbd2cSJim Jagielski                     if ( !bVertical )
1116*b1cdbd2cSJim Jagielski                     {
1117*b1cdbd2cSJim Jagielski 				        aBulletPos.Y() = rStartPos.Y() + aBulletArea.Top();
1118*b1cdbd2cSJim Jagielski                         if ( !bRightToLeftPara )
1119*b1cdbd2cSJim Jagielski 				            aBulletPos.X() = rStartPos.X() + aBulletArea.Left();
1120*b1cdbd2cSJim Jagielski                         else
1121*b1cdbd2cSJim Jagielski                             aBulletPos.X() = rStartPos.X() + GetPaperSize().Width() - aBulletArea.Right();
1122*b1cdbd2cSJim Jagielski                     }
1123*b1cdbd2cSJim Jagielski 			        else
1124*b1cdbd2cSJim Jagielski 			        {
1125*b1cdbd2cSJim Jagielski 				        aBulletPos.X() = rStartPos.X() - aBulletArea.Bottom();
1126*b1cdbd2cSJim Jagielski 				        aBulletPos.Y() = rStartPos.Y() + aBulletArea.Left();
1127*b1cdbd2cSJim Jagielski 			        }
1128*b1cdbd2cSJim Jagielski 
1129*b1cdbd2cSJim Jagielski                     if(bStrippingPortions)
1130*b1cdbd2cSJim Jagielski                     {
1131*b1cdbd2cSJim Jagielski                         if(aDrawBulletHdl.IsSet())
1132*b1cdbd2cSJim Jagielski                         {
1133*b1cdbd2cSJim Jagielski                             // call something analog to aDrawPortionHdl (if set) and feed it something
1134*b1cdbd2cSJim Jagielski                             // analog to DrawPortionInfo...
1135*b1cdbd2cSJim Jagielski                             // created aDrawBulletHdl, Set/GetDrawBulletHdl.
1136*b1cdbd2cSJim Jagielski                             // created DrawBulletInfo and added handling to sdrtextdecomposition.cxx
1137*b1cdbd2cSJim Jagielski                             DrawBulletInfo aDrawBulletInfo(
1138*b1cdbd2cSJim Jagielski                                 *pFmt->GetBrush()->GetGraphicObject(),
1139*b1cdbd2cSJim Jagielski                                 aBulletPos,
1140*b1cdbd2cSJim Jagielski                                 pPara->aBulSize);
1141*b1cdbd2cSJim Jagielski 
1142*b1cdbd2cSJim Jagielski                             aDrawBulletHdl.Call(&aDrawBulletInfo);
1143*b1cdbd2cSJim Jagielski                         }
1144*b1cdbd2cSJim Jagielski                     }
1145*b1cdbd2cSJim Jagielski                     else
1146*b1cdbd2cSJim Jagielski                     {
1147*b1cdbd2cSJim Jagielski                         // MT: Remove CAST when KA made the Draw-Method const
1148*b1cdbd2cSJim Jagielski     					((GraphicObject*)pFmt->GetBrush()->GetGraphicObject())->Draw( pOutDev, aBulletPos, pPara->aBulSize );
1149*b1cdbd2cSJim Jagielski                     }
1150*b1cdbd2cSJim Jagielski                 }
1151*b1cdbd2cSJim Jagielski 			}
1152*b1cdbd2cSJim Jagielski 		}
1153*b1cdbd2cSJim Jagielski 
1154*b1cdbd2cSJim Jagielski 		// Bei zusammengeklappten Absaetzen einen Strich vor den Text malen.
1155*b1cdbd2cSJim Jagielski 		if( pParaList->HasChilds(pPara) && !pParaList->HasVisibleChilds(pPara) &&
1156*b1cdbd2cSJim Jagielski 				!bStrippingPortions && !nOrientation )
1157*b1cdbd2cSJim Jagielski 		{
1158*b1cdbd2cSJim Jagielski             long nWidth = pOutDev->PixelToLogic( Size( 10, 0 ) ).Width();
1159*b1cdbd2cSJim Jagielski 
1160*b1cdbd2cSJim Jagielski             Point aStartPos, aEndPos;
1161*b1cdbd2cSJim Jagielski 			if ( !bVertical )
1162*b1cdbd2cSJim Jagielski             {
1163*b1cdbd2cSJim Jagielski 				aStartPos.Y() = rStartPos.Y() + aBulletArea.Bottom();
1164*b1cdbd2cSJim Jagielski                 if ( !bRightToLeftPara )
1165*b1cdbd2cSJim Jagielski 				    aStartPos.X() = rStartPos.X() + aBulletArea.Right();
1166*b1cdbd2cSJim Jagielski                 else
1167*b1cdbd2cSJim Jagielski                     aStartPos.X() = rStartPos.X() + GetPaperSize().Width() - aBulletArea.Left();
1168*b1cdbd2cSJim Jagielski                 aEndPos = aStartPos;
1169*b1cdbd2cSJim Jagielski                 aEndPos.X() += nWidth;
1170*b1cdbd2cSJim Jagielski             }
1171*b1cdbd2cSJim Jagielski 			else
1172*b1cdbd2cSJim Jagielski 			{
1173*b1cdbd2cSJim Jagielski 				aStartPos.X() = rStartPos.X() - aBulletArea.Bottom();
1174*b1cdbd2cSJim Jagielski 				aStartPos.Y() = rStartPos.Y() + aBulletArea.Right();
1175*b1cdbd2cSJim Jagielski                 aEndPos = aStartPos;
1176*b1cdbd2cSJim Jagielski                 aEndPos.Y() += nWidth;
1177*b1cdbd2cSJim Jagielski 			}
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski 			const Color& rOldLineColor = pOutDev->GetLineColor();
1180*b1cdbd2cSJim Jagielski 			pOutDev->SetLineColor( Color( COL_BLACK ) );
1181*b1cdbd2cSJim Jagielski 			pOutDev->DrawLine( aStartPos, aEndPos );
1182*b1cdbd2cSJim Jagielski 			pOutDev->SetLineColor( rOldLineColor );
1183*b1cdbd2cSJim Jagielski 		}
1184*b1cdbd2cSJim Jagielski 	}
1185*b1cdbd2cSJim Jagielski }
1186*b1cdbd2cSJim Jagielski 
InvalidateBullet(Paragraph *,sal_uLong nPara)1187*b1cdbd2cSJim Jagielski void Outliner::InvalidateBullet( Paragraph* /*pPara*/, sal_uLong nPara )
1188*b1cdbd2cSJim Jagielski {
1189*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1190*b1cdbd2cSJim Jagielski 
1191*b1cdbd2cSJim Jagielski 	long nLineHeight = (long)pEditEngine->GetLineHeight((sal_uInt16)nPara );
1192*b1cdbd2cSJim Jagielski 	OutlinerView* pView = aViewList.First();
1193*b1cdbd2cSJim Jagielski 	while( pView )
1194*b1cdbd2cSJim Jagielski 	{
1195*b1cdbd2cSJim Jagielski 		Point aPos( pView->pEditView->GetWindowPosTopLeft((sal_uInt16)nPara ) );
1196*b1cdbd2cSJim Jagielski 		Rectangle aRect( pView->GetOutputArea() );
1197*b1cdbd2cSJim Jagielski 		aRect.Right() = aPos.X();
1198*b1cdbd2cSJim Jagielski 		aRect.Top() = aPos.Y();
1199*b1cdbd2cSJim Jagielski 		aRect.Bottom() = aPos.Y();
1200*b1cdbd2cSJim Jagielski 		aRect.Bottom() += nLineHeight;
1201*b1cdbd2cSJim Jagielski 
1202*b1cdbd2cSJim Jagielski 		pView->GetWindow()->Invalidate( aRect );
1203*b1cdbd2cSJim Jagielski 		pView = aViewList.Next();
1204*b1cdbd2cSJim Jagielski 	}
1205*b1cdbd2cSJim Jagielski }
1206*b1cdbd2cSJim Jagielski 
Read(SvStream & rInput,const String & rBaseURL,sal_uInt16 eFormat,SvKeyValueIterator * pHTTPHeaderAttrs)1207*b1cdbd2cSJim Jagielski sal_uLong Outliner::Read( SvStream& rInput, const String& rBaseURL, sal_uInt16 eFormat, SvKeyValueIterator* pHTTPHeaderAttrs )
1208*b1cdbd2cSJim Jagielski {
1209*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1210*b1cdbd2cSJim Jagielski 
1211*b1cdbd2cSJim Jagielski 	sal_Bool bOldUndo = pEditEngine->IsUndoEnabled();
1212*b1cdbd2cSJim Jagielski 	EnableUndo( sal_False );
1213*b1cdbd2cSJim Jagielski 
1214*b1cdbd2cSJim Jagielski 	sal_Bool bUpdate = pEditEngine->GetUpdateMode();
1215*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( sal_False );
1216*b1cdbd2cSJim Jagielski 
1217*b1cdbd2cSJim Jagielski 	Clear();
1218*b1cdbd2cSJim Jagielski 
1219*b1cdbd2cSJim Jagielski 	ImplBlockInsertionCallbacks( sal_True );
1220*b1cdbd2cSJim Jagielski     sal_uLong nRet = pEditEngine->Read( rInput, rBaseURL, (EETextFormat)eFormat, pHTTPHeaderAttrs );
1221*b1cdbd2cSJim Jagielski 
1222*b1cdbd2cSJim Jagielski 	bFirstParaIsEmpty = sal_False;
1223*b1cdbd2cSJim Jagielski 
1224*b1cdbd2cSJim Jagielski 	sal_uInt16 nParas = pEditEngine->GetParagraphCount();
1225*b1cdbd2cSJim Jagielski  	pParaList->Clear( sal_True );
1226*b1cdbd2cSJim Jagielski 	sal_uInt16 n;
1227*b1cdbd2cSJim Jagielski 	for ( n = 0; n < nParas; n++ )
1228*b1cdbd2cSJim Jagielski 	{
1229*b1cdbd2cSJim Jagielski 		Paragraph* pPara = new Paragraph( 0 );
1230*b1cdbd2cSJim Jagielski 		pParaList->Insert( pPara, LIST_APPEND );
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski 		if ( eFormat == EE_FORMAT_BIN )
1233*b1cdbd2cSJim Jagielski 		{
1234*b1cdbd2cSJim Jagielski 			const SfxItemSet& rAttrs = pEditEngine->GetParaAttribs( n );
1235*b1cdbd2cSJim Jagielski 			const SfxInt16Item& rLevel = (const SfxInt16Item&) rAttrs.Get( EE_PARA_OUTLLEVEL );
1236*b1cdbd2cSJim Jagielski 			sal_Int16 nDepth = rLevel.GetValue();
1237*b1cdbd2cSJim Jagielski 			ImplInitDepth( n, nDepth, sal_False );
1238*b1cdbd2cSJim Jagielski 		}
1239*b1cdbd2cSJim Jagielski 	}
1240*b1cdbd2cSJim Jagielski 
1241*b1cdbd2cSJim Jagielski 	if ( eFormat != EE_FORMAT_BIN )
1242*b1cdbd2cSJim Jagielski 	{
1243*b1cdbd2cSJim Jagielski 		ImpFilterIndents( 0, nParas-1 );
1244*b1cdbd2cSJim Jagielski 	}
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski     ImplBlockInsertionCallbacks( sal_False );
1247*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( bUpdate );
1248*b1cdbd2cSJim Jagielski 	EnableUndo( bOldUndo );
1249*b1cdbd2cSJim Jagielski 
1250*b1cdbd2cSJim Jagielski 	return nRet;
1251*b1cdbd2cSJim Jagielski }
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski 
ImpFilterIndents(sal_uLong nFirstPara,sal_uLong nLastPara)1254*b1cdbd2cSJim Jagielski void Outliner::ImpFilterIndents( sal_uLong nFirstPara, sal_uLong nLastPara )
1255*b1cdbd2cSJim Jagielski {
1256*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1257*b1cdbd2cSJim Jagielski 
1258*b1cdbd2cSJim Jagielski 	sal_Bool bUpdate = pEditEngine->GetUpdateMode();
1259*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( sal_False );
1260*b1cdbd2cSJim Jagielski 
1261*b1cdbd2cSJim Jagielski 	Paragraph* pLastConverted = NULL;
1262*b1cdbd2cSJim Jagielski 	for( sal_uLong nPara = nFirstPara; nPara <= nLastPara; nPara++ )
1263*b1cdbd2cSJim Jagielski 	{
1264*b1cdbd2cSJim Jagielski 		Paragraph* pPara = pParaList->GetParagraph( nPara );
1265*b1cdbd2cSJim Jagielski                 if (pPara)
1266*b1cdbd2cSJim Jagielski                 {
1267*b1cdbd2cSJim Jagielski                     if( ImpConvertEdtToOut( nPara ) )
1268*b1cdbd2cSJim Jagielski                     {
1269*b1cdbd2cSJim Jagielski                             pLastConverted = pPara;
1270*b1cdbd2cSJim Jagielski                     }
1271*b1cdbd2cSJim Jagielski                     else if ( pLastConverted )
1272*b1cdbd2cSJim Jagielski                     {
1273*b1cdbd2cSJim Jagielski                             // Normale Absaetze unter der Ueberschrift anordnen...
1274*b1cdbd2cSJim Jagielski                             pPara->SetDepth( pLastConverted->GetDepth() );
1275*b1cdbd2cSJim Jagielski                     }
1276*b1cdbd2cSJim Jagielski 
1277*b1cdbd2cSJim Jagielski                     ImplInitDepth( (sal_uInt16)nPara, pPara->GetDepth(), sal_False );
1278*b1cdbd2cSJim Jagielski 		}
1279*b1cdbd2cSJim Jagielski 	}
1280*b1cdbd2cSJim Jagielski 
1281*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( bUpdate );
1282*b1cdbd2cSJim Jagielski }
1283*b1cdbd2cSJim Jagielski 
GetUndoManager()1284*b1cdbd2cSJim Jagielski ::svl::IUndoManager& Outliner::GetUndoManager()
1285*b1cdbd2cSJim Jagielski {
1286*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1287*b1cdbd2cSJim Jagielski 	return pEditEngine->GetUndoManager();
1288*b1cdbd2cSJim Jagielski }
1289*b1cdbd2cSJim Jagielski 
SetUndoManager(::svl::IUndoManager * pNew)1290*b1cdbd2cSJim Jagielski ::svl::IUndoManager* Outliner::SetUndoManager(::svl::IUndoManager* pNew)
1291*b1cdbd2cSJim Jagielski {
1292*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1293*b1cdbd2cSJim Jagielski 	return pEditEngine->SetUndoManager(pNew);
1294*b1cdbd2cSJim Jagielski }
1295*b1cdbd2cSJim Jagielski 
ImpTextPasted(sal_uLong nStartPara,sal_uInt16 nCount)1296*b1cdbd2cSJim Jagielski void Outliner::ImpTextPasted( sal_uLong nStartPara, sal_uInt16 nCount )
1297*b1cdbd2cSJim Jagielski {
1298*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1299*b1cdbd2cSJim Jagielski 
1300*b1cdbd2cSJim Jagielski 	sal_Bool bUpdate = pEditEngine->GetUpdateMode();
1301*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( sal_False );
1302*b1cdbd2cSJim Jagielski 
1303*b1cdbd2cSJim Jagielski 	const sal_uLong nStart = nStartPara;
1304*b1cdbd2cSJim Jagielski 
1305*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nStartPara );
1306*b1cdbd2cSJim Jagielski //	Paragraph* pLastConverted = NULL;
1307*b1cdbd2cSJim Jagielski //    bool bFirst = true;
1308*b1cdbd2cSJim Jagielski 
1309*b1cdbd2cSJim Jagielski 	while( nCount && pPara )
1310*b1cdbd2cSJim Jagielski 	{
1311*b1cdbd2cSJim Jagielski 		if( ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT )
1312*b1cdbd2cSJim Jagielski 		{
1313*b1cdbd2cSJim Jagielski             nDepthChangedHdlPrevDepth = pPara->GetDepth();
1314*b1cdbd2cSJim Jagielski             mnDepthChangeHdlPrevFlags = pPara->nFlags;
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski 			ImpConvertEdtToOut( nStartPara );
1317*b1cdbd2cSJim Jagielski 
1318*b1cdbd2cSJim Jagielski             pHdlParagraph = pPara;
1319*b1cdbd2cSJim Jagielski 
1320*b1cdbd2cSJim Jagielski             if( nStartPara == nStart )
1321*b1cdbd2cSJim Jagielski             {
1322*b1cdbd2cSJim Jagielski                 // the existing paragraph has changed depth or flags
1323*b1cdbd2cSJim Jagielski 				if( (pPara->GetDepth() != nDepthChangedHdlPrevDepth) || (pPara->nFlags != mnDepthChangeHdlPrevFlags) )
1324*b1cdbd2cSJim Jagielski 					DepthChangedHdl();
1325*b1cdbd2cSJim Jagielski             }
1326*b1cdbd2cSJim Jagielski 		}
1327*b1cdbd2cSJim Jagielski 		else // EditEngine-Modus
1328*b1cdbd2cSJim Jagielski 		{
1329*b1cdbd2cSJim Jagielski 			sal_Int16 nDepth = -1;
1330*b1cdbd2cSJim Jagielski 			const SfxItemSet& rAttrs = pEditEngine->GetParaAttribs( (sal_uInt16)nStartPara );
1331*b1cdbd2cSJim Jagielski 			if ( rAttrs.GetItemState( EE_PARA_OUTLLEVEL ) == SFX_ITEM_ON )
1332*b1cdbd2cSJim Jagielski 			{
1333*b1cdbd2cSJim Jagielski 				const SfxInt16Item& rLevel = (const SfxInt16Item&) rAttrs.Get( EE_PARA_OUTLLEVEL );
1334*b1cdbd2cSJim Jagielski 				nDepth = rLevel.GetValue();
1335*b1cdbd2cSJim Jagielski 			}
1336*b1cdbd2cSJim Jagielski 			if ( nDepth != GetDepth( nStartPara ) )
1337*b1cdbd2cSJim Jagielski 				ImplInitDepth( (sal_uInt16)nStartPara, nDepth, sal_False );
1338*b1cdbd2cSJim Jagielski 		}
1339*b1cdbd2cSJim Jagielski 
1340*b1cdbd2cSJim Jagielski 		nCount--;
1341*b1cdbd2cSJim Jagielski 		nStartPara++;
1342*b1cdbd2cSJim Jagielski 		pPara = pParaList->GetParagraph( nStartPara );
1343*b1cdbd2cSJim Jagielski 	}
1344*b1cdbd2cSJim Jagielski 
1345*b1cdbd2cSJim Jagielski 	pEditEngine->SetUpdateMode( bUpdate );
1346*b1cdbd2cSJim Jagielski 
1347*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pParaList->GetParagraphCount()==pEditEngine->GetParagraphCount(),"ImpTextPasted failed");
1348*b1cdbd2cSJim Jagielski }
1349*b1cdbd2cSJim Jagielski 
IndentingPagesHdl(OutlinerView * pView)1350*b1cdbd2cSJim Jagielski long Outliner::IndentingPagesHdl( OutlinerView* pView )
1351*b1cdbd2cSJim Jagielski {
1352*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1353*b1cdbd2cSJim Jagielski 	if( !aIndentingPagesHdl.IsSet() )
1354*b1cdbd2cSJim Jagielski 		return 1;
1355*b1cdbd2cSJim Jagielski 	return aIndentingPagesHdl.Call( pView );
1356*b1cdbd2cSJim Jagielski }
1357*b1cdbd2cSJim Jagielski 
ImpCanIndentSelectedPages(OutlinerView * pCurView)1358*b1cdbd2cSJim Jagielski sal_Bool Outliner::ImpCanIndentSelectedPages( OutlinerView* pCurView )
1359*b1cdbd2cSJim Jagielski {
1360*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1361*b1cdbd2cSJim Jagielski 	// Die selektierten Seiten muessen vorher durch ImpCalcSelectedPages
1362*b1cdbd2cSJim Jagielski 	// schon eingestellt sein
1363*b1cdbd2cSJim Jagielski 
1364*b1cdbd2cSJim Jagielski 	// Wenn der erste Absatz auf Ebene 0 liegt darf er auf keinen Fall
1365*b1cdbd2cSJim Jagielski 	// eingerueckt werden, evtl folgen aber weitere auf Ebene 0.
1366*b1cdbd2cSJim Jagielski 	if ( ( mnFirstSelPage == 0 ) && ( ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT ) )
1367*b1cdbd2cSJim Jagielski 	{
1368*b1cdbd2cSJim Jagielski 		if ( nDepthChangedHdlPrevDepth == 1 )	// ist die einzige Seite
1369*b1cdbd2cSJim Jagielski 			return sal_False;
1370*b1cdbd2cSJim Jagielski 		else
1371*b1cdbd2cSJim Jagielski 			pCurView->ImpCalcSelectedPages( sal_False );	// ohne die erste
1372*b1cdbd2cSJim Jagielski 	}
1373*b1cdbd2cSJim Jagielski 	return (sal_Bool)IndentingPagesHdl( pCurView );
1374*b1cdbd2cSJim Jagielski }
1375*b1cdbd2cSJim Jagielski 
1376*b1cdbd2cSJim Jagielski 
ImpCanDeleteSelectedPages(OutlinerView * pCurView)1377*b1cdbd2cSJim Jagielski sal_Bool Outliner::ImpCanDeleteSelectedPages( OutlinerView* pCurView )
1378*b1cdbd2cSJim Jagielski {
1379*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1380*b1cdbd2cSJim Jagielski 	// Die selektierten Seiten muessen vorher durch ImpCalcSelectedPages
1381*b1cdbd2cSJim Jagielski 	// schon eingestellt sein
1382*b1cdbd2cSJim Jagielski 	return (sal_Bool)RemovingPagesHdl( pCurView );
1383*b1cdbd2cSJim Jagielski }
1384*b1cdbd2cSJim Jagielski 
Outliner(SfxItemPool * pPool,sal_uInt16 nMode)1385*b1cdbd2cSJim Jagielski Outliner::Outliner( SfxItemPool* pPool, sal_uInt16 nMode )
1386*b1cdbd2cSJim Jagielski : nMinDepth( -1 )
1387*b1cdbd2cSJim Jagielski {
1388*b1cdbd2cSJim Jagielski 	DBG_CTOR( Outliner, 0 );
1389*b1cdbd2cSJim Jagielski 
1390*b1cdbd2cSJim Jagielski 	bStrippingPortions 	= sal_False;
1391*b1cdbd2cSJim Jagielski 	bPasting			= sal_False;
1392*b1cdbd2cSJim Jagielski 
1393*b1cdbd2cSJim Jagielski 	nFirstPage			= 1;
1394*b1cdbd2cSJim Jagielski 	bBlockInsCallback	= sal_False;
1395*b1cdbd2cSJim Jagielski 
1396*b1cdbd2cSJim Jagielski 	nMaxDepth			= 9;
1397*b1cdbd2cSJim Jagielski 
1398*b1cdbd2cSJim Jagielski 	pParaList = new ParagraphList;
1399*b1cdbd2cSJim Jagielski 	pParaList->SetVisibleStateChangedHdl( LINK( this, Outliner, ParaVisibleStateChangedHdl ) );
1400*b1cdbd2cSJim Jagielski 	Paragraph* pPara = new Paragraph( 0 );
1401*b1cdbd2cSJim Jagielski 	pParaList->Insert( pPara, LIST_APPEND );
1402*b1cdbd2cSJim Jagielski 	bFirstParaIsEmpty = sal_True;
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski 	pEditEngine = new OutlinerEditEng( this, pPool );
1405*b1cdbd2cSJim Jagielski     pEditEngine->SetBeginMovingParagraphsHdl( LINK( this, Outliner, BeginMovingParagraphsHdl ) );
1406*b1cdbd2cSJim Jagielski     pEditEngine->SetEndMovingParagraphsHdl( LINK( this, Outliner, EndMovingParagraphsHdl ) );
1407*b1cdbd2cSJim Jagielski     pEditEngine->SetBeginPasteOrDropHdl( LINK( this, Outliner, BeginPasteOrDropHdl ) );
1408*b1cdbd2cSJim Jagielski     pEditEngine->SetEndPasteOrDropHdl( LINK( this, Outliner, EndPasteOrDropHdl ) );
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski 	Init( nMode );
1411*b1cdbd2cSJim Jagielski }
1412*b1cdbd2cSJim Jagielski 
~Outliner()1413*b1cdbd2cSJim Jagielski Outliner::~Outliner()
1414*b1cdbd2cSJim Jagielski {
1415*b1cdbd2cSJim Jagielski 	DBG_DTOR(Outliner,0);
1416*b1cdbd2cSJim Jagielski 
1417*b1cdbd2cSJim Jagielski 	pParaList->Clear( sal_True );
1418*b1cdbd2cSJim Jagielski 	delete pParaList;
1419*b1cdbd2cSJim Jagielski 	delete pEditEngine;
1420*b1cdbd2cSJim Jagielski }
1421*b1cdbd2cSJim Jagielski 
InsertView(OutlinerView * pView,sal_uLong nIndex)1422*b1cdbd2cSJim Jagielski sal_uLong Outliner::InsertView( OutlinerView* pView, sal_uLong nIndex )
1423*b1cdbd2cSJim Jagielski {
1424*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski 	aViewList.Insert( pView, nIndex );
1427*b1cdbd2cSJim Jagielski 	pEditEngine->InsertView(  pView->pEditView, (sal_uInt16)nIndex );
1428*b1cdbd2cSJim Jagielski 	return aViewList.GetPos( pView );
1429*b1cdbd2cSJim Jagielski }
1430*b1cdbd2cSJim Jagielski 
RemoveView(OutlinerView * pView)1431*b1cdbd2cSJim Jagielski OutlinerView* Outliner::RemoveView( OutlinerView* pView )
1432*b1cdbd2cSJim Jagielski {
1433*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski 	sal_uLong nPos = aViewList.GetPos( pView );
1436*b1cdbd2cSJim Jagielski 	if ( nPos != LIST_ENTRY_NOTFOUND )
1437*b1cdbd2cSJim Jagielski 	{
1438*b1cdbd2cSJim Jagielski 		pView->pEditView->HideCursor(); // HACK wg. BugId 10006
1439*b1cdbd2cSJim Jagielski 		pEditEngine->RemoveView(  pView->pEditView );
1440*b1cdbd2cSJim Jagielski 		aViewList.Remove( nPos );
1441*b1cdbd2cSJim Jagielski 	}
1442*b1cdbd2cSJim Jagielski 	return NULL;	// MT: return ueberfluessig
1443*b1cdbd2cSJim Jagielski }
1444*b1cdbd2cSJim Jagielski 
RemoveView(sal_uLong nIndex)1445*b1cdbd2cSJim Jagielski OutlinerView* Outliner::RemoveView( sal_uLong nIndex )
1446*b1cdbd2cSJim Jagielski {
1447*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1448*b1cdbd2cSJim Jagielski 
1449*b1cdbd2cSJim Jagielski 	EditView* pEditView = pEditEngine->GetView( (sal_uInt16)nIndex );
1450*b1cdbd2cSJim Jagielski 	pEditView->HideCursor(); // HACK wg. BugId 10006
1451*b1cdbd2cSJim Jagielski 
1452*b1cdbd2cSJim Jagielski 	pEditEngine->RemoveView( (sal_uInt16)nIndex );
1453*b1cdbd2cSJim Jagielski 	aViewList.Remove( nIndex );
1454*b1cdbd2cSJim Jagielski 	return NULL;	// MT: return ueberfluessig
1455*b1cdbd2cSJim Jagielski }
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski 
GetView(sal_uLong nIndex) const1458*b1cdbd2cSJim Jagielski OutlinerView* Outliner::GetView( sal_uLong nIndex ) const
1459*b1cdbd2cSJim Jagielski {
1460*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1461*b1cdbd2cSJim Jagielski 	return aViewList.GetObject( nIndex );
1462*b1cdbd2cSJim Jagielski }
1463*b1cdbd2cSJim Jagielski 
GetViewCount() const1464*b1cdbd2cSJim Jagielski sal_uLong Outliner::GetViewCount() const
1465*b1cdbd2cSJim Jagielski {
1466*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1467*b1cdbd2cSJim Jagielski 	return aViewList.Count();
1468*b1cdbd2cSJim Jagielski }
1469*b1cdbd2cSJim Jagielski 
ParagraphInsertedHdl()1470*b1cdbd2cSJim Jagielski void Outliner::ParagraphInsertedHdl()
1471*b1cdbd2cSJim Jagielski {
1472*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1473*b1cdbd2cSJim Jagielski 	if( !IsInUndo() )
1474*b1cdbd2cSJim Jagielski 		aParaInsertedHdl.Call( this );
1475*b1cdbd2cSJim Jagielski }
1476*b1cdbd2cSJim Jagielski 
1477*b1cdbd2cSJim Jagielski 
ParagraphRemovingHdl()1478*b1cdbd2cSJim Jagielski void Outliner::ParagraphRemovingHdl()
1479*b1cdbd2cSJim Jagielski {
1480*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1481*b1cdbd2cSJim Jagielski 	if( !IsInUndo() )
1482*b1cdbd2cSJim Jagielski 		aParaRemovingHdl.Call( this );
1483*b1cdbd2cSJim Jagielski }
1484*b1cdbd2cSJim Jagielski 
1485*b1cdbd2cSJim Jagielski 
DepthChangedHdl()1486*b1cdbd2cSJim Jagielski void Outliner::DepthChangedHdl()
1487*b1cdbd2cSJim Jagielski {
1488*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1489*b1cdbd2cSJim Jagielski 	if( !IsInUndo() )
1490*b1cdbd2cSJim Jagielski 		aDepthChangedHdl.Call( this );
1491*b1cdbd2cSJim Jagielski }
1492*b1cdbd2cSJim Jagielski 
1493*b1cdbd2cSJim Jagielski 
GetAbsPos(Paragraph * pPara)1494*b1cdbd2cSJim Jagielski sal_uLong Outliner::GetAbsPos( Paragraph* pPara )
1495*b1cdbd2cSJim Jagielski {
1496*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1497*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pPara,"GetAbsPos:No Para");
1498*b1cdbd2cSJim Jagielski 	return pParaList->GetAbsPos( pPara );
1499*b1cdbd2cSJim Jagielski }
1500*b1cdbd2cSJim Jagielski 
GetParagraphCount() const1501*b1cdbd2cSJim Jagielski sal_uLong Outliner::GetParagraphCount() const
1502*b1cdbd2cSJim Jagielski {
1503*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1504*b1cdbd2cSJim Jagielski 	return pParaList->GetParagraphCount();
1505*b1cdbd2cSJim Jagielski }
1506*b1cdbd2cSJim Jagielski 
GetParagraph(sal_uLong nAbsPos) const1507*b1cdbd2cSJim Jagielski Paragraph* Outliner::GetParagraph( sal_uLong nAbsPos ) const
1508*b1cdbd2cSJim Jagielski {
1509*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1510*b1cdbd2cSJim Jagielski 	return pParaList->GetParagraph( nAbsPos );
1511*b1cdbd2cSJim Jagielski }
1512*b1cdbd2cSJim Jagielski 
HasChilds(Paragraph * pParagraph) const1513*b1cdbd2cSJim Jagielski sal_Bool Outliner::HasChilds( Paragraph* pParagraph ) const
1514*b1cdbd2cSJim Jagielski {
1515*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1516*b1cdbd2cSJim Jagielski 	return pParaList->HasChilds( pParagraph );
1517*b1cdbd2cSJim Jagielski }
1518*b1cdbd2cSJim Jagielski 
ImplHasNumberFormat(sal_uInt16 nPara) const1519*b1cdbd2cSJim Jagielski bool Outliner::ImplHasNumberFormat( sal_uInt16 nPara ) const
1520*b1cdbd2cSJim Jagielski {
1521*b1cdbd2cSJim Jagielski     return GetNumberFormat(nPara) != 0;
1522*b1cdbd2cSJim Jagielski 	if ( GetNumberFormat(nPara) )
1523*b1cdbd2cSJim Jagielski 	{
1524*b1cdbd2cSJim Jagielski 		const SfxBoolItem& rBulletState = (const SfxBoolItem&) pEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE );
1525*b1cdbd2cSJim Jagielski 		return rBulletState.GetValue();
1526*b1cdbd2cSJim Jagielski 	}
1527*b1cdbd2cSJim Jagielski 	else
1528*b1cdbd2cSJim Jagielski 		return sal_False;
1529*b1cdbd2cSJim Jagielski }
1530*b1cdbd2cSJim Jagielski 
GetNumberFormat(sal_uInt16 nPara) const1531*b1cdbd2cSJim Jagielski const SvxNumberFormat* Outliner::GetNumberFormat( sal_uInt16 nPara ) const
1532*b1cdbd2cSJim Jagielski {
1533*b1cdbd2cSJim Jagielski     const SvxNumberFormat* pFmt = NULL;
1534*b1cdbd2cSJim Jagielski 
1535*b1cdbd2cSJim Jagielski     Paragraph* pPara = pParaList->GetParagraph( nPara );
1536*b1cdbd2cSJim Jagielski     if (pPara == NULL)
1537*b1cdbd2cSJim Jagielski         return NULL;
1538*b1cdbd2cSJim Jagielski 
1539*b1cdbd2cSJim Jagielski     sal_Int16 nDepth = pPara? pPara->GetDepth() : -1;
1540*b1cdbd2cSJim Jagielski 
1541*b1cdbd2cSJim Jagielski     if( nDepth >= 0 )
1542*b1cdbd2cSJim Jagielski     {
1543*b1cdbd2cSJim Jagielski         const SvxNumBulletItem& rNumBullet = (const SvxNumBulletItem&) pEditEngine->GetParaAttrib( nPara, EE_PARA_NUMBULLET );
1544*b1cdbd2cSJim Jagielski         if ( rNumBullet.GetNumRule()->GetLevelCount() > nDepth )
1545*b1cdbd2cSJim Jagielski             pFmt = rNumBullet.GetNumRule()->Get( nDepth );
1546*b1cdbd2cSJim Jagielski     }
1547*b1cdbd2cSJim Jagielski 
1548*b1cdbd2cSJim Jagielski     return pFmt;
1549*b1cdbd2cSJim Jagielski }
1550*b1cdbd2cSJim Jagielski 
ImplGetBulletSize(sal_uInt16 nPara)1551*b1cdbd2cSJim Jagielski Size Outliner::ImplGetBulletSize( sal_uInt16 nPara )
1552*b1cdbd2cSJim Jagielski {
1553*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
1554*b1cdbd2cSJim Jagielski         if (!pPara)
1555*b1cdbd2cSJim Jagielski             return Size();
1556*b1cdbd2cSJim Jagielski 
1557*b1cdbd2cSJim Jagielski 	if( pPara->aBulSize.Width() == -1 )
1558*b1cdbd2cSJim Jagielski 	{
1559*b1cdbd2cSJim Jagielski         const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
1560*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pFmt, "ImplGetBulletSize - no Bullet!" );
1561*b1cdbd2cSJim Jagielski 
1562*b1cdbd2cSJim Jagielski 		if ( pFmt->GetNumberingType() == SVX_NUM_NUMBER_NONE )
1563*b1cdbd2cSJim Jagielski 		{
1564*b1cdbd2cSJim Jagielski 			pPara->aBulSize = Size( 0, 0 );
1565*b1cdbd2cSJim Jagielski 		}
1566*b1cdbd2cSJim Jagielski 		else if( pFmt->GetNumberingType() != SVX_NUM_BITMAP )
1567*b1cdbd2cSJim Jagielski 		{
1568*b1cdbd2cSJim Jagielski 			String aBulletText = ImplGetBulletText( nPara );
1569*b1cdbd2cSJim Jagielski 			OutputDevice* pRefDev = pEditEngine->GetRefDevice();
1570*b1cdbd2cSJim Jagielski 			Font aBulletFont( ImpCalcBulletFont( nPara ) );
1571*b1cdbd2cSJim Jagielski 			Font aRefFont( pRefDev->GetFont());
1572*b1cdbd2cSJim Jagielski 			pRefDev->SetFont( aBulletFont );
1573*b1cdbd2cSJim Jagielski 			pPara->aBulSize.Width() = pRefDev->GetTextWidth( aBulletText );
1574*b1cdbd2cSJim Jagielski 			pPara->aBulSize.Height() = pRefDev->GetTextHeight();
1575*b1cdbd2cSJim Jagielski 			pRefDev->SetFont( aRefFont );
1576*b1cdbd2cSJim Jagielski 		}
1577*b1cdbd2cSJim Jagielski 		else
1578*b1cdbd2cSJim Jagielski 		{
1579*b1cdbd2cSJim Jagielski 			pPara->aBulSize = OutputDevice::LogicToLogic( pFmt->GetGraphicSize(), MAP_100TH_MM, pEditEngine->GetRefDevice()->GetMapMode() );
1580*b1cdbd2cSJim Jagielski 		}
1581*b1cdbd2cSJim Jagielski 	}
1582*b1cdbd2cSJim Jagielski 
1583*b1cdbd2cSJim Jagielski 	return pPara->aBulSize;
1584*b1cdbd2cSJim Jagielski }
1585*b1cdbd2cSJim Jagielski 
ImplCheckParagraphs(sal_uInt16 nStart,sal_uInt16 nEnd)1586*b1cdbd2cSJim Jagielski void Outliner::ImplCheckParagraphs( sal_uInt16 nStart, sal_uInt16 nEnd )
1587*b1cdbd2cSJim Jagielski {
1588*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Outliner, 0 );
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski     // --> OD 2009-03-10 #i100014#
1591*b1cdbd2cSJim Jagielski     // assure that the following for-loop does not loop forever
1592*b1cdbd2cSJim Jagielski     for ( sal_uInt16 n = nStart; n < nEnd; n++ )
1593*b1cdbd2cSJim Jagielski     // <--
1594*b1cdbd2cSJim Jagielski 	{
1595*b1cdbd2cSJim Jagielski 		Paragraph* pPara = pParaList->GetParagraph( n );
1596*b1cdbd2cSJim Jagielski         if (pPara)
1597*b1cdbd2cSJim Jagielski         {
1598*b1cdbd2cSJim Jagielski             pPara->Invalidate();
1599*b1cdbd2cSJim Jagielski             ImplCalcBulletText( n, sal_False, sal_False );
1600*b1cdbd2cSJim Jagielski         }
1601*b1cdbd2cSJim Jagielski 	}
1602*b1cdbd2cSJim Jagielski }
1603*b1cdbd2cSJim Jagielski 
SetRefDevice(OutputDevice * pRefDev)1604*b1cdbd2cSJim Jagielski void Outliner::SetRefDevice( OutputDevice* pRefDev )
1605*b1cdbd2cSJim Jagielski {
1606*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1607*b1cdbd2cSJim Jagielski 	pEditEngine->SetRefDevice( pRefDev );
1608*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n = (sal_uInt16) pParaList->GetParagraphCount(); n; )
1609*b1cdbd2cSJim Jagielski 	{
1610*b1cdbd2cSJim Jagielski 		Paragraph* pPara = pParaList->GetParagraph( --n );
1611*b1cdbd2cSJim Jagielski 		pPara->Invalidate();
1612*b1cdbd2cSJim Jagielski 	}
1613*b1cdbd2cSJim Jagielski }
1614*b1cdbd2cSJim Jagielski 
ParaAttribsChanged(sal_uInt16 nPara)1615*b1cdbd2cSJim Jagielski void Outliner::ParaAttribsChanged( sal_uInt16 nPara )
1616*b1cdbd2cSJim Jagielski {
1617*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1618*b1cdbd2cSJim Jagielski 
1619*b1cdbd2cSJim Jagielski 	// Der Outliner hat kein eigenes Undo, wenn Absaetz getrennt/verschmolzen werden.
1620*b1cdbd2cSJim Jagielski 	// Beim ParagraphInserted ist das Attribut EE_PARA_OUTLLEVEL
1621*b1cdbd2cSJim Jagielski 	// ggf. noch nicht eingestellt, dies wird aber benoetigt um die Tiefe
1622*b1cdbd2cSJim Jagielski 	// des Absatzes zu bestimmen.
1623*b1cdbd2cSJim Jagielski 
1624*b1cdbd2cSJim Jagielski 	if( pEditEngine->IsInUndo() )
1625*b1cdbd2cSJim Jagielski 	{
1626*b1cdbd2cSJim Jagielski 		if ( pParaList->GetParagraphCount() == pEditEngine->GetParagraphCount() )
1627*b1cdbd2cSJim Jagielski 		{
1628*b1cdbd2cSJim Jagielski 			Paragraph* pPara = pParaList->GetParagraph( nPara );
1629*b1cdbd2cSJim Jagielski 			const SfxInt16Item& rLevel = (const SfxInt16Item&) pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL );
1630*b1cdbd2cSJim Jagielski 			if ( pPara && pPara->GetDepth() != rLevel.GetValue() )
1631*b1cdbd2cSJim Jagielski 			{
1632*b1cdbd2cSJim Jagielski 				pPara->SetDepth( rLevel.GetValue() );
1633*b1cdbd2cSJim Jagielski 				ImplCalcBulletText( nPara, sal_True, sal_True );
1634*b1cdbd2cSJim Jagielski 			}
1635*b1cdbd2cSJim Jagielski 		}
1636*b1cdbd2cSJim Jagielski 	}
1637*b1cdbd2cSJim Jagielski }
1638*b1cdbd2cSJim Jagielski 
StyleSheetChanged(SfxStyleSheet * pStyle)1639*b1cdbd2cSJim Jagielski void Outliner::StyleSheetChanged( SfxStyleSheet* pStyle )
1640*b1cdbd2cSJim Jagielski {
1641*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1642*b1cdbd2cSJim Jagielski 
1643*b1cdbd2cSJim Jagielski 	// Die EditEngine ruft StyleSheetChanged auch fuer abgeleitete Styles.
1644*b1cdbd2cSJim Jagielski 	// MT: Hier wurde frueher alle Absaetze durch ein ImpRecalcParaAttribs
1645*b1cdbd2cSJim Jagielski 	// gejagt, die die besagte Vorlage haben, warum?
1646*b1cdbd2cSJim Jagielski 	// => Eigentlich kann sich nur die Bullet-Repraesentation aendern...
1647*b1cdbd2cSJim Jagielski 
1648*b1cdbd2cSJim Jagielski 	sal_uInt16 nParas = (sal_uInt16)pParaList->GetParagraphCount();
1649*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nPara = 0; nPara < nParas; nPara++ )
1650*b1cdbd2cSJim Jagielski 	{
1651*b1cdbd2cSJim Jagielski 		if ( pEditEngine->GetStyleSheet( nPara ) == pStyle )
1652*b1cdbd2cSJim Jagielski 		{
1653*b1cdbd2cSJim Jagielski 			ImplCheckNumBulletItem( nPara );
1654*b1cdbd2cSJim Jagielski 			ImplCalcBulletText( nPara, sal_False, sal_False );
1655*b1cdbd2cSJim Jagielski             // #97333# EditEngine formats changed paragraphs before calling this method,
1656*b1cdbd2cSJim Jagielski             // so they are not reformatted now and use wrong bullet indent
1657*b1cdbd2cSJim Jagielski             pEditEngine->QuickMarkInvalid( ESelection( nPara, 0, nPara, 0 ) );
1658*b1cdbd2cSJim Jagielski 		}
1659*b1cdbd2cSJim Jagielski 	}
1660*b1cdbd2cSJim Jagielski }
1661*b1cdbd2cSJim Jagielski 
ImpCalcBulletArea(sal_uInt16 nPara,sal_Bool bAdjust,sal_Bool bReturnPaperPos)1662*b1cdbd2cSJim Jagielski Rectangle Outliner::ImpCalcBulletArea( sal_uInt16 nPara, sal_Bool bAdjust, sal_Bool bReturnPaperPos )
1663*b1cdbd2cSJim Jagielski {
1664*b1cdbd2cSJim Jagielski 	// Bullet-Bereich innerhalb des Absatzes...
1665*b1cdbd2cSJim Jagielski 	Rectangle aBulletArea;
1666*b1cdbd2cSJim Jagielski 
1667*b1cdbd2cSJim Jagielski     const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
1668*b1cdbd2cSJim Jagielski 	if ( pFmt )
1669*b1cdbd2cSJim Jagielski 	{
1670*b1cdbd2cSJim Jagielski 		Point aTopLeft;
1671*b1cdbd2cSJim Jagielski 		Size aBulletSize( ImplGetBulletSize( nPara ) );
1672*b1cdbd2cSJim Jagielski 
1673*b1cdbd2cSJim Jagielski         sal_Bool bOutlineMode = ( pEditEngine->GetControlWord() & EE_CNTRL_OUTLINER ) != 0;
1674*b1cdbd2cSJim Jagielski 
1675*b1cdbd2cSJim Jagielski         // the ODF attribut text:space-before which holds the spacing to add to the left of the label
1676*b1cdbd2cSJim Jagielski         const short nSpaceBefore = pFmt->GetAbsLSpace() + pFmt->GetFirstLineOffset();
1677*b1cdbd2cSJim Jagielski 
1678*b1cdbd2cSJim Jagielski         const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&) pEditEngine->GetParaAttrib( nPara, bOutlineMode ? EE_PARA_OUTLLRSPACE : EE_PARA_LRSPACE );
1679*b1cdbd2cSJim Jagielski         aTopLeft.X() = rLR.GetTxtLeft() + rLR.GetTxtFirstLineOfst() + nSpaceBefore;
1680*b1cdbd2cSJim Jagielski 
1681*b1cdbd2cSJim Jagielski 		long nBulletWidth = Max( (long) -rLR.GetTxtFirstLineOfst(), (long) ((-pFmt->GetFirstLineOffset()) + pFmt->GetCharTextDistance()) );
1682*b1cdbd2cSJim Jagielski 		if ( nBulletWidth < aBulletSize.Width() ) 	// Bullet macht sich Platz
1683*b1cdbd2cSJim Jagielski 			nBulletWidth = aBulletSize.Width();
1684*b1cdbd2cSJim Jagielski 
1685*b1cdbd2cSJim Jagielski 		if ( bAdjust && !bOutlineMode )
1686*b1cdbd2cSJim Jagielski 		{
1687*b1cdbd2cSJim Jagielski 			// Bei zentriert/rechtsbuendig anpassen
1688*b1cdbd2cSJim Jagielski 			const SvxAdjustItem& rItem = (const SvxAdjustItem&)pEditEngine->GetParaAttrib( nPara, EE_PARA_JUST );
1689*b1cdbd2cSJim Jagielski 			if ( ( !pEditEngine->IsRightToLeft( nPara ) && ( rItem.GetAdjust() != SVX_ADJUST_LEFT ) ) ||
1690*b1cdbd2cSJim Jagielski 				 ( pEditEngine->IsRightToLeft( nPara ) && ( rItem.GetAdjust() != SVX_ADJUST_RIGHT ) ) )
1691*b1cdbd2cSJim Jagielski 			{
1692*b1cdbd2cSJim Jagielski 				aTopLeft.X() = pEditEngine->GetFirstLineStartX( nPara ) - nBulletWidth;
1693*b1cdbd2cSJim Jagielski 			}
1694*b1cdbd2cSJim Jagielski 		}
1695*b1cdbd2cSJim Jagielski 
1696*b1cdbd2cSJim Jagielski 		// Vertikal:
1697*b1cdbd2cSJim Jagielski 		ParagraphInfos aInfos = pEditEngine->GetParagraphInfos( nPara );
1698*b1cdbd2cSJim Jagielski 		if ( aInfos.bValid )
1699*b1cdbd2cSJim Jagielski 		{
1700*b1cdbd2cSJim Jagielski 			aTopLeft.Y() = /* aInfos.nFirstLineOffset + */ // #91076# nFirstLineOffset is already added to the StartPos (PaintBullet) from the EditEngine
1701*b1cdbd2cSJim Jagielski 							aInfos.nFirstLineHeight - aInfos.nFirstLineTextHeight
1702*b1cdbd2cSJim Jagielski 							+ aInfos.nFirstLineTextHeight / 2
1703*b1cdbd2cSJim Jagielski 							- aBulletSize.Height() / 2;
1704*b1cdbd2cSJim Jagielski 			// ggf. lieber auf der Baseline ausgeben...
1705*b1cdbd2cSJim Jagielski 			if( ( pFmt->GetNumberingType() != SVX_NUM_NUMBER_NONE ) && ( pFmt->GetNumberingType() != SVX_NUM_BITMAP ) && ( pFmt->GetNumberingType() != SVX_NUM_CHAR_SPECIAL ) )
1706*b1cdbd2cSJim Jagielski 			{
1707*b1cdbd2cSJim Jagielski 				Font aBulletFont( ImpCalcBulletFont( nPara ) );
1708*b1cdbd2cSJim Jagielski 				if ( aBulletFont.GetCharSet() != RTL_TEXTENCODING_SYMBOL )
1709*b1cdbd2cSJim Jagielski 				{
1710*b1cdbd2cSJim Jagielski 					OutputDevice* pRefDev = pEditEngine->GetRefDevice();
1711*b1cdbd2cSJim Jagielski 					Font aOldFont = pRefDev->GetFont();
1712*b1cdbd2cSJim Jagielski 					pRefDev->SetFont( aBulletFont );
1713*b1cdbd2cSJim Jagielski 					FontMetric aMetric( pRefDev->GetFontMetric() );
1714*b1cdbd2cSJim Jagielski 					// Leading der ersten Zeile...
1715*b1cdbd2cSJim Jagielski 					aTopLeft.Y() = /* aInfos.nFirstLineOffset + */ aInfos.nFirstLineMaxAscent;
1716*b1cdbd2cSJim Jagielski 					aTopLeft.Y() -= aMetric.GetAscent();
1717*b1cdbd2cSJim Jagielski 					pRefDev->SetFont( aOldFont );
1718*b1cdbd2cSJim Jagielski 				}
1719*b1cdbd2cSJim Jagielski 			}
1720*b1cdbd2cSJim Jagielski 		}
1721*b1cdbd2cSJim Jagielski 
1722*b1cdbd2cSJim Jagielski 		// Horizontal:
1723*b1cdbd2cSJim Jagielski 		if( pFmt->GetNumAdjust() == SVX_ADJUST_RIGHT )
1724*b1cdbd2cSJim Jagielski 		{
1725*b1cdbd2cSJim Jagielski 			aTopLeft.X() += nBulletWidth - aBulletSize.Width();
1726*b1cdbd2cSJim Jagielski 		}
1727*b1cdbd2cSJim Jagielski 		else if( pFmt->GetNumAdjust() == SVX_ADJUST_CENTER )
1728*b1cdbd2cSJim Jagielski 		{
1729*b1cdbd2cSJim Jagielski 			aTopLeft.X() += ( nBulletWidth - aBulletSize.Width() ) / 2;
1730*b1cdbd2cSJim Jagielski 		}
1731*b1cdbd2cSJim Jagielski 
1732*b1cdbd2cSJim Jagielski 		if ( aTopLeft.X() < 0 ) 	// dann draengeln
1733*b1cdbd2cSJim Jagielski 			aTopLeft.X() = 0;
1734*b1cdbd2cSJim Jagielski 
1735*b1cdbd2cSJim Jagielski 		aBulletArea = Rectangle( aTopLeft, aBulletSize );
1736*b1cdbd2cSJim Jagielski 	}
1737*b1cdbd2cSJim Jagielski     if ( bReturnPaperPos )
1738*b1cdbd2cSJim Jagielski     {
1739*b1cdbd2cSJim Jagielski         Size aBulletSize( aBulletArea.GetSize() );
1740*b1cdbd2cSJim Jagielski         Point aBulletDocPos( aBulletArea.TopLeft() );
1741*b1cdbd2cSJim Jagielski         aBulletDocPos.Y() += pEditEngine->GetDocPosTopLeft( nPara ).Y();
1742*b1cdbd2cSJim Jagielski         Point aBulletPos( aBulletDocPos );
1743*b1cdbd2cSJim Jagielski 
1744*b1cdbd2cSJim Jagielski 	    if ( IsVertical() )
1745*b1cdbd2cSJim Jagielski 	    {
1746*b1cdbd2cSJim Jagielski             aBulletPos.Y() = aBulletDocPos.X();
1747*b1cdbd2cSJim Jagielski             aBulletPos.X() = GetPaperSize().Width() - aBulletDocPos.Y();
1748*b1cdbd2cSJim Jagielski             // Rotate:
1749*b1cdbd2cSJim Jagielski             aBulletPos.X() -= aBulletSize.Height();
1750*b1cdbd2cSJim Jagielski             Size aSz( aBulletSize );
1751*b1cdbd2cSJim Jagielski             aBulletSize.Width() = aSz.Height();
1752*b1cdbd2cSJim Jagielski             aBulletSize.Height() = aSz.Width();
1753*b1cdbd2cSJim Jagielski 	    }
1754*b1cdbd2cSJim Jagielski         else if ( pEditEngine->IsRightToLeft( nPara ) )
1755*b1cdbd2cSJim Jagielski         {
1756*b1cdbd2cSJim Jagielski             aBulletPos.X() = GetPaperSize().Width() - aBulletDocPos.X() - aBulletSize.Width();
1757*b1cdbd2cSJim Jagielski         }
1758*b1cdbd2cSJim Jagielski 
1759*b1cdbd2cSJim Jagielski 		aBulletArea = Rectangle( aBulletPos, aBulletSize );
1760*b1cdbd2cSJim Jagielski     }
1761*b1cdbd2cSJim Jagielski 	return aBulletArea;
1762*b1cdbd2cSJim Jagielski }
1763*b1cdbd2cSJim Jagielski 
ExpandHdl()1764*b1cdbd2cSJim Jagielski void Outliner::ExpandHdl()
1765*b1cdbd2cSJim Jagielski {
1766*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1767*b1cdbd2cSJim Jagielski 	aExpandHdl.Call( this );
1768*b1cdbd2cSJim Jagielski }
1769*b1cdbd2cSJim Jagielski 
GetBulletInfo(sal_uInt16 nPara)1770*b1cdbd2cSJim Jagielski EBulletInfo Outliner::GetBulletInfo( sal_uInt16 nPara )
1771*b1cdbd2cSJim Jagielski {
1772*b1cdbd2cSJim Jagielski     EBulletInfo aInfo;
1773*b1cdbd2cSJim Jagielski 
1774*b1cdbd2cSJim Jagielski     aInfo.nParagraph = nPara;
1775*b1cdbd2cSJim Jagielski     aInfo.bVisible = ImplHasNumberFormat( nPara ) ? sal_True : sal_False;
1776*b1cdbd2cSJim Jagielski 
1777*b1cdbd2cSJim Jagielski     const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
1778*b1cdbd2cSJim Jagielski     aInfo.nType = pFmt ? pFmt->GetNumberingType() : 0;
1779*b1cdbd2cSJim Jagielski 
1780*b1cdbd2cSJim Jagielski     if( pFmt )
1781*b1cdbd2cSJim Jagielski     {
1782*b1cdbd2cSJim Jagielski         if( pFmt->GetNumberingType() != SVX_NUM_BITMAP )
1783*b1cdbd2cSJim Jagielski         {
1784*b1cdbd2cSJim Jagielski             aInfo.aText = ImplGetBulletText( nPara );
1785*b1cdbd2cSJim Jagielski 
1786*b1cdbd2cSJim Jagielski             if( pFmt->GetBulletFont() )
1787*b1cdbd2cSJim Jagielski                 aInfo.aFont = *pFmt->GetBulletFont();
1788*b1cdbd2cSJim Jagielski         }
1789*b1cdbd2cSJim Jagielski         else if ( pFmt->GetBrush()->GetGraphicObject() )
1790*b1cdbd2cSJim Jagielski         {
1791*b1cdbd2cSJim Jagielski             aInfo.aGraphic = pFmt->GetBrush()->GetGraphicObject()->GetGraphic();
1792*b1cdbd2cSJim Jagielski         }
1793*b1cdbd2cSJim Jagielski     }
1794*b1cdbd2cSJim Jagielski 
1795*b1cdbd2cSJim Jagielski     if ( aInfo.bVisible )
1796*b1cdbd2cSJim Jagielski     {
1797*b1cdbd2cSJim Jagielski         aInfo.aBounds = ImpCalcBulletArea( nPara, sal_True, sal_True );
1798*b1cdbd2cSJim Jagielski     }
1799*b1cdbd2cSJim Jagielski 
1800*b1cdbd2cSJim Jagielski     return aInfo;
1801*b1cdbd2cSJim Jagielski }
1802*b1cdbd2cSJim Jagielski 
GetText(Paragraph * pParagraph,sal_uLong nCount) const1803*b1cdbd2cSJim Jagielski XubString Outliner::GetText( Paragraph* pParagraph, sal_uLong nCount ) const
1804*b1cdbd2cSJim Jagielski {
1805*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1806*b1cdbd2cSJim Jagielski 
1807*b1cdbd2cSJim Jagielski 	XubString aText;
1808*b1cdbd2cSJim Jagielski 	sal_uInt16 nStartPara = (sal_uInt16) pParaList->GetAbsPos( pParagraph );
1809*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n = 0; n < nCount; n++ )
1810*b1cdbd2cSJim Jagielski 	{
1811*b1cdbd2cSJim Jagielski 		aText += pEditEngine->GetText( nStartPara + n );
1812*b1cdbd2cSJim Jagielski 		if ( (n+1) < (sal_uInt16)nCount )
1813*b1cdbd2cSJim Jagielski 			aText += '\n';
1814*b1cdbd2cSJim Jagielski 	}
1815*b1cdbd2cSJim Jagielski 	return aText;
1816*b1cdbd2cSJim Jagielski }
1817*b1cdbd2cSJim Jagielski 
Remove(Paragraph * pPara,sal_uLong nParaCount)1818*b1cdbd2cSJim Jagielski void Outliner::Remove( Paragraph* pPara, sal_uLong nParaCount )
1819*b1cdbd2cSJim Jagielski {
1820*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1821*b1cdbd2cSJim Jagielski 
1822*b1cdbd2cSJim Jagielski 	sal_uLong nPos = pParaList->GetAbsPos( pPara );
1823*b1cdbd2cSJim Jagielski 	if( !nPos && ( nParaCount >= pParaList->GetParagraphCount() ) )
1824*b1cdbd2cSJim Jagielski 	{
1825*b1cdbd2cSJim Jagielski 		Clear();
1826*b1cdbd2cSJim Jagielski 	}
1827*b1cdbd2cSJim Jagielski 	else
1828*b1cdbd2cSJim Jagielski 	{
1829*b1cdbd2cSJim Jagielski 		for( sal_uInt16 n = 0; n < (sal_uInt16)nParaCount; n++ )
1830*b1cdbd2cSJim Jagielski 			pEditEngine->RemoveParagraph( (sal_uInt16) nPos );
1831*b1cdbd2cSJim Jagielski 	}
1832*b1cdbd2cSJim Jagielski }
1833*b1cdbd2cSJim Jagielski 
StripPortions()1834*b1cdbd2cSJim Jagielski void Outliner::StripPortions()
1835*b1cdbd2cSJim Jagielski {
1836*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1837*b1cdbd2cSJim Jagielski 	bStrippingPortions = sal_True;
1838*b1cdbd2cSJim Jagielski 	pEditEngine->StripPortions();
1839*b1cdbd2cSJim Jagielski 	bStrippingPortions = sal_False;
1840*b1cdbd2cSJim Jagielski }
1841*b1cdbd2cSJim Jagielski 
1842*b1cdbd2cSJim Jagielski // #101498#
DrawingText(const Point & rStartPos,const XubString & rText,sal_uInt16 nTextStart,sal_uInt16 nTextLen,const sal_Int32 * pDXArray,const SvxFont & rFont,sal_uInt16 nPara,sal_uInt16 nIndex,sal_uInt8 nRightToLeft,const EEngineData::WrongSpellVector * pWrongSpellVector,const SvxFieldData * pFieldData,bool bEndOfLine,bool bEndOfParagraph,bool bEndOfBullet,const::com::sun::star::lang::Locale * pLocale,const Color & rOverlineColor,const Color & rTextLineColor)1843*b1cdbd2cSJim Jagielski void Outliner::DrawingText( const Point& rStartPos, const XubString& rText, sal_uInt16 nTextStart, sal_uInt16 nTextLen, const sal_Int32* pDXArray,const SvxFont& rFont,
1844*b1cdbd2cSJim Jagielski     sal_uInt16 nPara, sal_uInt16 nIndex, sal_uInt8 nRightToLeft,
1845*b1cdbd2cSJim Jagielski     const EEngineData::WrongSpellVector* pWrongSpellVector,
1846*b1cdbd2cSJim Jagielski     const SvxFieldData* pFieldData,
1847*b1cdbd2cSJim Jagielski     bool bEndOfLine,
1848*b1cdbd2cSJim Jagielski     bool bEndOfParagraph,
1849*b1cdbd2cSJim Jagielski     bool bEndOfBullet,
1850*b1cdbd2cSJim Jagielski     const ::com::sun::star::lang::Locale* pLocale,
1851*b1cdbd2cSJim Jagielski     const Color& rOverlineColor,
1852*b1cdbd2cSJim Jagielski     const Color& rTextLineColor)
1853*b1cdbd2cSJim Jagielski {
1854*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1855*b1cdbd2cSJim Jagielski 
1856*b1cdbd2cSJim Jagielski 	if(aDrawPortionHdl.IsSet())
1857*b1cdbd2cSJim Jagielski     {
1858*b1cdbd2cSJim Jagielski 	    // #101498#
1859*b1cdbd2cSJim Jagielski 	    DrawPortionInfo aInfo( rStartPos, rText, nTextStart, nTextLen, rFont, nPara, nIndex, pDXArray, pWrongSpellVector,
1860*b1cdbd2cSJim Jagielski             pFieldData, pLocale, rOverlineColor, rTextLineColor, nRightToLeft, bEndOfLine, bEndOfParagraph, bEndOfBullet);
1861*b1cdbd2cSJim Jagielski 
1862*b1cdbd2cSJim Jagielski         aDrawPortionHdl.Call( &aInfo );
1863*b1cdbd2cSJim Jagielski     }
1864*b1cdbd2cSJim Jagielski }
1865*b1cdbd2cSJim Jagielski 
RemovingPagesHdl(OutlinerView * pView)1866*b1cdbd2cSJim Jagielski long Outliner::RemovingPagesHdl( OutlinerView* pView )
1867*b1cdbd2cSJim Jagielski {
1868*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1869*b1cdbd2cSJim Jagielski 	return aRemovingPagesHdl.IsSet() ? aRemovingPagesHdl.Call( pView ) : sal_True;
1870*b1cdbd2cSJim Jagielski }
1871*b1cdbd2cSJim Jagielski 
ImpCanDeleteSelectedPages(OutlinerView * pCurView,sal_uInt16 _nFirstPage,sal_uInt16 nPages)1872*b1cdbd2cSJim Jagielski sal_Bool Outliner::ImpCanDeleteSelectedPages( OutlinerView* pCurView, sal_uInt16 _nFirstPage, sal_uInt16 nPages )
1873*b1cdbd2cSJim Jagielski {
1874*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1875*b1cdbd2cSJim Jagielski 
1876*b1cdbd2cSJim Jagielski 	nDepthChangedHdlPrevDepth = nPages;
1877*b1cdbd2cSJim Jagielski 	mnFirstSelPage = _nFirstPage;
1878*b1cdbd2cSJim Jagielski 	pHdlParagraph = 0;
1879*b1cdbd2cSJim Jagielski 	return (sal_Bool)RemovingPagesHdl( pCurView );
1880*b1cdbd2cSJim Jagielski }
1881*b1cdbd2cSJim Jagielski 
GetParaAttribs(sal_uInt16 nPara)1882*b1cdbd2cSJim Jagielski SfxItemSet Outliner::GetParaAttribs( sal_uInt16 nPara )
1883*b1cdbd2cSJim Jagielski {
1884*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1885*b1cdbd2cSJim Jagielski 	return pEditEngine->GetParaAttribs( nPara );
1886*b1cdbd2cSJim Jagielski }
1887*b1cdbd2cSJim Jagielski 
IMPL_LINK(Outliner,ParaVisibleStateChangedHdl,Paragraph *,pPara)1888*b1cdbd2cSJim Jagielski IMPL_LINK( Outliner, ParaVisibleStateChangedHdl, Paragraph*, pPara )
1889*b1cdbd2cSJim Jagielski {
1890*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1891*b1cdbd2cSJim Jagielski 
1892*b1cdbd2cSJim Jagielski 	sal_uLong nPara = pParaList->GetAbsPos( pPara );
1893*b1cdbd2cSJim Jagielski 	pEditEngine->ShowParagraph( (sal_uInt16)nPara, pPara->IsVisible() );
1894*b1cdbd2cSJim Jagielski 
1895*b1cdbd2cSJim Jagielski 	return 0;
1896*b1cdbd2cSJim Jagielski }
1897*b1cdbd2cSJim Jagielski 
IMPL_LINK(Outliner,BeginMovingParagraphsHdl,MoveParagraphsInfo *,EMPTYARG)1898*b1cdbd2cSJim Jagielski IMPL_LINK( Outliner, BeginMovingParagraphsHdl, MoveParagraphsInfo*, EMPTYARG )
1899*b1cdbd2cSJim Jagielski {
1900*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1901*b1cdbd2cSJim Jagielski 
1902*b1cdbd2cSJim Jagielski 	if( !IsInUndo() )
1903*b1cdbd2cSJim Jagielski 		GetBeginMovingHdl().Call( this );
1904*b1cdbd2cSJim Jagielski 
1905*b1cdbd2cSJim Jagielski 	return 0;
1906*b1cdbd2cSJim Jagielski }
1907*b1cdbd2cSJim Jagielski 
IMPL_LINK(Outliner,BeginPasteOrDropHdl,PasteOrDropInfos *,pInfos)1908*b1cdbd2cSJim Jagielski IMPL_LINK( Outliner, BeginPasteOrDropHdl, PasteOrDropInfos*, pInfos )
1909*b1cdbd2cSJim Jagielski {
1910*b1cdbd2cSJim Jagielski     UndoActionStart( EDITUNDO_DRAGANDDROP );
1911*b1cdbd2cSJim Jagielski     maBeginPasteOrDropHdl.Call(pInfos);
1912*b1cdbd2cSJim Jagielski 	return 0;
1913*b1cdbd2cSJim Jagielski }
1914*b1cdbd2cSJim Jagielski 
IMPL_LINK(Outliner,EndPasteOrDropHdl,PasteOrDropInfos *,pInfos)1915*b1cdbd2cSJim Jagielski IMPL_LINK( Outliner, EndPasteOrDropHdl, PasteOrDropInfos*, pInfos )
1916*b1cdbd2cSJim Jagielski {
1917*b1cdbd2cSJim Jagielski 	bPasting = sal_False;
1918*b1cdbd2cSJim Jagielski 	ImpTextPasted( pInfos->nStartPara, pInfos->nEndPara - pInfos->nStartPara + 1 );
1919*b1cdbd2cSJim Jagielski     maEndPasteOrDropHdl.Call( pInfos );
1920*b1cdbd2cSJim Jagielski 	UndoActionEnd( EDITUNDO_DRAGANDDROP );
1921*b1cdbd2cSJim Jagielski 	return 0;
1922*b1cdbd2cSJim Jagielski }
1923*b1cdbd2cSJim Jagielski 
IMPL_LINK(Outliner,EndMovingParagraphsHdl,MoveParagraphsInfo *,pInfos)1924*b1cdbd2cSJim Jagielski IMPL_LINK( Outliner, EndMovingParagraphsHdl, MoveParagraphsInfo*, pInfos )
1925*b1cdbd2cSJim Jagielski {
1926*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
1927*b1cdbd2cSJim Jagielski 
1928*b1cdbd2cSJim Jagielski 	pParaList->MoveParagraphs( pInfos->nStartPara, pInfos->nDestPara, pInfos->nEndPara - pInfos->nStartPara + 1 );
1929*b1cdbd2cSJim Jagielski 	sal_uInt16 nChangesStart = Min( pInfos->nStartPara, pInfos->nDestPara );
1930*b1cdbd2cSJim Jagielski 	sal_uInt16 nParas = (sal_uInt16)pParaList->GetParagraphCount();
1931*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n = nChangesStart; n < nParas; n++ )
1932*b1cdbd2cSJim Jagielski 		ImplCalcBulletText( n, sal_False, sal_False );
1933*b1cdbd2cSJim Jagielski 
1934*b1cdbd2cSJim Jagielski 	if( !IsInUndo() )
1935*b1cdbd2cSJim Jagielski 		aEndMovingHdl.Call( this );
1936*b1cdbd2cSJim Jagielski 
1937*b1cdbd2cSJim Jagielski     return 0;
1938*b1cdbd2cSJim Jagielski }
1939*b1cdbd2cSJim Jagielski 
isSameNumbering(const SvxNumberFormat & rN1,const SvxNumberFormat & rN2)1940*b1cdbd2cSJim Jagielski static bool isSameNumbering( const SvxNumberFormat& rN1, const SvxNumberFormat& rN2 )
1941*b1cdbd2cSJim Jagielski {
1942*b1cdbd2cSJim Jagielski     if( rN1.GetNumberingType() != rN2.GetNumberingType() )
1943*b1cdbd2cSJim Jagielski         return false;
1944*b1cdbd2cSJim Jagielski 
1945*b1cdbd2cSJim Jagielski     if( rN1.GetNumStr(1) != rN2.GetNumStr(1) )
1946*b1cdbd2cSJim Jagielski         return false;
1947*b1cdbd2cSJim Jagielski 
1948*b1cdbd2cSJim Jagielski     if( (rN1.GetPrefix() != rN2.GetPrefix()) || (rN1.GetSuffix() != rN2.GetSuffix()) )
1949*b1cdbd2cSJim Jagielski         return false;
1950*b1cdbd2cSJim Jagielski 
1951*b1cdbd2cSJim Jagielski     return true;
1952*b1cdbd2cSJim Jagielski }
1953*b1cdbd2cSJim Jagielski 
ImplGetNumbering(sal_uInt16 nPara,const SvxNumberFormat * pParaFmt)1954*b1cdbd2cSJim Jagielski sal_uInt16 Outliner::ImplGetNumbering( sal_uInt16 nPara, const SvxNumberFormat* pParaFmt )
1955*b1cdbd2cSJim Jagielski {
1956*b1cdbd2cSJim Jagielski     sal_uInt16 nNumber = pParaFmt->GetStart() - 1;
1957*b1cdbd2cSJim Jagielski 
1958*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
1959*b1cdbd2cSJim Jagielski     const sal_Int16 nParaDepth = pPara->GetDepth();
1960*b1cdbd2cSJim Jagielski 
1961*b1cdbd2cSJim Jagielski     do
1962*b1cdbd2cSJim Jagielski     {
1963*b1cdbd2cSJim Jagielski         pPara = pParaList->GetParagraph( nPara );
1964*b1cdbd2cSJim Jagielski         const sal_Int16 nDepth = pPara->GetDepth();
1965*b1cdbd2cSJim Jagielski 
1966*b1cdbd2cSJim Jagielski         // ignore paragraphs that are below our paragraph or have no numbering
1967*b1cdbd2cSJim Jagielski         if( (nDepth > nParaDepth) || (nDepth == -1) )
1968*b1cdbd2cSJim Jagielski             continue;
1969*b1cdbd2cSJim Jagielski 
1970*b1cdbd2cSJim Jagielski         // stop on paragraphs that are above our paragraph
1971*b1cdbd2cSJim Jagielski         if( nDepth < nParaDepth )
1972*b1cdbd2cSJim Jagielski             break;
1973*b1cdbd2cSJim Jagielski 
1974*b1cdbd2cSJim Jagielski         const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
1975*b1cdbd2cSJim Jagielski 
1976*b1cdbd2cSJim Jagielski         if( pFmt == 0 )
1977*b1cdbd2cSJim Jagielski             continue; // ignore paragraphs without bullets
1978*b1cdbd2cSJim Jagielski 
1979*b1cdbd2cSJim Jagielski         // check if numbering less than or equal to pParaFmt
1980*b1cdbd2cSJim Jagielski         if( !isSameNumbering( *pFmt, *pParaFmt ) || ( pFmt->GetStart() < pParaFmt->GetStart() ) )
1981*b1cdbd2cSJim Jagielski             break;
1982*b1cdbd2cSJim Jagielski 
1983*b1cdbd2cSJim Jagielski         if (  pFmt->GetStart() > pParaFmt->GetStart() )
1984*b1cdbd2cSJim Jagielski         {
1985*b1cdbd2cSJim Jagielski            nNumber += pFmt->GetStart() - pParaFmt->GetStart();
1986*b1cdbd2cSJim Jagielski            pParaFmt = pFmt;
1987*b1cdbd2cSJim Jagielski         }
1988*b1cdbd2cSJim Jagielski 
1989*b1cdbd2cSJim Jagielski         const SfxBoolItem& rBulletState = (const SfxBoolItem&) pEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE );
1990*b1cdbd2cSJim Jagielski 
1991*b1cdbd2cSJim Jagielski         if( rBulletState.GetValue() )
1992*b1cdbd2cSJim Jagielski             nNumber += 1;
1993*b1cdbd2cSJim Jagielski 
1994*b1cdbd2cSJim Jagielski         // same depth, same number format, check for restart
1995*b1cdbd2cSJim Jagielski         const sal_Int16 nNumberingStartValue = pPara->GetNumberingStartValue();
1996*b1cdbd2cSJim Jagielski         if( (nNumberingStartValue != -1) || pPara->IsParaIsNumberingRestart() )
1997*b1cdbd2cSJim Jagielski         {
1998*b1cdbd2cSJim Jagielski             if( nNumberingStartValue != -1 )
1999*b1cdbd2cSJim Jagielski                 nNumber += nNumberingStartValue - 1;
2000*b1cdbd2cSJim Jagielski             break;
2001*b1cdbd2cSJim Jagielski         }
2002*b1cdbd2cSJim Jagielski     }
2003*b1cdbd2cSJim Jagielski     while( nPara-- );
2004*b1cdbd2cSJim Jagielski 
2005*b1cdbd2cSJim Jagielski     return nNumber;
2006*b1cdbd2cSJim Jagielski }
2007*b1cdbd2cSJim Jagielski 
ImplCalcBulletText(sal_uInt16 nPara,sal_Bool bRecalcLevel,sal_Bool bRecalcChilds)2008*b1cdbd2cSJim Jagielski void Outliner::ImplCalcBulletText( sal_uInt16 nPara, sal_Bool bRecalcLevel, sal_Bool bRecalcChilds )
2009*b1cdbd2cSJim Jagielski {
2010*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
2011*b1cdbd2cSJim Jagielski 
2012*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
2013*b1cdbd2cSJim Jagielski 	sal_uInt16 nRelPos = 0xFFFF;
2014*b1cdbd2cSJim Jagielski 
2015*b1cdbd2cSJim Jagielski 	while ( pPara )
2016*b1cdbd2cSJim Jagielski 	{
2017*b1cdbd2cSJim Jagielski 		XubString aBulletText;
2018*b1cdbd2cSJim Jagielski         const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
2019*b1cdbd2cSJim Jagielski 		if( pFmt && ( pFmt->GetNumberingType() != SVX_NUM_BITMAP ) )
2020*b1cdbd2cSJim Jagielski 		{
2021*b1cdbd2cSJim Jagielski 			aBulletText += pFmt->GetPrefix();
2022*b1cdbd2cSJim Jagielski 			if( pFmt->GetNumberingType() == SVX_NUM_CHAR_SPECIAL )
2023*b1cdbd2cSJim Jagielski 			{
2024*b1cdbd2cSJim Jagielski 				aBulletText += pFmt->GetBulletChar();
2025*b1cdbd2cSJim Jagielski 			}
2026*b1cdbd2cSJim Jagielski 			else if( pFmt->GetNumberingType() != SVX_NUM_NUMBER_NONE )
2027*b1cdbd2cSJim Jagielski 			{
2028*b1cdbd2cSJim Jagielski 				aBulletText += pFmt->GetNumStr( ImplGetNumbering( nPara, pFmt ) );
2029*b1cdbd2cSJim Jagielski 			}
2030*b1cdbd2cSJim Jagielski 			aBulletText += pFmt->GetSuffix();
2031*b1cdbd2cSJim Jagielski 		}
2032*b1cdbd2cSJim Jagielski 
2033*b1cdbd2cSJim Jagielski 		if( aBulletText != pPara->GetText() )
2034*b1cdbd2cSJim Jagielski 			pPara->SetText( aBulletText );
2035*b1cdbd2cSJim Jagielski 
2036*b1cdbd2cSJim Jagielski 		pPara->nFlags &= (~PARAFLAG_SETBULLETTEXT);
2037*b1cdbd2cSJim Jagielski 
2038*b1cdbd2cSJim Jagielski 		if ( bRecalcLevel )
2039*b1cdbd2cSJim Jagielski 		{
2040*b1cdbd2cSJim Jagielski 			if ( nRelPos != 0xFFFF )
2041*b1cdbd2cSJim Jagielski 				nRelPos++;
2042*b1cdbd2cSJim Jagielski 
2043*b1cdbd2cSJim Jagielski 			sal_Int16 nDepth = pPara->GetDepth();
2044*b1cdbd2cSJim Jagielski 			pPara = pParaList->GetParagraph( ++nPara );
2045*b1cdbd2cSJim Jagielski 			if ( !bRecalcChilds )
2046*b1cdbd2cSJim Jagielski 			{
2047*b1cdbd2cSJim Jagielski 				while ( pPara && ( pPara->GetDepth() > nDepth ) )
2048*b1cdbd2cSJim Jagielski 					pPara = pParaList->GetParagraph( ++nPara );
2049*b1cdbd2cSJim Jagielski 			}
2050*b1cdbd2cSJim Jagielski 
2051*b1cdbd2cSJim Jagielski 			if ( pPara && ( pPara->GetDepth() < nDepth ) )
2052*b1cdbd2cSJim Jagielski 				pPara = NULL;
2053*b1cdbd2cSJim Jagielski 		}
2054*b1cdbd2cSJim Jagielski 		else
2055*b1cdbd2cSJim Jagielski 		{
2056*b1cdbd2cSJim Jagielski 			pPara = NULL;
2057*b1cdbd2cSJim Jagielski 		}
2058*b1cdbd2cSJim Jagielski 	}
2059*b1cdbd2cSJim Jagielski }
2060*b1cdbd2cSJim Jagielski 
Clear()2061*b1cdbd2cSJim Jagielski void Outliner::Clear()
2062*b1cdbd2cSJim Jagielski {
2063*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
2064*b1cdbd2cSJim Jagielski 
2065*b1cdbd2cSJim Jagielski 	if( !bFirstParaIsEmpty )
2066*b1cdbd2cSJim Jagielski 	{
2067*b1cdbd2cSJim Jagielski 		ImplBlockInsertionCallbacks( sal_True );
2068*b1cdbd2cSJim Jagielski 		pEditEngine->Clear();
2069*b1cdbd2cSJim Jagielski 		pParaList->Clear( sal_True );
2070*b1cdbd2cSJim Jagielski 		pParaList->Insert( new Paragraph( nMinDepth ), LIST_APPEND );
2071*b1cdbd2cSJim Jagielski 		bFirstParaIsEmpty = sal_True;
2072*b1cdbd2cSJim Jagielski 		ImplBlockInsertionCallbacks( sal_False );
2073*b1cdbd2cSJim Jagielski 	}
2074*b1cdbd2cSJim Jagielski 	else
2075*b1cdbd2cSJim Jagielski 	{
2076*b1cdbd2cSJim Jagielski             Paragraph* pPara = pParaList->GetParagraph( 0 );
2077*b1cdbd2cSJim Jagielski             if(pPara)
2078*b1cdbd2cSJim Jagielski                 pPara->SetDepth( nMinDepth );
2079*b1cdbd2cSJim Jagielski 	}
2080*b1cdbd2cSJim Jagielski }
2081*b1cdbd2cSJim Jagielski 
SetFlatMode(sal_Bool bFlat)2082*b1cdbd2cSJim Jagielski void Outliner::SetFlatMode( sal_Bool bFlat )
2083*b1cdbd2cSJim Jagielski {
2084*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(Outliner,0);
2085*b1cdbd2cSJim Jagielski 
2086*b1cdbd2cSJim Jagielski 	if( bFlat != pEditEngine->IsFlatMode() )
2087*b1cdbd2cSJim Jagielski 	{
2088*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 nPara = (sal_uInt16)pParaList->GetParagraphCount(); nPara; )
2089*b1cdbd2cSJim Jagielski 			pParaList->GetParagraph( --nPara )->aBulSize.Width() = -1;
2090*b1cdbd2cSJim Jagielski 
2091*b1cdbd2cSJim Jagielski 		pEditEngine->SetFlatMode( bFlat );
2092*b1cdbd2cSJim Jagielski 	}
2093*b1cdbd2cSJim Jagielski }
2094*b1cdbd2cSJim Jagielski 
ImplGetBulletText(sal_uInt16 nPara)2095*b1cdbd2cSJim Jagielski String Outliner::ImplGetBulletText( sal_uInt16 nPara )
2096*b1cdbd2cSJim Jagielski {
2097*b1cdbd2cSJim Jagielski         String aRes;
2098*b1cdbd2cSJim Jagielski 	Paragraph* pPara = pParaList->GetParagraph( nPara );
2099*b1cdbd2cSJim Jagielski         if (pPara)
2100*b1cdbd2cSJim Jagielski         {
2101*b1cdbd2cSJim Jagielski 	// MT: Optimierung mal wieder aktivieren...
2102*b1cdbd2cSJim Jagielski //	if( pPara->nFlags & PARAFLAG_SETBULLETTEXT )
2103*b1cdbd2cSJim Jagielski 		ImplCalcBulletText( nPara, sal_False, sal_False );
2104*b1cdbd2cSJim Jagielski                 aRes = pPara->GetText();
2105*b1cdbd2cSJim Jagielski         }
2106*b1cdbd2cSJim Jagielski 	return aRes;
2107*b1cdbd2cSJim Jagielski }
2108*b1cdbd2cSJim Jagielski 
2109*b1cdbd2cSJim Jagielski // this is needed for StarOffice Api
SetLevelDependendStyleSheet(sal_uInt16 nPara)2110*b1cdbd2cSJim Jagielski void Outliner::SetLevelDependendStyleSheet( sal_uInt16 nPara )
2111*b1cdbd2cSJim Jagielski {
2112*b1cdbd2cSJim Jagielski 	SfxItemSet aOldAttrs( pEditEngine->GetParaAttribs( nPara ) );
2113*b1cdbd2cSJim Jagielski 	ImplSetLevelDependendStyleSheet( nPara );
2114*b1cdbd2cSJim Jagielski 	pEditEngine->SetParaAttribs( nPara, aOldAttrs );
2115*b1cdbd2cSJim Jagielski }
2116*b1cdbd2cSJim Jagielski 
2117*b1cdbd2cSJim Jagielski SV_IMPL_PTRARR( NotifyList, EENotifyPtr );
2118*b1cdbd2cSJim Jagielski 
ImplBlockInsertionCallbacks(sal_Bool b)2119*b1cdbd2cSJim Jagielski void Outliner::ImplBlockInsertionCallbacks( sal_Bool b )
2120*b1cdbd2cSJim Jagielski {
2121*b1cdbd2cSJim Jagielski     if ( b )
2122*b1cdbd2cSJim Jagielski     {
2123*b1cdbd2cSJim Jagielski         bBlockInsCallback++;
2124*b1cdbd2cSJim Jagielski     }
2125*b1cdbd2cSJim Jagielski     else
2126*b1cdbd2cSJim Jagielski     {
2127*b1cdbd2cSJim Jagielski         DBG_ASSERT( bBlockInsCallback, "ImplBlockInsertionCallbacks ?!" );
2128*b1cdbd2cSJim Jagielski         bBlockInsCallback--;
2129*b1cdbd2cSJim Jagielski         if ( !bBlockInsCallback )
2130*b1cdbd2cSJim Jagielski         {
2131*b1cdbd2cSJim Jagielski             // Call blocked notify events...
2132*b1cdbd2cSJim Jagielski             while ( pEditEngine->aNotifyCache.Count() )
2133*b1cdbd2cSJim Jagielski             {
2134*b1cdbd2cSJim Jagielski                 EENotify* pNotify = pEditEngine->aNotifyCache[0];
2135*b1cdbd2cSJim Jagielski                 // Remove from list before calling, maybe we enter LeaveBlockNotifications while calling the handler...
2136*b1cdbd2cSJim Jagielski                 pEditEngine->aNotifyCache.Remove( 0 );
2137*b1cdbd2cSJim Jagielski                 pEditEngine->aOutlinerNotifyHdl.Call( pNotify );
2138*b1cdbd2cSJim Jagielski                 delete pNotify;
2139*b1cdbd2cSJim Jagielski             }
2140*b1cdbd2cSJim Jagielski         }
2141*b1cdbd2cSJim Jagielski     }
2142*b1cdbd2cSJim Jagielski }
2143*b1cdbd2cSJim Jagielski 
IMPL_LINK(Outliner,EditEngineNotifyHdl,EENotify *,pNotify)2144*b1cdbd2cSJim Jagielski IMPL_LINK( Outliner, EditEngineNotifyHdl, EENotify*, pNotify )
2145*b1cdbd2cSJim Jagielski {
2146*b1cdbd2cSJim Jagielski     if ( !bBlockInsCallback )
2147*b1cdbd2cSJim Jagielski     {
2148*b1cdbd2cSJim Jagielski         pEditEngine->aOutlinerNotifyHdl.Call( pNotify );
2149*b1cdbd2cSJim Jagielski     }
2150*b1cdbd2cSJim Jagielski     else
2151*b1cdbd2cSJim Jagielski     {
2152*b1cdbd2cSJim Jagielski         EENotify* pNewNotify = new EENotify( *pNotify );
2153*b1cdbd2cSJim Jagielski         pEditEngine->aNotifyCache.Insert( pNewNotify, pEditEngine->aNotifyCache.Count() );
2154*b1cdbd2cSJim Jagielski     }
2155*b1cdbd2cSJim Jagielski 
2156*b1cdbd2cSJim Jagielski     return 0;
2157*b1cdbd2cSJim Jagielski }
2158*b1cdbd2cSJim Jagielski 
2159*b1cdbd2cSJim Jagielski /** sets a link that is called at the beginning of a drag operation at an edit view */
SetBeginDropHdl(const Link & rLink)2160*b1cdbd2cSJim Jagielski void Outliner::SetBeginDropHdl( const Link& rLink )
2161*b1cdbd2cSJim Jagielski {
2162*b1cdbd2cSJim Jagielski 	pEditEngine->SetBeginDropHdl( rLink );
2163*b1cdbd2cSJim Jagielski }
2164*b1cdbd2cSJim Jagielski 
GetBeginDropHdl() const2165*b1cdbd2cSJim Jagielski Link Outliner::GetBeginDropHdl() const
2166*b1cdbd2cSJim Jagielski {
2167*b1cdbd2cSJim Jagielski 	return pEditEngine->GetBeginDropHdl();
2168*b1cdbd2cSJim Jagielski }
2169*b1cdbd2cSJim Jagielski 
2170*b1cdbd2cSJim Jagielski /** sets a link that is called at the end of a drag operation at an edit view */
SetEndDropHdl(const Link & rLink)2171*b1cdbd2cSJim Jagielski void Outliner::SetEndDropHdl( const Link& rLink )
2172*b1cdbd2cSJim Jagielski {
2173*b1cdbd2cSJim Jagielski 	pEditEngine->SetEndDropHdl( rLink );
2174*b1cdbd2cSJim Jagielski }
2175*b1cdbd2cSJim Jagielski 
GetEndDropHdl() const2176*b1cdbd2cSJim Jagielski Link Outliner::GetEndDropHdl() const
2177*b1cdbd2cSJim Jagielski {
2178*b1cdbd2cSJim Jagielski 	return pEditEngine->GetEndDropHdl();
2179*b1cdbd2cSJim Jagielski }
2180*b1cdbd2cSJim Jagielski 
2181*b1cdbd2cSJim Jagielski /** sets a link that is called before a drop or paste operation. */
SetBeginPasteOrDropHdl(const Link & rLink)2182*b1cdbd2cSJim Jagielski void Outliner::SetBeginPasteOrDropHdl( const Link& rLink )
2183*b1cdbd2cSJim Jagielski {
2184*b1cdbd2cSJim Jagielski     maBeginPasteOrDropHdl = rLink;
2185*b1cdbd2cSJim Jagielski }
2186*b1cdbd2cSJim Jagielski 
2187*b1cdbd2cSJim Jagielski /** sets a link that is called after a drop or paste operation. */
SetEndPasteOrDropHdl(const Link & rLink)2188*b1cdbd2cSJim Jagielski void Outliner::SetEndPasteOrDropHdl( const Link& rLink )
2189*b1cdbd2cSJim Jagielski {
2190*b1cdbd2cSJim Jagielski     maEndPasteOrDropHdl = rLink;
2191*b1cdbd2cSJim Jagielski }
2192*b1cdbd2cSJim Jagielski 
SetParaFlag(Paragraph * pPara,sal_uInt16 nFlag)2193*b1cdbd2cSJim Jagielski void Outliner::SetParaFlag( Paragraph* pPara,  sal_uInt16 nFlag )
2194*b1cdbd2cSJim Jagielski {
2195*b1cdbd2cSJim Jagielski     if( pPara && !pPara->HasFlag( nFlag ) )
2196*b1cdbd2cSJim Jagielski     {
2197*b1cdbd2cSJim Jagielski         if( IsUndoEnabled() && !IsInUndo() )
2198*b1cdbd2cSJim Jagielski             InsertUndo( new OutlinerUndoChangeParaFlags( this, (sal_uInt16)GetAbsPos( pPara ), pPara->nFlags, pPara->nFlags|nFlag ) );
2199*b1cdbd2cSJim Jagielski 
2200*b1cdbd2cSJim Jagielski         pPara->SetFlag( nFlag );
2201*b1cdbd2cSJim Jagielski     }
2202*b1cdbd2cSJim Jagielski }
2203*b1cdbd2cSJim Jagielski 
RemoveParaFlag(Paragraph * pPara,sal_uInt16 nFlag)2204*b1cdbd2cSJim Jagielski void Outliner::RemoveParaFlag( Paragraph* pPara, sal_uInt16 nFlag )
2205*b1cdbd2cSJim Jagielski {
2206*b1cdbd2cSJim Jagielski     if( pPara && pPara->HasFlag( nFlag ) )
2207*b1cdbd2cSJim Jagielski     {
2208*b1cdbd2cSJim Jagielski         if( IsUndoEnabled() && !IsInUndo() )
2209*b1cdbd2cSJim Jagielski             InsertUndo( new OutlinerUndoChangeParaFlags( this, (sal_uInt16)GetAbsPos( pPara ), pPara->nFlags, pPara->nFlags & ~nFlag ) );
2210*b1cdbd2cSJim Jagielski 
2211*b1cdbd2cSJim Jagielski         pPara->RemoveFlag( nFlag );
2212*b1cdbd2cSJim Jagielski     }
2213*b1cdbd2cSJim Jagielski }
2214*b1cdbd2cSJim Jagielski 
HasParaFlag(const Paragraph * pPara,sal_uInt16 nFlag) const2215*b1cdbd2cSJim Jagielski bool Outliner::HasParaFlag( const Paragraph* pPara, sal_uInt16 nFlag ) const
2216*b1cdbd2cSJim Jagielski {
2217*b1cdbd2cSJim Jagielski     return pPara && pPara->HasFlag( nFlag );
2218*b1cdbd2cSJim Jagielski }
2219*b1cdbd2cSJim Jagielski 
2220*b1cdbd2cSJim Jagielski 
IsRTL() const2221*b1cdbd2cSJim Jagielski sal_Bool DrawPortionInfo::IsRTL() const
2222*b1cdbd2cSJim Jagielski {
2223*b1cdbd2cSJim Jagielski 	if(0xFF == mnBiDiLevel)
2224*b1cdbd2cSJim Jagielski 	{
2225*b1cdbd2cSJim Jagielski         // Use Bidi functions from icu 2.0 to calculate if this portion
2226*b1cdbd2cSJim Jagielski 		// is RTL or not.
2227*b1cdbd2cSJim Jagielski         UErrorCode nError(U_ZERO_ERROR);
2228*b1cdbd2cSJim Jagielski         UBiDi* pBidi = ubidi_openSized(mrText.Len(), 0, &nError);
2229*b1cdbd2cSJim Jagielski         nError = U_ZERO_ERROR;
2230*b1cdbd2cSJim Jagielski 
2231*b1cdbd2cSJim Jagielski 		// I do not have this info here. Is it necessary? I'll have to ask MT.
2232*b1cdbd2cSJim Jagielski 	    const sal_uInt8 nDefaultDir = UBIDI_LTR; //IsRightToLeft( nPara ) ? UBIDI_RTL : UBIDI_LTR;
2233*b1cdbd2cSJim Jagielski 
2234*b1cdbd2cSJim Jagielski 		ubidi_setPara(pBidi, reinterpret_cast<const UChar *>(mrText.GetBuffer()), mrText.Len(), nDefaultDir, NULL, &nError);	// UChar != sal_Unicode in MinGW
2235*b1cdbd2cSJim Jagielski         nError = U_ZERO_ERROR;
2236*b1cdbd2cSJim Jagielski 
2237*b1cdbd2cSJim Jagielski //        sal_Int32 nCount(ubidi_countRuns(pBidi, &nError));
2238*b1cdbd2cSJim Jagielski 
2239*b1cdbd2cSJim Jagielski         int32_t nStart(0);
2240*b1cdbd2cSJim Jagielski         int32_t nEnd;
2241*b1cdbd2cSJim Jagielski         UBiDiLevel nCurrDir;
2242*b1cdbd2cSJim Jagielski 
2243*b1cdbd2cSJim Jagielski 		ubidi_getLogicalRun(pBidi, nStart, &nEnd, &nCurrDir);
2244*b1cdbd2cSJim Jagielski 
2245*b1cdbd2cSJim Jagielski         ubidi_close(pBidi);
2246*b1cdbd2cSJim Jagielski 
2247*b1cdbd2cSJim Jagielski 		// remember on-demand calculated state
2248*b1cdbd2cSJim Jagielski 		((DrawPortionInfo*)this)->mnBiDiLevel = nCurrDir;
2249*b1cdbd2cSJim Jagielski 	}
2250*b1cdbd2cSJim Jagielski 
2251*b1cdbd2cSJim Jagielski 	return (1 == (mnBiDiLevel % 2));
2252*b1cdbd2cSJim Jagielski }
2253*b1cdbd2cSJim Jagielski 
2254*b1cdbd2cSJim Jagielski // eof
2255