fdo#74697 Add Bluez 5 support for impress remote.
[LibreOffice.git] / lotuswordpro / source / filter / lwplayout.cxx
blob0818f3f3bc8b52e222e9fd264965a9f7438cbc2b
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 Feb 2005 Process gemotry, margins
64 ************************************************************************/
66 #include "lwplayout.hxx"
67 #include "lwpusewhen.hxx"
68 #include "lwptools.hxx"
69 #include "xfilter/xfcolumns.hxx"
70 #include "lwpstory.hxx"
71 #include "lwpparastyle.hxx"
72 #include "lwpholder.hxx"
73 #include "lwpdoc.hxx"
74 #include "lwppagehint.hxx"
75 #include "lwpdivinfo.hxx"
76 #include "lwpgrfobj.hxx"
77 #include <osl/thread.h>
79 LwpVirtualLayout::LwpVirtualLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm)
80 : LwpDLNFPVList(objHdr, pStrm)
84 void LwpVirtualLayout::Read()
86 LwpDLNFPVList::Read();
88 LwpObjectStream* pStrm = m_pObjStrm;
89 m_nAttributes = pStrm->QuickReaduInt32();
90 m_nAttributes2 = pStrm->QuickReaduInt32();
91 m_nAttributes3 = pStrm->QuickReaduInt32();
92 m_nOverrideFlag = pStrm->QuickReaduInt32();
93 m_nDirection = pStrm->QuickReaduInt16();
95 //Note that two bytes is read into m_nEditorID instead of one byte.
96 m_nEditorID = pStrm->QuickReaduInt16();
98 m_NextEnumerated.ReadIndexed(pStrm);
99 m_PreviousEnumerated.ReadIndexed(pStrm);
101 pStrm->SkipExtra();
104 sal_Bool LwpVirtualLayout::MarginsSameAsParent()
106 return m_nAttributes2 & STYLE2_MARGINSSAMEASPARENT ? sal_True : sal_False;
110 * @descr: Get column width
113 double LwpVirtualLayout::GetColWidth(sal_uInt16 /*nIndex*/)
115 //return GetContentWidth(); //not support now
116 //return LwpTools::ConvertToMetric(5); //test
117 return 0; //test
121 * @descr: Get the gap between columns
124 double LwpVirtualLayout::GetColGap(sal_uInt16 /*nIndex*/)
126 //return DEFAULTGAPSIZE;
127 //return LwpTools::ConvertToMetric(0.17);//DEFAULTGAPSIZE=0.17
128 return LwpTools::ConvertToMetric(0.17);
132 * @descr: Whether it is honoring protection
135 sal_Bool LwpVirtualLayout::HonorProtection()
137 if(!(m_nAttributes2 & STYLE2_HONORPROTECTION))
138 return sal_False;
140 LwpVirtualLayout* pParent = dynamic_cast<LwpVirtualLayout*> (GetParent()->obj());
141 if(pParent && !pParent->IsHeader())
143 return pParent->HonorProtection();
146 if(m_pFoundry)//is null now
148 LwpDocument* pDoc = m_pFoundry->GetDocument();
149 /*if(pDoc)
151 return pDoc->HonorProtection();
153 if(pDoc && pDoc->GetRootDocument())
154 return pDoc->GetRootDocument()->HonorProtection();
157 return sal_True;
161 * @descr: Whether it is protected
164 sal_Bool LwpVirtualLayout::IsProtected()
166 sal_Bool bProtected = (m_nAttributes & STYLE_PROTECTED)!=0;
168 LwpVirtualLayout* pParent = dynamic_cast<LwpVirtualLayout*> (GetParent()->obj());
169 if(pParent && !pParent->IsHeader())
171 if(pParent->HonorProtection()&&(pParent->HasProtection()||bProtected))
173 return sal_True;
176 else if(m_pFoundry)//is null now
178 LwpDocument* pDoc = m_pFoundry->GetDocument();
179 if(pDoc)
181 if (pDoc->HonorProtection() && bProtected)
183 return sal_True;
188 return sal_False;
192 * @descr: Whether it has protection
195 sal_Bool LwpVirtualLayout::HasProtection()
197 if(m_nAttributes & STYLE_PROTECTED)
198 return sal_True;
200 LwpVirtualLayout* pParent = dynamic_cast<LwpVirtualLayout*> (GetParent()->obj());
201 if(pParent && !pParent->IsHeader())
203 return pParent->HasProtection();
206 return sal_False;
210 * @descr: Whether it is a mirror layout
213 sal_Bool LwpVirtualLayout::IsComplex()
215 return m_nAttributes & STYLE_COMPLEX ? sal_True : sal_False;
219 * @descr: Get usewhen pointer
222 LwpUseWhen* LwpVirtualLayout::GetUseWhen()
225 If we have a parent, and I'm not a page layout,
226 use my parents information.
228 if(GetLayoutType()!=LWP_PAGE_LAYOUT)
230 //get parent
231 LwpVirtualLayout* pParent = dynamic_cast<LwpVirtualLayout*> (GetParent()->obj());
232 if(pParent && !pParent->IsHeader()&& (pParent->GetLayoutType()!=LWP_PAGE_LAYOUT))
233 return pParent->GetUseWhen();
237 return VirtualGetUseWhen();
240 * @descr: Whether this layout is page layout or not
241 * @param:
242 * @return:
244 sal_Bool LwpVirtualLayout::IsPage()
246 return (GetLayoutType() == LWP_PAGE_LAYOUT);
249 * @descr: Whether this layout is heaer layout or not
250 * @param:
251 * @return:
253 sal_Bool LwpVirtualLayout::IsHeader()
255 return (GetLayoutType() == LWP_HEADER_LAYOUT);
258 * @descr: Whether this layout is footer layout or not
259 * @param:
260 * @return:
262 sal_Bool LwpVirtualLayout::IsFooter()
264 return (GetLayoutType() == LWP_FOOTER_LAYOUT);
267 * @descr: Whether this layout is frame layout or not
268 * @param:
269 * @return:
271 sal_Bool LwpVirtualLayout::IsFrame()
273 return (GetLayoutType() == LWP_FRAME_LAYOUT);
277 * @descr: Whether this layout is cell layout or not
278 * @param:
279 * @return:
281 sal_Bool LwpVirtualLayout::IsCell()
283 return (GetLayoutType() == LWP_CELL_LAYOUT
284 || GetLayoutType() == LWP_CONNECTED_CELL_LAYOUT
285 || GetLayoutType() == LWP_HIDDEN_CELL_LAYOUT);
288 * @descr: Whether this layout is supertable layout or not
289 * @param:
290 * @return:
292 sal_Bool LwpVirtualLayout::IsSuperTable()
294 return (GetLayoutType() == LWP_SUPERTABLE_LAYOUT);
297 * @descr: Whether this layout is group layout or not
298 * @param:
299 * @return:
301 sal_Bool LwpVirtualLayout::IsGroupHead()
303 return (GetLayoutType() == LWP_GROUP_LAYOUT);
306 * @descr: get the relative type
307 * @param:
308 * @return:
310 sal_uInt8 LwpVirtualLayout::GetRelativeType()
312 return LwpLayoutRelativityGuts::LAY_PARENT_RELATIVE;
315 * @descr: whether it is relative anchored layout
316 * @param:
317 * @return:
319 sal_Bool LwpVirtualLayout::IsRelativeAnchored()
321 sal_uInt8 nType;
323 nType = GetRelativeType();
324 return (nType == LwpLayoutRelativityGuts::LAY_PARA_RELATIVE) || (nType == LwpLayoutRelativityGuts::LAY_INLINE)
325 || (nType == LwpLayoutRelativityGuts::LAY_INLINE_NEWLINE) || (nType == LwpLayoutRelativityGuts::LAY_INLINE_VERTICAL);
328 * @descr: whether it is MinimumHeight layout
329 * @param:
330 * @return:
332 sal_Bool LwpVirtualLayout::IsMinimumHeight()
334 return ((m_nAttributes3& STYLE3_MINHEIGHTVALID) != 0);
338 * @descr: Get parent layout
341 LwpVirtualLayout* LwpVirtualLayout::GetParentLayout()
343 return dynamic_cast<LwpVirtualLayout*> (GetParent()->obj());
347 * @descr: Register child layout style
350 void LwpVirtualLayout::RegisterChildStyle()
352 //Register all children styles
353 LwpVirtualLayout* pLayout = dynamic_cast<LwpVirtualLayout*>(GetChildHead()->obj());
354 while(pLayout)
356 pLayout->SetFoundry(m_pFoundry);
357 pLayout->RegisterStyle();
358 pLayout = dynamic_cast<LwpVirtualLayout*>(pLayout->GetNext()->obj());
362 sal_Bool LwpVirtualLayout::NoContentReference()
364 return (m_nAttributes2 & STYLE2_NOCONTENTREFERENCE) != 0;
367 sal_Bool LwpVirtualLayout::IsStyleLayout()
369 if (m_nAttributes3 & STYLE3_STYLELAYOUT)
370 return sal_True;
372 LwpVirtualLayout* pParent = dynamic_cast<LwpVirtualLayout*>(GetParent()->obj());
373 if (pParent)
374 return pParent->IsStyleLayout();
375 return sal_False;
379 * @descr: Find child layout by layout type
382 LwpVirtualLayout* LwpVirtualLayout::FindChildByType(LWP_LAYOUT_TYPE eType)
384 LwpObjectID *pID = GetChildHead();
386 while(pID && !pID->IsNull())
388 LwpVirtualLayout * pLayout = dynamic_cast<LwpVirtualLayout *>(pID->obj());
389 if(!pLayout)
391 break;
394 if (pLayout && pLayout->GetLayoutType() == eType)
396 return pLayout;
398 pID = pLayout->GetNext();
401 return NULL;
405 * @descr: Whether the size of layout is fit the graphic
408 sal_Bool LwpVirtualLayout::IsFitGraphic()
410 return IsAutoGrowRight() && !IsAutoGrowLeft() && IsAutoGrowDown();
414 * @descr: Whether the width of layout is auto grow
417 sal_Bool LwpVirtualLayout::IsAutoGrowWidth()
419 return IsAutoGrowLeft() || IsAutoGrowRight();
423 * @descr: Determine whether the layout width is to margin
426 sal_Bool LwpVirtualLayout::IsInlineToMargin()
428 return (m_nAttributes3 & STYLE3_INLINETOMARGIN) != 0;
431 void LwpAssociatedLayouts::Read(LwpObjectStream* pStrm)
433 m_OnlyLayout.ReadIndexed(pStrm);
434 m_Layouts.Read(pStrm);
435 pStrm->SkipExtra();
439 * @descr: Looking for the layout which follows the pStartLayout
440 * @param: pStartLayout - the layout which is used for looking for its following layout
442 LwpVirtualLayout* LwpAssociatedLayouts::GetLayout(LwpVirtualLayout *pStartLayout)
444 LwpVirtualLayout* pLayout = NULL;
446 if (!pStartLayout && !m_OnlyLayout.IsNull())
447 /* Looking for the first layout and there's only one layout in the list.*/
448 return dynamic_cast<LwpVirtualLayout*>(m_OnlyLayout.obj());
450 LwpObjectHolder* pObjHolder = dynamic_cast<LwpObjectHolder*>(m_Layouts.GetHead()->obj());
451 if(pObjHolder)
453 pLayout = dynamic_cast<LwpVirtualLayout*>(pObjHolder->GetObject()->obj());
454 if(!pStartLayout )
455 return pLayout;
457 while(pObjHolder && pStartLayout != pLayout)
459 pObjHolder = dynamic_cast<LwpObjectHolder*>(pObjHolder->GetNext()->obj());
460 if(pObjHolder)
462 pLayout = dynamic_cast<LwpVirtualLayout*>(pObjHolder->GetObject()->obj());
466 if(pObjHolder)
468 pObjHolder = dynamic_cast<LwpObjectHolder*>(pObjHolder->GetNext()->obj());
469 if(pObjHolder)
471 pLayout = dynamic_cast<LwpVirtualLayout*>(pObjHolder->GetObject()->obj());
472 return pLayout;
476 //return pLayout;
479 return NULL;
482 LwpHeadLayout::LwpHeadLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm)
483 : LwpVirtualLayout(objHdr, pStrm)
486 void LwpHeadLayout::Read()
488 LwpVirtualLayout::Read();
489 //For PermissiveLayout
490 m_pObjStrm->SkipExtra();
491 //For me
492 m_pObjStrm->SkipExtra();
495 void LwpHeadLayout::RegisterStyle()
497 //Register all children styles
498 LwpVirtualLayout* pLayout = dynamic_cast<LwpVirtualLayout*>(GetChildHead()->obj());
499 while(pLayout)
501 pLayout->SetFoundry(m_pFoundry);
502 //if the layout is relative to para, the layout will be registered in para
503 if(!pLayout->IsRelativeAnchored())
505 if (pLayout == this)
507 OSL_FAIL("Layout points to itself");
508 break;
510 pLayout->RegisterStyle();
512 LwpVirtualLayout *pNext = dynamic_cast<LwpVirtualLayout*>(pLayout->GetNext()->obj());
513 if (pNext == pLayout)
515 OSL_FAIL("Layout points to itself");
516 break;
518 pLayout = pNext;
523 * @descr find endnote supertable layout from the child layout list. Suppose that there is only one endnote supertablelayout in one division
524 * @return pointer to endnote supertable layout
526 LwpVirtualLayout* LwpHeadLayout::FindEnSuperTableLayout()
528 LwpVirtualLayout* pLayout = dynamic_cast<LwpVirtualLayout*>(GetChildHead()->obj());
529 while(pLayout)
531 if(pLayout->GetLayoutType() == LWP_ENDNOTE_SUPERTABLE_LAYOUT)
533 return pLayout;
535 pLayout = dynamic_cast<LwpVirtualLayout*>(pLayout->GetNext()->obj());
537 return NULL;
540 LwpLayoutStyle::LwpLayoutStyle()
541 : m_nStyleDefinition(0)
542 , m_pDescription(new LwpAtomHolder)
543 , m_nKey(0)
547 LwpLayoutStyle::~LwpLayoutStyle()
549 delete m_pDescription;
552 void LwpLayoutStyle::Read(LwpObjectStream* pStrm)
554 m_nStyleDefinition = pStrm->QuickReaduInt32();
555 m_pDescription->Read(pStrm);
556 if (pStrm->CheckExtra())
558 m_nKey = pStrm->QuickReaduInt16();
559 pStrm->SkipExtra();
563 LwpLayoutMisc::LwpLayoutMisc() :
564 m_nGridDistance(0), m_nGridType(0),
565 m_pContentStyle(new LwpAtomHolder)
569 LwpLayoutMisc::~LwpLayoutMisc()
571 if (m_pContentStyle)
573 delete m_pContentStyle;
577 void LwpLayoutMisc::Read(LwpObjectStream* pStrm)
579 m_nGridType = pStrm->QuickReaduInt16();
580 m_nGridDistance = pStrm->QuickReadInt32();
581 m_pContentStyle->Read(pStrm);
582 pStrm->SkipExtra();
585 LwpMiddleLayout::LwpMiddleLayout( LwpObjectHeader &objHdr, LwpSvStream* pStrm )
586 : LwpVirtualLayout(objHdr, pStrm),
587 m_pStyleStuff(new LwpLayoutStyle), m_pMiscStuff(new LwpLayoutMisc)
590 LwpMiddleLayout::~LwpMiddleLayout()
592 if (m_pStyleStuff)
594 delete m_pStyleStuff;
596 if (m_pMiscStuff)
598 delete m_pMiscStuff;
601 void LwpMiddleLayout::Read()
603 LwpObjectStream* pStrm = m_pObjStrm;
605 LwpVirtualLayout::Read();
607 //skip CLiteLayout data;
608 LwpAtomHolder ContentClass;
609 ContentClass.Read(pStrm);
610 pStrm->SkipExtra();
612 // before layout hierarchy rework
613 if(LwpFileHeader::m_nFileRevision < 0x000B)
614 return;
616 m_Content.ReadIndexed(pStrm);
618 // 01/20/2005
619 m_BasedOnStyle.ReadIndexed(pStrm);
620 m_TabPiece.ReadIndexed(pStrm);
622 sal_uInt8 nWhatsItGot = pStrm->QuickReaduInt8();
624 if (nWhatsItGot & DISK_GOT_STYLE_STUFF)
626 m_pStyleStuff->Read(pStrm);
628 if (nWhatsItGot & DISK_GOT_MISC_STUFF)
630 m_pMiscStuff->Read(pStrm);
633 m_LayGeometry.ReadIndexed(pStrm);
634 m_LayScale.ReadIndexed(pStrm);
635 m_LayMargins.ReadIndexed(pStrm);
636 m_LayBorderStuff.ReadIndexed(pStrm);
637 m_LayBackgroundStuff.ReadIndexed(pStrm);
639 if (pStrm->CheckExtra())
641 m_LayExtBorderStuff.ReadIndexed(pStrm);
642 pStrm->SkipExtra();
644 //end
647 #include "lwplaypiece.hxx"
650 * @descr: Get the geometry of current layout
653 LwpLayoutGeometry* LwpMiddleLayout::GetGeometry()
655 if( !m_LayGeometry.IsNull() )
657 return ( dynamic_cast<LwpLayoutGeometry*> (m_LayGeometry.obj()) );
659 else if( !m_BasedOnStyle.IsNull() )
661 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
662 return pLay ? pLay->GetGeometry() : NULL;
664 return NULL;
668 * @descr: Get layout height, measured by "cm"
671 double LwpMiddleLayout::GetGeometryHeight()
673 LwpLayoutGeometry* pGeo = GetGeometry();
674 if(pGeo)
676 return ( LwpTools::ConvertFromUnitsToMetric( pGeo->GetHeight() ) );
678 else
679 return -1;
683 * @descr: Get layout width, measured by "cm"
686 double LwpMiddleLayout::GetGeometryWidth()
688 LwpLayoutGeometry* pGeo = GetGeometry();
689 if(pGeo)
691 return ( LwpTools::ConvertFromUnitsToMetric( pGeo->GetWidth() ) );
693 else
694 return -1;
698 * @descr: Whether the margins is same as parent layout
701 sal_Bool LwpMiddleLayout::MarginsSameAsParent()
703 if(m_nOverrideFlag & OVER_MARGINS)
705 return LwpVirtualLayout::MarginsSameAsParent();
707 if(!m_BasedOnStyle.IsNull())
709 LwpVirtualLayout* pLay = dynamic_cast<LwpVirtualLayout*> (m_BasedOnStyle.obj());
710 if (pLay)
711 pLay->MarginsSameAsParent();
713 return LwpVirtualLayout::MarginsSameAsParent();
718 * @descr: Get margin
719 * @param: nWhichSide - 0: left, 1: right, 2:top, 3: bottom
721 double LwpMiddleLayout::GetMarginsValue(const sal_uInt8 &nWhichSide)
723 double fValue = 0;
724 if((nWhichSide==MARGIN_LEFT)||(nWhichSide==MARGIN_RIGHT))
726 if ( MarginsSameAsParent() )
728 LwpVirtualLayout* pParent = dynamic_cast<LwpVirtualLayout*> (GetParent()->obj());
729 if(pParent && !pParent->IsHeader())
731 fValue = pParent->GetMarginsValue(nWhichSide);
732 return fValue;
737 if(m_nOverrideFlag & OVER_MARGINS)
739 LwpLayoutMargins* pMar1 = dynamic_cast<LwpLayoutMargins*> (m_LayMargins.obj());
740 if(pMar1)
742 fValue = pMar1->GetMargins()->GetMarginsValue(nWhichSide);
743 return fValue;
746 LwpVirtualLayout* pStyle = dynamic_cast<LwpVirtualLayout*> (m_BasedOnStyle.obj());
747 if(pStyle)
749 fValue = pStyle->GetMarginsValue(nWhichSide);
750 return fValue;
752 return LwpVirtualLayout::GetMarginsValue(nWhichSide);
755 * @descr: Get extmargin value
756 * @param: nWhichSide - 0: left, 1: right, 2:top, 3: bottom
757 * @param:
758 * @return:
760 double LwpMiddleLayout::GetExtMarginsValue(const sal_uInt8 &nWhichSide)
762 double fValue = 0;
763 if(m_nOverrideFlag & OVER_MARGINS)
765 LwpLayoutMargins* pMar1 = dynamic_cast<LwpLayoutMargins*> (m_LayMargins.obj());
766 if(pMar1)
768 fValue = pMar1->GetExtMargins()->GetMarginsValue(nWhichSide);
769 return fValue;
772 LwpVirtualLayout* pStyle = dynamic_cast<LwpVirtualLayout*> (m_BasedOnStyle.obj());
773 if(pStyle)
775 fValue = pStyle->GetExtMarginsValue(nWhichSide);
776 return fValue;
778 return LwpVirtualLayout::GetExtMarginsValue(nWhichSide);
781 * @descr: Get the LwpBorderStuff object according to m_LayBorderStuff id.
782 * @param:
783 * @param:
784 * @return:
786 LwpBorderStuff* LwpMiddleLayout::GetBorderStuff()
788 if(m_nOverrideFlag & OVER_BORDERS)
790 LwpLayoutBorder* pLayoutBorder = dynamic_cast<LwpLayoutBorder*>(m_LayBorderStuff.obj());
791 return pLayoutBorder ? pLayoutBorder->GetBorderStuff() : NULL;
793 else if( !m_BasedOnStyle.IsNull() )
795 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
796 return pLay ? pLay->GetBorderStuff() : NULL;
798 return NULL;
802 * @descr: Get LwpBackgroundStuff object according to m_LayBackgroundStuff id;
803 * @param:
804 * @param:
805 * @return:
807 LwpBackgroundStuff* LwpMiddleLayout::GetBackgroundStuff()
809 if(m_nOverrideFlag & OVER_BACKGROUND)
811 LwpLayoutBackground* pLayoutBackground = dynamic_cast<LwpLayoutBackground*>(m_LayBackgroundStuff.obj());
812 return pLayoutBackground ? pLayoutBackground->GetBackgoudStuff() : NULL;
814 else if( !m_BasedOnStyle.IsNull() )
816 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
817 return pLay ? pLay->GetBackgroundStuff() : NULL;
819 return NULL;
822 * @descr: create xfborder.
823 * @param:
824 * @param:
825 * @return:
827 XFBorders* LwpMiddleLayout::GetXFBorders()
829 LwpBorderStuff* pBorderStuff = GetBorderStuff();
830 if(pBorderStuff&&pBorderStuff->GetSide() != 0)
832 //copy from lwpparastyle.
833 XFBorders *pXFBorders = new XFBorders();
834 // apply 4 borders respectively
835 LwpBorderStuff::BorderType pType[] = { LwpBorderStuff::LEFT, LwpBorderStuff::RIGHT,
836 LwpBorderStuff::TOP, LwpBorderStuff::BOTTOM };
838 for (sal_uInt8 nC = 0; nC < 4; nC++)
840 if (pBorderStuff->HasSide(pType[nC]))
842 LwpParaStyle::ApplySubBorder(pBorderStuff, pType[nC], pXFBorders);
845 return pXFBorders;
847 return NULL;
851 * @descr: Get text direction settings.
852 * @param:
853 * @param:
854 * @return:
856 enumXFTextDir LwpMiddleLayout::GetTextDirection()
858 enumXFTextDir eTextDir = enumXFTextDirNone;
859 sal_uInt8 nDirection = GetContentOrientation();
860 switch(nDirection)
862 case TEXT_ORIENT_LRTB:
864 eTextDir = enumXFTextDirLR_TB;
865 break;
867 case TEXT_ORIENT_TBRL:
869 eTextDir = enumXFTextDirTB_RL;
870 break;
872 case TEXT_ORIENT_RLBT: // not supported now
874 eTextDir = enumXFTextDirNone;
875 break;
877 case TEXT_ORIENT_BTLR: // not supported now
879 eTextDir = enumXFTextDirNone;
880 break;
882 default:
883 break;
885 return eTextDir;
888 * @descr: Get back ground color.
889 * @param:
890 * @param:
891 * @return:
893 LwpColor* LwpMiddleLayout::GetBackColor()
895 LwpBackgroundStuff* pBackgroundStuff = GetBackgroundStuff();
896 if(pBackgroundStuff && !pBackgroundStuff->IsTransparent())
898 LwpColor* pColor = pBackgroundStuff->GetFillColor();
899 if(pColor->IsValidColor())
901 return pColor;
904 return NULL;
908 * @descr: Add back color settings into xfpagemaster.
909 * @param:
910 * @param:
911 * @return:
913 LwpTabOverride* LwpMiddleLayout::GetTabOverride()
915 if(m_nAttributes & OVER_TABS)
917 if(!m_TabPiece.IsNull())
918 return (LwpTabOverride*) dynamic_cast<LwpTabPiece*>(m_TabPiece.obj())->GetOverride();
919 return NULL;
921 else if( !m_BasedOnStyle.IsNull() )
923 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
924 return pLay ? pLay->GetTabOverride() : NULL;
926 return NULL;
930 * @descr: Layscale for graphic & watermark
931 * @param:
932 * @param:
933 * @return:
935 sal_uInt16 LwpMiddleLayout::GetScaleMode(void)
937 if ((m_nOverrideFlag & OVER_SCALING) && m_LayScale.obj())
938 return GetLayoutScale()->GetScaleMode();
939 else if (m_BasedOnStyle.obj())
940 return dynamic_cast<LwpMiddleLayout*>(m_BasedOnStyle.obj())->GetScaleMode();
941 else
942 return (LwpLayoutScale::FIT_IN_FRAME | LwpLayoutScale::MAINTAIN_ASPECT_RATIO);
945 sal_uInt16 LwpMiddleLayout::GetScaleTile(void)
947 if ((m_nOverrideFlag & OVER_SCALING) && m_LayScale.obj())
948 return (GetLayoutScale()->GetPlacement() & LwpLayoutScale::TILED)
949 ? 1 : 0;
950 else if (m_BasedOnStyle.obj())
951 return dynamic_cast<LwpMiddleLayout*>(m_BasedOnStyle.obj())->GetScaleTile();
952 else
953 return 0;
956 sal_uInt16 LwpMiddleLayout::GetScaleCenter(void)
958 if ((m_nOverrideFlag & OVER_SCALING) && m_LayScale.obj())
959 return (GetLayoutScale()->GetPlacement() & LwpLayoutScale::CENTERED)
960 ? 1 : 0;
961 else if (m_BasedOnStyle.obj())
962 return dynamic_cast<LwpMiddleLayout*>(m_BasedOnStyle.obj())->GetScaleCenter();
963 else
964 return 0;
967 sal_uInt32 LwpMiddleLayout::GetScalePercentage(void)
969 if ((m_nOverrideFlag & OVER_SCALING) && m_LayScale.obj())
970 return GetLayoutScale()->GetScalePercentage()/10;//m_nScalePercentage 1000 = 100%
971 else if (m_BasedOnStyle.obj())
972 return dynamic_cast<LwpMiddleLayout*>(m_BasedOnStyle.obj())->GetScalePercentage();
973 else
974 return 100;
977 double LwpMiddleLayout::GetScaleWidth(void)
979 if ((m_nOverrideFlag & OVER_SCALING) && m_LayScale.obj())
980 return LwpTools::ConvertFromUnits(GetLayoutScale()->GetScaleWidth());
981 else if (m_BasedOnStyle.obj())
982 return dynamic_cast<LwpMiddleLayout*>(m_BasedOnStyle.obj())->GetScaleWidth();
983 else
984 return 0;
987 double LwpMiddleLayout::GetScaleHeight(void)
989 if ((m_nOverrideFlag & OVER_SCALING) && m_LayScale.obj())
990 return LwpTools::ConvertFromUnits(GetLayoutScale()->GetScaleHeight());
991 else if (m_BasedOnStyle.obj())
992 return dynamic_cast<LwpMiddleLayout*>(m_BasedOnStyle.obj())->GetScaleHeight();
993 else
994 return 0;
996 sal_Bool LwpMiddleLayout::CanSizeRight(void)
998 sal_uInt8 RelType = GetRelativeType();
1000 if (RelType == LwpLayoutRelativityGuts::LAY_INLINE || RelType == LwpLayoutRelativityGuts::LAY_PARA_RELATIVE
1001 || RelType == LwpLayoutRelativityGuts::LAY_INLINE_VERTICAL)
1003 return sal_False;
1005 return sal_True;
1007 sal_Int32 LwpMiddleLayout::GetMinimumWidth()
1009 if (((m_nAttributes3 & STYLE3_WIDTHVALID) != 0) && GetGeometry())
1011 return GetGeometry()->GetWidth();
1013 else if (m_nOverrideFlag & OVER_SIZE)
1015 return DetermineWidth();
1017 return 0;
1019 sal_Int32 LwpMiddleLayout::DetermineWidth()
1021 if (IsSizeRightToContent())
1023 assert(sal_False);
1025 else if (IsSizeRightToContainer())
1027 assert(sal_False);
1029 else
1031 m_nAttributes3 |= STYLE3_WIDTHVALID;
1032 return GetGeometry()->GetWidth();
1034 return 0;
1036 sal_Bool LwpMiddleLayout::IsSizeRightToContainer(void)
1038 if (!CanSizeRight())
1039 return sal_False;
1041 if (m_nOverrideFlag & OVER_SIZE)
1043 return (m_nDirection & ((LAY_USEDIRECTION|LAY_AUTOSIZE|LAY_TOCONTAINER)
1044 << SHIFT_RIGHT))
1045 == ((LAY_USEDIRECTION | LAY_TOCONTAINER | LAY_AUTOSIZE) << SHIFT_RIGHT);
1047 else if (m_BasedOnStyle.obj())
1049 LwpMiddleLayout * pLayout = dynamic_cast<LwpMiddleLayout *>(m_BasedOnStyle.obj());
1050 return pLayout ? pLayout->IsSizeRightToContainer() : sal_False;
1052 else
1053 return sal_False;
1055 sal_Bool LwpMiddleLayout::IsSizeRightToContent(void)
1057 if (!CanSizeRight())
1058 return sal_False;
1060 if (m_nOverrideFlag & OVER_SIZE)
1062 return (m_nDirection & ((LAY_USEDIRECTION|LAY_AUTOSIZE|LAY_TOCONTAINER)
1063 << SHIFT_RIGHT))
1064 == ((LAY_USEDIRECTION | LAY_AUTOSIZE) << SHIFT_RIGHT);
1066 else if (m_BasedOnStyle.obj())
1068 LwpMiddleLayout * pLayout = dynamic_cast<LwpMiddleLayout *>(m_BasedOnStyle.obj());
1069 return pLayout ? pLayout->IsSizeRightToContent() : sal_False;
1071 else
1072 return sal_False;
1076 * @descr: Get layout height
1079 double LwpMiddleLayout::GetHeight()
1081 return GetGeometryHeight();
1085 * @descr: Get layout height
1088 double LwpMiddleLayout::GetWidth()
1090 return GetGeometryWidth();
1093 * @descr: Get layout orgin point
1096 LwpPoint LwpMiddleLayout::GetOrigin()
1098 LwpLayoutGeometry* pGeo = GetGeometry();
1099 if(pGeo)
1101 sal_uInt8 nType = GetRelativeType();
1102 if(nType == LwpLayoutRelativityGuts::LAY_INLINE
1103 || nType == LwpLayoutRelativityGuts::LAY_INLINE_NEWLINE )
1105 return pGeo->GetAbsoluteOrigin();
1107 else
1108 return pGeo->GetOrigin();
1112 return LwpPoint();
1116 * @descr: Whether the fill is pattern fill or not
1117 * @return: True if yes, false if not.
1119 sal_Bool LwpMiddleLayout::IsPatternFill()
1121 LwpBackgroundStuff* pBackgroundStuff = GetBackgroundStuff();
1122 if (pBackgroundStuff)
1124 return pBackgroundStuff->IsPatternFill();
1127 return sal_False;
1131 * @descr: Get the fill pattern style. Data are saved in a XFBGImage object
1132 * @return: the fill pattern style.
1134 XFBGImage* LwpMiddleLayout::GetFillPattern()
1136 LwpBackgroundStuff* pBackgroundStuff = GetBackgroundStuff();
1137 if (pBackgroundStuff)
1139 return pBackgroundStuff->GetFillPattern();
1142 return NULL;
1147 * @descr: Whether the height and width of layout is auto grow
1150 sal_Bool LwpMiddleLayout::IsAutoGrow()
1152 if(m_nOverrideFlag & OVER_SIZE)
1154 return m_nDirection &
1155 ((LAY_AUTOGROW << SHIFT_UP) | (LAY_AUTOGROW << SHIFT_DOWN) |
1156 (LAY_AUTOGROW << SHIFT_RIGHT) | (LAY_AUTOGROW << SHIFT_LEFT))
1157 ? sal_True : sal_False;
1159 else if( !m_BasedOnStyle.IsNull() )
1161 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
1162 return pLay ? pLay->IsAutoGrow() : sal_False;
1164 return LwpVirtualLayout::IsAutoGrow();
1168 * @descr: Whether the height of layout is auto grow down
1171 sal_Bool LwpMiddleLayout::IsAutoGrowDown()
1173 if(m_nOverrideFlag & OVER_SIZE)
1175 return m_nDirection & (LAY_AUTOGROW << SHIFT_DOWN) ? sal_True : sal_False;
1177 else if( !m_BasedOnStyle.IsNull() )
1179 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
1180 return pLay ? pLay->IsAutoGrowDown() : sal_False;
1182 return LwpVirtualLayout::IsAutoGrowDown();
1186 * @descr: Whether the height of layout is auto grow up
1189 sal_Bool LwpMiddleLayout::IsAutoGrowUp()
1191 if(m_nOverrideFlag & OVER_SIZE)
1193 return m_nDirection & (LAY_AUTOGROW << SHIFT_UP) ? sal_True : sal_False;
1195 else if( !m_BasedOnStyle.IsNull() )
1197 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
1198 return pLay ? pLay->IsAutoGrowUp() : sal_False;
1200 return LwpVirtualLayout::IsAutoGrowUp();
1204 * @descr: Whether the height of layout is auto grow down
1207 sal_Bool LwpMiddleLayout::IsAutoGrowLeft()
1209 if(m_nOverrideFlag & OVER_SIZE)
1211 return m_nDirection & (LAY_AUTOGROW << SHIFT_LEFT) ? sal_True : sal_False;
1213 else if( !m_BasedOnStyle.IsNull() )
1215 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
1216 if (pLay)
1217 return pLay->IsAutoGrowLeft();
1219 return LwpVirtualLayout::IsAutoGrowLeft();
1223 * @descr: Whether the height of layout is auto grow down
1226 sal_Bool LwpMiddleLayout::IsAutoGrowRight()
1228 if(m_nOverrideFlag & OVER_SIZE)
1230 return m_nDirection & (LAY_AUTOGROW << SHIFT_RIGHT) ? sal_True : sal_False;
1232 else if( !m_BasedOnStyle.IsNull() )
1234 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
1235 return pLay ? pLay->IsAutoGrowRight() : sal_False;
1237 return LwpVirtualLayout::IsAutoGrowRight();
1242 * @descr: Get contents orientation
1245 sal_uInt8 LwpMiddleLayout::GetContentOrientation()
1247 //content orientation in Graphic objects and OLE objects not supported now
1248 if((m_nOverrideFlag & OVER_ROTATION)&& !m_LayGeometry.IsNull())
1250 LwpLayoutGeometry* pLayGeometry = dynamic_cast<LwpLayoutGeometry*> (m_LayGeometry.obj());
1251 if (pLayGeometry)
1252 return pLayGeometry->GetContentOrientation();
1254 else if( !m_BasedOnStyle.IsNull() )
1256 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
1257 if (pLay)
1258 return pLay->GetContentOrientation();
1260 return LwpVirtualLayout::GetContentOrientation();
1264 * @descr: Whether it is honoring protection
1267 sal_Bool LwpMiddleLayout::HonorProtection()
1269 if(m_nOverrideFlag & OVER_MISC)
1271 if(!(m_nAttributes2 & STYLE2_HONORPROTECTION))
1272 return sal_False;
1274 LwpVirtualLayout* pParent = dynamic_cast<LwpVirtualLayout*> (GetParent()->obj());
1275 if(pParent && !pParent->IsHeader())
1277 return pParent->HonorProtection();
1280 if(m_pFoundry)//is null now
1282 LwpDocument* pDoc = m_pFoundry->GetDocument();
1283 if(pDoc)
1285 return pDoc->HonorProtection();
1289 else if( !m_BasedOnStyle.IsNull() )
1291 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
1292 if (pLay)
1293 return pLay->HonorProtection();
1296 return LwpVirtualLayout::HonorProtection();
1300 * @descr: Whether it is pretected
1303 sal_Bool LwpMiddleLayout::IsProtected()
1305 sal_Bool bProtected = sal_False;
1306 if(m_nOverrideFlag & OVER_MISC)
1308 bProtected = (m_nAttributes & STYLE_PROTECTED)!=0;
1310 else if( !m_BasedOnStyle.IsNull() )
1312 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
1313 bProtected = pLay ? pLay->IsProtected() : sal_False;
1315 else
1316 bProtected = LwpVirtualLayout::IsProtected();
1318 LwpVirtualLayout* pParent = dynamic_cast<LwpVirtualLayout*> (GetParent()->obj());
1319 if(pParent && !pParent->IsHeader())
1321 /* If a parent's protected then none of its children can be accessed. */
1322 if(pParent->IsProtected())
1323 return sal_True;
1325 if(pParent->HonorProtection())
1326 return bProtected;
1328 /* If our parent isn't honoring protection then we aren't protected. */
1329 return sal_False;
1332 if(m_pFoundry)//is null now
1334 LwpDocument* pDoc = m_pFoundry->GetDocument();
1335 if(pDoc)
1337 if (pDoc->HonorProtection())
1338 return bProtected;
1340 /* If the document isn't honoring protection then we aren't protected.*/
1341 return sal_False;
1345 return bProtected;
1349 * @descr: Get watermark layout
1352 LwpVirtualLayout* LwpMiddleLayout::GetWaterMarkLayout()
1354 LwpVirtualLayout* pLay = dynamic_cast<LwpVirtualLayout*>(GetChildHead()->obj());
1355 while(pLay)
1357 if( pLay->IsForWaterMark())
1359 return pLay;
1361 pLay = dynamic_cast<LwpVirtualLayout*> (pLay->GetNext()->obj());
1363 return NULL;
1367 * @descr: Create and reture xfbgimage object for watermark
1370 XFBGImage* LwpMiddleLayout::GetXFBGImage()
1372 LwpMiddleLayout* pLay = static_cast<LwpMiddleLayout*>(GetWaterMarkLayout());
1373 if(pLay)
1375 //test BGImage
1376 LwpGraphicObject* pGrfObj = dynamic_cast<LwpGraphicObject*>(pLay->GetContent()->obj());
1377 if(pGrfObj)
1379 XFBGImage* pXFBGImage = new XFBGImage();
1381 if(pGrfObj->IsLinked())
1383 //set file link
1384 OUString linkedfilepath = pGrfObj->GetLinkedFilePath();
1385 OUString fileURL = LwpTools::convertToFileUrl(OUStringToOString(linkedfilepath, osl_getThreadTextEncoding()));
1386 pXFBGImage->SetFileLink(fileURL);
1388 else
1390 sal_uInt8* pGrafData = NULL;
1391 sal_uInt32 nDataLen = pGrfObj->GetRawGrafData(pGrafData);
1392 pXFBGImage->SetImageData(pGrafData, nDataLen);
1393 if(pGrafData)
1395 delete[] pGrafData;
1396 pGrafData = NULL;
1401 //automatic, top left
1402 pXFBGImage->SetPosition(enumXFAlignStart,enumXFAlignTop);
1403 if(pLay->GetScaleCenter())
1405 //center
1406 pXFBGImage->SetPosition(enumXFAlignCenter,enumXFAlignCenter);
1408 else if(pLay->GetScaleTile())
1410 //tile
1411 pXFBGImage->SetRepeate();
1413 //fit type, area type
1414 if((pLay->GetScaleMode()& LwpLayoutScale::FIT_IN_FRAME)!=0)
1416 if((pLay->GetScaleMode()& LwpLayoutScale::MAINTAIN_ASPECT_RATIO)==0)
1418 pXFBGImage->SetStretch();
1421 return pXFBGImage;
1424 return NULL;
1428 * @descr: Whether the page uses the printer setting
1431 sal_Bool LwpMiddleLayout::GetUsePrinterSettings()
1433 if(m_nOverrideFlag & OVER_SIZE)
1435 return (m_nAttributes3 & STYLE3_USEPRINTERSETTINGS) != 0;
1437 else if( !m_BasedOnStyle.IsNull() )
1439 LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*> ( m_BasedOnStyle.obj() );
1440 return pLay ? pLay->GetUsePrinterSettings() : sal_False;
1442 return sal_False;
1446 //Check whether there are contents in the layout
1447 sal_Bool LwpMiddleLayout::HasContent()
1449 LwpObject* content = m_Content.obj();
1450 if(content)
1451 return sal_True;
1452 return sal_False;
1454 //End by
1456 LwpLayout::LwpLayout( LwpObjectHeader &objHdr, LwpSvStream* pStrm ) :
1457 LwpMiddleLayout(objHdr, pStrm), m_pUseWhen(new LwpUseWhen)
1460 LwpLayout::~LwpLayout()
1462 if (m_pUseWhen)
1464 delete m_pUseWhen;
1468 void LwpLayout::Read()
1470 LwpObjectStream* pStrm = m_pObjStrm;
1472 LwpMiddleLayout::Read();
1473 if (LwpFileHeader::m_nFileRevision < 0x000B)
1475 // read PreRevBLayout...
1477 else
1479 sal_uInt16 nSimple = pStrm->QuickReaduInt16();
1481 if (!nSimple)
1483 m_pUseWhen->Read(pStrm);
1485 sal_uInt8 nFlag = pStrm->QuickReaduInt8();
1486 if (nFlag)
1487 m_Positon.ReadIndexed(pStrm);
1490 m_LayColumns.ReadIndexed(pStrm);
1491 m_LayGutterStuff.ReadIndexed(pStrm);
1492 m_LayJoinStuff.ReadIndexed(pStrm);
1493 m_LayShadow.ReadIndexed(pStrm);
1495 if (pStrm->CheckExtra())
1497 m_LayExtJoinStuff.ReadIndexed(pStrm);
1498 pStrm->SkipExtra();
1504 * @descr: Get columns number
1507 sal_uInt16 LwpLayout::GetNumCols()
1509 if(m_nOverrideFlag & OVER_COLUMNS)
1511 LwpLayoutColumns* pLayColumns = dynamic_cast<LwpLayoutColumns*>(m_LayColumns.obj());
1512 if(pLayColumns)
1514 return pLayColumns->GetNumCols();
1518 LwpVirtualLayout* pStyle = dynamic_cast<LwpVirtualLayout*> (m_BasedOnStyle.obj());
1519 if(pStyle)
1521 return pStyle->GetNumCols();
1524 return LwpVirtualLayout::GetNumCols();
1529 * @descr: Get column width
1530 * @param: the order of column
1532 double LwpLayout::GetColWidth(sal_uInt16 nIndex)
1534 if((m_nOverrideFlag & OVER_COLUMNS)||(m_nAttributes2 & STYLE2_LOCALCOLUMNINFO))
1536 LwpLayoutColumns* pLayColumns = dynamic_cast<LwpLayoutColumns*>(m_LayColumns.obj());
1537 if(pLayColumns)
1539 return pLayColumns->GetColWidth(nIndex);
1543 LwpVirtualLayout* pStyle = dynamic_cast<LwpVirtualLayout*> (m_BasedOnStyle.obj());
1544 if(pStyle)
1546 return pStyle->GetColWidth(nIndex);
1549 return LwpVirtualLayout::GetColWidth(nIndex);
1554 * @descr: Get gap between columns
1555 * @param: the order of column
1557 double LwpLayout::GetColGap(sal_uInt16 nIndex)
1559 if((m_nOverrideFlag & OVER_COLUMNS)||(m_nAttributes2 & STYLE2_LOCALCOLUMNINFO))
1561 LwpLayoutColumns* pLayColumns = dynamic_cast<LwpLayoutColumns*>(m_LayColumns.obj());
1562 if(pLayColumns)
1564 return pLayColumns->GetColGap(nIndex);
1568 LwpVirtualLayout* pStyle = dynamic_cast<LwpVirtualLayout*> (m_BasedOnStyle.obj());
1569 if(pStyle)
1571 return pStyle->GetColGap(nIndex);
1574 return LwpVirtualLayout::GetColGap(nIndex);
1578 * @descr: Create and return XFColumns object
1581 XFColumns* LwpLayout::GetXFColumns()
1583 //if there is only one column, do not need insert columns
1584 sal_uInt16 nCols = GetNumCols();
1585 if(nCols==1)
1587 return NULL;
1590 XFColumns* pColumns = new XFColumns();
1591 //set XFColumnSep
1592 boost::scoped_ptr<XFColumnSep> pColumnSep(GetColumnSep());
1593 if(pColumnSep)
1595 pColumns->SetSeparator(*pColumnSep);
1598 //set column count and column gap
1599 pColumns->SetCount(nCols);
1600 double fGap = GetColGap(0);
1601 pColumns->SetGap(fGap);
1603 //set xfcolumn
1604 for(sal_uInt16 nIndex = 0; nIndex<nCols; nIndex++)
1606 XFColumn aColumn;
1607 sal_Int32 nWidth = static_cast<sal_Int32>(GetColWidth(nIndex));
1608 nWidth=8305/nCols; //relative width
1609 aColumn.SetRelWidth(nWidth);
1611 //the left and right margins is 0;
1612 double nGap = GetColGap(nIndex)/2;
1613 //nGap=0;
1614 aColumn.SetMargins(nGap,nGap);
1615 if(nIndex==0)
1617 aColumn.SetMargins(0,nGap);
1619 if(nIndex==(nCols-1))
1621 aColumn.SetMargins(nGap,0);
1623 pColumns->AddColumn(aColumn);
1626 return pColumns;
1630 * @descr: Create and return XFColumnSep object
1633 XFColumnSep* LwpLayout::GetColumnSep()
1636 //Get LwpLayoutGutters
1637 LwpLayoutGutters* pLayoutGutters = dynamic_cast<LwpLayoutGutters*>(m_LayGutterStuff.obj());
1638 if(!pLayoutGutters)
1640 return NULL;
1643 LwpBorderStuff* pBorderStuff = pLayoutGutters->GetBorderStuff();
1645 if(pBorderStuff)
1647 LwpBorderStuff::BorderType eType = LwpBorderStuff::LEFT;
1648 LwpColor aColor = pBorderStuff->GetSideColor(eType);
1649 double fWidth = pBorderStuff->GetSideWidth(eType);
1650 //sal_uInt16 nType = pBorderStuff->GetSideType(eType);
1652 XFColumnSep* pColumnSep = new XFColumnSep();
1653 XFColor aXFColor(aColor.To24Color());
1654 pColumnSep->SetColor(aXFColor);
1655 pColumnSep->SetWidth(fWidth);
1656 pColumnSep->SetRelHeight(100);
1657 pColumnSep->SetVerticalAlign(enumXFAlignTop);
1659 return pColumnSep;
1661 return NULL;
1666 * @descr: Get use when type
1669 LwpLayout::UseWhenType LwpLayout::GetUseWhenType()
1671 UseWhenType eType = StartWithinPage;
1672 LwpUseWhen* pUseWhen = GetUseWhen();
1673 if(pUseWhen)
1675 if(pUseWhen->IsStartOnThisHF())
1677 eType = StartWithinColume;
1679 else if(pUseWhen->IsStartOnThisPage())
1681 eType = StartWithinPage;
1683 else if(pUseWhen->IsStartOnNextPage())
1685 eType = StartOnNextPage;
1687 else if(pUseWhen->IsStartOnNextOddPage())
1689 eType = StartOnOddPage;
1691 else if(pUseWhen->IsStartOnNextEvenPage())
1693 eType = StartOnEvenPage;
1697 else
1699 eType = StartOnNextPage;
1701 return eType;
1705 * @descr: Get use page
1708 sal_uInt16 LwpLayout::GetUsePage()
1710 if(m_nOverrideFlag & OVER_PLACEMENT)
1712 LwpUseWhen* pUseWhen = GetUseWhen();
1713 if(pUseWhen)
1714 return pUseWhen->GetUsePage();
1715 else
1716 return 0;
1718 else if( !m_BasedOnStyle.IsNull() )
1720 LwpLayout* pLay = dynamic_cast<LwpLayout*> ( m_BasedOnStyle.obj() );
1721 return pLay ? pLay->GetUsePage() : 0;
1723 return 0;
1727 * @descr: Get usewhen pointer
1730 LwpUseWhen* LwpLayout::VirtualGetUseWhen()
1732 if(m_nOverrideFlag & OVER_PLACEMENT)
1734 return m_pUseWhen;
1736 else if( !m_BasedOnStyle.IsNull() )
1738 LwpLayout* pLay = dynamic_cast<LwpLayout*> ( m_BasedOnStyle.obj() );
1739 return pLay ? pLay->VirtualGetUseWhen() : NULL;
1741 return LwpVirtualLayout::VirtualGetUseWhen();
1745 * @descr: Whether it is use on all pages
1748 sal_Bool LwpLayout::IsUseOnAllPages()
1750 if(m_nOverrideFlag & OVER_PLACEMENT)
1752 LwpUseWhen* pUseWhen = GetUseWhen();
1753 if(pUseWhen)
1754 return pUseWhen->IsUseOnAllPages();
1755 else
1756 return sal_False;
1758 else if( !m_BasedOnStyle.IsNull() )
1760 LwpLayout* pLay = dynamic_cast<LwpLayout*> ( m_BasedOnStyle.obj() );
1761 if (pLay)
1762 return pLay->IsUseOnAllPages();
1764 return LwpVirtualLayout::IsUseOnAllPages();
1768 * @descr: Whether it is use on all even pages
1771 sal_Bool LwpLayout::IsUseOnAllEvenPages()
1773 if(m_nOverrideFlag & OVER_PLACEMENT)
1775 LwpUseWhen* pUseWhen = GetUseWhen();
1776 if(pUseWhen)
1777 return pUseWhen->IsUseOnAllEvenPages();
1778 else
1779 return sal_False;
1781 else if( !m_BasedOnStyle.IsNull() )
1783 LwpLayout* pLay = dynamic_cast<LwpLayout*> ( m_BasedOnStyle.obj() );
1784 if (pLay)
1785 return pLay->IsUseOnAllEvenPages();
1787 return LwpVirtualLayout::IsUseOnAllEvenPages();
1791 * @descr: Whether it is use on all odd pages
1794 sal_Bool LwpLayout::IsUseOnAllOddPages()
1796 if(m_nOverrideFlag & OVER_PLACEMENT)
1798 LwpUseWhen* pUseWhen = GetUseWhen();
1799 if(pUseWhen)
1800 return pUseWhen->IsUseOnAllOddPages();
1801 else
1802 return sal_False;
1804 else if( !m_BasedOnStyle.IsNull() )
1806 LwpLayout* pLay = dynamic_cast<LwpLayout*> ( m_BasedOnStyle.obj() );
1807 if (pLay)
1808 return pLay->IsUseOnAllOddPages();
1810 return LwpVirtualLayout::IsUseOnAllOddPages();
1814 * @descr: Whether it is use on current page
1817 sal_Bool LwpLayout::IsUseOnPage()
1819 if(m_nOverrideFlag & OVER_PLACEMENT)
1821 LwpUseWhen* pUseWhen = GetUseWhen();
1822 if(pUseWhen)
1823 return pUseWhen->IsUseOnPage();
1824 else
1825 return sal_False;
1827 else if( !m_BasedOnStyle.IsNull() )
1829 LwpLayout* pLay = dynamic_cast<LwpLayout*> ( m_BasedOnStyle.obj() );
1830 if (pLay)
1831 return pLay->IsUseOnPage();
1833 return LwpVirtualLayout::IsUseOnPage();
1837 * @descr: Get the LwpShadow object according to m_LayShadow id.
1838 * @param:
1839 * @param:
1840 * @return:
1842 LwpShadow* LwpLayout::GetShadow()
1844 if(m_nOverrideFlag & OVER_SHADOW)
1846 LwpLayoutShadow* pLayoutShadow = dynamic_cast<LwpLayoutShadow*>(m_LayShadow.obj());
1847 return pLayoutShadow ? pLayoutShadow->GetShadow() : NULL;
1849 else if( !m_BasedOnStyle.IsNull() )
1851 LwpLayout* pLay = dynamic_cast<LwpLayout*> ( m_BasedOnStyle.obj() );
1852 return pLay ? pLay->GetShadow() : NULL;
1854 return NULL;
1858 * @descr: create xfshadow
1859 * @param:
1860 * @param:
1861 * @return:
1863 XFShadow* LwpLayout::GetXFShadow()
1865 LwpShadow* pShadow = GetShadow();
1866 if( pShadow )
1868 LwpColor color = pShadow->GetColor();
1869 double offsetX = pShadow->GetOffsetX();
1870 double offsetY = pShadow->GetOffsetY();
1872 if( offsetX && offsetY && color.IsValidColor() )
1874 XFShadow* pXFShadow = new XFShadow();
1875 enumXFShadowPos eXFShadowPos = enumXFShadowLeftTop;
1876 double fOffset = 0;
1878 sal_Bool left = sal_False;
1879 sal_Bool top = sal_False;
1880 if( offsetX < 0 )
1881 left = sal_True;
1882 if( offsetY < 0 )
1883 top = sal_True;
1884 if( left )
1886 fOffset = -offsetX;
1887 if( top )
1888 eXFShadowPos = enumXFShadowLeftTop;
1889 else
1890 eXFShadowPos = enumXFShadowLeftBottom;
1892 else
1894 fOffset = offsetX;
1895 if( top )
1896 eXFShadowPos = enumXFShadowRightTop;
1897 else
1898 eXFShadowPos = enumXFShadowRightBottom;
1901 pXFShadow->SetPosition(eXFShadowPos);
1902 pXFShadow->SetOffset(fOffset);
1903 pXFShadow->SetColor(XFColor(color.To24Color()));
1905 return pXFShadow;
1908 return NULL;
1912 * @descr get the layout that containers the current frame layout
1915 LwpVirtualLayout* LwpLayout::GetContainerLayout()
1917 if(IsRelativeAnchored())
1919 //get position
1920 LwpPara* pPara = dynamic_cast<LwpPara*>(GetPosition()->obj());
1921 if(pPara)
1923 LwpStory* pStory = pPara->GetStory();
1924 return pStory ? pStory->GetTabLayout() : NULL;
1927 return GetParentLayout();
1930 LwpPlacableLayout::LwpPlacableLayout( LwpObjectHeader &objHdr, LwpSvStream* pStrm )
1931 : LwpLayout(objHdr, pStrm),m_pFont(NULL)
1934 LwpPlacableLayout::~LwpPlacableLayout()
1937 void LwpPlacableLayout::Read()
1939 LwpObjectStream* pStrm = m_pObjStrm;
1940 LwpLayout::Read();
1941 if(LwpFileHeader::m_nFileRevision < 0x000B)
1943 assert(false);
1945 else
1947 sal_uInt16 simple = pStrm->QuickReaduInt16();
1948 if(!simple)
1950 m_nWrapType = pStrm->QuickReaduInt8();
1951 m_nBuoyancy = pStrm->QuickReaduInt8();
1952 m_nBaseLineOffset = pStrm->QuickReadInt32();
1953 m_Script.Read( pStrm);
1955 else
1957 m_nWrapType = LAY_WRAP_AROUND;
1958 m_nBuoyancy = LAY_BUOYNEUTRAL;
1959 m_nBaseLineOffset = 0;
1961 m_LayRelativity.ReadIndexed( pStrm);
1962 if(pStrm->CheckExtra())
1964 sal_uInt16 count = pStrm->QuickReaduInt16();
1965 if(count)
1967 // temporily added by to avoid assertion
1968 while (count)
1970 LwpPoint aPoint;
1971 aPoint.Read(pStrm);
1972 count--;
1974 // end added by
1976 pStrm->SkipExtra();
1981 * @descr: get wrap type
1982 * @param:
1983 * @param:
1984 * @return:
1986 sal_uInt8 LwpPlacableLayout::GetWrapType()
1988 if(m_nOverrideFlag & OVER_PLACEMENT)
1990 return m_nWrapType;
1992 else if( !m_BasedOnStyle.IsNull() )
1994 LwpPlacableLayout* pLay = dynamic_cast<LwpPlacableLayout*> ( m_BasedOnStyle.obj() );
1995 if (pLay)
1996 return pLay->GetWrapType();
1998 return LAY_WRAP_AROUND;
2001 * @descr: get LayoutRelativity
2002 * @param:
2003 * @param:
2004 * @return:
2006 LwpLayoutRelativity* LwpPlacableLayout::GetRelativityPiece()
2008 if(!m_LayRelativity.IsNull())
2010 if(m_nOverrideFlag & OVER_PLACEMENT)
2012 return dynamic_cast<LwpLayoutRelativity*>(m_LayRelativity.obj());
2015 else if( !m_BasedOnStyle.IsNull() )
2017 LwpPlacableLayout* pLay = dynamic_cast<LwpPlacableLayout*> ( m_BasedOnStyle.obj() );
2018 return pLay ? pLay->GetRelativityPiece() : NULL;
2020 return NULL;
2023 * @descr: Get relative type
2026 sal_uInt8 LwpPlacableLayout::GetRelativeType()
2028 LwpLayoutRelativity* pLayRel = GetRelativityPiece();
2029 if(pLayRel)
2031 return pLayRel->GetRelGuts()->GetRelativeType();
2033 return LwpVirtualLayout::GetRelativeType();
2036 * @descr: Get offset from the baseline
2039 sal_Int32 LwpPlacableLayout::GetBaseLineOffset()
2041 /* The baseline is only valid if this is flow-with-text */
2042 if(GetRelativeType()!=LwpLayoutRelativityGuts::LAY_INLINE)
2044 return 0;
2047 // First, ask our content if it has a baseline, ignore now
2049 if (Content && Content->GetBaseLineOffset(&Baseline))
2050 return Baseline;
2053 if(m_nOverrideFlag & OVER_PLACEMENT)
2055 return m_nBaseLineOffset;
2057 else if( !m_BasedOnStyle.IsNull() )
2059 LwpPlacableLayout* pLay = dynamic_cast<LwpPlacableLayout*> ( m_BasedOnStyle.obj() );
2060 return pLay ? pLay->GetBaseLineOffset() : 0;
2062 return 0;
2067 * @descr: whether the parent layout is page layout
2070 sal_Bool LwpPlacableLayout::IsAnchorPage()
2072 if(IsRelativeAnchored())
2073 return sal_False;
2075 LwpVirtualLayout* pLayout = GetParentLayout();
2076 if(pLayout && (pLayout->IsPage() || pLayout->IsHeader() || pLayout->IsFooter()))
2077 //if(pLayout && pLayout->IsPage())
2079 return sal_True;
2081 return sal_False;
2084 * @descr: whether the parent layout is frame layout
2087 sal_Bool LwpPlacableLayout::IsAnchorFrame()
2089 if(IsRelativeAnchored())
2090 return sal_False;
2092 LwpVirtualLayout* pLayout = GetParentLayout();
2093 if(pLayout && (pLayout->IsFrame()||pLayout->IsGroupHead()))
2095 return sal_True;
2097 return sal_False;
2100 * @descr: whether the parent layout is cell layout
2103 sal_Bool LwpPlacableLayout::IsAnchorCell()
2105 if(IsRelativeAnchored())
2106 return sal_False;
2108 LwpVirtualLayout* pLayout = GetParentLayout();
2109 if(pLayout && pLayout->IsCell())
2111 return sal_True;
2113 return sal_False;
2117 * @descr: Get font style for setting position of frame
2120 XFFont* LwpPlacableLayout::GetFont()
2122 return m_pFont;
2125 * @descr: Set font style for setting position of frame
2128 void LwpPlacableLayout::SetFont(XFFont * pFont)
2130 m_pFont = pFont;
2133 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */