LCOV - code coverage report
Current view: top level - libreoffice/lotuswordpro/source/filter - lwpparastyle.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 270 379 71.2 %
Date: 2012-12-27 Functions: 21 21 100.0 %
Legend: Lines: hit not hit

          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 <boost/scoped_ptr.hpp>
      66             : 
      67             : #include "lwpparastyle.hxx"
      68             : #include "lwpfilehdr.hxx"
      69             : #include "lwpoverride.hxx"
      70             : #include "lwpparaborderoverride.hxx"
      71             : #include "lwpbreaksoverride.hxx"
      72             : #include "lwpnumberingoverride.hxx"
      73             : #include "lwptaboverride.hxx"
      74             : #include "lwpbackgroundoverride.hxx"
      75             : #include "xfilter/xfdefs.hxx"
      76             : #include "xfilter/xfparastyle.hxx"
      77             : #include "xfilter/xfborders.hxx"
      78             : #include "lwpfont.hxx"
      79             : #include "lwpfoundry.hxx"
      80             : #include "lwppiece.hxx"
      81             : #include "lwpshadow.hxx"
      82             : #include "lwpborderstuff.hxx"
      83             : #include "lwpmargins.hxx"
      84             : #include "lwptabrack.hxx"
      85             : 
      86             : #include "lwpsilverbullet.hxx"
      87             : 
      88             : 
      89          68 : LwpParaStyle::LwpParaStyle(LwpObjectHeader& objHdr, LwpSvStream* pStrm) :
      90          68 : LwpTextStyle(objHdr, pStrm), m_pKinsokuOptsOverride(new LwpKinsokuOptsOverride),
      91         136 : m_pBulletOverride(new LwpBulletOverride)
      92             : {
      93          68 : }
      94             : 
      95         204 : LwpParaStyle::~LwpParaStyle()
      96             : {
      97          68 :     if (m_pKinsokuOptsOverride)
      98             :     {
      99          68 :         delete m_pKinsokuOptsOverride;
     100             :     }
     101             : 
     102          68 :     if (m_pBulletOverride)
     103             :     {
     104          68 :         delete m_pBulletOverride;
     105             :     }
     106         136 : }
     107             : 
     108          68 : void LwpParaStyle::Read()
     109             : {
     110          68 :     LwpTextStyle::Read();
     111             : 
     112          68 :     if (LwpFileHeader::m_nFileRevision < 0x000B)
     113             :     {
     114             :         // read many overrides
     115           0 :         LwpAlignmentOverride    aAlignOverride;
     116           0 :         aAlignOverride.Read(m_pObjStrm);
     117             : 
     118           0 :         LwpSpacingOverride  aSpacingOverride;
     119           0 :         aSpacingOverride.Read(m_pObjStrm);
     120             : 
     121           0 :         LwpIndentOverride       aIndentOverride;
     122           0 :         aIndentOverride.Read(m_pObjStrm);
     123             : 
     124           0 :         LwpParaBorderOverride   aPBOverride;
     125           0 :         aPBOverride.Read(m_pObjStrm);
     126             : 
     127           0 :         LwpBreaksOverride   aBreaksOverride;
     128           0 :         aBreaksOverride.Read(m_pObjStrm);
     129             : 
     130           0 :         LwpNumberingOverride    aNumberingOverride;
     131           0 :         aNumberingOverride.Read(m_pObjStrm);
     132             : 
     133           0 :         LwpTabOverride      aTabOverride;
     134           0 :         aTabOverride.Read(m_pObjStrm);
     135             : 
     136             :     }
     137             :     else
     138             :     {
     139          68 :         m_AlignmentStyle.ReadIndexed(m_pObjStrm);
     140          68 :         m_SpacingStyle.ReadIndexed(m_pObjStrm);
     141          68 :         m_IndentStyle.ReadIndexed(m_pObjStrm);
     142          68 :         m_BorderStyle.ReadIndexed(m_pObjStrm);
     143          68 :         m_BreaksStyle.ReadIndexed(m_pObjStrm);
     144          68 :         m_NumberingStyle.ReadIndexed(m_pObjStrm);
     145          68 :         m_TabStyle.ReadIndexed(m_pObjStrm);
     146             : 
     147          68 :         m_pKinsokuOptsOverride->Read(m_pObjStrm);
     148          68 :         m_pBulletOverride->Read(m_pObjStrm);
     149             : 
     150          68 :         if (m_pObjStrm->CheckExtra())
     151             :         {
     152          52 :             m_BackgroundStyle.ReadIndexed(m_pObjStrm);
     153          52 :             m_pObjStrm->SkipExtra();
     154             :         }
     155             : 
     156             : 
     157             :     }
     158          68 : }
     159             : 
     160          68 : void LwpParaStyle::Apply(XFParaStyle *pParaStyle)
     161             : {
     162             :     assert(pParaStyle);
     163          68 :     if (!pParaStyle)
     164          68 :         return;
     165             : 
     166          68 :     LwpVirtualPiece *pPiece = NULL;
     167             :     //alignment:
     168          68 :     pPiece = dynamic_cast<LwpVirtualPiece*>(m_AlignmentStyle.obj());
     169          68 :     if( pPiece )
     170             :     {
     171          20 :         LwpAlignmentOverride *pAlign = dynamic_cast<LwpAlignmentOverride*>(pPiece->GetOverride());
     172          20 :         if( pAlign )
     173          20 :                 ApplyAlignment(pParaStyle,pAlign);
     174             :     }
     175             : 
     176             :     //don't known top and bottom indent now.
     177          68 :     pPiece = dynamic_cast<LwpVirtualPiece*>(m_IndentStyle.obj());
     178          68 :     if( pPiece )
     179             :     {
     180          49 :         LwpIndentOverride   *pIndent = dynamic_cast<LwpIndentOverride*>(pPiece->GetOverride());
     181          49 :         if( pIndent )
     182             :         {
     183          49 :             if (!m_pBulletOverride->IsInValid())//Add by ,for remove bullet indent in named bullet style
     184             :             {
     185          41 :                 boost::scoped_ptr<LwpIndentOverride> pNewIndent(pIndent->clone());
     186          41 :                 pNewIndent->SetMFirst(0);
     187          41 :                 pNewIndent->SetMRest(0);
     188          41 :                 ApplyIndent(NULL, pParaStyle, pNewIndent.get());
     189             :             }
     190             :             else
     191           8 :                 ApplyIndent(NULL,pParaStyle,pIndent);
     192             :         }
     193             :     }
     194             :     //shadow & borders.
     195          68 :     pPiece = dynamic_cast<LwpVirtualPiece*>(m_BorderStyle.obj());
     196          68 :     if( pPiece )
     197             :     {
     198           4 :         LwpParaBorderOverride *pBorder = dynamic_cast<LwpParaBorderOverride*>(pPiece->GetOverride());
     199           4 :         if( pBorder )
     200             :         {
     201           4 :             this->ApplyParaBorder(pParaStyle, pBorder);
     202             :         }
     203             :     }
     204             : 
     205          68 :     pPiece = dynamic_cast<LwpVirtualPiece*>(m_SpacingStyle.obj());
     206          68 :     if (pPiece)
     207             :     {
     208          27 :         LwpSpacingOverride *pSpacing = dynamic_cast<LwpSpacingOverride*>(pPiece->GetOverride());
     209          27 :         if( pSpacing)
     210          27 :             ApplySpacing(NULL,pParaStyle,pSpacing);
     211             :     }
     212             : 
     213             :     //paragraph background.
     214          68 :     pPiece = dynamic_cast<LwpVirtualPiece*>(m_BackgroundStyle.obj());
     215          68 :     if( pPiece )
     216             :     {
     217           0 :         LwpBackgroundOverride *pBack = dynamic_cast<LwpBackgroundOverride*>(pPiece->GetOverride());
     218           0 :         if( pBack )
     219             :         {
     220           0 :             LwpColor color = pBack->GetBackColor();
     221           0 :             XFColor aXFColor( color.To24Color() );
     222           0 :             pParaStyle->SetBackColor( aXFColor );
     223             :         }
     224             :     }
     225             : 
     226             : 
     227             :     //add tab style
     228          68 :     pPiece = dynamic_cast<LwpVirtualPiece*>(m_TabStyle.obj());
     229          68 :     if( pPiece  )
     230             :     {
     231           0 :         LwpTabOverride *pTab = dynamic_cast<LwpTabOverride*>(pPiece->GetOverride());
     232           0 :         if(pTab)
     233             :         {
     234           0 :             ApplyTab(pParaStyle,pTab);
     235             :         }
     236             :     }
     237          68 :     pPiece = dynamic_cast<LwpVirtualPiece*>(m_BreaksStyle.obj());
     238          68 :     if( pPiece  )
     239             :     {
     240          27 :         LwpBreaksOverride *pBreak = dynamic_cast<LwpBreaksOverride*>(pPiece->GetOverride());
     241          27 :         if(pBreak)
     242             :         {
     243          27 :             ApplyBreaks(pParaStyle,pBreak);
     244             :         }
     245             :     }
     246             : 
     247             : }
     248             : 
     249         352 : void LwpParaStyle::ApplySubBorder(LwpBorderStuff* pBorderStuff, LwpBorderStuff::BorderType eType, XFBorders* pXFBorders)
     250             : {
     251         352 :     enumXFBorder eXFBorderSide = enumXFBorderNone;
     252         352 :     switch (eType)
     253             :     {
     254             :     case LwpBorderStuff::LEFT:
     255          88 :         eXFBorderSide = enumXFBorderLeft;
     256          88 :         break;
     257             :     case LwpBorderStuff::RIGHT:
     258          88 :         eXFBorderSide = enumXFBorderRight;
     259          88 :         break;
     260             :     case LwpBorderStuff::TOP:
     261          88 :         eXFBorderSide = enumXFBorderTop;
     262          88 :         break;
     263             :     case LwpBorderStuff::BOTTOM:
     264          88 :         eXFBorderSide = enumXFBorderBottom;
     265          88 :         break;
     266             :     default:
     267           0 :         break;
     268             :     }
     269             : 
     270         352 :     LwpColor    aColor = pBorderStuff->GetSideColor(eType);
     271         352 :     float       fWidth = pBorderStuff->GetSideWidth(eType);
     272         352 :     sal_uInt16  nType = pBorderStuff->GetSideType(eType);
     273             : 
     274         352 :     switch (nType)
     275             :     {
     276             :     default://fall through!
     277             :     case 0x14: //single fall through!
     278             :     case 0x17: //treble
     279         352 :         pXFBorders->SetWidth(eXFBorderSide, fWidth);
     280         352 :         break;
     281             :     case 0x15: //double , fall through!
     282             :     case 0x16: //thick double
     283           0 :         pXFBorders->SetDoubleLine(eXFBorderSide, sal_True, sal_False);
     284           0 :         pXFBorders->SetWidthOutter(eXFBorderSide, static_cast<float>(fWidth*0.333));
     285           0 :         pXFBorders->SetWidthSpace(eXFBorderSide, static_cast<float>(fWidth*0.334));
     286           0 :         pXFBorders->SetWidthInner(eXFBorderSide, static_cast<float>(fWidth*0.333));
     287             : //      pXFBorders->SetWidth(eXFBorderSide, fWidth);
     288           0 :         break;
     289             :     case 0x18: //thick-thin
     290           0 :         pXFBorders->SetDoubleLine(eXFBorderSide, sal_True, sal_False);
     291           0 :         pXFBorders->SetWidthOutter(eXFBorderSide, static_cast<float>(fWidth*0.5));
     292           0 :         pXFBorders->SetWidthInner(eXFBorderSide, static_cast<float>(fWidth*0.25));
     293           0 :         pXFBorders->SetWidthSpace(eXFBorderSide, static_cast<float>(fWidth*0.25));
     294           0 :         break;
     295             :     case 0x19: //thin-thick
     296           0 :         pXFBorders->SetDoubleLine(eXFBorderSide, sal_True, sal_False);
     297           0 :         pXFBorders->SetWidthInner(eXFBorderSide, static_cast<float>(fWidth*0.7));
     298           0 :         pXFBorders->SetWidthOutter(eXFBorderSide, static_cast<float>(fWidth*0.15));
     299           0 :         pXFBorders->SetWidthSpace(eXFBorderSide, static_cast<float>(fWidth*0.15));
     300           0 :         break;
     301             :     }
     302             : 
     303         352 :     if (aColor.IsValidColor())
     304             :     {
     305         352 :         XFColor aXFColor(aColor.To24Color());
     306         352 :         pXFBorders->SetColor(eXFBorderSide, aXFColor );
     307         352 :     }
     308         352 : }
     309             : 
     310           6 : void LwpParaStyle::ApplyParaBorder(XFParaStyle* pParaStyle, LwpParaBorderOverride* pBorder)
     311             : {
     312             :     //convert LwpShadow:
     313           6 :     LwpShadow *pShadow = pBorder->GetShadow();
     314           6 :     if( pShadow )
     315             :     {
     316           6 :         LwpColor color = pShadow->GetColor();
     317           6 :         float   offsetX = pShadow->GetOffsetX();
     318           6 :         float   offsetY = pShadow->GetOffsetY();
     319             : 
     320           6 :         if( offsetX && offsetY && color.IsValidColor() )
     321             :         {
     322           1 :             XFColor aXFColor(color.To24Color());
     323           1 :             sal_Bool left = sal_False;
     324           1 :             sal_Bool top = sal_False;
     325           1 :             if( offsetX < 0 )
     326           0 :                 left = sal_True;
     327           1 :             if( offsetY < 0 )
     328           0 :                 top = sal_True;
     329           1 :             if( left )
     330             :             {
     331           0 :                 if( top )
     332           0 :                     pParaStyle->SetShadow(enumXFShadowLeftTop,-offsetX,aXFColor);
     333             :                 else
     334           0 :                     pParaStyle->SetShadow(enumXFShadowLeftBottom,-offsetX,aXFColor);
     335             :             }
     336             :             else
     337             :             {
     338           1 :                 if( top )
     339           0 :                     pParaStyle->SetShadow(enumXFShadowRightTop,offsetX,aXFColor);
     340             :                 else
     341           1 :                     pParaStyle->SetShadow(enumXFShadowRightBottom,offsetX,aXFColor);
     342             :             }
     343           6 :         }
     344             :     }
     345             : 
     346             :     //convert to XFBorders obejct:
     347           6 :     LwpBorderStuff  *pBorderStuff = pBorder->GetBorderStuff();
     348           6 :     if( pBorderStuff && pBorderStuff->GetSide() != 0 )
     349             :     {
     350           2 :         XFBorders   *pXFBorders = new XFBorders();
     351           2 :         pParaStyle->SetBorders(pXFBorders);
     352             : 
     353           2 :         LwpMargins* pMargins = pBorder->GetMargins();
     354             : 
     355             :         // apply 4 borders respectively
     356             :         LwpBorderStuff::BorderType pType[] = { LwpBorderStuff::LEFT, LwpBorderStuff::RIGHT,
     357           2 :             LwpBorderStuff::TOP, LwpBorderStuff::BOTTOM };
     358             :         float pMarginValue[4];
     359             : 
     360          10 :         for (sal_uInt8 nC = 0; nC < 4; nC++)
     361             :         {
     362           8 :             if (pBorderStuff->HasSide(pType[nC]))
     363             :             {
     364           8 :                 this->ApplySubBorder(pBorderStuff, pType[nC], pXFBorders);
     365             : 
     366             :                 //get border spacing to text content
     367           8 :                 if (pMargins)
     368             :                 {
     369           8 :                     pMarginValue[nC] = static_cast<float>(pMargins->GetMarginsValue(nC));
     370             :                 }
     371             :             }
     372             : 
     373             :         }
     374             : 
     375             :         //apply border spacing to text content
     376           2 :         pParaStyle->SetPadding(pMarginValue[0], pMarginValue[1], pMarginValue[2], pMarginValue[3]);
     377             : 
     378             :     }
     379           6 : }
     380             : 
     381          27 : void LwpParaStyle::ApplyBreaks(XFParaStyle* pParaStyle, LwpBreaksOverride* pBreaks)
     382             : {
     383          27 :     if (pBreaks->IsKeepWithNext())
     384             :     {
     385           4 :         pParaStyle->SetBreaks(enumXFBreakKeepWithNext);
     386             :     }
     387          27 :     if (pBreaks->IsPageBreakBefore())
     388             :     {
     389           0 :         pParaStyle->SetBreaks(enumXFBreakBefPage);
     390             :     }
     391          27 :     if (pBreaks->IsPageBreakAfter())
     392             :     {
     393           0 :         pParaStyle->SetBreaks(enumXFBreakAftPage);
     394             :     }
     395          27 :     if (pBreaks->IsColumnBreakBefore())
     396             :     {
     397           0 :         pParaStyle->SetBreaks(enumXFBreakBefColumn);
     398             :     }
     399          27 :     if (pBreaks->IsColumnBreakAfter())
     400             :     {
     401           0 :         pParaStyle->SetBreaks(enumXFBreakAftColumn);
     402             :     }
     403          27 : }
     404             : 
     405          24 : void LwpParaStyle::ApplyAlignment(XFParaStyle* pParaStyle, LwpAlignmentOverride* pAlign)
     406             : {
     407          24 :     enumXFAlignType alignType = enumXFAlignStart;
     408             :     LwpAlignmentOverride::AlignType type;
     409             : 
     410          24 :     type = pAlign->GetAlignType();
     411          24 :     pParaStyle->SetNumberRight(sal_False);//to identify its align attribute
     412          24 :     switch(type)
     413             :     {
     414             :     case LwpAlignmentOverride::ALIGN_LEFT:
     415           4 :         alignType = enumXFAlignStart;
     416           4 :         break;
     417             :     case LwpAlignmentOverride::ALIGN_RIGHT:
     418           2 :         alignType = enumXFAlignEnd;
     419           2 :         break;
     420             :     case LwpAlignmentOverride::ALIGN_CENTER:
     421          14 :         alignType = enumXFAlignCenter;
     422          14 :         break;
     423             :     case LwpAlignmentOverride::ALIGN_NUMERICLEFT://if non-number in table,ALIGN_NUMERICLEFT/RIGHT are useless
     424           0 :         alignType = enumXFAlignStart;            //note by  1/28
     425           0 :         break;
     426             :     case LwpAlignmentOverride::ALIGN_JUSTIFY:
     427             :     case LwpAlignmentOverride::ALIGN_JUSTIFYALL:
     428           0 :         alignType = enumXFAlignJustify;
     429           0 :         break;
     430             :     case LwpAlignmentOverride::ALIGN_NUMERICRIGHT:
     431           4 :         pParaStyle->SetNumberRight(sal_True);//to identify its align attribute
     432           4 :         alignType = enumXFAlignEnd;
     433           4 :         break;
     434             :     default:
     435           0 :         break;
     436             :     }
     437          24 :     pParaStyle->SetAlignType(alignType);
     438          24 : }
     439             : 
     440         179 : void LwpParaStyle::ApplyIndent(LwpPara* pPara, XFParaStyle* pParaStyle, LwpIndentOverride* pIndent)
     441             : {
     442             :     LwpPara* pParentPara;
     443         179 :     if (pPara)
     444         130 :         pParentPara = pPara->GetParent();
     445             :     else
     446          49 :         pParentPara = NULL;
     447             : 
     448             :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
     449         179 :     std::auto_ptr<LwpIndentOverride> pTotalIndent(new LwpIndentOverride);
     450             :     SAL_WNODEPRECATED_DECLARATIONS_POP
     451         179 :     if (pIndent->IsUseRelative() && pParentPara)
     452             :     {
     453           0 :         LwpIndentOverride* pParentIndent = pParentPara->GetIndent();
     454           0 :         if (!pParentIndent)
     455             :             return;
     456           0 :         pTotalIndent.reset(pIndent->clone());
     457             : 
     458             :         //add by ,for bullet only
     459           0 :         if (pPara)
     460             :         {
     461           0 :             if (pPara->GetBulletFlag())
     462             :             {
     463           0 :                 pTotalIndent->SetMAll(pParentIndent->GetMAll() + pTotalIndent->GetMAll());
     464           0 :                 pTotalIndent->SetMRight(pParentIndent->GetMRight()+ pTotalIndent->GetMRight());
     465             :                 pParaStyle->SetMargins(LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(
     466           0 :                     pTotalIndent->GetMAll())), pTotalIndent->GetRight());
     467           0 :                 pPara->SetIndent(pTotalIndent.release());
     468             :                 return;
     469             :             }
     470             :         }
     471             :         //end add
     472           0 :         sal_uInt16 relative = pParentIndent->GetRelative();
     473             : 
     474           0 :         sal_Int32 Amount = pParentIndent->GetMAll();
     475             : 
     476           0 :         if (relative == LwpIndentOverride::RELATIVE_FIRST)
     477           0 :             Amount += pParentIndent->GetMFirst();
     478           0 :         else if (relative == LwpIndentOverride::RELATIVE_REST)
     479           0 :             Amount += pParentIndent->GetMRest();
     480           0 :         pTotalIndent->SetMAll(Amount + pTotalIndent->GetMAll());
     481           0 :         pTotalIndent->SetMRight(pParentIndent->GetMRight()+ pTotalIndent->GetMRight());
     482             : 
     483           0 :         pParaStyle->SetIndent(pTotalIndent->GetFirst());
     484           0 :         pParaStyle->SetMargins(pTotalIndent->GetLeft(), pTotalIndent->GetRight());
     485           0 :         pPara->SetIndent(pTotalIndent.release());
     486             : 
     487             :     }
     488             :     else
     489             :     {
     490         179 :         pTotalIndent.reset(pIndent->clone());
     491             :         //add by
     492         179 :         if (pPara)
     493             :         {
     494         130 :             if (pPara->GetBulletFlag())
     495             :             {
     496             : //              pParaStyle->SetIndent(LwpTools::ConvertFromUnits(pIndent->GetMAll()));
     497             :                 pParaStyle->SetMargins(LwpTools::ConvertToMetric(
     498           4 :                     LwpTools::ConvertFromUnits(pIndent->GetMAll())), pIndent->GetRight());
     499           4 :                 pPara->SetIndent(pTotalIndent.release());
     500             :                 return;
     501             :             }
     502             :         }
     503             :         //end add
     504             : 
     505         175 :         pParaStyle->SetIndent(pIndent->GetFirst());
     506         175 :         pParaStyle->SetMargins(pIndent->GetLeft(), pIndent->GetRight());
     507         175 :         if (pPara)
     508             :         {
     509         126 :             pPara->SetIndent(pTotalIndent.release());
     510             :         }
     511         179 :     }
     512             : }
     513             : 
     514         139 : void LwpParaStyle::ApplySpacing(LwpPara* pPara, XFParaStyle* pParaStyle, LwpSpacingOverride* pSpacing)
     515             : {
     516         139 :     LwpSpacingCommonOverride* spacing = pSpacing->GetSpacing();
     517         139 :     LwpSpacingCommonOverride* abovepara = pSpacing->GetAboveSpacing();
     518         139 :     LwpSpacingCommonOverride* belowpara = pSpacing->GetBelowSpacing();
     519             : 
     520         139 :     LwpSpacingCommonOverride::SpacingType type = spacing->GetType();
     521         139 :     sal_Int32 amount = spacing->GetAmount();
     522         139 :     sal_Int32 multiple = spacing->GetMultiple();
     523             :     enumLHType xftype;
     524             :     double height;
     525             : 
     526         139 :     switch(type)
     527             :     {
     528             :     case LwpSpacingCommonOverride::SPACING_DYNAMIC:
     529             :     {
     530         117 :     xftype = enumLHPercent;
     531         117 :     height = double(multiple)/65536L*100;
     532         117 :     pParaStyle->SetLineHeight(xftype,height);
     533             :     }
     534         117 :         break;
     535             :     case LwpSpacingCommonOverride::SPACING_LEADING:
     536             :     {
     537           0 :     xftype = enumLHSpace;
     538           0 :     height = LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(amount));
     539           0 :     pParaStyle->SetLineHeight(xftype,height);
     540             :     }
     541           0 :         break;
     542             :     case LwpSpacingCommonOverride::SPACING_CUSTOM:
     543             :     {
     544           0 :     xftype = enumLHHeight;
     545           0 :     height =  LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(sal_Int32(float(multiple)/65536L*amount)));
     546           0 :         pParaStyle->SetLineHeight(xftype,height);
     547             :     }
     548           0 :         break;
     549             :     case LwpSpacingCommonOverride::SPACING_NONE:
     550          22 :         break;
     551             :     }
     552             : 
     553             : //TO DO: Above Line need to be processed!!!!!!! what it means??????  1-26
     554             : 
     555         139 :     type = abovepara->GetType();
     556         139 :     amount = abovepara->GetAmount();
     557         139 :     multiple = abovepara->GetMultiple();
     558         139 :     double above_val =-1;
     559         139 :     switch(type)
     560             :     {
     561             :     case LwpSpacingCommonOverride::SPACING_DYNAMIC:
     562             : //        above_val = LINE_HEIGHT*float(multiple)/65536L*100; //TO DO:  1-26
     563          12 :         break;
     564             :     case LwpSpacingCommonOverride::SPACING_LEADING:
     565           0 :         break;
     566             :     case LwpSpacingCommonOverride::SPACING_CUSTOM:
     567         104 :         above_val =  LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(sal_Int32(float(multiple)/65536L*amount)));
     568         104 :         break;
     569             :     case LwpSpacingCommonOverride::SPACING_NONE:
     570          23 :         break;
     571             :     }
     572             : 
     573         139 :     type = belowpara->GetType();
     574         139 :     amount = belowpara->GetAmount();
     575         139 :     multiple = belowpara->GetMultiple();
     576         139 :     double below_val=-1;
     577         139 :     switch(type)
     578             :     {
     579             :     case LwpSpacingCommonOverride::SPACING_DYNAMIC:
     580             : //        below_val = LINE_HEIGHT*float(multiple)/65536L*100;//TO DO:  1-26
     581           4 :         break;
     582             :     case LwpSpacingCommonOverride::SPACING_LEADING:
     583           0 :         break;
     584             :     case LwpSpacingCommonOverride::SPACING_CUSTOM:
     585         104 :         below_val =  LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(sal_Int32(float(multiple)/65536L*amount)));
     586         104 :         break;
     587             :     case LwpSpacingCommonOverride::SPACING_NONE:
     588          31 :         break;
     589             :     }
     590             : 
     591         139 :     if (pPara)
     592             :     {
     593         112 :         if (below_val != -1)
     594          97 :             pPara->SetBelowSpacing(below_val);
     595         112 :         LwpPara* pPrePara = dynamic_cast<LwpPara*>(pPara->GetPrevious()->obj());
     596         112 :         if (pPrePara && above_val != -1)
     597             :         {
     598          97 :             above_val += pPrePara->GetBelowSpacing();
     599             : 
     600             :         }
     601             : 
     602             :     }
     603         139 :     pParaStyle->SetMargins(-1,-1,above_val,below_val);
     604         139 : }
     605             : /**************************************************************************
     606             :  * @short:
     607             :  * @descr:
     608             :  * @param:
     609             :  * @param:
     610             :  * @return:
     611             : **************************************************************************/
     612          25 : void LwpParaStyle::ApplyTab(XFParaStyle *pParaStyle, LwpTabOverride *pTabOverRide)
     613             : {
     614          25 :     LwpObjectID* pTabRackID = pTabOverRide->GetTabRackID();
     615          25 :     if(pTabRackID->IsNull())
     616             :     {
     617             :         //assert(false);
     618          20 :         return;
     619             :     }
     620             : 
     621           5 :     LwpTabRack* pTabRack = dynamic_cast<LwpTabRack*>(pTabRackID->obj());
     622           5 :     if(!pTabRack)
     623             :     {
     624             :         //assert(false);
     625           0 :         return;
     626             :     }
     627             : 
     628           5 :     pParaStyle->ClearTabStyles();
     629             :     //Get margin left value
     630           5 :     double dMarginLeft = pParaStyle->GetMargins().GetLeft();
     631             : 
     632           5 :     sal_uInt16 nNumTabs = pTabRack->GetNumTabs();
     633          15 :     for(sal_uInt16 nIndex=0; nIndex<nNumTabs; nIndex++)
     634             :     {
     635             :         //get tab type
     636          10 :         LwpTab* pTab = pTabRack->Lookup(nIndex);
     637          10 :         if(!pTab)
     638           0 :             return;
     639             : 
     640          10 :         enumXFTab eType = enumXFTabNone;
     641          10 :         LwpTab::TabType type = pTab->GetTabType();
     642          10 :         switch(type)
     643             :         {
     644             :         case LwpTab::TT_LEFT:
     645           0 :             eType = enumXFTabLeft;
     646           0 :             break;
     647             :         case LwpTab::TT_CENTER:
     648           5 :             eType = enumXFTabCenter;
     649           5 :             break;
     650             :         case LwpTab::TT_RIGHT:
     651           5 :             eType = enumXFTabRight;
     652           5 :             break;
     653             :         case LwpTab::TT_NUMERIC:
     654           0 :             eType = enumXFTabChar;
     655           0 :             break;
     656             :         }
     657             : 
     658             :         //get position
     659          10 :         sal_uInt32 nPos = pTab->GetPosition();
     660             :         //different feature between SODC and lwp, the tab length must minus the margin left of para.
     661          10 :         double fLen = LwpTools::ConvertFromUnitsToMetric(nPos) - dMarginLeft;
     662             : 
     663             :         //get leader type
     664          10 :         sal_Unicode cLeader = 0x00;
     665          10 :         LwpTab::LeaderType leader= pTab->GetLeaderType();
     666          10 :         switch(leader)
     667             :         {
     668             :         case LwpTab::TL_NONE:
     669          10 :             cLeader = 0x20;     //space
     670          10 :             break;
     671             :         case LwpTab::TL_HYPHEN: //'-'
     672           0 :             cLeader = 0xAD;
     673           0 :             break;
     674             :         case LwpTab::TL_DOT:    //'.'
     675           0 :             cLeader = 0x2E;
     676           0 :             break;
     677             :         case LwpTab::TL_LINE:   //'_'
     678           0 :             cLeader = 0x5F;
     679           0 :             break;
     680             :         }
     681             : 
     682          10 :         sal_Unicode cAlignChar = static_cast<sal_Unicode>(pTab->GetAlignChar());
     683             : 
     684          10 :         pParaStyle->AddTabStyle(eType,fLen,cLeader,cAlignChar);
     685             :     }
     686             : 
     687             : }
     688             : 
     689             : 
     690          68 : void LwpParaStyle::RegisterStyle()
     691             : {
     692          68 :     XFParaStyle* pStyle = new XFParaStyle();
     693             : 
     694             :     //Set name
     695          68 :     OUString styleName = GetName()->str();
     696          68 :     pStyle->SetStyleName(styleName);
     697             : 
     698             :     //Create font
     699          68 :     LwpFontManager* pFontMgr = m_pFoundry->GetFontManger();
     700          68 :     XFFont* pFont = pFontMgr->CreateFont(m_nFinalFontID);
     701          68 :     pStyle->SetFont(pFont);
     702             : 
     703             :     //Set other paragraph properties...
     704             : 
     705          68 :     Apply(pStyle);
     706             :     //Add style
     707          68 :     LwpStyleManager* pStyleMgr = m_pFoundry->GetStyleManager();
     708          68 :     pStyleMgr->AddStyle(*GetObjectID(), pStyle);
     709          68 : }
     710             : 
     711           8 : LwpAlignmentOverride* LwpParaStyle::GetAlignment()
     712             : {
     713           8 :     if (m_AlignmentStyle.obj() == NULL)
     714           0 :         return NULL;
     715             : 
     716           8 :     LwpAlignmentPiece *pPiece = dynamic_cast<LwpAlignmentPiece*>(m_AlignmentStyle.obj());
     717           8 :     if (pPiece)
     718           8 :         return dynamic_cast<LwpAlignmentOverride*>(pPiece->GetOverride());
     719           0 :     return NULL;
     720             : }
     721             : 
     722         622 : LwpIndentOverride* LwpParaStyle::GetIndent()
     723             : {
     724         622 :     if (m_IndentStyle.obj() == NULL)
     725          61 :         return NULL;
     726             : 
     727         561 :     LwpIndentPiece *pPiece = dynamic_cast<LwpIndentPiece*>(m_IndentStyle.obj());
     728         561 :     if (pPiece)
     729         561 :         return dynamic_cast<LwpIndentOverride*>(pPiece->GetOverride());
     730           0 :     return NULL;
     731             : }
     732             : 
     733         224 : LwpSpacingOverride* LwpParaStyle::GetSpacing()
     734             : {
     735         224 :     if (m_SpacingStyle.obj() == NULL)
     736           0 :         return NULL;
     737             : 
     738         224 :     LwpSpacingPiece *pPiece = dynamic_cast<LwpSpacingPiece*>(m_SpacingStyle.obj());
     739         224 :     if (pPiece)
     740         224 :         return dynamic_cast<LwpSpacingOverride*>(pPiece->GetOverride());
     741           0 :     return NULL;
     742             : }
     743             : 
     744           2 : LwpParaBorderOverride* LwpParaStyle::GetParaBorder() const
     745             : {
     746           2 :     if(m_BorderStyle.IsNull())
     747           0 :         return NULL;
     748             : 
     749           2 :     LwpParaBorderPiece *pPiece = dynamic_cast<LwpParaBorderPiece*>(m_BorderStyle.obj(VO_PARABORDERPIECE));
     750           2 :     if (pPiece)
     751           2 :         return dynamic_cast<LwpParaBorderOverride*>(pPiece->GetOverride());
     752           0 :     return NULL;
     753             : }
     754             : 
     755         127 : LwpBreaksOverride* LwpParaStyle::GetBreaks() const
     756             : {
     757         127 :     if(m_BreaksStyle.IsNull())
     758           0 :         return NULL;
     759             : 
     760         127 :     LwpBreaksPiece *pPiece = dynamic_cast<LwpBreaksPiece*>(m_BreaksStyle.obj(VO_BREAKSPIECE));
     761         127 :     if (pPiece)
     762         127 :         return dynamic_cast<LwpBreaksOverride*>(pPiece->GetOverride());
     763           0 :     return NULL;
     764             : }
     765             : 
     766         262 : LwpBulletOverride* LwpParaStyle::GetBulletOverride() const
     767             : {
     768         262 :     return m_pBulletOverride;
     769             : }
     770             : 
     771         262 : LwpNumberingOverride* LwpParaStyle::GetNumberingOverride() const
     772             : {
     773         262 :     if(m_NumberingStyle.IsNull())
     774          37 :         return NULL;
     775             : 
     776         225 :     LwpNumberingPiece *pPiece = dynamic_cast<LwpNumberingPiece*>(m_NumberingStyle.obj(VO_NUMBERINGPIECE));
     777         225 :     if (pPiece)
     778         225 :         return dynamic_cast<LwpNumberingOverride*>(pPiece->GetOverride());
     779           0 :     return NULL;
     780             : }
     781             : 
     782             : 
     783             : /**************************************************************************
     784             :  * @short:
     785             :  * @descr:
     786             :  * @param:
     787             :  * @param:
     788             :  * @return:
     789             : **************************************************************************/
     790          25 : LwpTabOverride* LwpParaStyle::GetTabOverride() const
     791             : {
     792          25 :     if(m_TabStyle.obj() == NULL)
     793          25 :         return NULL;
     794           0 :     LwpTabPiece *pPiece = dynamic_cast<LwpTabPiece*>(m_TabStyle.obj());
     795           0 :     if (pPiece)
     796           0 :         return dynamic_cast<LwpTabOverride*>(pPiece->GetOverride());
     797           0 :     return NULL;
     798             : }
     799             : 
     800             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10