1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*************************************************************************
4 * The Contents of this file are made available subject to the terms of
5 * either of the following licenses
7 * - GNU Lesser General Public License Version 2.1
8 * - Sun Industry Standards Source License Version 1.1
10 * Sun Microsystems Inc., October, 2000
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
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.
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.
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,
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.
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.
46 * The Initial Developer of the Original Code is: IBM Corporation
48 * Copyright: 2008 by IBM Corporation
50 * All Rights Reserved.
52 * Contributor(s): _______________________________________
55 ************************************************************************/
56 /*************************************************************************
58 * For LWP filter architecture prototype
59 ************************************************************************/
63 #include "lwpparastyle.hxx"
64 #include <lwpfilehdr.hxx>
65 #include <lwpoverride.hxx>
66 #include "lwpparaborderoverride.hxx"
67 #include "lwpbreaksoverride.hxx"
68 #include "lwpnumberingoverride.hxx"
69 #include "lwptaboverride.hxx"
70 #include "lwpbackgroundoverride.hxx"
71 #include <o3tl/safeint.hxx>
72 #include <xfilter/xfdefs.hxx>
73 #include <xfilter/xfparastyle.hxx>
74 #include <xfilter/xfborders.hxx>
75 #include <lwpfont.hxx>
76 #include <lwpfoundry.hxx>
77 #include "lwppiece.hxx"
78 #include "lwpshadow.hxx"
79 #include "lwpborderstuff.hxx"
80 #include "lwpmargins.hxx"
81 #include "lwptabrack.hxx"
83 LwpParaStyle::LwpParaStyle(LwpObjectHeader
const & objHdr
, LwpSvStream
* pStrm
) :
84 LwpTextStyle(objHdr
, pStrm
)
88 LwpParaStyle::~LwpParaStyle()
92 void LwpParaStyle::Read()
96 if (LwpFileHeader::m_nFileRevision
< 0x000B)
98 // read many overrides
99 LwpAlignmentOverride aAlignOverride
;
100 aAlignOverride
.Read(m_pObjStrm
.get());
102 LwpSpacingOverride aSpacingOverride
;
103 aSpacingOverride
.Read(m_pObjStrm
.get());
105 LwpIndentOverride aIndentOverride
;
106 aIndentOverride
.Read(m_pObjStrm
.get());
108 LwpParaBorderOverride aPBOverride
;
109 aPBOverride
.Read(m_pObjStrm
.get());
111 LwpBreaksOverride aBreaksOverride
;
112 aBreaksOverride
.Read(m_pObjStrm
.get());
114 LwpNumberingOverride aNumberingOverride
;
115 aNumberingOverride
.Read(m_pObjStrm
.get());
117 LwpTabOverride aTabOverride
;
118 aTabOverride
.Read(m_pObjStrm
.get());
123 m_AlignmentStyle
.ReadIndexed(m_pObjStrm
.get());
124 m_SpacingStyle
.ReadIndexed(m_pObjStrm
.get());
125 m_IndentStyle
.ReadIndexed(m_pObjStrm
.get());
126 m_BorderStyle
.ReadIndexed(m_pObjStrm
.get());
127 m_BreaksStyle
.ReadIndexed(m_pObjStrm
.get());
128 m_NumberingStyle
.ReadIndexed(m_pObjStrm
.get());
129 m_TabStyle
.ReadIndexed(m_pObjStrm
.get());
131 m_KinsokuOptsOverride
.Read(m_pObjStrm
.get());
132 m_BulletOverride
.Read(m_pObjStrm
.get());
134 if (m_pObjStrm
->CheckExtra())
136 m_BackgroundStyle
.ReadIndexed(m_pObjStrm
.get());
137 m_pObjStrm
->SkipExtra();
143 void LwpParaStyle::Apply(XFParaStyle
*pParaStyle
)
148 LwpVirtualPiece
*pPiece
= dynamic_cast<LwpVirtualPiece
*>(m_AlignmentStyle
.obj().get());
151 LwpAlignmentOverride
*pAlign
= dynamic_cast<LwpAlignmentOverride
*>(pPiece
->GetOverride());
153 ApplyAlignment(pParaStyle
,pAlign
);
156 //don't known top and bottom indent now.
157 pPiece
= dynamic_cast<LwpVirtualPiece
*>(m_IndentStyle
.obj().get());
160 LwpIndentOverride
*pIndent
= dynamic_cast<LwpIndentOverride
*>(pPiece
->GetOverride());
163 if (!m_BulletOverride
.IsInValid())// for remove bullet indent in named bullet style
165 std::unique_ptr
<LwpIndentOverride
> pNewIndent(pIndent
->clone());
166 pNewIndent
->SetMFirst(0);
167 pNewIndent
->SetMRest(0);
168 ApplyIndent(nullptr, pParaStyle
, pNewIndent
.get());
171 ApplyIndent(nullptr,pParaStyle
,pIndent
);
175 pPiece
= dynamic_cast<LwpVirtualPiece
*>(m_BorderStyle
.obj().get());
178 LwpParaBorderOverride
*pBorder
= dynamic_cast<LwpParaBorderOverride
*>(pPiece
->GetOverride());
181 ApplyParaBorder(pParaStyle
, pBorder
);
185 pPiece
= dynamic_cast<LwpVirtualPiece
*>(m_SpacingStyle
.obj().get());
188 LwpSpacingOverride
*pSpacing
= dynamic_cast<LwpSpacingOverride
*>(pPiece
->GetOverride());
190 ApplySpacing(nullptr,pParaStyle
,pSpacing
);
193 //paragraph background.
194 pPiece
= dynamic_cast<LwpVirtualPiece
*>(m_BackgroundStyle
.obj().get());
197 LwpBackgroundOverride
*pBack
= dynamic_cast<LwpBackgroundOverride
*>(pPiece
->GetOverride());
200 LwpColor color
= pBack
->GetBackColor();
201 XFColor
aXFColor( color
.To24Color() );
202 pParaStyle
->SetBackColor( aXFColor
);
207 pPiece
= dynamic_cast<LwpVirtualPiece
*>(m_TabStyle
.obj().get());
210 LwpTabOverride
*pTab
= dynamic_cast<LwpTabOverride
*>(pPiece
->GetOverride());
213 ApplyTab(pParaStyle
,pTab
);
216 pPiece
= dynamic_cast<LwpVirtualPiece
*>(m_BreaksStyle
.obj().get());
219 LwpBreaksOverride
*pBreak
= dynamic_cast<LwpBreaksOverride
*>(pPiece
->GetOverride());
222 ApplyBreaks(pParaStyle
,pBreak
);
228 void LwpParaStyle::ApplySubBorder(LwpBorderStuff
* pBorderStuff
, LwpBorderStuff::BorderType eType
, XFBorders
* pXFBorders
)
230 enumXFBorder eXFBorderSide
= enumXFBorderNone
;
233 case LwpBorderStuff::LEFT
:
234 eXFBorderSide
= enumXFBorderLeft
;
236 case LwpBorderStuff::RIGHT
:
237 eXFBorderSide
= enumXFBorderRight
;
239 case LwpBorderStuff::TOP
:
240 eXFBorderSide
= enumXFBorderTop
;
242 case LwpBorderStuff::BOTTOM
:
243 eXFBorderSide
= enumXFBorderBottom
;
249 LwpColor aColor
= pBorderStuff
->GetSideColor(eType
);
250 float fWidth
= pBorderStuff
->GetSideWidth(eType
);
251 sal_uInt16 nType
= pBorderStuff
->GetSideType(eType
);
255 default://fall through!
256 case 0x14: //single fall through!
258 pXFBorders
->SetWidth(eXFBorderSide
, fWidth
);
260 case 0x15: //double , fall through!
261 case 0x16: //thick double
262 pXFBorders
->SetDoubleLine(eXFBorderSide
);
263 pXFBorders
->SetWidthOuter(eXFBorderSide
, static_cast<float>(fWidth
*0.333));
264 pXFBorders
->SetWidthSpace(eXFBorderSide
, static_cast<float>(fWidth
*0.334));
265 pXFBorders
->SetWidthInner(eXFBorderSide
, static_cast<float>(fWidth
*0.333));
266 // pXFBorders->SetWidth(eXFBorderSide, fWidth);
268 case 0x18: //thick-thin
269 pXFBorders
->SetDoubleLine(eXFBorderSide
);
270 pXFBorders
->SetWidthOuter(eXFBorderSide
, static_cast<float>(fWidth
*0.5));
271 pXFBorders
->SetWidthInner(eXFBorderSide
, static_cast<float>(fWidth
*0.25));
272 pXFBorders
->SetWidthSpace(eXFBorderSide
, static_cast<float>(fWidth
*0.25));
274 case 0x19: //thin-thick
275 pXFBorders
->SetDoubleLine(eXFBorderSide
);
276 pXFBorders
->SetWidthInner(eXFBorderSide
, static_cast<float>(fWidth
*0.7));
277 pXFBorders
->SetWidthOuter(eXFBorderSide
, static_cast<float>(fWidth
*0.15));
278 pXFBorders
->SetWidthSpace(eXFBorderSide
, static_cast<float>(fWidth
*0.15));
282 if (aColor
.IsValidColor())
284 XFColor
aXFColor(aColor
.To24Color());
285 pXFBorders
->SetColor(eXFBorderSide
, aXFColor
);
289 void LwpParaStyle::ApplyParaBorder(XFParaStyle
* pParaStyle
, LwpParaBorderOverride
* pBorder
)
292 LwpShadow
*pShadow
= pBorder
->GetShadow();
295 LwpColor color
= pShadow
->GetColor();
296 float offsetX
= pShadow
->GetOffsetX();
297 float offsetY
= pShadow
->GetOffsetY();
299 if( offsetX
&& offsetY
&& color
.IsValidColor() )
301 XFColor
aXFColor(color
.To24Color());
311 pParaStyle
->SetShadow(enumXFShadowLeftTop
,-offsetX
,aXFColor
);
313 pParaStyle
->SetShadow(enumXFShadowLeftBottom
,-offsetX
,aXFColor
);
318 pParaStyle
->SetShadow(enumXFShadowRightTop
,offsetX
,aXFColor
);
320 pParaStyle
->SetShadow(enumXFShadowRightBottom
,offsetX
,aXFColor
);
325 //convert to XFBorders object:
326 LwpBorderStuff
*pBorderStuff
= pBorder
->GetBorderStuff();
327 if( !(pBorderStuff
&& pBorderStuff
->GetSide() != 0) )
330 XFBorders
*pXFBorders
= new XFBorders();
331 pParaStyle
->SetBorders(pXFBorders
);
333 LwpMargins
* pMargins
= pBorder
->GetMargins();
335 // apply 4 borders respectively
336 LwpBorderStuff::BorderType pType
[] = { LwpBorderStuff::LEFT
, LwpBorderStuff::RIGHT
,
337 LwpBorderStuff::TOP
, LwpBorderStuff::BOTTOM
};
338 float pMarginValue
[4] = { 0.0, 0.0, 0.0, 0.0 };
340 for (sal_uInt8 nC
= 0; nC
< 4; nC
++)
342 if (pBorderStuff
->HasSide(pType
[nC
]))
344 ApplySubBorder(pBorderStuff
, pType
[nC
], pXFBorders
);
346 //get border spacing to text content
349 pMarginValue
[nC
] = static_cast<float>(pMargins
->GetMarginsValue(nC
));
355 //apply border spacing to text content
356 pParaStyle
->SetPadding(pMarginValue
[0], pMarginValue
[1], pMarginValue
[2], pMarginValue
[3]);
359 void LwpParaStyle::ApplyBreaks(XFParaStyle
* pParaStyle
, const LwpBreaksOverride
* pBreaks
)
361 if (pBreaks
->IsKeepWithNext())
363 pParaStyle
->SetBreaks(enumXFBreakKeepWithNext
);
365 if (pBreaks
->IsPageBreakBefore())
367 pParaStyle
->SetBreaks(enumXFBreakBefPage
);
369 if (pBreaks
->IsPageBreakAfter())
371 pParaStyle
->SetBreaks(enumXFBreakAftPage
);
373 if (pBreaks
->IsColumnBreakBefore())
375 pParaStyle
->SetBreaks(enumXFBreakBefColumn
);
377 if (pBreaks
->IsColumnBreakAfter())
379 pParaStyle
->SetBreaks(enumXFBreakAftColumn
);
383 void LwpParaStyle::ApplyAlignment(XFParaStyle
* pParaStyle
, const LwpAlignmentOverride
* pAlign
)
385 enumXFAlignType alignType
= enumXFAlignStart
;
386 auto type
= pAlign
->GetAlignType();
388 pParaStyle
->SetNumberRight(false);//to identify its align attribute
391 case LwpAlignmentOverride::ALIGN_LEFT
:
392 alignType
= enumXFAlignStart
;
394 case LwpAlignmentOverride::ALIGN_RIGHT
:
395 alignType
= enumXFAlignEnd
;
397 case LwpAlignmentOverride::ALIGN_CENTER
:
398 alignType
= enumXFAlignCenter
;
400 case LwpAlignmentOverride::ALIGN_NUMERICLEFT
://if non-number in table,ALIGN_NUMERICLEFT/RIGHT are useless
401 alignType
= enumXFAlignStart
; //note by 1/28
403 case LwpAlignmentOverride::ALIGN_JUSTIFY
:
404 case LwpAlignmentOverride::ALIGN_JUSTIFYALL
:
405 alignType
= enumXFAlignJustify
;
407 case LwpAlignmentOverride::ALIGN_NUMERICRIGHT
:
408 pParaStyle
->SetNumberRight(true);//to identify its align attribute
409 alignType
= enumXFAlignEnd
;
414 pParaStyle
->SetAlignType(alignType
);
417 void LwpParaStyle::ApplyIndent(LwpPara
* pPara
, XFParaStyle
* pParaStyle
, const LwpIndentOverride
* pIndent
)
419 LwpPara
* pParentPara
;
421 pParentPara
= pPara
->GetParent();
423 pParentPara
= nullptr;
425 std::unique_ptr
<LwpIndentOverride
> pTotalIndent(new LwpIndentOverride
);
426 if (pIndent
->IsUseRelative() && pParentPara
)
428 LwpIndentOverride
* pParentIndent
= pParentPara
->GetIndent();
431 pTotalIndent
.reset(pIndent
->clone());
434 if (pPara
&& pPara
->GetBulletFlag())
436 pTotalIndent
->SetMAll(o3tl::saturating_add(pParentIndent
->GetMAll(), pTotalIndent
->GetMAll()));
437 pTotalIndent
->SetMRight(o3tl::saturating_add(pParentIndent
->GetMRight(), pTotalIndent
->GetMRight()));
438 pParaStyle
->SetMargins(LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(
439 pTotalIndent
->GetMAll())), pTotalIndent
->GetRight());
440 pPara
->SetIndent(pTotalIndent
.release());
443 sal_uInt16 relative
= pParentIndent
->GetRelative();
445 sal_Int32 Amount
= pParentIndent
->GetMAll();
447 if (relative
== LwpIndentOverride::RELATIVE_FIRST
)
448 Amount
= o3tl::saturating_add(Amount
, pParentIndent
->GetMFirst());
449 else if (relative
== LwpIndentOverride::RELATIVE_REST
)
450 Amount
= o3tl::saturating_add(Amount
, pParentIndent
->GetMRest());
451 pTotalIndent
->SetMAll(o3tl::saturating_add(Amount
, pTotalIndent
->GetMAll()));
452 pTotalIndent
->SetMRight(o3tl::saturating_add(pParentIndent
->GetMRight(), pTotalIndent
->GetMRight()));
454 pParaStyle
->SetIndent(pTotalIndent
->GetFirst());
455 pParaStyle
->SetMargins(pTotalIndent
->GetLeft(), pTotalIndent
->GetRight());
456 pPara
->SetIndent(pTotalIndent
.release());
461 pTotalIndent
.reset(pIndent
->clone());
462 if (pPara
&& pPara
->GetBulletFlag())
464 pParaStyle
->SetMargins(LwpTools::ConvertToMetric(
465 LwpTools::ConvertFromUnits(pIndent
->GetMAll())), pIndent
->GetRight());
466 pPara
->SetIndent(pTotalIndent
.release());
470 pParaStyle
->SetIndent(pIndent
->GetFirst());
471 pParaStyle
->SetMargins(pIndent
->GetLeft(), pIndent
->GetRight());
474 pPara
->SetIndent(pTotalIndent
.release());
479 void LwpParaStyle::ApplySpacing(LwpPara
* pPara
, XFParaStyle
* pParaStyle
, LwpSpacingOverride
* pSpacing
)
481 LwpSpacingCommonOverride
* spacing
= pSpacing
->GetSpacing();
482 LwpSpacingCommonOverride
* abovepara
= pSpacing
->GetAboveSpacing();
483 LwpSpacingCommonOverride
* belowpara
= pSpacing
->GetBelowSpacing();
485 LwpSpacingCommonOverride::SpacingType type
= spacing
->GetType();
486 sal_Int32 amount
= spacing
->GetAmount();
487 sal_Int32 multiple
= spacing
->GetMultiple();
493 case LwpSpacingCommonOverride::SPACING_DYNAMIC
:
495 xftype
= enumLHPercent
;
496 height
= double(multiple
)/65536L*100;
497 pParaStyle
->SetLineHeight(xftype
,height
);
500 case LwpSpacingCommonOverride::SPACING_LEADING
:
502 xftype
= enumLHSpace
;
503 height
= LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(amount
));
504 pParaStyle
->SetLineHeight(xftype
,height
);
507 case LwpSpacingCommonOverride::SPACING_CUSTOM
:
509 xftype
= enumLHHeight
;
510 height
= LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(sal_Int32(float(multiple
)/65536L*amount
)));
511 pParaStyle
->SetLineHeight(xftype
,height
);
514 case LwpSpacingCommonOverride::SPACING_NONE
:
518 //TO DO: Above Line need to be processed!!!!!!! what it means?????? 1-26
520 type
= abovepara
->GetType();
521 amount
= abovepara
->GetAmount();
522 multiple
= abovepara
->GetMultiple();
523 double above_val
=-1;
526 case LwpSpacingCommonOverride::SPACING_DYNAMIC
:
528 case LwpSpacingCommonOverride::SPACING_LEADING
:
530 case LwpSpacingCommonOverride::SPACING_CUSTOM
:
531 above_val
= LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(sal_Int32(float(multiple
)/65536L*amount
)));
533 case LwpSpacingCommonOverride::SPACING_NONE
:
537 type
= belowpara
->GetType();
538 amount
= belowpara
->GetAmount();
539 multiple
= belowpara
->GetMultiple();
543 case LwpSpacingCommonOverride::SPACING_DYNAMIC
:
545 case LwpSpacingCommonOverride::SPACING_LEADING
:
547 case LwpSpacingCommonOverride::SPACING_CUSTOM
:
548 below_val
= LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(sal_Int32(float(multiple
)/65536L*amount
)));
550 case LwpSpacingCommonOverride::SPACING_NONE
:
557 pPara
->SetBelowSpacing(below_val
);
558 LwpPara
* pPrePara
= dynamic_cast<LwpPara
*>(pPara
->GetPrevious().obj().get());
559 if (pPrePara
&& above_val
!= -1)
561 above_val
+= pPrePara
->GetBelowSpacing();
566 pParaStyle
->SetMargins(-1,-1,above_val
,below_val
);
569 void LwpParaStyle::ApplyTab(XFParaStyle
*pParaStyle
, LwpTabOverride
*pTabOverRide
)
571 LwpObjectID
& rTabRackID
= pTabOverRide
->GetTabRackID();
572 if(rTabRackID
.IsNull())
577 LwpTabRack
* pTabRack
= dynamic_cast<LwpTabRack
*>(rTabRackID
.obj().get());
583 pParaStyle
->ClearTabStyles();
584 //Get margin left value
585 double dMarginLeft
= pParaStyle
->GetMargins().GetLeft();
587 sal_uInt16 nNumTabs
= pTabRack
->GetNumTabs();
588 for(sal_uInt16 nIndex
=0; nIndex
<nNumTabs
; nIndex
++)
591 LwpTab
* pTab
= pTabRack
->Lookup(nIndex
);
595 enumXFTab eType
= enumXFTabNone
;
596 sal_uInt32 type
= pTab
->GetTabType();
599 case LwpTab::TT_LEFT
:
600 eType
= enumXFTabLeft
;
602 case LwpTab::TT_CENTER
:
603 eType
= enumXFTabCenter
;
605 case LwpTab::TT_RIGHT
:
606 eType
= enumXFTabRight
;
608 case LwpTab::TT_NUMERIC
:
609 eType
= enumXFTabChar
;
614 sal_uInt32 nPos
= pTab
->GetPosition();
615 //different feature between SODC and lwp, the tab length must minus the margin left of para.
616 double fLen
= LwpTools::ConvertFromUnitsToMetric(nPos
) - dMarginLeft
;
619 sal_Unicode cLeader
= 0x00;
620 auto leader
= pTab
->GetLeaderType();
623 case LwpTab::TL_NONE
:
624 cLeader
= 0x20; //space
626 case LwpTab::TL_HYPHEN
: //'-'
629 case LwpTab::TL_DOT
: //'.'
632 case LwpTab::TL_LINE
: //'_'
637 sal_Unicode cAlignChar
= static_cast<sal_Unicode
>(pTab
->GetAlignChar());
639 pParaStyle
->AddTabStyle(eType
,fLen
,cLeader
,cAlignChar
);
644 void LwpParaStyle::RegisterStyle()
647 throw std::runtime_error("missing Foundry");
649 std::unique_ptr
<XFParaStyle
> xStyle(new XFParaStyle());
652 OUString styleName
= GetName().str();
653 xStyle
->SetStyleName(styleName
);
656 LwpFontManager
& rFontMgr
= m_pFoundry
->GetFontManager();
657 rtl::Reference
<XFFont
> pFont
= rFontMgr
.CreateFont(m_nFinalFontID
);
658 xStyle
->SetFont(pFont
);
660 //Set other paragraph properties...
664 LwpStyleManager
* pStyleMgr
= m_pFoundry
->GetStyleManager();
665 pStyleMgr
->AddStyle(GetObjectID(), std::move(xStyle
));
668 LwpAlignmentOverride
* LwpParaStyle::GetAlignment()
670 if (m_AlignmentStyle
.obj() == nullptr)
673 LwpAlignmentPiece
*pPiece
= dynamic_cast<LwpAlignmentPiece
*>(m_AlignmentStyle
.obj().get());
675 return dynamic_cast<LwpAlignmentOverride
*>(pPiece
->GetOverride());
679 LwpIndentOverride
* LwpParaStyle::GetIndent()
681 if (m_IndentStyle
.obj() == nullptr)
684 LwpIndentPiece
*pPiece
= dynamic_cast<LwpIndentPiece
*>(m_IndentStyle
.obj().get());
686 return dynamic_cast<LwpIndentOverride
*>(pPiece
->GetOverride());
690 LwpSpacingOverride
* LwpParaStyle::GetSpacing()
692 if (m_SpacingStyle
.obj() == nullptr)
695 LwpSpacingPiece
*pPiece
= dynamic_cast<LwpSpacingPiece
*>(m_SpacingStyle
.obj().get());
697 return dynamic_cast<LwpSpacingOverride
*>(pPiece
->GetOverride());
701 LwpParaBorderOverride
* LwpParaStyle::GetParaBorder() const
703 if(m_BorderStyle
.IsNull())
706 LwpParaBorderPiece
*pPiece
= dynamic_cast<LwpParaBorderPiece
*>(m_BorderStyle
.obj(VO_PARABORDERPIECE
).get());
708 return dynamic_cast<LwpParaBorderOverride
*>(pPiece
->GetOverride());
712 LwpBreaksOverride
* LwpParaStyle::GetBreaks() const
714 if(m_BreaksStyle
.IsNull())
717 LwpBreaksPiece
*pPiece
= dynamic_cast<LwpBreaksPiece
*>(m_BreaksStyle
.obj(VO_BREAKSPIECE
).get());
719 return dynamic_cast<LwpBreaksOverride
*>(pPiece
->GetOverride());
724 LwpNumberingOverride
* LwpParaStyle::GetNumberingOverride() const
726 if(m_NumberingStyle
.IsNull())
729 LwpNumberingPiece
*pPiece
= dynamic_cast<LwpNumberingPiece
*>(m_NumberingStyle
.obj(VO_NUMBERINGPIECE
).get());
731 return dynamic_cast<LwpNumberingOverride
*>(pPiece
->GetOverride());
735 LwpTabOverride
* LwpParaStyle::GetTabOverride() const
737 if(m_TabStyle
.obj() == nullptr)
739 LwpTabPiece
*pPiece
= dynamic_cast<LwpTabPiece
*>(m_TabStyle
.obj().get());
741 return dynamic_cast<LwpTabOverride
*>(pPiece
->GetOverride());
745 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */