Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*************************************************************************
3 : *
4 : * The Contents of this file are made available subject to the terms of
5 : * either of the following licenses
6 : *
7 : * - GNU Lesser General Public License Version 2.1
8 : * - Sun Industry Standards Source License Version 1.1
9 : *
10 : * Sun Microsystems Inc., October, 2000
11 : *
12 : * GNU Lesser General Public License Version 2.1
13 : * =============================================
14 : * Copyright 2000 by Sun Microsystems, Inc.
15 : * 901 San Antonio Road, Palo Alto, CA 94303, USA
16 : *
17 : * This library is free software; you can redistribute it and/or
18 : * modify it under the terms of the GNU Lesser General Public
19 : * License version 2.1, as published by the Free Software Foundation.
20 : *
21 : * This library is distributed in the hope that it will be useful,
22 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : * Lesser General Public License for more details.
25 : *
26 : * You should have received a copy of the GNU Lesser General Public
27 : * License along with this library; if not, write to the Free Software
28 : * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
29 : * MA 02111-1307 USA
30 : *
31 : *
32 : * Sun Industry Standards Source License Version 1.1
33 : * =================================================
34 : * The contents of this file are subject to the Sun Industry Standards
35 : * Source License Version 1.1 (the "License"); You may not use this file
36 : * except in compliance with the License. You may obtain a copy of the
37 : * License at http://www.openoffice.org/license.html.
38 : *
39 : * Software provided under this License is provided on an "AS IS" basis,
40 : * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
41 : * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
42 : * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
43 : * See the License for the specific provisions governing your rights and
44 : * obligations concerning the Software.
45 : *
46 : * The Initial Developer of the Original Code is: IBM Corporation
47 : *
48 : * Copyright: 2008 by IBM Corporation
49 : *
50 : * All Rights Reserved.
51 : *
52 : * Contributor(s): _______________________________________
53 : *
54 : *
55 : ************************************************************************/
56 : /*************************************************************************
57 : * @file
58 : * For LWP filter architecture prototype
59 : ************************************************************************/
60 : /*************************************************************************
61 : * Change History
62 : Jan 2005 Created
63 : ************************************************************************/
64 :
65 : #include "lwppara.hxx"
66 : #include "lwpglobalmgr.hxx"
67 : #include "lwpfilehdr.hxx"
68 : #include "lwpparaproperty.hxx"
69 : #include "lwptools.hxx"
70 : #include "lwpparastyle.hxx"
71 : #include "xfilter/xffont.hxx"
72 : #include "xfilter/xftextstyle.hxx"
73 : #include "xfilter/xfstylemanager.hxx"
74 : #include "xfilter/xfparagraph.hxx"
75 : #include "xfilter/xftextcontent.hxx"
76 : #include "xfilter/xftextspan.hxx"
77 : #include "xfilter/xfmargins.hxx"
78 : #include "xfilter/xftabstop.hxx"
79 : #include "xfilter/xflinebreak.hxx"
80 : #include "xfilter/xfsection.hxx"
81 : #include "xfilter/xfsectionstyle.hxx"
82 : #include "xfilter/xfcolor.hxx"
83 : #include "xfilter/xfhyperlink.hxx"
84 : #include "xfilter/xfliststyle.hxx"
85 : #include "lwpcharsetmgr.hxx"
86 : #include "lwpsection.hxx"
87 : #include "lwplayout.hxx"
88 : #include "lwpusewhen.hxx"
89 : #include "lwpbulletstylemgr.hxx"
90 : #include "lwpstory.hxx"
91 : #include "lwpsilverbullet.hxx"
92 : #include "xfilter/xflist.hxx"
93 : #include "xfilter/xfframe.hxx"
94 :
95 : #include "lwpdivinfo.hxx"
96 : #include "lwpdoc.hxx"
97 : #include "lwpholder.hxx"
98 : #include "lwppagehint.hxx"
99 :
100 : #include "lwpdropcapmgr.hxx"
101 : #include "lwptable.hxx"
102 :
103 262 : LwpPara::LwpPara(LwpObjectHeader& objHdr, LwpSvStream* pStrm)
104 : : LwpDLVList(objHdr, pStrm)
105 : , m_nOrdinal(0)
106 : , m_nFlags(0)
107 : , m_nLevel(0)
108 : , m_pProps(NULL)
109 : , m_pBreaks(NULL)
110 : , m_pIndentOverride(NULL)
111 : , m_FontID(0)
112 : , m_AllText("")
113 : , m_bHasBullet(false)
114 : , m_pSilverBullet(NULL)
115 : , m_pBullOver(NULL)
116 : , m_bBullContinue(false)
117 : , m_SectionStyleName("")
118 : , m_bHasDropcap(false)
119 : , m_nLines(0)
120 : , m_nChars(0)
121 : , m_pDropcapLayout(NULL)
122 : , m_BelowSpacing(0)
123 262 : , m_pXFContainer(NULL)
124 : {
125 262 : }
126 :
127 786 : LwpPara::~LwpPara()
128 : {
129 :
130 262 : if (m_pBreaks)
131 : {
132 127 : delete m_pBreaks;
133 127 : m_pBreaks = NULL;
134 : }
135 : /* if (m_pParaNumbering)
136 : {
137 : delete m_pParaNumbering;
138 : m_pParaNumbering = NULL;
139 : }*/
140 :
141 262 : if (m_pBullOver)
142 : {
143 259 : delete m_pBullOver;
144 259 : m_pBullOver = NULL;
145 : }
146 262 : if(m_pIndentOverride)
147 : {
148 256 : delete m_pIndentOverride;
149 : }
150 :
151 : LwpParaProperty* pNextProp;
152 927 : while(m_pProps)
153 : {
154 403 : pNextProp = m_pProps->GetNext();
155 403 : delete m_pProps;
156 403 : m_pProps = pNextProp;
157 : }
158 524 : }
159 :
160 262 : void LwpPara::Read()
161 : {
162 262 : LwpDLVList::Read();
163 :
164 : bool Simple;
165 262 : bool Notify = false;
166 262 : if(LwpFileHeader::m_nFileRevision<0x0006)
167 0 : Simple = false;
168 262 : else if(LwpFileHeader::m_nFileRevision<0x000B)
169 0 : Simple = m_pObjStrm->QuickReaduInt8() != 0;
170 : else
171 : {
172 262 : sal_uInt8 Flag = m_pObjStrm->QuickReaduInt8();
173 :
174 262 : const int DISK_SIMPLE = 1;
175 262 : const int DISK_NOTIFY = 2;
176 :
177 262 : Simple = (Flag & DISK_SIMPLE) != 0;
178 262 : Notify = (Flag & DISK_NOTIFY) != 0;
179 : }
180 :
181 262 : if(!Simple)
182 : {
183 259 : m_nOrdinal = m_pObjStrm->QuickReaduInt32();
184 259 : if(LwpFileHeader::m_nFileRevision<0x000B)
185 : {
186 : // TODO: to process
187 : assert(false);
188 : /*pCForked3NotifyList Notify = new CForked3NotifyList(this);
189 : Notify->GetExtraList()->QuickRead(pFile);
190 : Notify->QuickRead(pFile);
191 : if(Notify->GetExtraList()->IsEmpty() &&
192 : Notify->IsEmpty())
193 : delete Notify;
194 : else
195 : cNotifyList = Notify;*/
196 : }
197 : else
198 : {
199 259 : if (Notify)
200 : {
201 44 : LwpForked3NotifyList* pNotifyList = new LwpForked3NotifyList();
202 44 : pNotifyList->GetExtraList().Read(m_pObjStrm);
203 44 : pNotifyList->Read(m_pObjStrm);
204 44 : delete pNotifyList;
205 : }
206 : }
207 : }
208 : else
209 3 : m_nOrdinal = 0x0001;
210 :
211 262 : m_nFlags = m_pObjStrm->QuickReaduInt16();
212 262 : m_ParaStyle.ReadIndexed(m_pObjStrm);
213 :
214 262 : if(!Simple)
215 : {
216 259 : m_Hint.Read(m_pObjStrm);
217 : }
218 :
219 262 : m_Story.ReadIndexed(m_pObjStrm);
220 262 : if(!Simple)
221 : {
222 259 : if(LwpFileHeader::m_nFileRevision<0x000B)
223 : {
224 : // TODO: to process
225 : assert(false);
226 : /*PropList = new CParaPropListProperty(this);
227 : PropList->GetList()->QuickRead(pFile);
228 : if(PropList->GetList()->IsEmpty())
229 : {
230 : delete PropList;
231 : PropList = LNULL;
232 : }*/
233 : }
234 259 : m_nLevel = m_pObjStrm->QuickReaduInt16();
235 :
236 : // test
237 259 : if (m_nLevel > 9)
238 : {
239 0 : m_nLevel = 9;
240 : }
241 : // test ends
242 : }
243 : else
244 3 : m_nLevel = 0x0001;
245 :
246 262 : m_Fribs.SetPara(this);//add by 2/1, for silver bullet
247 262 : m_Fribs.ReadPara(m_pObjStrm);
248 :
249 262 : m_pProps = LwpParaProperty::ReadPropertyList(m_pObjStrm,this);
250 262 : }
251 :
252 0 : void LwpPara::Parse(IXFStream* pOutputStream)
253 : {
254 0 : m_pXFContainer = new XFContentContainer;
255 0 : XFConvert(m_pXFContainer);
256 0 : m_pXFContainer->ToXml(pOutputStream);
257 0 : m_pXFContainer->Reset();
258 0 : delete m_pXFContainer;
259 0 : m_pXFContainer = NULL;
260 0 : }
261 :
262 146 : void LwpPara::XFConvert(XFContentContainer* pCont)
263 : {
264 146 : m_pXFContainer = pCont;
265 :
266 146 : LwpStory *pStory = dynamic_cast<LwpStory*>(m_Story.obj().get());
267 :
268 146 : if (pStory && pStory->GetDropcapFlag())
269 : {
270 0 : ParseDropcapContent();
271 146 : return;
272 : }
273 :
274 : //Add the break before para
275 146 : if (m_pBreaks && m_nOrdinal!=0)
276 64 : AddBreakBefore(pCont);
277 :
278 : //Create an XFPara for this VO_PARA
279 146 : XFParagraph *pPara = new XFParagraph;
280 146 : pPara->SetStyleName(m_StyleName);
281 :
282 146 : if(!m_SectionStyleName.isEmpty())
283 : {
284 0 : XFSection* pSection = CreateXFSection();
285 0 : if (pStory)
286 0 : pStory->AddXFContent(pSection);
287 : //pSection->Add(pPara);
288 0 : m_pXFContainer = pSection;
289 : }
290 :
291 146 : if (m_bHasBullet && m_pSilverBullet)
292 : {
293 5 : XFContentContainer* pListItem = AddBulletList(m_pXFContainer);
294 5 : if (pListItem)
295 : {
296 5 : pListItem->Add(pPara);
297 5 : }
298 : }
299 : else
300 : {
301 141 : LwpBulletStyleMgr* pBulletStyleMgr = this->GetBulletStyleMgr();
302 141 : if (pBulletStyleMgr)
303 : {
304 141 : pBulletStyleMgr->SetCurrentSilverBullet(LwpObjectID());
305 141 : pBulletStyleMgr->SetContinueFlag(false);
306 : }
307 141 : m_pXFContainer->Add(pPara);
308 : }
309 :
310 146 : m_Fribs.SetXFPara(pPara);
311 146 : m_Fribs.XFConvert();
312 :
313 146 : if (m_pBreaks)
314 64 : AddBreakAfter(m_pXFContainer);
315 : }
316 :
317 259 : bool LwpPara::RegisterMasterPage(XFParaStyle* pBaseStyle)
318 : {
319 259 : bool bSuccess = false;
320 : //get story
321 259 : LwpStory* pStory = dynamic_cast<LwpStory*>(m_Story.obj().get());
322 : //if pagelayout is modified, register the pagelayout
323 259 : if(pStory && pStory->IsPMModified())
324 : {
325 4 : bool bNewSection = pStory->IsNeedSection();
326 4 : LwpPageLayout* pLayout = pStory->GetCurrentLayout();
327 4 : if(bNewSection)
328 : {
329 0 : RegisterNewSectionStyle(pLayout);
330 : }
331 :
332 4 : bSuccess = true;
333 : //register master page style
334 4 : XFParaStyle* pOverStyle = new XFParaStyle();
335 4 : *pOverStyle = *pBaseStyle;
336 4 : pOverStyle->SetStyleName( "");
337 4 : pOverStyle->SetMasterPage(pLayout->GetStyleName());
338 4 : if (!m_ParentStyleName.isEmpty())
339 4 : pOverStyle->SetParentStyleName(m_ParentStyleName);
340 4 : XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
341 4 : m_StyleName = pXFStyleManager->AddStyle(pOverStyle).m_pStyle->GetStyleName();
342 : }
343 259 : return bSuccess;
344 : }
345 : /**
346 : * @short register paragraph style
347 : */
348 259 : void LwpPara::RegisterStyle()
349 : { //1 reg autostyle
350 : // m_Fribs.SetPara(this);
351 : // m_Fribs.RegisterStyle();
352 :
353 : //2 reg para style
354 259 : if (!m_pFoundry)
355 0 : return;
356 259 : XFParaStyle* pBaseStyle = static_cast<XFParaStyle*>(m_pFoundry->GetStyleManager()->GetStyle(m_ParaStyle));
357 259 : if (pBaseStyle == NULL) return;
358 259 : m_StyleName = pBaseStyle->GetStyleName();//such intf to be added
359 259 : m_ParentStyleName = m_StyleName;
360 259 : XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
361 :
362 259 : if (GetParaStyle()->GetIndent())
363 : {
364 227 : std::unique_ptr<LwpIndentOverride> pIndentOverride(GetParaStyle()->GetIndent()->clone());
365 227 : delete m_pIndentOverride;
366 227 : m_pIndentOverride = pIndentOverride.release();
367 : }
368 :
369 259 : XFParaStyle* pOverStyle = NULL;
370 259 : bool noSpacing = true;
371 259 : LwpParaProperty* pBulletProps = NULL, *pNumberingProps = NULL;
372 :
373 259 : if (m_pProps != NULL)
374 : {
375 150 : bool noIndent = true;
376 150 : pOverStyle = new XFParaStyle;
377 150 : *pOverStyle = *pBaseStyle;
378 150 : pOverStyle->SetStyleName("");
379 150 : LwpParaProperty* pProps = m_pProps;
380 : sal_uInt32 PropType;
381 150 : LwpParaStyle& rParaStyle = dynamic_cast<LwpParaStyle&>(*m_ParaStyle.obj());
382 703 : while (pProps)
383 : {
384 403 : PropType = pProps->GetType();
385 403 : switch(PropType)
386 : {
387 : case PP_LOCAL_ALIGN:
388 : {
389 4 : if (!rParaStyle.GetAlignment())
390 0 : OverrideAlignment(NULL,static_cast<LwpParaAlignProperty*>(pProps)->GetAlignment(),pOverStyle);
391 : else
392 : {
393 : boost::scoped_ptr<LwpAlignmentOverride> const pAlign(
394 4 : rParaStyle.GetAlignment()->clone());
395 : OverrideAlignment(pAlign.get(),
396 : static_cast<LwpParaAlignProperty*>(pProps)->GetAlignment(),
397 4 : pOverStyle);
398 : }
399 : }
400 4 : break;
401 : case PP_LOCAL_INDENT:
402 : {
403 130 : noIndent = false;
404 130 : if (!rParaStyle.GetIndent())
405 29 : OverrideIndent(NULL,static_cast<LwpParaIndentProperty*>(pProps)->GetIndent(),pOverStyle);
406 :
407 : else
408 : {
409 101 : OverrideIndent(m_pIndentOverride,static_cast<LwpParaIndentProperty*>(pProps)->GetIndent(),pOverStyle);
410 : }
411 : }
412 130 : break;
413 : case PP_LOCAL_SPACING:
414 : {
415 112 : noSpacing = false;
416 112 : if (!rParaStyle.GetSpacing())
417 0 : OverrideSpacing(NULL,static_cast<LwpParaSpacingProperty*>(pProps)->GetSpacing(),pOverStyle);
418 : else
419 : {
420 : boost::scoped_ptr<LwpSpacingOverride> const
421 112 : pSpacing(rParaStyle.GetSpacing()->clone());
422 : OverrideSpacing(pSpacing.get(),
423 : static_cast<LwpParaSpacingProperty*>(pProps)->GetSpacing(),
424 112 : pOverStyle);
425 : }
426 : }
427 112 : break;
428 : case PP_LOCAL_BORDER:
429 : {
430 2 : OverrideParaBorder(pProps, pOverStyle);
431 2 : break;
432 : }
433 : case PP_LOCAL_BREAKS:
434 : {
435 127 : OverrideParaBreaks(pProps, pOverStyle);
436 127 : break;
437 : }
438 : case PP_LOCAL_BULLET:
439 : {
440 4 : pBulletProps = pProps;
441 : // OverrideParaBullet(pProps);
442 4 : break;
443 : }
444 : case PP_LOCAL_NUMBERING:
445 : {
446 4 : pNumberingProps = pProps;
447 : // OverrideParaNumbering(pProps);
448 4 : break;
449 : }
450 : //end
451 : case PP_LOCAL_TABRACK:
452 : {
453 : //, 01/28/05
454 : /*LwpTabOverride* pTabOverride=rParaStyle.GetTabOverride();
455 : if(!pTabOverride)
456 : {
457 : OverrideTab(NULL,static_cast<LwpParaTabRackProperty*>(pProps)->GetTab(),pOverStyle);
458 : }
459 : else
460 : {
461 : OverrideTab(pTabOverride,static_cast<LwpParaTabRackProperty*>(pProps)->GetTab(),pOverStyle);
462 : }*/
463 2 : break;
464 : }
465 : case PP_LOCAL_BACKGROUND:
466 : {
467 : /* LwpBackgroundOverride aBackground;
468 : if (!rParaStyle.GetBackground())
469 : OverrideBackground(NULL,static_cast<LwpParaBackGroundProperty*>(pProps)->GetBackground(),pOverStyle);
470 : else
471 : {
472 : aBackground = *(rParaStyle.GetaBackground());
473 : OverrideBackground(&aBackground,static_cast<LwpParaBackGroundProperty*>(pProps)->GetBackground(),pOverStyle);
474 : }
475 : */
476 : // modified by , 06/03/2005
477 18 : LwpBackgroundOverride* pBGOver = static_cast<LwpParaBackGroundProperty*>(pProps)->GetBackground();
478 18 : if (pBGOver)
479 : {
480 18 : LwpBackgroundStuff& rBGStuff = pBGOver->GetBGStuff();
481 18 : if (!rBGStuff.IsTransparent() )
482 : {
483 2 : if (rBGStuff.IsPatternFill())
484 : {
485 0 : XFBGImage* pXFBGImage = rBGStuff.GetFillPattern();
486 0 : pOverStyle->SetBackImage(pXFBGImage);
487 : }
488 : else
489 : {
490 2 : LwpColor* pColor = rBGStuff.GetFillColor();
491 2 : if (pColor && pColor->IsValidColor())
492 : {
493 2 : XFColor aXFColor( pColor->To24Color());
494 2 : pOverStyle->SetBackColor( aXFColor );
495 : }
496 : }
497 : }
498 : }
499 : // end modified
500 18 : break;
501 : }
502 : default:
503 0 : break;
504 : }
505 403 : pProps = pProps->GetNext();
506 : }
507 :
508 150 : if (noIndent && m_pIndentOverride)
509 : {
510 18 : if (m_pIndentOverride->IsUseRelative() && GetParent())
511 : {
512 0 : OverrideIndent(NULL,m_pIndentOverride,pOverStyle);
513 : }
514 : }
515 150 : if (!m_ParentStyleName.isEmpty())
516 150 : pOverStyle->SetParentStyleName(m_ParentStyleName);
517 150 : m_StyleName = pXFStyleManager->AddStyle(pOverStyle).m_pStyle->GetStyleName();
518 :
519 : }
520 : else //use named style
521 : {
522 109 : if (m_pIndentOverride)
523 : {
524 108 : if (m_pIndentOverride->IsUseRelative() && GetParent())
525 : {
526 0 : pOverStyle = new XFParaStyle;
527 0 : *pOverStyle = *pBaseStyle;
528 0 : OverrideIndent(NULL,m_pIndentOverride,pOverStyle);
529 0 : if (!m_ParentStyleName.isEmpty())
530 0 : pOverStyle->SetParentStyleName(m_ParentStyleName);
531 0 : m_StyleName = pXFStyleManager->AddStyle(pOverStyle).m_pStyle->GetStyleName();
532 : }
533 : }
534 : }
535 :
536 259 : if (IsInCell())
537 : {
538 1 : XFParaStyle* pOldStyle = pXFStyleManager->FindParaStyle(m_StyleName);
539 1 : if (pOldStyle->GetNumberRight())
540 : {
541 0 : pOverStyle = new XFParaStyle;
542 0 : *pOverStyle = *pOldStyle;
543 0 : pOverStyle->SetAlignType(enumXFAlignStart);
544 0 : if (!m_ParentStyleName.isEmpty())
545 0 : pOverStyle->SetParentStyleName(m_ParentStyleName);
546 0 : m_StyleName = pXFStyleManager->AddStyle(pOverStyle).m_pStyle->GetStyleName();
547 : }
548 : }
549 :
550 : // override bullet and numbering
551 259 : OverrideParaBullet(pBulletProps);
552 259 : OverrideParaNumbering(pNumberingProps);
553 :
554 : //add by
555 : //register bullet style
556 259 : LwpBulletStyleMgr* pBulletStyleMgr = this->GetBulletStyleMgr();
557 259 : if (pBulletStyleMgr)
558 : {
559 : // if has bullet or numbering
560 259 : if (m_bHasBullet)
561 : {
562 : //if it's normal bullet
563 6 : if (m_pSilverBullet)
564 : {
565 6 : if (m_pSilverBullet->HasName())
566 : {
567 4 : m_aBulletStyleName = m_pSilverBullet->GetBulletStyleName();
568 : }
569 2 : else if (!m_pBullOver->IsEditable())
570 : {
571 2 : m_aBulletStyleName = pBulletStyleMgr->RegisterBulletStyle(this, m_pBullOver, m_pIndentOverride);
572 : }
573 :
574 : // test codes
575 6 : if (m_pSilverBullet->IsBulletOrdered())
576 : {
577 6 : OUString aPreBullStyleName;
578 6 : LwpNumberingOverride* pNumbering = this->GetParaNumbering();
579 6 : sal_uInt16 nPosition = pNumbering->GetPosition();
580 6 : bool bLesser = m_pSilverBullet->IsLesserLevel(nPosition);
581 6 : LwpPara* pPara = this;
582 6 : LwpPara* pPrePara = NULL;
583 6 : sal_uInt16 nNum = 0, nLevel = 0, nFoundLevel = 0xffff, nFoundBound = 0;
584 :
585 6 : nFoundBound = nLevel = pNumbering->GetLevel();
586 6 : if (nPosition == pNumbering->GetPosition())
587 : {
588 6 : nFoundBound++;
589 : }
590 6 : bool bHeading = pNumbering->IsHeading();
591 :
592 : while(true)
593 : {
594 : /*// When we hit the hint paragraph, we can stop and check the hint.
595 : if (qNumberHint && (qPara == qNumberHint->GetPara()) &&
596 : qNumberHint->Lookup(qSilverBullet, Level, Position, &Offset))
597 : {
598 : Num += Offset;
599 : break;
600 : }*/
601 :
602 16 : LwpSilverBullet* pParaSilverBullet = pPara->GetSilverBullet();
603 16 : pNumbering = pPara->GetParaNumbering();
604 :
605 16 : if (pPara->GetObjectID() != this->GetObjectID())
606 : {
607 10 : if (!pParaSilverBullet)
608 : {
609 4 : break;
610 : }
611 :
612 : /* If lesser, stop when we hit an outline style whose level is
613 : * higher than our current level.
614 : */
615 : // restart based on Outline level?
616 6 : if (pNumbering && bLesser && (!bHeading || pNumbering->IsHeading()))
617 : {
618 6 : if (nFoundLevel != 0xffff)
619 : {
620 6 : if (pNumbering->GetLevel() < nFoundLevel)
621 : {
622 0 : break;
623 : }
624 12 : if ((pNumbering->GetLevel() == nFoundLevel)
625 6 : && (pParaSilverBullet->GetObjectID() != m_pSilverBullet->GetObjectID()
626 6 : || pNumbering->GetPosition() != nPosition))
627 : {
628 0 : break;
629 : }
630 : }
631 : else
632 : {
633 0 : if (pNumbering && pNumbering->GetLevel() < nFoundBound && pParaSilverBullet
634 0 : && (pParaSilverBullet->GetObjectID() != m_pSilverBullet->GetObjectID()
635 0 : || pNumbering->GetPosition() != nPosition))
636 : {
637 0 : nFoundBound = pNumbering->GetLevel();
638 : }
639 : }
640 : }
641 :
642 : /*if (qSpecificStyle
643 : && qSpecificStyle == qPara->GetParaStyle(LTRUE))
644 : break;
645 :
646 : // See if we crossed a section boundary
647 : if (ResetSection)
648 : {
649 : CurrPos.SetPara(qPara);
650 : if (CurrPos <= SectionPos)
651 : break;
652 : }*/
653 : }
654 :
655 : // Don't bump the number if this bullet is skipped
656 12 : if (m_pBullOver->IsSkip())
657 : ;
658 12 : else if ( pParaSilverBullet
659 12 : && pParaSilverBullet->GetObjectID() == m_pSilverBullet->GetObjectID()
660 24 : && pNumbering && nPosition == pNumbering->GetPosition())
661 : {
662 12 : if (bLesser)
663 : {
664 10 : if (nFoundLevel != 0xffff)
665 : {
666 6 : if (nFoundLevel == pNumbering->GetLevel())
667 : {
668 6 : aPreBullStyleName = pPara->GetBulletStyleName();
669 6 : nNum++;
670 : }
671 : }
672 4 : else if (pNumbering->GetLevel() <= nLevel)
673 : {
674 4 : if (pNumbering->GetLevel() >= nFoundBound)
675 : {
676 0 : break;
677 : }
678 4 : nFoundLevel = pNumbering->GetLevel();
679 4 : aPreBullStyleName = pPara->GetBulletStyleName();
680 4 : nNum++;
681 : }
682 : }
683 : else
684 : {
685 2 : aPreBullStyleName = pPara->GetBulletStyleName();
686 2 : nNum++;
687 : }
688 : }
689 :
690 12 : pPrePara = dynamic_cast<LwpPara*>(pPara->GetPrevious().obj(VO_PARA).get());
691 :
692 12 : if (!pPrePara)
693 : {
694 2 : LwpStory* pStory = pPara->GetStory();
695 2 : pPrePara = pStory->GetLastParaOfPreviousStory();
696 :
697 2 : if (!pPrePara)
698 : {
699 2 : break;
700 : }
701 : }
702 10 : pPara = pPrePara;
703 : }
704 6 : nNum = nNum ? nNum : 1;
705 :
706 6 : if (nNum > 1)
707 : {
708 3 : m_aBulletStyleName = aPreBullStyleName;
709 3 : m_bBullContinue = true;
710 : }
711 : else
712 : {
713 3 : m_bBullContinue = false;
714 3 : if (this->IsInCell())
715 : {
716 0 : XFListStyle* pOldStyle = static_cast<XFListStyle*>(pXFStyleManager->FindStyle(m_aBulletStyleName));
717 0 : if (pOldStyle)
718 : {
719 0 : XFListStyle* pNewStyle = new XFListStyle(*pOldStyle);
720 0 : m_aBulletStyleName = pXFStyleManager->AddStyle(pNewStyle).m_pStyle->GetStyleName();
721 : }
722 : }
723 : }
724 :
725 6 : LwpStory* pMyStory = this->GetStory();
726 6 : if (pMyStory)
727 : {
728 6 : if (pMyStory->IsBullStyleUsedBefore(m_aBulletStyleName, m_pParaNumbering->GetPosition()))
729 : {
730 : //m_bBullContinue = sal_True;
731 : }
732 : else
733 : {
734 3 : pMyStory->AddBullStyleName2List(m_aBulletStyleName, m_pParaNumbering->GetPosition());
735 : }
736 6 : }
737 :
738 : }
739 : // end of test codes
740 : }
741 : }
742 : }
743 : //end add
744 :
745 259 : if (noSpacing)
746 : {
747 147 : LwpPara* pPrePara = dynamic_cast<LwpPara*>(GetPrevious().obj().get());
748 147 : if (pPrePara && pPrePara->GetBelowSpacing()!=0)
749 : {
750 1 : pOverStyle = new XFParaStyle;
751 1 : *pOverStyle = *GetXFParaStyle();
752 1 : XFMargins* pMargin = &pOverStyle->GetMargins();
753 1 : pMargin->SetTop(pMargin->GetTop()+pPrePara->GetBelowSpacing());
754 1 : if (!m_ParentStyleName.isEmpty())
755 1 : pOverStyle->SetParentStyleName(m_ParentStyleName);
756 1 : m_StyleName = pXFStyleManager->AddStyle(pOverStyle).m_pStyle->GetStyleName();
757 : }
758 : }
759 :
760 : //register tab style
761 259 : if(m_Fribs.HasFrib(FRIB_TAG_TAB))
762 : {
763 25 : XFParaStyle* pParaStyle = new XFParaStyle;
764 25 : *pParaStyle = *GetXFParaStyle();
765 : //pOverStyle->SetStyleName("");
766 25 : this->RegisterTabStyle(pParaStyle);
767 25 : if (!m_ParentStyleName.isEmpty())
768 25 : pParaStyle->SetParentStyleName(m_ParentStyleName);
769 25 : m_StyleName = pXFStyleManager->AddStyle(pParaStyle).m_pStyle->GetStyleName();
770 : }
771 :
772 : //register master page;
773 259 : RegisterMasterPage(GetXFParaStyle());
774 :
775 : // reg auto style,lay here for pagebreak need overrided para style
776 259 : m_Fribs.SetPara(this);
777 259 : m_Fribs.RegisterStyle();
778 :
779 258 : if (m_bHasDropcap)
780 : {
781 0 : GatherDropcapInfo();
782 0 : XFParaStyle* pStyle = new XFParaStyle;
783 0 : *pStyle = *GetXFParaStyle();
784 0 : pStyle->SetDropCap(m_nChars-1,m_nLines);
785 0 : if (!m_ParentStyleName.isEmpty())
786 0 : pStyle->SetParentStyleName(m_ParentStyleName);
787 0 : m_StyleName = pXFStyleManager->AddStyle(pStyle).m_pStyle->GetStyleName();
788 : }
789 : // maybe useful for futer version
790 : // deleted because Leader of Table is not supported in this version
791 : //AddTabStyleForTOC();
792 : }
793 :
794 0 : void LwpPara::RegisterNewSectionStyle(LwpPageLayout *pLayout)
795 : {
796 0 : if( !pLayout )
797 0 : return;
798 :
799 0 : XFSectionStyle* pSectStyle= new XFSectionStyle();
800 0 : XFColumns* pColumns = pLayout->GetXFColumns();
801 0 : if(pColumns)
802 : {
803 0 : pSectStyle->SetColumns(pColumns);
804 : }
805 0 : XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
806 0 : m_SectionStyleName = pXFStyleManager->AddStyle(pSectStyle).m_pStyle->GetStyleName();
807 : }
808 :
809 0 : XFSection* LwpPara::CreateXFSection()
810 : {
811 0 : XFSection* pXFSection = new XFSection();
812 0 : pXFSection->SetStyleName(m_SectionStyleName);
813 0 : m_SectionStyleName.clear();
814 0 : return pXFSection;
815 : }
816 :
817 : /**************************************************************************
818 : * @descr: register tab style
819 : * @param:
820 : * @param:
821 : * @return:
822 : **************************************************************************/
823 25 : void LwpPara::RegisterTabStyle(XFParaStyle* pXFParaStyle)
824 : {
825 25 : LwpTabOverride aFinaOverride;
826 25 : LwpTabOverride* pBase = NULL;
827 : //get the tabrack from the current layout
828 25 : LwpStory* pStory = dynamic_cast<LwpStory*>(m_Story.obj().get());
829 25 : LwpMiddleLayout* pLayout = pStory ? pStory->GetTabLayout() : NULL;
830 25 : if(pLayout)
831 : {
832 25 : pBase = pLayout->GetTabOverride();
833 25 : if(pBase)
834 : {
835 5 : pBase->Override(&aFinaOverride);
836 : }
837 : }
838 :
839 : //get the tabrack from the base parastyle
840 25 : LwpParaStyle* pParaStyle = GetParaStyle();
841 25 : pBase = pParaStyle->GetTabOverride();
842 25 : if(pBase)
843 : {
844 0 : pBase->Override(&aFinaOverride);
845 : }
846 : //get the tabrack from the local property
847 25 : pBase = GetLocalTabOverride();
848 25 : if(pBase)
849 : {
850 2 : pBase->Override(&aFinaOverride);
851 : }
852 :
853 25 : LwpParaStyle::ApplyTab(pXFParaStyle, &aFinaOverride);
854 25 : }
855 : /**
856 : * @short parse dropcap text
857 : */
858 0 : void LwpPara::ParseDropcapContent()
859 : {
860 0 : if (!GetFoundry())
861 0 : return;
862 0 : XFParagraph* pDropcap = GetFoundry()->GetDropcapMgr()->GetXFPara();
863 0 : if (pDropcap)
864 : {
865 0 : m_Fribs.SetXFPara(pDropcap);
866 0 : m_Fribs.XFConvert();
867 : }
868 : }
869 : /**
870 : * @short add paragraph break attribute
871 : */
872 64 : void LwpPara::AddBreakBefore(XFContentContainer* pCont)
873 : {
874 64 : if (!m_pBreaks)
875 64 : return;
876 64 : if (m_pBreaks->IsPageBreakBefore())
877 : {
878 0 : XFParagraph *pPara = new XFParagraph();
879 0 : pPara->SetStyleName(m_BefPageBreakName);
880 0 : pCont->Add(pPara);
881 : }
882 64 : else if (m_pBreaks->IsColumnBreakBefore())
883 : {
884 0 : XFParagraph *pPara = new XFParagraph();
885 0 : pPara->SetStyleName(m_BefColumnBreakName);
886 0 : pCont->Add(pPara);
887 : }
888 : }
889 :
890 64 : void LwpPara::AddBreakAfter(XFContentContainer* pCont)
891 : {
892 64 : if (!m_pBreaks)
893 64 : return;
894 64 : if (m_pBreaks->IsPageBreakAfter())
895 : {
896 0 : XFParagraph *pPara = new XFParagraph();
897 0 : pPara->SetStyleName(m_AftPageBreakName);
898 0 : pCont->Add(pPara);
899 : }
900 64 : else if (m_pBreaks->IsColumnBreakAfter())
901 : {
902 0 : XFParagraph *pPara = new XFParagraph();
903 0 : pPara->SetStyleName(m_AftColumnBreakName);
904 0 : pCont->Add(pPara);
905 : }
906 : }
907 :
908 405 : LwpBulletStyleMgr* LwpPara::GetBulletStyleMgr()
909 : {
910 405 : if (m_pFoundry)
911 : {
912 405 : return m_pFoundry->GetBulletStyleMgr();
913 : }
914 :
915 0 : return NULL;
916 : }
917 :
918 5 : XFContentContainer* LwpPara::AddBulletList(XFContentContainer* pCont)
919 : {
920 5 : LwpBulletStyleMgr* pBulletStyleMgr = GetBulletStyleMgr();
921 5 : if (!pBulletStyleMgr)
922 : {
923 : assert(false);
924 0 : return NULL;
925 : }
926 :
927 5 : sal_uInt16 nLevel = m_nLevel;
928 5 : bool bOrdered = false;
929 5 : /*LwpStory* pMyStory =*/ GetStory();
930 :
931 5 : pBulletStyleMgr->SetContinueFlag(m_bBullContinue);
932 :
933 5 : if (m_pSilverBullet->IsBulletOrdered())
934 : {
935 5 : bOrdered = true;
936 : }
937 5 : if (m_pSilverBullet->HasName())
938 : {
939 4 : nLevel = m_pParaNumbering->GetPosition();
940 4 : m_nLevel = nLevel;//add by ,for get para level
941 : // m_aBulletStyleName = m_pSilverBullet->GetBulletStyleName();
942 : }
943 :
944 : return ( pBulletStyleMgr->AddBulletList(pCont, bOrdered, m_aBulletStyleName,
945 5 : nLevel, m_pBullOver->IsSkip()) );
946 : }
947 :
948 22 : LwpNumberingOverride* LwpPara::GetParaNumbering()
949 : {
950 22 : return m_pParaNumbering.get();
951 : }
952 :
953 44 : void LwpForked3NotifyList::Read(LwpObjectStream* pObjStrm)
954 : {
955 44 : m_PersistentList.Read(pObjStrm);
956 44 : }
957 :
958 90 : void LwpNotifyListPersistent::Read(LwpObjectStream* pObjStrm)
959 : {
960 90 : m_Head.ReadIndexed(pObjStrm);
961 90 : pObjStrm->SkipExtra();
962 90 : }
963 :
964 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|