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 "lwpfoundry.hxx"
66 : #include "lwpfilehdr.hxx"
67 : #include "lwpdoc.hxx"
68 : #include "lwpmarker.hxx"
69 : #include "lwpholder.hxx"
70 : #include "lwpbulletstylemgr.hxx"
71 : #include "lwpcontent.hxx"
72 : #include "lwpvpointer.hxx"
73 : #include "lwpsection.hxx"
74 : #include "lwpcharacterstyle.hxx"
75 : #include "lwpglobalmgr.hxx"
76 :
77 : #include <osl/diagnose.h>
78 :
79 :
80 9 : LwpFoundry::LwpFoundry(LwpObjectStream *pStrm, LwpDocument* pDoc)
81 : : m_pDoc(pDoc)
82 : , m_bRegisteredAll(false)
83 : , m_pPieceMgr(NULL)
84 9 : , m_pStyleMgr(NULL)
85 : {
86 9 : Read(pStrm);
87 9 : m_pDropcapMgr = new LwpDropcapMgr;
88 9 : m_pBulletStyleMgr = new LwpBulletStyleMgr();
89 9 : m_pBulletStyleMgr->SetFoundry(this);
90 9 : }
91 :
92 18 : LwpFoundry::~LwpFoundry()
93 : {
94 9 : if(m_pPieceMgr)
95 : {
96 5 : delete m_pPieceMgr;
97 : }
98 9 : if(m_pStyleMgr)
99 : {
100 9 : delete m_pStyleMgr;
101 : }
102 9 : if (m_pDropcapMgr)
103 9 : delete m_pDropcapMgr;
104 9 : if (m_pBulletStyleMgr)
105 : {
106 9 : delete m_pBulletStyleMgr;
107 : }
108 9 : }
109 :
110 9 : void LwpFoundry::Read(LwpObjectStream *pStrm)
111 : {
112 9 : if (!m_pDoc->IsChildDoc())
113 : {
114 5 : LwpVersionManager::Read(pStrm);
115 : }
116 9 : m_ObjMgr.Read(pStrm);
117 :
118 9 : m_MarkerHead.ReadIndexed(pStrm);
119 9 : m_FootnoteMgr.ReadIndexed(pStrm);
120 :
121 9 : m_NumMgr.Read(pStrm);
122 9 : m_BulMgr.Read(pStrm);
123 :
124 9 : m_SectionList.Read(pStrm);
125 9 : m_Layout.ReadIndexed(pStrm);
126 :
127 9 : ReadStyles(pStrm);
128 :
129 9 : m_BookMarkHead.ReadIndexed(pStrm);
130 9 : m_DdeLinkHead.ReadIndexed(pStrm);
131 9 : m_DirtBagHead.ReadIndexed(pStrm);
132 9 : m_NamedOutlineSeqHead.ReadIndexed(pStrm);
133 :
134 9 : m_EnumLayoutHead.ReadIndexed(pStrm);
135 9 : m_EnumLayoutTail.ReadIndexed(pStrm);
136 9 : m_NamedObjects.ReadIndexed(pStrm);
137 :
138 9 : m_nLastClickHere = pStrm->QuickReaduInt32();
139 9 : m_SmartTextMgr.ReadIndexed(pStrm);
140 :
141 9 : m_ContentMgr.Read(pStrm);
142 9 : m_FontMgr.Read(pStrm);
143 :
144 9 : if (!m_pDoc->IsChildDoc() && LwpFileHeader::m_nFileRevision >= 0x000B)
145 : {
146 5 : m_pPieceMgr = new LwpPieceManager();
147 :
148 5 : m_pPieceMgr->Read(pStrm);
149 : }
150 :
151 9 : if( LwpFileHeader::m_nFileRevision >= 0x000B)
152 : {
153 9 : m_DftDropCapStyle.ReadIndexed(pStrm);
154 : }
155 9 : if( LwpFileHeader::m_nFileRevision >= 0x000F)
156 : {
157 9 : m_DftHeaderStyle.ReadIndexed(pStrm);
158 9 : m_DftFooterStyle.ReadIndexed(pStrm);
159 : }
160 9 : pStrm->SkipExtra();
161 :
162 9 : m_pStyleMgr = new LwpStyleManager();
163 9 : m_pStyleMgr->SetFoundry(this);
164 9 : }
165 :
166 9 : void LwpFoundry::ReadStyles(LwpObjectStream *pStrm)
167 : {
168 9 : m_TextStyle.ReadIndexed(pStrm);
169 9 : m_DefaultTextStyle.ReadIndexed(pStrm);
170 9 : m_DefaultClickStyle.ReadIndexed(pStrm);
171 9 : m_PageStyle.ReadIndexed(pStrm);
172 9 : m_FrameStyle.ReadIndexed(pStrm);
173 :
174 9 : m_TableStyle.ReadIndexed(pStrm);
175 9 : m_CellStyle.ReadIndexed(pStrm);
176 9 : m_DftFrameStyle.ReadIndexed(pStrm);
177 9 : m_DftPageStyle.ReadIndexed(pStrm);
178 9 : m_DftTableStyle.ReadIndexed(pStrm);
179 :
180 9 : m_DftCellStyle.ReadIndexed(pStrm);
181 9 : m_DftColumnStyle.ReadIndexed(pStrm);
182 9 : m_DftLeftColumnStyle.ReadIndexed(pStrm);
183 9 : m_DftRighColumnStyle.ReadIndexed(pStrm);
184 :
185 9 : }
186 :
187 : #include "xfilter/xfstylemanager.hxx"
188 : #include "lwplayout.hxx"
189 :
190 8 : void LwpFoundry::RegisterAllLayouts()
191 : {
192 8 : if (m_bRegisteredAll)
193 : {
194 : OSL_FAIL("recursive LwpFoundry::RegisterAllLayouts!\n");
195 8 : return;
196 : }
197 :
198 8 : m_bRegisteredAll = true;
199 :
200 : //Register CellStyle
201 8 : rtl::Reference<LwpObject> pStyle = m_CellStyle.obj();
202 8 : if( pStyle.is() )
203 : {
204 8 : pStyle->SetFoundry(this);
205 8 : pStyle->RegisterStyle();
206 : }
207 :
208 : //register content page layout list: Layout
209 8 : pStyle = m_Layout.obj();
210 8 : if( pStyle.is() )
211 : {
212 8 : pStyle->SetFoundry(this);
213 8 : pStyle->RegisterStyle();
214 : }
215 :
216 : //Register page style layout list: PageStyle, such as "Default Page"
217 8 : pStyle = m_PageStyle.obj();
218 8 : if( pStyle.is() )
219 : {
220 8 : pStyle->SetFoundry(this);
221 8 : pStyle->RegisterStyle();
222 : }
223 :
224 : //Register FrameStyle
225 8 : pStyle = m_FrameStyle.obj();
226 8 : if( pStyle.is() )
227 : {
228 8 : pStyle->SetFoundry(this);
229 8 : pStyle->RegisterStyle();
230 8 : }
231 :
232 : }
233 :
234 0 : LwpBookMark* LwpFoundry::GetBookMark(LwpObjectID objMarker)
235 : {
236 : LwpDLVListHeadHolder* pHeadHolder= static_cast
237 0 : <LwpDLVListHeadHolder*>(m_BookMarkHead.obj().get());
238 0 : LwpObjectID& rObjID = pHeadHolder->GetHeadID();
239 : LwpBookMark* pBookMark;
240 0 : pBookMark = static_cast<LwpBookMark*>(rObjID.obj().get());
241 :
242 0 : while (pBookMark)
243 : {
244 0 : if (pBookMark->IsRightMarker(objMarker))
245 0 : return pBookMark;
246 0 : rObjID = pBookMark->GetNext();
247 0 : pBookMark = static_cast<LwpBookMark*>(rObjID.obj().get());
248 : }
249 0 : return NULL;
250 : }
251 :
252 : /**
253 : * @descr: Get next content
254 : *
255 : */
256 0 : LwpContent* LwpFoundry::EnumContents(LwpContent * pContent)
257 : {
258 0 : return GetContentManager().EnumContents(pContent);
259 : }
260 :
261 : /**
262 : * @descr: Get next section
263 : *
264 : */
265 0 : LwpSection* LwpFoundry::EnumSections(LwpSection * pSection)
266 : {
267 0 : return static_cast<LwpSection*>(m_SectionList.Enumerate(pSection));
268 : }
269 :
270 : /**
271 : * @descr: Get default text style id
272 : *
273 : */
274 0 : LwpObjectID * LwpFoundry::GetDefaultTextStyle()
275 : {
276 0 : LwpVersionedPointer * pPointer = static_cast<LwpVersionedPointer *>(m_DefaultTextStyle.obj().get());
277 0 : if (!pPointer)
278 0 : return NULL;
279 :
280 0 : return &pPointer->GetPointer();
281 : }
282 :
283 : /**
284 : * @descr: Get paragraph style object id according to its style name
285 : *
286 : */
287 0 : LwpObjectID * LwpFoundry::FindParaStyleByName(const OUString& name)
288 : {
289 : //Register all text styles: para styles, character styles
290 0 : LwpDLVListHeadHolder* pParaStyleHolder = static_cast<LwpDLVListHeadHolder*>(GetTextStyleHead().obj().get());
291 0 : if(pParaStyleHolder)
292 : {
293 0 : LwpTextStyle* pParaStyle = static_cast<LwpTextStyle*> (pParaStyleHolder->GetHeadID().obj().get());
294 0 : while(pParaStyle)
295 : {
296 0 : OUString strName = pParaStyle->GetName().str();
297 0 : if(strName == name)
298 0 : return &pParaStyle->GetObjectID();
299 0 : pParaStyle = static_cast<LwpTextStyle*>(pParaStyle->GetNext().obj().get());
300 0 : }
301 : }
302 :
303 0 : return NULL;
304 : }
305 :
306 : /**
307 : * @descr: Get style name registered according the original style name
308 : *
309 : */
310 0 : OUString LwpFoundry::FindActuralStyleName(const OUString& name)
311 : {
312 0 : LwpObjectID* pID = FindParaStyleByName(name);
313 0 : if(pID)
314 : {
315 0 : IXFStyle* pStyle = GetStyleManager()->GetStyle(*pID);
316 0 : if(pStyle)
317 : {
318 0 : return pStyle->GetStyleName();
319 : }
320 : }
321 :
322 0 : return name;
323 : }
324 :
325 5 : void LwpVersionManager::Read(LwpObjectStream *pStrm)
326 : {
327 : // TODO: skip the data for prototype
328 5 : Skip(pStrm);
329 5 : }
330 :
331 5 : void LwpVersionManager::Skip(LwpObjectStream *pStrm)
332 : {
333 5 : pStrm->QuickReaduInt32();
334 5 : sal_uInt16 Count = pStrm->QuickReaduInt16();
335 :
336 15 : while(Count--)
337 : {
338 5 : sal_uInt32 tag = pStrm->QuickReaduInt32();
339 5 : switch(tag)
340 : {
341 : case TAG_USER_VERSION:
342 : // TODO: skip the CUserVersionControl
343 5 : pStrm->SeekRel(pStrm->QuickReaduInt16());
344 5 : break;
345 :
346 : default:
347 0 : pStrm->SeekRel(pStrm->QuickReaduInt16());
348 0 : pStrm->SkipExtra();
349 0 : break;
350 : }
351 : }
352 5 : pStrm->SkipExtra();
353 5 : }
354 :
355 9 : void LwpObjectManager::Read(LwpObjectStream *pStrm)
356 : {
357 :
358 9 : LwpObjectID dummy;
359 9 : dummy.Read(pStrm);
360 : // TODO: judge if we need to set the cDelta by the dummy id
361 :
362 9 : m_Division.ReadIndexed(pStrm);
363 9 : pStrm->SkipExtra();
364 9 : }
365 :
366 9 : void LwpNumberManager::Read(LwpObjectStream *pStrm)
367 : {
368 9 : m_TableRange.ReadIndexed(pStrm);
369 9 : pStrm->SkipExtra();
370 9 : }
371 :
372 9 : void LwpBulletManager::Read(LwpObjectStream *pStrm)
373 : {
374 9 : m_Head.ReadIndexed(pStrm);
375 9 : pStrm->SkipExtra();
376 9 : }
377 :
378 9 : void LwpContentManager::Read(LwpObjectStream *pStrm)
379 : {
380 9 : m_ContentList.ReadIndexed(pStrm);
381 :
382 : // TODO: to judge the file revision
383 :
384 9 : m_EnumHead.ReadIndexed(pStrm);
385 9 : m_EnumTail.ReadIndexed(pStrm);
386 :
387 9 : m_OleObjCount.ReadIndexed(pStrm);
388 :
389 9 : if( LwpFileHeader::m_nFileRevision >= 0x000B)
390 : {
391 9 : m_GrapHead.ReadIndexed(pStrm);
392 9 : m_GrapTail.ReadIndexed(pStrm);
393 9 : m_OleHead.ReadIndexed(pStrm);
394 9 : m_OleTail.ReadIndexed(pStrm);
395 : }
396 :
397 9 : pStrm->SkipExtra();
398 9 : }
399 :
400 : /**
401 : * @descr: Get next content
402 : *
403 : */
404 0 : LwpContent* LwpContentManager::EnumContents(LwpContent* pContent)
405 : {
406 0 : if(pContent)
407 0 : return pContent->GetNextEnumerated();
408 0 : LwpVersionedPointer* pPointer = static_cast<LwpVersionedPointer*>(m_EnumHead.obj().get());
409 0 : return pPointer ? static_cast<LwpContent*>(pPointer->GetPointer().obj().get()) : NULL;
410 : }
411 :
412 5 : void LwpPieceManager::Read(LwpObjectStream *pStrm)
413 : {
414 5 : m_GeometryPieceList.ReadIndexed(pStrm);
415 5 : m_ScalePieceList.ReadIndexed(pStrm);
416 5 : m_MarginsPieceList.ReadIndexed(pStrm);
417 5 : m_ColumnsPieceList.ReadIndexed(pStrm);
418 5 : m_BorderStuffPieceList.ReadIndexed(pStrm);
419 :
420 5 : m_GutterStuffPieceList.ReadIndexed(pStrm);
421 5 : m_BackgroundStuffPieceList.ReadIndexed(pStrm);
422 5 : m_JoinStuffPieceList.ReadIndexed(pStrm);
423 5 : m_ShadowPieceList.ReadIndexed(pStrm);
424 5 : m_NumericsPieceList.ReadIndexed(pStrm);
425 :
426 5 : m_RelativityPieceList.ReadIndexed(pStrm);
427 5 : m_AlignmentPieceList.ReadIndexed(pStrm);
428 5 : m_IndentPieceList.ReadIndexed(pStrm);
429 5 : m_ParaBorderPieceList.ReadIndexed(pStrm);
430 5 : m_SpacingPieceList.ReadIndexed(pStrm);
431 :
432 5 : m_BreaksPieceList.ReadIndexed(pStrm);
433 5 : m_NumberingPieceList.ReadIndexed(pStrm);
434 5 : m_TabPieceList.ReadIndexed(pStrm);
435 5 : m_CharacterBorderPieceList.ReadIndexed(pStrm);
436 5 : m_AmikakePieceList.ReadIndexed(pStrm);
437 :
438 5 : if(pStrm->CheckExtra())
439 : {
440 4 : m_ParaBackgroundPieceList.ReadIndexed(pStrm);
441 4 : m_ExternalBorderStuffPieceList.ReadIndexed(pStrm);
442 4 : m_ExternalJoinStuffPieceList.ReadIndexed(pStrm);
443 4 : pStrm->SkipExtra();
444 : }
445 5 : }
446 :
447 9 : void LwpOrderedObjectManager::Read(LwpObjectStream *pStrm)
448 : {
449 9 : m_Head.ReadIndexed(pStrm);
450 9 : }
451 :
452 : /**
453 : * @descr: Get next orderedobject, copy from lwp source code
454 : *
455 : */
456 0 : LwpOrderedObject* LwpOrderedObjectManager::Enumerate(LwpOrderedObject * pLast)
457 : {
458 : // If Last has a next, return it.
459 0 : if(pLast && !pLast->GetNext().IsNull())
460 0 : return static_cast<LwpOrderedObject*>(pLast->GetNext().obj().get());
461 :
462 0 : LwpListList* pList = NULL;
463 0 : if(pLast)
464 : {
465 : // We're at the end of Last's list (not Liszt's list).
466 : // Start with the next active list
467 0 : pList = static_cast<LwpListList*>(pLast->GetListList().obj().get());
468 0 : pList= GetNextActiveListList(pList);
469 : }
470 : else
471 : {
472 : // Start with the first active ListList
473 0 : pList = GetNextActiveListList(NULL);
474 : }
475 :
476 0 : if(pList)
477 : {
478 0 : return static_cast<LwpOrderedObject*>(pList->GetHead().obj().get());
479 : }
480 :
481 0 : return NULL;
482 : }
483 :
484 : /**
485 : * @descr: Get next listlist object, copy from lwp source code
486 : *
487 : */
488 0 : LwpListList* LwpOrderedObjectManager::GetNextActiveListList(LwpListList * pLast)
489 : {
490 0 : LwpListList* pList = NULL;
491 0 : if(pLast)
492 0 : pList = static_cast<LwpListList*>(pLast->GetNext().obj().get());
493 : else
494 : {
495 0 : LwpDLVListHeadHolder* pHeadHolder= static_cast<LwpDLVListHeadHolder*>(m_Head.obj().get());
496 0 : if(pHeadHolder)
497 : {
498 0 : pList = static_cast<LwpListList*>(pHeadHolder->GetHeadID().obj().get());
499 : }
500 : }
501 :
502 0 : while(pList)
503 : {
504 0 : LwpContent* pContent = static_cast<LwpContent*>(pList->GetObject().obj().get());
505 0 : if(pContent && pContent->HasNonEmbeddedLayouts() &&
506 0 : !pContent->IsStyleContent())
507 0 : return pList;
508 0 : pList = static_cast<LwpListList*>(pList->GetNext().obj().get());
509 : }
510 0 : return NULL;
511 : }
512 :
513 9 : LwpStyleManager::LwpStyleManager()
514 9 : : m_pFoundry(0)
515 : {
516 9 : }
517 :
518 18 : LwpStyleManager::~LwpStyleManager()
519 : {
520 9 : m_StyleList.clear();
521 9 : }
522 :
523 : /*
524 : VO_PARASTYLE/VO_CHARACTERSTYLE call this method to add its created style to XFStyleManager
525 : 1. Add the style to XFStyleManager, and return the <office:styles> style name
526 : 2. Add it to LwpParaStyleMap.
527 : Prerequisite: pStyle has been created and all properties has been set to it.
528 : Return the XFStyle* added by XFStyleManager
529 : */
530 68 : IXFStyle* LwpStyleManager::AddStyle(LwpObjectID styleObjID, IXFStyle* pStyle)
531 : {
532 : assert(pStyle);
533 : //pStyle may change if same style is found in XFStyleManager
534 68 : XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
535 68 : pStyle = pXFStyleManager->AddStyle(pStyle).m_pStyle;
536 68 : m_StyleList.insert(LwpStyleMap::value_type(styleObjID, pStyle));
537 68 : return pStyle;
538 : }
539 :
540 : /*
541 : Called by VO_PARA or other objects to get style name based on the Style object ID
542 : 1) Get style from LwpParaStyleMap based on the LwpObjectID of VO_PARASTYLE.
543 : Prerequisite: VO_PARASTYLE/VO_CHARACTERSTYLE should call AddStyle first.
544 : Return empty string if no style found.
545 : */
546 259 : IXFStyle* LwpStyleManager::GetStyle(const LwpObjectID &styleObjID)
547 : {
548 259 : LwpStyleMap::const_iterator it = m_StyleList.find(styleObjID);
549 259 : if (it != m_StyleList.end()) {
550 259 : return((*it).second);
551 : }
552 0 : return NULL;
553 : }
554 :
555 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|