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 : #include "lwpglobalmgr.hxx"
65 : #include "lwpsilverbullet.hxx"
66 : #include "lwpdoc.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"
73 :
74 13 : LwpSilverBullet::LwpSilverBullet(LwpObjectHeader& objHdr, LwpSvStream* pStrm)
75 13 : : LwpDLNFVList(objHdr, pStrm), m_pAtomHolder(new LwpAtomHolder), m_pBulletPara(NULL)
76 : {
77 13 : }
78 :
79 39 : LwpSilverBullet::~LwpSilverBullet()
80 : {
81 13 : if (m_pAtomHolder)
82 : {
83 13 : delete m_pAtomHolder;
84 : }
85 26 : }
86 :
87 13 : void LwpSilverBullet::Read()
88 : {
89 13 : LwpDLNFVList::Read();
90 :
91 13 : m_nFlags = m_pObjStrm->QuickReaduInt16();
92 13 : m_aStory.ReadIndexed(m_pObjStrm);
93 :
94 13 : sal_uInt16 nNumPos = m_pObjStrm->QuickReaduInt16();
95 :
96 143 : for (sal_uInt8 nC = 0; nC < nNumPos; nC++)
97 130 : m_pResetPositionFlags[nC] = m_pObjStrm->QuickReaduInt8();
98 :
99 13 : m_nUseCount = m_pObjStrm->QuickReaduInt32();
100 :
101 13 : m_pAtomHolder->Read(m_pObjStrm);
102 13 : }
103 :
104 : /**
105 : * @short: Register bullet or numbering style-list and store the returned
106 : * name from XFStyleManager.
107 : * @descr:
108 : */
109 13 : void LwpSilverBullet::RegisterStyle()
110 : {
111 13 : XFListStyle* pListStyle = new XFListStyle();
112 13 : XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
113 :
114 13 : this->GetBulletPara();
115 :
116 13 : if (this->IsBulletOrdered() && this->HasName())
117 : {
118 : //todo: find the flag in the file
119 12 : sal_Bool bCumulative = sal_False;
120 :
121 120 : for (sal_uInt8 nPos = 1; nPos < 10; nPos++)
122 : {
123 108 : ParaNumbering aParaNumbering;
124 : //get numbering format according to the position.
125 108 : m_pBulletPara->GetParaNumber(nPos, &aParaNumbering);
126 108 : LwpFribParaNumber* pParaNumber = aParaNumbering.pParaNumber;
127 108 : if (pParaNumber)
128 : {
129 108 : if (pParaNumber->GetStyleID() != NUMCHAR_other)
130 : {
131 108 : m_pHideLevels[nPos] = aParaNumbering.nNumLevel;
132 108 : sal_uInt16 nDisplayLevel = this->GetDisplayLevel(nPos);
133 108 : bCumulative = (sal_Bool)(nDisplayLevel > 1);
134 108 : rtl::OUString aPrefix = this->GetAdditionalName(nPos);
135 :
136 108 : XFNumFmt aFmt;
137 108 : if (!bCumulative && aParaNumbering.pPrefix)
138 : {
139 4 : aFmt.SetPrefix(aPrefix + aParaNumbering.pPrefix->GetText());
140 : }
141 :
142 108 : aFmt.SetFormat(this->GetNumCharByStyleID(pParaNumber));
143 :
144 108 : if (aParaNumbering.pSuffix)
145 : {
146 40 : aFmt.SetSuffix(aParaNumbering.pSuffix->GetText());
147 : }
148 :
149 : //set numbering format into the style-list.
150 108 : pListStyle->SetListNumber(nPos, aFmt, pParaNumber->GetStart()+1);
151 :
152 108 : if (bCumulative && nPos > 1)
153 : {
154 64 : pListStyle->SetDisplayLevel(nPos, nDisplayLevel);
155 108 : }
156 :
157 : }
158 : else
159 : {
160 0 : rtl::OUString aPrefix, aSuffix;
161 0 : if (aParaNumbering.pPrefix)
162 : {
163 0 : aPrefix = aParaNumbering.pPrefix->GetText();
164 : }
165 0 : if (aParaNumbering.pSuffix)
166 : {
167 0 : aSuffix = aParaNumbering.pSuffix->GetText();
168 : }
169 :
170 0 : pListStyle->SetListBullet(nPos, this->GetNumCharByStyleID(pParaNumber).toChar(),
171 0 : rtl::OUString("Times New Roman"), aPrefix, aSuffix);
172 : }
173 :
174 108 : pListStyle->SetListPosition(nPos, 0.0, 0.635, 0.0);
175 108 : aParaNumbering.clear();
176 : }
177 : }
178 : }
179 :
180 : //add style-list to style manager.
181 13 : m_strStyleName = pXFStyleManager->AddStyle(pListStyle)->GetStyleName();
182 13 : }
183 :
184 : /**
185 : * @short: Get the font name of the bullet.
186 : * @descr:
187 : * @return: Font name of the bullet.
188 : */
189 0 : rtl::OUString LwpSilverBullet::GetBulletFontName()
190 : {
191 0 : rtl::OUString aEmpty;
192 :
193 : //foundry has been set?
194 0 : if (!m_pFoundry)
195 : {
196 0 : return aEmpty;
197 : }
198 :
199 0 : LwpFontManager* pFontMgr = m_pFoundry->GetFontManger();
200 0 : if (!pFontMgr)
201 : {
202 0 : return aEmpty;
203 : }
204 :
205 0 : sal_uInt32 nBulletFontID = m_pBulletPara->GetBulletFontID();
206 0 : sal_uInt16 nFinalFont = static_cast<sal_uInt16>((nBulletFontID >> 16) & 0xFFFF);
207 :
208 : //final fontid is valid?
209 0 : if (nFinalFont > 255 || nFinalFont == 0)
210 : {
211 0 : return aEmpty;
212 : }
213 :
214 : //get font name from font manager.
215 0 : rtl::OUString aFontName = pFontMgr->GetNameByID(nBulletFontID);
216 :
217 0 : return aFontName;
218 : }
219 : /**
220 : * @short: Get bullet character of the bullet vo_para.
221 : * @descr:
222 : * @return: An UChar32 bulle character.
223 : */
224 0 : UChar32 LwpSilverBullet::GetBulletChar()
225 : {
226 0 : rtl::OUString aBulletChar = m_pBulletPara->GetBulletChar();
227 :
228 0 : return aBulletChar.toChar();
229 : }
230 :
231 : /**
232 : * @short: Get the LwpPara object through story id.
233 : */
234 15 : LwpPara* LwpSilverBullet::GetBulletPara()
235 : {
236 15 : if (!m_pBulletPara)
237 : {
238 13 : LwpStory* pStory = dynamic_cast<LwpStory*>(m_aStory.obj(VO_STORY));
239 13 : if (!pStory)
240 : {
241 0 : return NULL;
242 : }
243 :
244 13 : m_pBulletPara = dynamic_cast<LwpPara*>(pStory->GetFirstPara()->obj(VO_PARA));
245 : }
246 :
247 15 : return m_pBulletPara;
248 : }
249 :
250 : /**
251 : * @short: Get numbering character of the bullet vo_para.
252 : * @descr:
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.
256 : */
257 117 : rtl::OUString LwpSilverBullet::GetNumCharByStyleID(LwpFribParaNumber* pParaNumber)
258 : {
259 117 : rtl::OUString aEmpty;
260 :
261 117 : if (!pParaNumber)
262 : {
263 : assert(false);
264 0 : return aEmpty;
265 : }
266 :
267 117 : rtl::OUString strNumChar("1");
268 117 : sal_uInt16 nStyleID = pParaNumber->GetStyleID();
269 117 : UChar32 uC = 0x0000;
270 :
271 117 : switch (nStyleID)
272 : {
273 : case NUMCHAR_1:
274 : case NUMCHAR_01:
275 : case NUMCHAR_Chinese4:
276 93 : strNumChar = rtl::OUString("1");
277 93 : break;
278 : case NUMCHAR_A :
279 4 : strNumChar = rtl::OUString("A");
280 4 : break;
281 : case NUMCHAR_a:
282 8 : strNumChar = rtl::OUString("a");
283 8 : break;
284 : case NUMCHAR_I:
285 4 : strNumChar = rtl::OUString("I");
286 4 : break;
287 : case NUMCHAR_i:
288 8 : strNumChar = rtl::OUString("i");
289 8 : break;
290 : case NUMCHAR_other:
291 0 : uC = static_cast<UChar32>(pParaNumber->GetNumberChar());
292 0 : strNumChar = rtl::OUString(uC);
293 0 : break;
294 : case NUMCHAR_Chinese1:
295 : {
296 0 : sal_Unicode sBuf[13] = {0x58f9,0x002c,0x0020,0x8d30,0x002c,0x0020,0x53c1,0x002c,0x0020,0x002e,0x002e,0x002e,0x0};
297 0 : strNumChar = rtl::OUString(sBuf);
298 : }
299 0 : break;
300 : case NUMCHAR_Chinese2:
301 : {
302 0 : sal_Unicode sBuf[13] = {0x4e00,0x002c,0x0020,0x4e8c,0x002c,0x0020,0x4e09,0x002c,0x0020,0x002e,0x002e,0x002e,0x0};
303 0 : strNumChar = rtl::OUString(sBuf);
304 : }
305 0 : break;
306 : case NUMCHAR_Chinese3:
307 : {
308 0 : sal_Unicode sBuf[13] = {0x7532,0x002c,0x0020,0x4e59,0x002c,0x0020,0x4e19,0x002c,0x0020,0x002e,0x002e,0x002e,0x0};
309 0 : strNumChar = rtl::OUString(sBuf);
310 : }
311 0 : break;
312 : case NUMCHAR_none:
313 0 : strNumChar = aEmpty;
314 0 : break;
315 : default:
316 0 : break;
317 : }//mod end
318 117 : return strNumChar;
319 : }
320 :
321 : /**
322 : * @short: To judge the silverbullet list is ordered or not.
323 : * @descr:
324 : * @return: sal_True if list is ordered, sal_False if list is unordered.
325 : */
326 24 : sal_Bool LwpSilverBullet::IsBulletOrdered()
327 : {
328 24 : if (!m_pBulletPara)
329 0 : return sal_False;
330 :
331 24 : LwpFribPtr* pFribs = m_pBulletPara->GetFribs();
332 :
333 24 : if (!pFribs)
334 0 : return sal_False;
335 :
336 24 : return (sal_Bool)(pFribs->HasFrib(FRIB_TAG_PARANUMBER) != NULL);
337 : }
338 :
339 : /**
340 : * @short: Calculate the displaylevel according to the position and hidelevels.
341 : * @descr:
342 : * @param: nPos position of the numbering.
343 : * @return: displaylevel of the position passed in.
344 : */
345 108 : sal_uInt16 LwpSilverBullet::GetDisplayLevel(sal_uInt8 nPos)
346 : {
347 108 : if (nPos > 1)
348 : {
349 96 : sal_uInt16 nHideBit = (1 << nPos);
350 384 : for (sal_uInt8 nC = nPos-1; nC > 0; nC--)
351 : {
352 320 : sal_uInt16 nAttrMask = ~m_pHideLevels[nC];
353 320 : if (!(nAttrMask & nHideBit))
354 : {
355 32 : return static_cast<sal_uInt16>(nPos - nC);
356 : }
357 : }
358 : }
359 :
360 76 : return static_cast<sal_uInt16>(nPos);
361 : }
362 :
363 : /**
364 : * @descr: Get the additional information, "Division name" or "Section Name" from document
365 : * variable frib according to numbering position. Whether we should add a
366 : * Division/Section name or not is determined by the hidelevels of the frib.
367 : * @param: nPos position of the numbering.
368 : * @return: Division or Section name.
369 : */
370 108 : rtl::OUString LwpSilverBullet::GetAdditionalName(sal_uInt8 nPos)
371 : {
372 108 : rtl::OUString aRet, aEmpty;
373 108 : sal_uInt16 nHideBit = (1 << nPos);
374 108 : sal_Bool bDivisionName = sal_False;
375 108 : sal_Bool bSectionName = sal_False;
376 :
377 108 : LwpFrib* pParaFrib = m_pBulletPara->GetFribs()->GetFribs();
378 108 : if (!pParaFrib)
379 : {
380 0 : return aEmpty;
381 : }
382 :
383 2268 : while (pParaFrib)
384 : {
385 2052 : if (pParaFrib->GetType() == FRIB_TAG_DOCVAR)
386 : {
387 0 : ModifierInfo* pMoInfo = pParaFrib->GetModifiers();
388 0 : if (!pMoInfo)
389 : {
390 0 : return aEmpty;
391 : }
392 0 : sal_uInt16 nHideLevels = pMoInfo->aTxtAttrOverride.GetHideLevels();
393 0 : sal_uInt16 nType = static_cast<LwpFribDocVar*>(pParaFrib)->GetType();
394 :
395 0 : if (~nHideLevels & nHideBit)
396 : {
397 0 : if (nType == 0x000D)
398 : {
399 0 : bDivisionName = sal_True;
400 : }
401 0 : else if (nType == 0x000E)
402 : {
403 0 : bSectionName= sal_True;
404 : }
405 : }
406 : }
407 2052 : pParaFrib = pParaFrib->GetNext();
408 : }
409 :
410 108 : if (bDivisionName)
411 : {
412 0 : aRet += this->GetDivisionName();
413 : }
414 108 : if (bSectionName)
415 : {
416 0 : aRet += this->GetSectionName();
417 : }
418 :
419 108 : return aRet;
420 : }
421 :
422 0 : rtl::OUString LwpSilverBullet::GetDivisionName()
423 : {
424 0 : rtl::OUString aRet;
425 :
426 0 : if (!m_pFoundry)
427 : {
428 0 : return aRet;
429 : }
430 :
431 0 : LwpDocument* pDoc = m_pFoundry->GetDocument();
432 0 : if (pDoc)
433 : {
434 0 : LwpObjectID* pID = pDoc->GetDivInfoID();
435 0 : if (!pID->IsNull())
436 : {
437 0 : LwpDivInfo *pInfo = dynamic_cast<LwpDivInfo*>(pID->obj(VO_DIVISIONINFO));
438 0 : if (pInfo)
439 0 : aRet = pInfo->GetDivName();
440 : }
441 : }
442 :
443 0 : return aRet;
444 : }
445 :
446 0 : rtl::OUString LwpSilverBullet::GetSectionName()
447 : {
448 0 : rtl::OUString aEmpty;
449 0 : LwpStory* pStory = dynamic_cast<LwpStory*>(m_aStory.obj(VO_STORY));
450 0 : if (!pStory)
451 : {
452 0 : return aEmpty;
453 : }
454 :
455 0 : return pStory->GetSectionName();
456 : }
457 :
458 24 : sal_Bool LwpSilverBullet::HasName()
459 : {
460 24 : LwpAtomHolder* pName = this->GetName();
461 24 : if (pName)
462 : {
463 24 : return (sal_Bool)(!pName->str().isEmpty());
464 : }
465 : else
466 : {
467 0 : return sal_False;
468 : }
469 : }
470 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|