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 ************************************************************************/
60 /*************************************************************************
63 ************************************************************************/
64 #include "lwpglobalmgr.hxx"
65 #include "lwpsilverbullet.hxx"
67 #include "lwpdivinfo.hxx"
68 #include "lwpfoundry.hxx"
69 #include "lwpstory.hxx"
70 #include "lwppara.hxx"
71 #include "xfilter/xfliststyle.hxx"
72 #include "xfilter/xfstylemanager.hxx"
74 LwpSilverBullet::LwpSilverBullet(LwpObjectHeader
& objHdr
, LwpSvStream
* pStrm
)
75 : LwpDLNFVList(objHdr
, pStrm
)
78 , m_pAtomHolder(new LwpAtomHolder
)
83 LwpSilverBullet::~LwpSilverBullet()
91 void LwpSilverBullet::Read()
95 m_nFlags
= m_pObjStrm
->QuickReaduInt16();
96 m_aStory
.ReadIndexed(m_pObjStrm
);
98 sal_uInt16 nNumPos
= m_pObjStrm
->QuickReaduInt16();
100 for (sal_uInt8 nC
= 0; nC
< nNumPos
; nC
++)
101 m_pResetPositionFlags
[nC
] = m_pObjStrm
->QuickReaduInt8();
103 m_nUseCount
= m_pObjStrm
->QuickReaduInt32();
105 m_pAtomHolder
->Read(m_pObjStrm
);
109 * @short: Register bullet or numbering style-list and store the returned
110 * name from XFStyleManager.
113 void LwpSilverBullet::RegisterStyle()
115 XFListStyle
* pListStyle
= new XFListStyle();
116 XFStyleManager
* pXFStyleManager
= LwpGlobalMgr::GetInstance()->GetXFStyleManager();
118 this->GetBulletPara();
120 if (this->IsBulletOrdered() && this->HasName())
122 //todo: find the flag in the file
123 bool bCumulative
= false;
125 for (sal_uInt8 nPos
= 1; nPos
< 10; nPos
++)
127 ParaNumbering aParaNumbering
;
128 //get numbering format according to the position.
129 m_pBulletPara
->GetParaNumber(nPos
, &aParaNumbering
);
130 LwpFribParaNumber
* pParaNumber
= aParaNumbering
.pParaNumber
;
133 if (pParaNumber
->GetStyleID() != NUMCHAR_other
)
135 m_pHideLevels
[nPos
] = aParaNumbering
.nNumLevel
;
136 sal_uInt16 nDisplayLevel
= this->GetDisplayLevel(nPos
);
137 bCumulative
= (nDisplayLevel
> 1);
138 OUString aPrefix
= this->GetAdditionalName(nPos
);
141 if (!bCumulative
&& aParaNumbering
.pPrefix
)
143 aFmt
.SetPrefix(aPrefix
+ aParaNumbering
.pPrefix
->GetText());
146 aFmt
.SetFormat(GetNumCharByStyleID(pParaNumber
));
148 if (aParaNumbering
.pSuffix
)
150 aFmt
.SetSuffix(aParaNumbering
.pSuffix
->GetText());
153 //set numbering format into the style-list.
154 pListStyle
->SetListNumber(nPos
, aFmt
, pParaNumber
->GetStart()+1);
156 if (bCumulative
&& nPos
> 1)
158 pListStyle
->SetDisplayLevel(nPos
, nDisplayLevel
);
164 OUString aPrefix
, aSuffix
;
165 if (aParaNumbering
.pPrefix
)
167 aPrefix
= aParaNumbering
.pPrefix
->GetText();
169 if (aParaNumbering
.pSuffix
)
171 aSuffix
= aParaNumbering
.pSuffix
->GetText();
174 pListStyle
->SetListBullet(nPos
, GetNumCharByStyleID(pParaNumber
).toChar(),
175 "Times New Roman", aPrefix
, aSuffix
);
178 pListStyle
->SetListPosition(nPos
, 0.0, 0.635, 0.0);
179 aParaNumbering
.clear();
184 //add style-list to style manager.
185 m_strStyleName
= pXFStyleManager
->AddStyle(pListStyle
).m_pStyle
->GetStyleName();
189 * @short: Get the font name of the bullet.
191 * @return: Font name of the bullet.
193 OUString
LwpSilverBullet::GetBulletFontName()
197 //foundry has been set?
203 LwpFontManager
& rFontMgr
= m_pFoundry
->GetFontManger();
205 sal_uInt32 nBulletFontID
= m_pBulletPara
->GetBulletFontID();
206 sal_uInt16 nFinalFont
= static_cast<sal_uInt16
>((nBulletFontID
>> 16) & 0xFFFF);
208 //final fontid is valid?
209 if (nFinalFont
> 255 || nFinalFont
== 0)
214 //get font name from font manager.
215 OUString aFontName
= rFontMgr
.GetNameByID(nBulletFontID
);
220 * @short: Get bullet character of the bullet vo_para.
222 * @return: An UChar32 bulle character.
224 UChar32
LwpSilverBullet::GetBulletChar()
226 OUString aBulletChar
= m_pBulletPara
->GetBulletChar();
228 return aBulletChar
.toChar();
232 * @short: Get the LwpPara object through story id.
234 LwpPara
* LwpSilverBullet::GetBulletPara()
238 LwpStory
* pStory
= dynamic_cast<LwpStory
*>(m_aStory
.obj(VO_STORY
).get());
244 m_pBulletPara
= dynamic_cast<LwpPara
*>(pStory
->GetFirstPara().obj(VO_PARA
).get());
247 return m_pBulletPara
;
251 * @short: Get numbering character of the bullet vo_para.
253 * @param: pParaNumber a pionter to the structure LwpFribParaNumber which
254 * includes numbering prefix, format and suffix.
255 * @return: An OUString object which store the numbering character.
257 OUString
LwpSilverBullet::GetNumCharByStyleID(LwpFribParaNumber
* pParaNumber
)
267 OUString
strNumChar("1");
268 sal_uInt16 nStyleID
= pParaNumber
->GetStyleID();
275 case NUMCHAR_Chinese4
:
291 uC
= static_cast<UChar32
>(pParaNumber
->GetNumberChar());
292 strNumChar
= OUString(uC
);
294 case NUMCHAR_Chinese1
:
296 sal_Unicode sBuf
[13] = {0x58f9,0x002c,0x0020,0x8d30,0x002c,0x0020,0x53c1,0x002c,0x0020,0x002e,0x002e,0x002e,0x0};
297 strNumChar
= OUString(sBuf
);
300 case NUMCHAR_Chinese2
:
302 sal_Unicode sBuf
[13] = {0x4e00,0x002c,0x0020,0x4e8c,0x002c,0x0020,0x4e09,0x002c,0x0020,0x002e,0x002e,0x002e,0x0};
303 strNumChar
= OUString(sBuf
);
306 case NUMCHAR_Chinese3
:
308 sal_Unicode sBuf
[13] = {0x7532,0x002c,0x0020,0x4e59,0x002c,0x0020,0x4e19,0x002c,0x0020,0x002e,0x002e,0x002e,0x0};
309 strNumChar
= OUString(sBuf
);
322 * @short: To judge the silverbullet list is ordered or not.
324 * @return: sal_True if list is ordered, sal_False if list is unordered.
326 bool LwpSilverBullet::IsBulletOrdered()
331 LwpFribPtr
& rFribs
= m_pBulletPara
->GetFribs();
333 return (rFribs
.HasFrib(FRIB_TAG_PARANUMBER
) != NULL
);
337 * @short: Calculate the displaylevel according to the position and hidelevels.
339 * @param: nPos position of the numbering.
340 * @return: displaylevel of the position passed in.
342 sal_uInt16
LwpSilverBullet::GetDisplayLevel(sal_uInt8 nPos
)
346 sal_uInt16 nHideBit
= (1 << nPos
);
347 for (sal_uInt8 nC
= nPos
-1; nC
> 0; nC
--)
349 sal_uInt16 nAttrMask
= ~m_pHideLevels
[nC
];
350 if (!(nAttrMask
& nHideBit
))
352 return static_cast<sal_uInt16
>(nPos
- nC
);
357 return static_cast<sal_uInt16
>(nPos
);
361 * @descr: Get the additional information, "Division name" or "Section Name" from document
362 * variable frib according to numbering position. Whether we should add a
363 * Division/Section name or not is determined by the hidelevels of the frib.
364 * @param: nPos position of the numbering.
365 * @return: Division or Section name.
367 OUString
LwpSilverBullet::GetAdditionalName(sal_uInt8 nPos
)
369 OUString aRet
, aEmpty
;
370 sal_uInt16 nHideBit
= (1 << nPos
);
371 bool bDivisionName
= false;
372 bool bSectionName
= false;
374 LwpFrib
* pParaFrib
= m_pBulletPara
->GetFribs().GetFribs();
382 if (pParaFrib
->GetType() == FRIB_TAG_DOCVAR
)
384 ModifierInfo
* pMoInfo
= pParaFrib
->GetModifiers();
389 sal_uInt16 nHideLevels
= pMoInfo
->aTxtAttrOverride
.GetHideLevels();
390 sal_uInt16 nType
= static_cast<LwpFribDocVar
*>(pParaFrib
)->GetType();
392 if (~nHideLevels
& nHideBit
)
396 bDivisionName
= true;
398 else if (nType
== 0x000E)
404 pParaFrib
= pParaFrib
->GetNext();
409 aRet
+= this->GetDivisionName();
413 aRet
+= this->GetSectionName();
419 OUString
LwpSilverBullet::GetDivisionName()
428 LwpDocument
* pDoc
= m_pFoundry
->GetDocument();
431 LwpObjectID
& rID
= pDoc
->GetDivInfoID();
434 LwpDivInfo
*pInfo
= dynamic_cast<LwpDivInfo
*>(rID
.obj(VO_DIVISIONINFO
).get());
436 aRet
= pInfo
->GetDivName();
443 OUString
LwpSilverBullet::GetSectionName()
446 LwpStory
* pStory
= dynamic_cast<LwpStory
*>(m_aStory
.obj(VO_STORY
).get());
452 return pStory
->GetSectionName();
455 bool LwpSilverBullet::HasName()
457 LwpAtomHolder
& rName
= this->GetName();
458 return (!rName
.str().isEmpty());
460 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */