fdo#74697 Add Bluez 5 support for impress remote.
[LibreOffice.git] / lotuswordpro / source / filter / lwpfribptr.cxx
blob89c0db7b5029a1370c7bcb5a83177a8f48c3c661
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,
29 * MA 02111-1307 USA
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 /*************************************************************************
57 * @file
58 * For LWP filter architecture prototype
59 ************************************************************************/
60 /*************************************************************************
61 * Change History
62 Jan 2005 Created
63 ************************************************************************/
65 #include "lwpfribptr.hxx"
67 #include "lwpfribheader.hxx"
68 #include "lwpfribtext.hxx"
69 #include "lwppara.hxx"
70 #include "lwpstory.hxx"
71 #include "xfilter/xftextspan.hxx"
72 #include "xfilter/xftextcontent.hxx"
73 #include "xfilter/xftabstop.hxx"
74 #include "xfilter/xflinebreak.hxx"
75 #include "lwpfribsection.hxx"
76 #include "lwpsection.hxx"
77 #include "lwpfribbreaks.hxx"
78 #include "lwpfribframe.hxx"
79 #include "lwpfribtable.hxx"
80 #include "xfilter/xfstylemanager.hxx"
81 #include "lwphyperlinkmgr.hxx"
82 #include "xfilter/xfhyperlink.hxx"
83 #include "lwpfootnote.hxx"
84 #include "lwpnotes.hxx"
85 #include "lwpfribmark.hxx"
86 #include "xfilter/xfchange.hxx"
87 #include "lwpchangemgr.hxx"
88 #include "lwpglobalmgr.hxx"
91 LwpFribPtr::LwpFribPtr()
92 : m_pFribs(NULL),m_pXFPara(NULL),m_pPara(NULL)
96 LwpFribPtr::~LwpFribPtr()
98 LwpFrib* pNextFrib = m_pFribs;
99 LwpFrib* pCurFrib = m_pFribs;
100 while(pCurFrib)
102 pNextFrib = pCurFrib -> GetNext();
103 delete pCurFrib;
104 pCurFrib = pNextFrib;
108 void LwpFribPtr::ReadPara(LwpObjectStream* pObjStrm)
110 LwpFrib* pCurFrib = m_pFribs = NULL;
111 for(;;)
113 // Get the frib type
114 sal_uInt8 FribTag = pObjStrm->QuickReaduInt8();
116 sal_uInt8 FribType = FribTag & ~FRIB_TAG_TYPEMASK;
118 // Stop when we hit Elvis
119 if (FribType == FRIB_TAG_ELVIS)
120 break;
122 // skip the editor ID
123 //pObjStrm->SeekRel(sizeof(sal_uInt8));
124 sal_uInt8 FribEditor = pObjStrm->QuickReaduInt8();
125 if( FribType != FT_MAXIMUM )
127 LwpFrib* pFrib = LwpFrib::CreateFrib( m_pPara, pObjStrm, FribTag,FribEditor);
128 if(!m_pFribs)
130 m_pFribs = pFrib;
132 if(pCurFrib)
134 pCurFrib->SetNext(pFrib);
136 else//frist frib in the para,add by 2/1
138 if (pFrib->GetType() == FRIB_TAG_TEXT)
140 LwpFribText* pText = static_cast<LwpFribText*>(pFrib);
141 if (pFrib->GetModifiers())
142 m_pPara->SetFirstFrib(pText->GetText(),pText->GetModifiers()->FontID);
143 else
144 m_pPara->SetFirstFrib(pText->GetText(),0);
147 pCurFrib = pFrib;
152 #include "lwpdropcapmgr.hxx"
153 void LwpFribPtr::XFConvert()
155 LwpFrib* pFrib = m_pFribs;
156 while(pFrib)
158 sal_uInt8 nFribType = pFrib->GetType();
159 sal_Bool bRevisionFlag = pFrib->GetRevisionFlag();
160 OUString sChangeID;
161 if (bRevisionFlag)
163 if ( nFribType!= FRIB_TAG_TABLE && nFribType != FRIB_TAG_FIELD
164 && nFribType != FRIB_TAG_FRAME)
166 //sal_uInt8 nRevisionType = pFrib->GetRevisionType();
167 LwpGlobalMgr* pGlobal = LwpGlobalMgr::GetInstance();
168 LwpChangeMgr* pChangeMgr = pGlobal->GetLwpChangeMgr();
169 sChangeID = pChangeMgr->GetChangeID(pFrib);
170 if (!sChangeID.isEmpty())
172 /// if (nRevisionType == LwpFrib::REV_INSERT)
173 /// {
174 XFChangeStart* pChangeStart = new XFChangeStart;
175 pChangeStart->SetChangeID(sChangeID);
176 m_pXFPara->Add(pChangeStart);
177 /// }
178 /// else if (nRevisionType == LwpFrib::REV_DELETE)
179 /// {
180 /// XFChange* pChange = new XFChange;
181 /// pChange->SetChangeID(sChangeID);
182 /// m_pXFPara->Add(pChange);
183 /// pFrib = pFrib->GetNext();
184 /// continue;
185 /// }
190 switch(nFribType)
192 case FRIB_TAG_TEXT:
194 LwpFribText* textFrib= static_cast<LwpFribText*>(pFrib);
195 textFrib->XFConvert(m_pXFPara,m_pPara->GetStory());
197 break;
198 case FRIB_TAG_TAB:
200 LwpFribTab* tabFrib = static_cast<LwpFribTab*>(pFrib);
201 if (pFrib->m_ModFlag)
203 XFTextSpan *pSpan = new XFTextSpan();
204 pSpan->SetStyleName(tabFrib->GetStyleName());
205 XFTabStop *pTab = new XFTabStop();
206 pSpan->Add(pTab);
207 m_pXFPara->Add(pSpan);
209 else
211 XFTabStop *pTab = new XFTabStop();
212 m_pXFPara->Add(pTab);
215 break;
216 case FRIB_TAG_SECTION:
218 LwpFribSection* pSectionFrib = static_cast<LwpFribSection*>(pFrib);
219 pSectionFrib->ParseSection();
221 break;
223 case FRIB_TAG_PAGEBREAK:
225 LwpFribPageBreak* pPageBreak = static_cast<LwpFribPageBreak*>(pFrib);
226 LwpPageLayout* pLayout = dynamic_cast<LwpPageLayout*>(pPageBreak->GetLayout()->obj());
227 if(pLayout)
229 pPageBreak->ParseLayout();
231 else
233 if (pPageBreak->IsLastFrib() == sal_True)
235 m_pXFPara->SetStyleName( pPageBreak->GetStyleName() );
237 else
239 //parse pagebreak
240 XFParagraph *pPara = new XFParagraph();
241 pPara->SetStyleName(pFrib->GetStyleName());
242 SetXFPara(pPara);
243 m_pPara->AddXFContent(pPara);
247 break;
248 case FRIB_TAG_COLBREAK:
250 XFParagraph *pPara = new XFParagraph();
251 pPara->SetStyleName(pFrib->GetStyleName());
252 SetXFPara(pPara);
253 m_pPara->AddXFContent(pPara);
255 break;
256 case FRIB_TAG_LINEBREAK:
258 XFLineBreak *pLineBreak = new XFLineBreak();
259 m_pXFPara->Add(pLineBreak);
261 break;
262 case FRIB_TAG_UNICODE: //fall through
263 case FRIB_TAG_UNICODE2: //fall through
264 case FRIB_TAG_UNICODE3: //fall through
266 LwpFribUnicode* unicodeFrib= static_cast<LwpFribUnicode*>(pFrib);
267 unicodeFrib->XFConvert(m_pXFPara,m_pPara->GetStory());
269 break;
270 case FRIB_TAG_HARDSPACE:
272 OUString sHardSpace(sal_Unicode(0x00a0));
273 LwpHyperlinkMgr* pHyperlink =
274 m_pPara->GetStory()->GetHyperlinkMgr();
275 if (pHyperlink->GetHyperlinkFlag())
276 pFrib->ConvertHyperLink(m_pXFPara,pHyperlink,sHardSpace);
277 else
278 pFrib->ConvertChars(m_pXFPara,sHardSpace);
280 break;
281 case FRIB_TAG_SOFTHYPHEN:
283 OUString sSoftHyphen(sal_Unicode(0x00ad));
284 pFrib->ConvertChars(m_pXFPara,sSoftHyphen);
286 break;
287 case FRIB_TAG_FRAME:
289 LwpFribFrame* frameFrib= static_cast<LwpFribFrame*>(pFrib);
290 LwpObject* pLayout = frameFrib->GetLayout();
291 if (pLayout && pLayout->GetTag() == VO_DROPCAPLAYOUT)
292 m_pPara->GetFoundry()->GetDropcapMgr()->SetXFPara(m_pXFPara);
293 frameFrib->XFConvert(m_pXFPara);
295 break;
296 case FRIB_TAG_CHBLOCK:
298 LwpFribCHBlock* chbFrib = static_cast<LwpFribCHBlock*>(pFrib);
299 chbFrib->XFConvert(m_pXFPara,m_pPara->GetStory());
301 break;
302 case FRIB_TAG_TABLE:
304 LwpFribTable* tableFrib = static_cast<LwpFribTable*>(pFrib);
305 //tableFrib->XFConvert(m_pPara->GetXFContainer());
306 tableFrib->XFConvert(m_pXFPara);
308 break;
309 case FRIB_TAG_BOOKMARK:
311 LwpFribBookMark* bookmarkFrib = static_cast<LwpFribBookMark*>(pFrib);
312 bookmarkFrib->XFConvert(m_pXFPara);
314 break;
315 case FRIB_TAG_FOOTNOTE:
317 LwpFribFootnote* pFootnoteFrib = static_cast<LwpFribFootnote*>(pFrib);
318 pFootnoteFrib->XFConvert(m_pXFPara);
319 break;
321 case FRIB_TAG_FIELD:
323 LwpFribField* fieldFrib = static_cast<LwpFribField*>(pFrib);
324 fieldFrib->XFConvert(m_pXFPara);
325 break;
327 case FRIB_TAG_NOTE:
329 LwpFribNote* pNoteFrib = static_cast<LwpFribNote*>(pFrib);
330 pNoteFrib->XFConvert(m_pXFPara);
331 break;
333 case FRIB_TAG_PAGENUMBER:
335 LwpFribPageNumber* pagenumFrib = static_cast<LwpFribPageNumber*>(pFrib);
336 pagenumFrib->XFConvert(m_pXFPara);
337 break;
339 case FRIB_TAG_DOCVAR:
341 LwpFribDocVar* docFrib = static_cast<LwpFribDocVar*>(pFrib);
342 docFrib->XFConvert(m_pXFPara);
343 break;
345 case FRIB_TAG_RUBYMARKER:
347 LwpFribRubyMarker* rubyFrib = static_cast<LwpFribRubyMarker*>(pFrib);
348 rubyFrib->XFConvert(m_pXFPara);
349 break;
351 case FRIB_TAG_RUBYFRAME:
353 LwpFribRubyFrame* rubyfrmeFrib = static_cast<LwpFribRubyFrame*>(pFrib);
354 rubyfrmeFrib->XFConvert(m_pXFPara);
355 break;
357 default :
358 break;
361 if (bRevisionFlag )//&& pFrib->GetRevisionType() == LwpFrib::REV_INSERT)
363 if (nFribType!= FRIB_TAG_TABLE && nFribType != FRIB_TAG_FIELD
364 && nFribType != FRIB_TAG_FRAME)
366 if (!sChangeID.isEmpty())
368 XFChangeEnd* pChangeEnd = new XFChangeEnd;
369 pChangeEnd->SetChangeID(sChangeID);
370 m_pXFPara->Add(pChangeEnd);
374 pFrib = pFrib->GetNext();
379 void LwpFribPtr::FindLayouts()
381 LwpFrib* pFrib = m_pFribs;
382 while(pFrib)
384 switch(pFrib->GetType())
386 case FRIB_TAG_SECTION:
388 LwpFribSection* pSectionFrib = static_cast<LwpFribSection*>(pFrib);
389 LwpSection* pSection = pSectionFrib->GetSection();
390 if(pSection)
392 LwpPageLayout* pLayout = pSection->GetPageLayout();
393 if(pLayout)
395 LwpLayout::UseWhenType eSectionType = pLayout->GetUseWhenType();
396 if(eSectionType==LwpLayout::StartWithinColume)
398 //StartWithinColume type not support now
399 break;
401 LwpStory* pStory = dynamic_cast<LwpStory*>(m_pPara->GetStoryID()->obj());
402 if (pStory)
403 pStory->AddPageLayout(pSection->GetPageLayout());
407 break;
409 case FRIB_TAG_PAGEBREAK:
411 LwpFribPageBreak* pPageBreak = static_cast<LwpFribPageBreak*>(pFrib);
412 LwpPageLayout* pLayout = dynamic_cast<LwpPageLayout*>(pPageBreak->GetLayout()->obj());
413 if(pLayout)
415 LwpStory* pStory = dynamic_cast<LwpStory*>(m_pPara->GetStoryID()->obj());
416 if (pStory)
417 pStory->AddPageLayout(pLayout);
419 break;
421 default:
422 break;
424 pFrib = pFrib->GetNext();
427 /**************************************************************************
428 * @descr: Whether has a frib which type is nType
429 * @param:
430 * @param:
431 * @return:
432 **************************************************************************/
433 LwpFrib* LwpFribPtr::HasFrib(sal_uInt8 nType)
435 LwpFrib* pFrib = m_pFribs;
436 while(pFrib)
438 if(pFrib->GetType()==nType)
440 return pFrib;
442 pFrib = pFrib->GetNext();
444 return NULL;
447 void LwpFribPtr::GatherAllText()
449 LwpFrib* pFrib = m_pFribs;
450 while(pFrib)
452 switch(pFrib->GetType())
454 case FRIB_TAG_TEXT:
456 OUString sText = static_cast<LwpFribText*>(pFrib)->GetText();
457 m_pPara->SetAllText(sText);
458 break;
460 case FRIB_TAG_UNICODE: //fall through
461 case FRIB_TAG_UNICODE2: //fall through
462 case FRIB_TAG_UNICODE3: //fall through :
464 OUString sText = static_cast<LwpFribText*>(pFrib)->GetText();
465 m_pPara->SetAllText(sText);
466 break;
468 default :
469 break;
471 pFrib = pFrib->GetNext();
475 void LwpFribPtr::RegisterStyle()
477 LwpFrib* pFrib = m_pFribs;
478 while(pFrib)
480 switch(pFrib->GetType())
482 case FRIB_TAG_TEXT:
484 pFrib->RegisterStyle(m_pPara->GetFoundry());
485 OUString sText = static_cast<LwpFribText*>(pFrib)->GetText();
486 ProcessDropcap(m_pPara->GetStory(), pFrib,sText.getLength());
487 break;
489 case FRIB_TAG_TAB:
490 pFrib->RegisterStyle(m_pPara->GetFoundry());
491 break;
492 case FRIB_TAG_SECTION:
494 //section registerstyle here;
495 LwpFribSection* pSectionFrib = static_cast<LwpFribSection*>(pFrib);
496 pSectionFrib->RegisterSectionStyle();
497 //for bullet
498 pSectionFrib->SetSectionName();
500 break;
501 case FRIB_TAG_PAGEBREAK:
503 LwpFribPageBreak* breakFrib = static_cast<LwpFribPageBreak*>(pFrib);
504 breakFrib->RegisterBreakStyle(m_pPara);
506 break;
507 case FRIB_TAG_COLBREAK:
509 LwpFribColumnBreak* breakFrib = static_cast<LwpFribColumnBreak*>(pFrib);
510 breakFrib->RegisterBreakStyle(m_pPara);
512 break;
513 case FRIB_TAG_UNICODE: //fall through
514 case FRIB_TAG_UNICODE2: //fall through
515 case FRIB_TAG_UNICODE3: //fall through :
517 pFrib->RegisterStyle(m_pPara->GetFoundry());
518 OUString sText = static_cast<LwpFribUnicode*>(pFrib)->GetText();
519 ProcessDropcap(m_pPara->GetStory(), pFrib,sText.getLength());
520 break;
522 case FRIB_TAG_HARDSPACE:
523 pFrib->RegisterStyle(m_pPara->GetFoundry());
524 ProcessDropcap(m_pPara->GetStory(),pFrib,1);
525 break;
526 case FRIB_TAG_SOFTHYPHEN:
527 pFrib->RegisterStyle(m_pPara->GetFoundry());
528 break;
529 case FRIB_TAG_FRAME:
531 LwpFribFrame* frameFrib = static_cast<LwpFribFrame*>(pFrib);
532 frameFrib->SetParaDropcap(m_pPara);
533 frameFrib->RegisterStyle(m_pPara->GetFoundry());
534 //register framelayout style, ,03/09/2005
535 //frameFrib->GetLayout()->RegisterStyle();
537 break;
538 case FRIB_TAG_CHBLOCK:
539 break;
540 case FRIB_TAG_TABLE:
542 LwpFribTable* tableFrib = static_cast<LwpFribTable*>(pFrib);
543 tableFrib->RegisterNewStyle();
545 break;
546 case FRIB_TAG_FOOTNOTE:
548 LwpFribFootnote* pFribFootnote = static_cast<LwpFribFootnote*>(pFrib);
549 pFribFootnote->RegisterNewStyle();
551 break;
552 case FRIB_TAG_NOTE:
554 LwpFribNote* pNoteFrib = static_cast<LwpFribNote*>(pFrib);
555 pNoteFrib->RegisterNewStyle();
556 break;
558 case FRIB_TAG_PAGENUMBER:
560 pFrib->RegisterStyle(m_pPara->GetFoundry());
561 break;
563 case FRIB_TAG_DOCVAR:
565 LwpFribDocVar* docFrib = static_cast<LwpFribDocVar*>(pFrib);
566 docFrib->RegisterStyle(m_pPara->GetFoundry());
567 break;
569 case FRIB_TAG_FIELD:
571 LwpFribField* fieldFrib = static_cast<LwpFribField*>(pFrib);
572 fieldFrib->RegisterStyle(m_pPara->GetFoundry());
573 break;
575 case FRIB_TAG_BOOKMARK:
577 LwpFribBookMark* bookmarkFrib = static_cast<LwpFribBookMark*>(pFrib);
578 bookmarkFrib->RegisterStyle(m_pPara->GetFoundry());
579 break;
581 case FRIB_TAG_RUBYFRAME:
583 LwpFribRubyFrame* rubyfrmeFrib = static_cast<LwpFribRubyFrame*>(pFrib);
584 rubyfrmeFrib->RegisterStyle(m_pPara->GetFoundry());
585 break;
587 default :
588 break;
590 if (pFrib->GetRevisionFlag() && pFrib->GetType()!= FRIB_TAG_FIELD)
592 LwpGlobalMgr* pGlobal = LwpGlobalMgr::GetInstance();
593 LwpChangeMgr* pChangeMgr = pGlobal->GetLwpChangeMgr();
594 pChangeMgr->AddChangeFrib(pFrib);
597 pFrib = pFrib->GetNext();
601 void LwpFribPtr::ProcessDropcap(LwpStory* pStory,LwpFrib* pFrib,sal_uInt32 nLen)
603 if (pStory)
605 if (pStory->GetDropcapFlag() == sal_True)
607 XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
608 XFTextStyle* pFribStyle = pXFStyleManager->FindTextStyle(pFrib->GetStyleName());
609 pFribStyle->GetFont()->SetFontSize(0);
611 LwpDropcapLayout* pObj = dynamic_cast<LwpDropcapLayout*>(pStory->GetLayoutsWithMe()->GetOnlyLayout()->obj());
612 if (pObj)
613 pObj->SetChars(nLen);
618 * @descr: If the position of pPreLayout is earlier than pNextLayout, return true, or return false, defalut return true
621 sal_Bool LwpFribPtr::ComparePagePosition(LwpVirtualLayout* pPreLayout, LwpVirtualLayout* pNextLayout)
623 if(!pPreLayout || !pNextLayout)
624 return sal_True;
626 LwpFrib* pFrib = m_pFribs;
627 LwpVirtualLayout* pLayout = NULL;
628 while(pFrib)
630 switch(pFrib->GetType())
632 case FRIB_TAG_SECTION:
634 LwpFribSection* pSectionFrib = static_cast<LwpFribSection*>(pFrib);
635 LwpSection* pSection = pSectionFrib->GetSection();
636 if(pSection)
638 pLayout = pSection->GetPageLayout();
641 break;
643 case FRIB_TAG_PAGEBREAK:
645 LwpFribPageBreak* pPageBreak = static_cast<LwpFribPageBreak*>(pFrib);
646 pLayout = dynamic_cast<LwpVirtualLayout*>(pPageBreak->GetLayout()->obj());
647 break;
649 default:
650 break;
653 if(pLayout)
655 if(pPreLayout == pLayout)
656 return sal_True;
657 if(pNextLayout == pLayout)
658 return sal_False;
660 pFrib = pFrib->GetNext();
663 return sal_True;
666 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */