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