diff options
Diffstat (limited to 'lotuswordpro/source/filter/lwpframelayout.cxx')
-rw-r--r-- | lotuswordpro/source/filter/lwpframelayout.cxx | 1289 |
1 files changed, 0 insertions, 1289 deletions
diff --git a/lotuswordpro/source/filter/lwpframelayout.cxx b/lotuswordpro/source/filter/lwpframelayout.cxx deleted file mode 100644 index efc863f1f..000000000 --- a/lotuswordpro/source/filter/lwpframelayout.cxx +++ /dev/null @@ -1,1289 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * The Contents of this file are made available subject to the terms of - * either of the following licenses - * - * - GNU Lesser General Public License Version 2.1 - * - Sun Industry Standards Source License Version 1.1 - * - * Sun Microsystems Inc., October, 2000 - * - * GNU Lesser General Public License Version 2.1 - * ============================================= - * Copyright 2000 by Sun Microsystems, Inc. - * 901 San Antonio Road, Palo Alto, CA 94303, USA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - * - * - * Sun Industry Standards Source License Version 1.1 - * ================================================= - * The contents of this file are subject to the Sun Industry Standards - * Source License Version 1.1 (the "License"); You may not use this file - * except in compliance with the License. You may obtain a copy of the - * License at http://www.openoffice.org/license.html. - * - * Software provided under this License is provided on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, - * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. - * See the License for the specific provisions governing your rights and - * obligations concerning the Software. - * - * The Initial Developer of the Original Code is: IBM Corporation - * - * Copyright: 2008 by IBM Corporation - * - * All Rights Reserved. - * - * Contributor(s): _______________________________________ - * - * - ************************************************************************/ -/************************************************************************* - * @file - * the class for VO_FrameLayout - ************************************************************************/ -/************************************************************************* - * Change History -Mar 2005 Created - ************************************************************************/ -#include "lwpframelayout.hxx" -#include "lwppara.hxx" -#include "xfilter/xfstylemanager.hxx" -#include "xfilter/xfparagraph.hxx" -#include "xfilter/xffloatframe.hxx" -#include "xfilter/xfrubystyle.hxx" -#include "lwppagelayout.hxx" -#include "lwpoleobject.hxx" -#include "lwptablelayout.hxx" -#include "lwpgrfobj.hxx" -#include "lwpglobalmgr.hxx" - -LwpFrame::LwpFrame(LwpPlacableLayout* pLayout):m_pLayout(pLayout) -{ -} - -LwpFrame::~LwpFrame() -{ -} -/** -* @descr: parse frame -* @param: register frame style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::RegisterStyle(XFFrameStyle* pFrameStyle) -{ - ApplyWrapType(pFrameStyle); - ApplyMargins(pFrameStyle); - ApplyPadding(pFrameStyle); - ApplyBorders(pFrameStyle); - ApplyColumns(pFrameStyle); - ApplyShadow(pFrameStyle); - ApplyBackGround(pFrameStyle); - ApplyWatermark(pFrameStyle); -// ApplyBackColor(pFrameStyle); - ApplyProtect(pFrameStyle); - ApplyTextDir(pFrameStyle); - ApplyPosType(pFrameStyle); - - pFrameStyle->SetStyleName(m_pLayout->GetName()->str()); - XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); - m_StyleName = pXFStyleManager->AddStyle(pFrameStyle)->GetStyleName(); - m_pLayout->SetStyleName(m_StyleName); -} -/** -* @descr: parse frame and set frame properties -* @param: pXFFrame - XFFrame object -* @param: nPageNo - the page number that the frame anchors -* -*/ - void LwpFrame::Parse(XFFrame* pXFFrame, sal_Int32 nPageNo) - { - //set the frame style name - pXFFrame->SetStyleName(m_StyleName); - - //SetAnchorType and position,if it's page anchor,set the page number. - ParseAnchorType(pXFFrame); - if(nPageNo>0) - { - pXFFrame->SetAnchorPage(nPageNo); - } - - //Set frame Name - OUString aFrameName = m_pLayout->GetName()->str(); - if(aFrameName.getLength()) - { - //cause the bug of SODC, the linkframe name can not be "Frame1", so I change the frame name - /*if(aFrameName.equals(A2OUSTR("Frame1"))) - { - aFrameName = A2OUSTR("Frame1_COPY"); - } - pXFFrame->SetName(aFrameName);*/ - pXFFrame->SetName(m_StyleName); - } - - LwpLayoutGeometry* pLayoutGeo = m_pLayout->GetGeometry(); - //Set frame Width and height - if(pLayoutGeo) - { - double fWidth = m_pLayout->GetWidth(); - double fHeight = m_pLayout->GetHeight(); - - pXFFrame->SetWidth( fWidth ); - pXFFrame->SetHeight( fHeight ); - - //Get content obj; - /*LwpObject* pObj =*/ m_pLayout->GetContent()->obj(); - if(m_pLayout->IsGroupHead()&&(m_pLayout->IsMinimumHeight())) - { - //process grouplayout height. there is problems now - pXFFrame->SetHeight( fHeight ); - } - /* - else if(m_pLayout->IsFitGraphic() && pObj && pObj->GetTag() == VO_GRAPHIC) - { - //If is graphic, get original size and set it; - LwpGraphicObject* pGrpObj = static_cast<LwpGraphicObject*>(pObj); - long nHeight =0, nWidth =0; - pGrpObj->GetGrafOrgSize(nWidth, nHeight); - //add margins to the width and height; - fWidth = (double)nWidth/TWIPS_PER_CM + m_pLayout->GetMarginsValue(MARGIN_LEFT) + m_pLayout->GetMarginsValue(MARGIN_RIGHT); - fHeight = (double)nHeight/TWIPS_PER_CM + m_pLayout->GetMarginsValue(MARGIN_TOP) + m_pLayout->GetMarginsValue(MARGIN_BOTTOM); - pXFFrame->SetWidth(fWidth); - pXFFrame->SetHeight(fHeight); - } - */ - else if(m_pLayout->IsAutoGrow()) - { - pXFFrame->SetMinHeight( fHeight ); - } - } - - if(m_pLayout->IsFrame()) - { - //Set frame link. Only frame layout has this feature - LwpFrameLayout* pLayout= static_cast<LwpFrameLayout*>(m_pLayout); - pXFFrame->SetNextLink(pLayout->GetNextLinkName()); - } - - } -/** -* @descr: parse frame relative to page, frame or cell -* @param: pCont - content container which contains the frame -* -*/ - void LwpFrame::XFConvert(XFContentContainer* pCont) - { - //parse the frame which anchor to page - LwpVirtualLayout* pParent = m_pLayout->GetParentLayout(); - if(pParent->IsPage()&& pParent->GetParentLayout()->IsPage()) - { - //for mirror page, problems exist if the parent layout is header or footer layout, - pParent = pParent->GetParentLayout(); - } - if(m_pLayout->IsAnchorPage()&& pParent->IsPage()) - { - //get parent layout - if(m_pLayout->IsUseOnPage()) - { - sal_Int32 nPageNo = pParent->GetPageNumber(m_pLayout->GetUsePage()); - if(nPageNo>0) - m_pLayout->XFConvertFrame(pCont, nPageNo); - } - else if(m_pLayout->IsUseOnAllPages()) - { - sal_Int32 nFirst = pParent->GetPageNumber(FIRST_LAYOUTPAGENO); - sal_Int32 nLast = pParent->GetPageNumber(LAST_LAYOUTPAGENO); - if(nLast > 0) - m_pLayout->XFConvertFrame(pCont, nFirst, nLast, sal_True); - - } - else if(m_pLayout->IsUseOnAllOddPages()||m_pLayout->IsUseOnAllEvenPages()) - { - sal_Int32 nFirst = pParent->GetPageNumber(FIRST_LAYOUTPAGENO); - sal_Int32 nLast = pParent->GetPageNumber(LAST_LAYOUTPAGENO); - if(nLast > 0) - { - sal_uInt16 first = static_cast<sal_uInt16>(nFirst); - if((m_pLayout->IsUseOnAllOddPages() && !LwpTools::IsOddNumber(first)) - || (m_pLayout->IsUseOnAllEvenPages() && !LwpTools::IsEvenNumber(first))) - nFirst++; - if(nFirst <= nLast) - { - m_pLayout->XFConvertFrame(pCont, nFirst, nLast, sal_False); - } - } - } - } - else - { - m_pLayout->XFConvertFrame(pCont); - } - - } -/** -* @descr: set frame wrap type style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyWrapType(XFFrameStyle *pFrameStyle) -{ - enumXFWrap eWrap = enumXFWrapNone; - switch(m_pLayout->GetWrapType()) - { - case LwpPlacableLayout::LAY_WRAP_AROUND: //fall throught - case LwpPlacableLayout::LAY_WRAP_IRREG_BIGGEST: - { - //In SODC, if Optimal wrap type is used and the distance between the frame object - //and page margins is less than 2cm, the text is not wraped. While there is no this feature in Word Pro - //So the optimal wrap type is translated to left side or right side wrap type according to the distance - //between the frame object and page margins - - eWrap = enumXFWrapBest; - LwpMiddleLayout* pParent = static_cast<LwpMiddleLayout*>(m_pLayout->GetContainerLayout()); - if(pParent) - { - if(IsLeftWider()) - eWrap = enumXFWrapLeft; - else - eWrap = enumXFWrapRight; - } - break; - } - case LwpPlacableLayout::LAY_NO_WRAP_BESIDE: - { - eWrap = enumXFWrapNone; - break; - } - case LwpPlacableLayout::LAY_NO_WRAP_AROUND: - { - eWrap = enumXFWrapRunThrough; - if(!m_pLayout->GetBackColor() && !m_pLayout->GetWaterMarkLayout()) - { - //pFrameStyle->SetBackGround(sal_True); - XFColor aXFColor(0xffffff); //white color - pFrameStyle->SetBackColor(aXFColor); - pFrameStyle->SetTransparency(100); //transparency - } - break; - } - case LwpPlacableLayout::LAY_WRAP_LEFT: //fall throught - case LwpPlacableLayout::LAY_WRAP_IRREG_LEFT: - { - eWrap = enumXFWrapLeft; - break; - } - case LwpPlacableLayout::LAY_WRAP_RIGHT: //fall throught - case LwpPlacableLayout::LAY_WRAP_IRREG_RIGHT: - { - eWrap = enumXFWrapRight; - break; - } - case LwpPlacableLayout::LAY_WRAP_BOTH: //fall throught - case LwpPlacableLayout::LAY_WRAP_IRREG_BOTH: - { - eWrap = enumXFWrapParallel; - break; - } - default: - break; - } - - //If it is the type of with para above, wrap type is enumXFWrapNone - if(m_pLayout->GetRelativeType()==LwpLayoutRelativityGuts::LAY_INLINE_NEWLINE) - { - eWrap = enumXFWrapNone; - } - - pFrameStyle->SetWrapType(eWrap); -} -/** -* @descr: set frame margins style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyMargins(XFFrameStyle *pFrameStyle) -{ - double fLeft = m_pLayout->GetExtMarginsValue(MARGIN_LEFT); - double fRight = m_pLayout->GetExtMarginsValue(MARGIN_RIGHT); - double fTop = m_pLayout->GetExtMarginsValue(MARGIN_TOP); - double fBottom = m_pLayout->GetExtMarginsValue(MARGIN_BOTTOM); - pFrameStyle->SetMargins(fLeft,fRight,fTop,fBottom); -} -/** -* @descr: set padding border style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyPadding(XFFrameStyle *pFrameStyle) -{ - double fLeft = m_pLayout->GetMarginsValue(MARGIN_LEFT); - double fRight = m_pLayout->GetMarginsValue(MARGIN_RIGHT); - double fTop = m_pLayout->GetMarginsValue(MARGIN_TOP); - double fBottom = m_pLayout->GetMarginsValue(MARGIN_BOTTOM); - pFrameStyle->SetPadding(fLeft,fRight,fTop,fBottom); -} -/** -* @descr: set frame border style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyBorders(XFFrameStyle *pFrameStyle) -{ - XFBorders* pBordres = m_pLayout->GetXFBorders(); - if(pBordres) - { - pFrameStyle->SetBorders(pBordres); - } -} -/** -* @descr: set frame colums style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyColumns(XFFrameStyle *pFrameStyle) -{ - XFColumns* pColumns = m_pLayout->GetXFColumns(); - if(pColumns) - { - pFrameStyle->SetColumns(pColumns); - } -} -/** -* @descr: set frame shadow style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyShadow(XFFrameStyle* pFrameStyle) -{ - XFShadow* pXFShadow = m_pLayout->GetXFShadow(); - if(pXFShadow) - { - pFrameStyle->SetShadow(pXFShadow); - } -} -/** -* @descr: set frame back color style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyBackColor(XFFrameStyle* pFrameStyle) -{ - LwpColor* pColor = m_pLayout->GetBackColor(); - if(pColor) - { - XFColor aXFColor(pColor->To24Color()); - pFrameStyle->SetBackColor(aXFColor); - } -} -/** -* @descr: set frame protect style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyProtect(XFFrameStyle* pFrameStyle) -{ - if(m_pLayout->IsProtected()) - { - pFrameStyle->SetProtect(sal_True,sal_True,sal_True); - } -} -/** -* @descr: set frame text direction style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyTextDir(XFFrameStyle* pFrameStyle) -{ - pFrameStyle->SetTextDir(m_pLayout->GetTextDirection()); -} -/** -* @descr: set frame position type style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyPosType(XFFrameStyle* pFrameStyle) -{ - enumXFFrameXPos eXPos = enumXFFrameXPosCenter; - enumXFFrameXRel eXRel = enumXFFrameXRelPara; - enumXFFrameYPos eYPos = enumXFFrameYPosMiddle; - enumXFFrameYRel eYRel = enumXFFrameYRelPara; - sal_uInt8 nType = m_pLayout->GetRelativeType(); - switch(nType) - { - case LwpLayoutRelativityGuts::LAY_PARENT_RELATIVE://fall throught - case LwpLayoutRelativityGuts::LAY_CONTENT_RELATIVE: - { - //anchor to page, frame and cell - eXPos = enumXFFrameXPosFromLeft; - eXRel = enumXFFrameXRelPage; - //set vertical position - if(m_pLayout->IsAnchorPage())//in page - { - LwpVirtualLayout* pContainer = m_pLayout->GetContainerLayout(); - if(pContainer && (pContainer->IsHeader() || pContainer->IsFooter())) - { - //Only anchor to para, the frame can display in header and footer of each page - eYPos = enumXFFrameYPosFromTop; //from top - eYRel = enumXFFrameYRelPara; //from margin - } - else - { - eYPos = enumXFFrameYPosFromTop; - eYRel = enumXFFrameYRelPage; - } - } - if(m_pLayout->IsAnchorFrame()) //in frame - { - eYPos = enumXFFrameYPosFromTop; - eYRel = enumXFFrameYRelPage; - } - if(m_pLayout->IsAnchorCell()) - { - //SODC has no this type, simulate this feature - eYPos = enumXFFrameYPosFromTop; //from top - eYRel = enumXFFrameYRelPara; //from margin - } - break; - } - case LwpLayoutRelativityGuts::LAY_PARA_RELATIVE: //same page as text - { - eXPos = enumXFFrameXPosFromLeft; - eXRel = enumXFFrameXRelPage; - eYPos = enumXFFrameYPosBelow; //below - eYRel = enumXFFrameYRelChar; //from char - //set vertical position - LwpVirtualLayout* pContainer = m_pLayout->GetContainerLayout(); - if(pContainer && pContainer->IsPage())//in page - { - //eYPos = enumXFFrameYPosFromTop; - //eYRel = enumXFFrameYRelPage; - eYPos = enumXFFrameYPosBelow; - eYRel = enumXFFrameYRelChar; - } - else if(pContainer && pContainer->IsFrame()) //in frame - { - eYPos = enumXFFrameYPosFromTop; - eYRel = enumXFFrameYRelPage; - } - else - { - eYPos = enumXFFrameYPosFromTop; //from top - eYRel = enumXFFrameYRelPara; //from margin - } - break; - } - case LwpLayoutRelativityGuts::LAY_INLINE: //in text - { - eXPos = enumXFFrameXPosFromLeft; //need not be set - eXRel = enumXFFrameXRelParaContent; //need not be set - eYPos = enumXFFrameYPosTop; //should be from top - eYRel = enumXFFrameYRelBaseLine; - sal_Int32 nOffset = m_pLayout->GetBaseLineOffset(); - if(nOffset>0) - { - eYPos = enumXFFrameYPosFromTop; - } - break; - } - case LwpLayoutRelativityGuts::LAY_INLINE_NEWLINE: //with para above - { - eXPos = enumXFFrameXPosFromLeft; - eXRel = enumXFFrameXRelParaContent; - //eYPos = enumXFFrameYPosTop; - eYPos = enumXFFrameYPosBottom; - eYRel = enumXFFrameYRelParaContent; - break; - } - case LwpLayoutRelativityGuts::LAY_INLINE_VERTICAL: //in text - vertical - { - eXPos = enumXFFrameXPosFromLeft; - eXRel = enumXFFrameXRelPage; - eYPos = enumXFFrameYPosFromTop; //should be below position - eYRel = enumXFFrameYRelChar; - break; - } - default: - break; - } - - pFrameStyle->SetXPosType(eXPos,eXRel); - pFrameStyle->SetYPosType(eYPos,eYRel); -} -/** -* @descr: set frame watermark style -* @param: pFrameStyle - Frame Style object -* -*/ -void LwpFrame::ApplyWatermark(XFFrameStyle *pFrameStyle) -{ - XFBGImage* pBGImage = m_pLayout->GetXFBGImage(); - if(pBGImage) - { - pFrameStyle->SetBackImage(pBGImage); - //set watermark transparent - LwpMiddleLayout* pLay = static_cast<LwpMiddleLayout*>(m_pLayout->GetWaterMarkLayout()); - LwpBackgroundStuff* pBackgroundStuff = pLay->GetBackgroundStuff(); - if(pBackgroundStuff && !pBackgroundStuff->IsTransparent()) - { - pFrameStyle->SetTransparency(100); - } - } -} - -/** - * @short Apply pattern fill to frame style - * @param pFrameStyle - pointer of XFFrameStyle - * @return - */ -void LwpFrame::ApplyPatternFill(XFFrameStyle* pFrameStyle) -{ - XFBGImage* pXFBGImage = m_pLayout->GetFillPattern(); - if (pXFBGImage) - { - pFrameStyle->SetBackImage(pXFBGImage); - } -} - -/** - * @short Apply background to frame style - * @param pFrameStyle - pointer of XFFrameStyle - * @return - */ -void LwpFrame::ApplyBackGround(XFFrameStyle* pFrameStyle) -{ - if (!m_pLayout) - { - return; - } - - if (m_pLayout->IsPatternFill()) - { - ApplyPatternFill(pFrameStyle); - } - else - { - ApplyBackColor(pFrameStyle); - } -} - -/** -* @descr: set frame size, anchor type, anchored page number -* @param: pXFFrame - XFFrame object -* -*/ -void LwpFrame::ParseAnchorType(XFFrame *pXFFrame) -{ - //set position - double fXOffset = 0; - double fYOffset = 0; - //page number - sal_uInt16 nPageNum = 0; - //set anchor type - enumXFAnchor eAnchor = enumXFAnchorNone; - - LwpLayoutGeometry* pLayoutGeo = m_pLayout->GetGeometry(); - if(pLayoutGeo) - { - LwpPoint aPoint = pLayoutGeo->GetOrigin(); - fXOffset = LwpTools::ConvertFromUnitsToMetric(aPoint.GetX()); - fYOffset = LwpTools::ConvertFromUnitsToMetric(aPoint.GetY()); - } - //set anchor type - eAnchor = enumXFAnchorNone; - sal_uInt8 nType = m_pLayout->GetRelativeType(); - switch(nType) - { - case LwpLayoutRelativityGuts::LAY_PARENT_RELATIVE://fall throught - case LwpLayoutRelativityGuts::LAY_CONTENT_RELATIVE: - { - //anchor to page, frame and cell - if(m_pLayout->IsAnchorPage())//in page - { - LwpVirtualLayout* pContainer = m_pLayout->GetContainerLayout(); - if(pContainer && (pContainer->IsHeader() || pContainer->IsFooter())) - { - eAnchor = enumXFAnchorPara; - fYOffset -= pContainer->GetMarginsValue(MARGIN_TOP); - } - else - eAnchor = enumXFAnchorPage; - } - if(m_pLayout->IsAnchorFrame()) //in frame - { - eAnchor = enumXFAnchorFrame; - } - if(m_pLayout->IsAnchorCell()) //in cell - { - //eAnchor = enumXFAnchorChar; - eAnchor = enumXFAnchorPara; - LwpMiddleLayout* pContainer = static_cast<LwpMiddleLayout*>(m_pLayout->GetContainerLayout()); - if(pContainer) - { - fYOffset -= pContainer->GetMarginsValue(MARGIN_TOP); - } - } - break; - } - case LwpLayoutRelativityGuts::LAY_PARA_RELATIVE: //same page as text - { - eAnchor = enumXFAnchorChar; - LwpVirtualLayout* pContainer = m_pLayout->GetContainerLayout(); - if(pContainer && pContainer->IsPage())//in page - { - //eAnchor = enumXFAnchorPage; - eAnchor = enumXFAnchorChar;// to character - } - else if(pContainer && pContainer->IsFrame()) //in frame - { - eAnchor = enumXFAnchorFrame; - } - else if(pContainer && pContainer->IsCell()) //in cell - { - //eAnchor = enumXFAnchorChar; - eAnchor = enumXFAnchorPara; - fYOffset -= pContainer->GetMarginsValue(MARGIN_TOP); - } - else if(pContainer && (pContainer->IsHeader() || pContainer->IsFooter()))//in header or footer - { - eAnchor = enumXFAnchorPara; - fYOffset -= pContainer->GetMarginsValue(MARGIN_TOP); - } - break; - } - case LwpLayoutRelativityGuts::LAY_INLINE: //in text - { - eAnchor = enumXFAnchorAsChar; - sal_Int32 nOffset = m_pLayout->GetBaseLineOffset(); - if(nOffset>0 && pLayoutGeo) - { - //experiential value - fYOffset =-(m_pLayout->GetGeometryHeight()+2*m_pLayout->GetExtMarginsValue(MARGIN_BOTTOM)-LwpTools::ConvertFromUnitsToMetric(nOffset)); - } - break; - } - case LwpLayoutRelativityGuts::LAY_INLINE_NEWLINE: //with para above - { - eAnchor = enumXFAnchorPara; - break; - } - case LwpLayoutRelativityGuts::LAY_INLINE_VERTICAL: //in text - vertical - { - eAnchor = enumXFAnchorChar; - //set vertical position - double offset = 0; - - //because of the different feature between Word Pro and SODC, I simulate the vertical base offset - //between anchor and frame orgin using the font height. - //LwpPara* pPara = static_cast<LwpPara*>(m_pLayout->GetPosition()->obj()); - XFFont* pFont = m_pLayout->GetFont(); - if(pFont) - { - offset = (double)(pFont->GetFontSize())*CM_PER_INCH/POINTS_PER_INCH; - } - fYOffset = offset-fYOffset; - break; - } - default: - break; - } - - pXFFrame->SetX(fXOffset); - pXFFrame->SetY(fYOffset); - pXFFrame->SetAnchorPage(nPageNum); - pXFFrame->SetAnchorType(eAnchor); -} - -/** - * @descr Calculate the distance between the frame object and the page margins. - * And determine which side(left or right) is wider - */ -sal_Bool LwpFrame::IsLeftWider() -{ - //LwpMiddleLayout* pParent = static_cast<LwpMiddleLayout*>(m_pLayout->GetContainerLayout()); - LwpVirtualLayout* pParent = static_cast<LwpVirtualLayout*>(m_pLayout->GetContainerLayout()); - if(pParent) - { - LwpPoint aPoint = m_pLayout->GetOrigin(); - double fXOffset = LwpTools::ConvertFromUnitsToMetric(aPoint.GetX()); - double fWidth = m_pLayout->GetWidth(); - double fWrapLeft = m_pLayout->GetExtMarginsValue(MARGIN_LEFT); - double fWrapRight = m_pLayout->GetExtMarginsValue(MARGIN_RIGHT); - - //LwpPoint aParentPoint = pParent->GetOrigin(); - //double fParentXOffset = LwpTools::ConvertFromUnitsToMetric(aParentPoint.GetX()); - double fParentWidth = pParent->GetWidth(); - if(pParent->IsCell()) - { - //Get actual width of this cell layout - fParentWidth = static_cast<LwpCellLayout*>(pParent)->GetActualWidth(); - } - double fParentMarginLeft = pParent->GetMarginsValue(MARGIN_LEFT); - double fParentMarginRight = pParent->GetMarginsValue(MARGIN_RIGHT); - - double fLeft = fXOffset - fWrapLeft -fParentMarginLeft; - double fRight = fParentWidth - fParentMarginRight -(fXOffset + fWidth + fWrapRight); - if(fLeft > fRight) - return sal_True; - } - return sal_False; -} - -LwpFrameLink::LwpFrameLink() -{} - -LwpFrameLink::~LwpFrameLink() -{} - -/** - * @descr frame link information - * - */ -void LwpFrameLink::Read(LwpObjectStream* pStrm) -{ - m_PreviousLayout.ReadIndexed(pStrm); - m_NextLayout.ReadIndexed(pStrm); - pStrm->SkipExtra(); -} - -LwpFrameLayout::LwpFrameLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm) - : LwpPlacableLayout(objHdr, pStrm), m_pFrame(NULL) -{ - -} - -LwpFrameLayout::~LwpFrameLayout() -{ - if(m_pFrame) - { - delete m_pFrame; - m_pFrame = NULL; - } -} - -/** - * @descr read frame layout object - * - */ -void LwpFrameLayout::Read() -{ - LwpPlacableLayout::Read(); - if(LwpFileHeader::m_nFileRevision >= 0x000B) - { - if(m_pObjStrm->QuickReaduInt16()) - { - m_Link.Read(m_pObjStrm); - } - } - m_pObjStrm->SkipExtra(); -} - -/** - * @descr create a xfframe and add into content container - * @param: pCont - content container that contains the frame. - * - */ - void LwpFrameLayout::XFConvert(XFContentContainer* pCont) - { - if(m_pFrame) - { - //parse the frame which anchor to paragraph - if(IsRelativeAnchored()) - { - XFConvertFrame(pCont); - } - else - { - m_pFrame->XFConvert(pCont); - } - - } - } -/** - * @descr create a xfframe and add into content container, called by XFConvert - * @param: pCont - content container that contains the frame. - * @param: nPageNo - the page number that the frame anchors - * - */ -void LwpFrameLayout::XFConvertFrame(XFContentContainer* pCont, sal_Int32 nStart , sal_Int32 nEnd, sal_Bool bAll ) -{ - if(m_pFrame) - { - XFFrame* pXFFrame = NULL; - if(nEnd < nStart) - { - pXFFrame = new XFFrame(); - } - else - { - pXFFrame = new XFFloatFrame(nStart, nEnd, bAll); - } - - m_pFrame->Parse(pXFFrame, nStart); - //if it is a link frame, parse contents only once - if(!HasPreviousLinkLayout()) - { - LwpObject* content = m_Content.obj(); - if (content) - { - content->XFConvert(pXFFrame); - //set frame size according to ole size - ApplyGraphicSize(pXFFrame); - } - } - pCont ->Add(pXFFrame); - } -} -/** - * @descr register frame style - * - */ -void LwpFrameLayout::RegisterStyle() -{ - //if it is for water mark, don't register style - if(IsForWaterMark()) - { - return; - } - //register frame style - XFFrameStyle* pFrameStyle = new XFFrameStyle(); - m_pFrame = new LwpFrame(this); - m_pFrame->RegisterStyle(pFrameStyle); - - //register content style - LwpObject* content = m_Content.obj(); - if (content) - { - content->SetFoundry(m_pFoundry); - content->RegisterStyle(); - } - - //register child frame style - RegisterChildStyle(); - - -} -/** - * @descr get the name of the frame that current frame links - * - */ -OUString LwpFrameLayout::GetNextLinkName() -{ - OUString aName; - LwpObjectID* pObjectID = m_Link.GetNextLayout(); - if(!pObjectID->IsNull()) - { - LwpLayout* pLayout = dynamic_cast<LwpLayout*>(pObjectID->obj()); - if (pLayout) - { - LwpAtomHolder *pHolder = pLayout->GetName(); - if (pHolder) - aName = pHolder->str(); - //for division name confict - if(pLayout->GetStyleName().getLength() > 0) - aName = pLayout->GetStyleName(); - } - } - return aName; -} -/** - * @descr whether current frame is linked by other frame - * - */ -sal_Bool LwpFrameLayout::HasPreviousLinkLayout() -{ - LwpObjectID* pObjectID = m_Link.GetPreviousLayout(); - if(pObjectID->IsNull()) - return sal_False; - return sal_True; -} -/** - * @descr whether current frame is for water mark. Problem maybe exsits by this method, must be tracking - * - */ - sal_Bool LwpFrameLayout::IsForWaterMark() -{ - if(m_nBuoyancy >=LAY_BUOYLAYER) - { - if(!m_Content.IsNull() && (m_Content.obj()->GetTag()==VO_GRAPHIC) ) - { - return sal_True; - } - } - return sal_False; -} - -/** - * @descr Get frame width - * - */ -double LwpFrameLayout::GetWidth() -{ - double fWidth = LwpMiddleLayout::GetWidth(); - if(IsInlineToMargin() && IsAutoGrowWidth()) - { - //for text field entry when choosing maximize field length - fWidth = GetMaxWidth(); - } - return fWidth; -} - -/** - * @descr Get frame width when the text field chooses maximize field length - * - */ -double LwpFrameLayout::GetMaxWidth() -{ - double fActualWidth = 0; - LwpMiddleLayout* pParent = static_cast<LwpMiddleLayout*>(GetContainerLayout()); - if(pParent) - { - LwpPoint aPoint = GetOrigin(); - double fXOffset = LwpTools::ConvertFromUnitsToMetric(aPoint.GetX()); - double fWrapRight = GetExtMarginsValue(MARGIN_RIGHT); - - //Get parent layout width - double fParentWidth = pParent->GetWidth(); - if(pParent->IsCell()) - { - //Get actual width of this cell layout - fParentWidth = static_cast<LwpCellLayout*>(pParent)->GetActualWidth(); - } - - double fParentMarginRight = 0; - sal_uInt8 nType = GetRelativeType(); - if(nType == LwpLayoutRelativityGuts::LAY_INLINE - || nType == LwpLayoutRelativityGuts::LAY_INLINE_NEWLINE ) - { - fParentMarginRight = pParent->GetMarginsValue(MARGIN_RIGHT); - } - - fActualWidth = fParentWidth - fXOffset - fParentMarginRight - fWrapRight; - } - - return fActualWidth; -} - -/** - * @descr Set frame size according to graphic size - * - */ -void LwpFrameLayout::ApplyGraphicSize(XFFrame * pXFFrame) -{ - LwpObject* content = m_Content.obj(); - if(content && (content->GetTag() == VO_GRAPHIC - || content->GetTag() == VO_OLEOBJECT )) - { - LwpGraphicOleObject* pGraOle = static_cast<LwpGraphicOleObject*>(content); - //Get frame geometry size - double fWidth = 0; - double fHeight = 0; - pGraOle->GetGrafScaledSize(fWidth, fHeight); - if( IsFitGraphic()) - { - //graphic scaled sze - fWidth += GetMarginsValue(MARGIN_LEFT) + GetMarginsValue(MARGIN_RIGHT); - fHeight += GetMarginsValue(MARGIN_TOP) + GetMarginsValue(MARGIN_BOTTOM); - } - else if(IsAutoGrowDown() || IsAutoGrowUp()) - { - fWidth = GetWidth(); - fHeight += GetMarginsValue(MARGIN_TOP) + GetMarginsValue(MARGIN_BOTTOM); - } - else if( IsAutoGrowLeft() || IsAutoGrowRight()) - { - fHeight = GetHeight(); - fWidth += GetMarginsValue(MARGIN_LEFT) + GetMarginsValue(MARGIN_RIGHT); - } - else - { - fWidth = GetWidth(); - fHeight = GetHeight(); - } - pXFFrame->SetWidth(fWidth); - pXFFrame->SetHeight(fHeight); - } -} - -LwpGroupLayout::LwpGroupLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm) - : LwpPlacableLayout(objHdr, pStrm),m_pFrame(NULL) -{ - -} - -LwpGroupLayout::~LwpGroupLayout() -{ - if(m_pFrame) - { - delete m_pFrame; - m_pFrame = NULL; - } -} -/** - * @descr read group layout object - * - */ -void LwpGroupLayout::Read() -{ - LwpPlacableLayout::Read(); - m_pObjStrm->SkipExtra(); -} -/** - * @descr register group frame style - * - */ -void LwpGroupLayout::RegisterStyle() -{ - //register frame style - XFFrameStyle* pFrameStyle = new XFFrameStyle(); - m_pFrame = new LwpFrame(this); - m_pFrame->RegisterStyle(pFrameStyle); - - //register child frame style - RegisterChildStyle(); - /* - LwpVirtualLayout* pLayout = static_cast<LwpVirtualLayout*>(GetChildHead()->obj()); - while(pLayout) - { - pLayout->SetFoundry(m_pFoundry); - pLayout->RegisterStyle(); - pLayout = static_cast<LwpVirtualLayout*>(pLayout->GetNext()->obj()); - } - */ -} -/** - * @descr create a xfframe and add into content container - * @param: pCont - content container that contains the frame. - * - */ -void LwpGroupLayout::XFConvert(XFContentContainer *pCont) -{ - if(m_pFrame) - { - //parse the frame which anchor to paragraph - if(IsRelativeAnchored()) - { - XFConvertFrame(pCont); - } - else - { - m_pFrame->XFConvert(pCont); - } - - } -} -/** - * @descr create a xfframe and add into content container, called by XFConvert - * @param: pCont - content container that contains the frame. - * @param: nPageNo - the page number that the frame anchors - * - */ -void LwpGroupLayout::XFConvertFrame(XFContentContainer* pCont, sal_Int32 nStart , sal_Int32 nEnd, sal_Bool bAll) -{ - if(m_pFrame) - { - XFFrame* pXFFrame = NULL; - if(nEnd < nStart) - { - pXFFrame = new XFFrame(); - } - else - { - pXFFrame = new XFFloatFrame(nStart, nEnd, bAll); - } - - m_pFrame->Parse(pXFFrame, nStart); - - //add child frame into group - LwpVirtualLayout* pLayout = static_cast<LwpVirtualLayout*>(GetChildHead()->obj()); - while(pLayout) - { - pLayout->XFConvert(pXFFrame); - pLayout = static_cast<LwpVirtualLayout*>(pLayout->GetNext()->obj()); - } - - pCont ->Add(pXFFrame); - } -} - -LwpGroupFrame::LwpGroupFrame(LwpObjectHeader &objHdr, LwpSvStream* pStrm) - :LwpContent(objHdr, pStrm) -{} - -LwpGroupFrame::~LwpGroupFrame() -{} - -void LwpGroupFrame::Read() -{ - LwpContent::Read(); - m_pObjStrm->SkipExtra(); - -} - void LwpGroupFrame::RegisterStyle() -{ -} -void LwpGroupFrame::XFConvert(XFContentContainer* /*pCont*/) -{ -} - -LwpDropcapLayout::LwpDropcapLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm) - : LwpFrameLayout(objHdr, pStrm) -{ - m_nChars = 1; - m_nLines = 3; -} - -void LwpDropcapLayout::Read() -{ - LwpFrameLayout::Read(); - m_nLines = m_pObjStrm->QuickReaduInt16(); - m_pObjStrm->SeekRel(1); - m_pObjStrm->SkipExtra(); -} - -void LwpDropcapLayout::Parse(IXFStream* pOutputStream) -{ - LwpStory* pStory = static_cast<LwpStory*>(m_Content.obj(VO_STORY)); - if (!pStory) - return; - LwpObject* pPara = pStory->GetFirstPara()->obj(VO_PARA); - if(pPara) - { - pPara->SetFoundry(m_pFoundry); - pPara->Parse(pOutputStream); - } -} - -void LwpDropcapLayout::XFConvert(XFContentContainer* pCont) -{ - LwpStory* pStory = static_cast<LwpStory*>(m_Content.obj(VO_STORY)); - if (pStory) - { - pStory->SetFoundry(m_pFoundry); - pStory->XFConvert(pCont); - } -} - -LwpStory* LwpDropcapLayout::GetContentStory() -{ - return static_cast<LwpStory*>(m_Content.obj(VO_STORY)); -} - -void LwpDropcapLayout::RegisterStyle(LwpFoundry* pFoundry) -{ - LwpStory* pStory = GetContentStory(); - if (pStory) - { - pStory->SetDropcapFlag(sal_True); - pStory->SetFoundry(pFoundry); - LwpPara* pPara = static_cast<LwpPara*>(pStory->GetFirstPara()->obj()); - while(pPara) - { - pPara->SetFoundry(pFoundry); - pPara->RegisterStyle(); - pPara = static_cast<LwpPara*>(pPara->GetNext()->obj()); - } - } -} - -/** - * @descr do nothing - * - */ -void LwpDropcapLayout::RegisterStyle() -{ -} - -LwpRubyLayout::LwpRubyLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm) - : LwpFrameLayout(objHdr, pStrm) -{ -} - -void LwpRubyLayout::Read() -{ - LwpFrameLayout::Read(); - m_nPlacement = m_pObjStrm->QuickReaduInt8(); - m_nAlignment = m_pObjStrm->QuickReaduInt8();; - m_nStateFlag = m_pObjStrm->QuickReaduInt16();; - m_nXOffset = m_pObjStrm->QuickReadInt32(); - m_nYOffset = m_pObjStrm->QuickReadInt32(); - m_objRubyMarker.ReadIndexed(m_pObjStrm); - m_pObjStrm->SkipExtra(); -} - -LwpRubyMarker* LwpRubyLayout::GetMarker() -{ - return static_cast<LwpRubyMarker*>(m_objRubyMarker.obj(VO_RUBYMARKER)); -} - -LwpStory* LwpRubyLayout::GetContentStory() -{ - return static_cast<LwpStory*>(m_Content.obj(VO_STORY)); -} - -void LwpRubyLayout::ConvertContentText() -{ - LwpStory* pStory = GetContentStory(); - LwpRubyMarker* pMarker = GetMarker(); - if (pStory && pMarker) - pMarker->SetRubyText(pStory->GetContentText(sal_True)); -} - -void LwpRubyLayout::RegisterStyle() -{ - LwpRubyMarker* pMarker = GetMarker(); - - XFRubyStyle* pRubyStyle = new XFRubyStyle; - - enumXFRubyPosition eType = enumXFRubyLeft; - if (m_nAlignment == LEFT) - { - eType = enumXFRubyLeft; - } - else if(m_nAlignment == RIGHT) - { - eType = enumXFRubyRight; - } - else if(m_nAlignment == CENTER) - { - eType = enumXFRubyCenter; - } - pRubyStyle->SetAlignment(eType); - - eType = enumXFRubyTop; - if (m_nPlacement == TOP) - { - eType = enumXFRubyTop; - } - else if(m_nPlacement == BOTTOM) - { - eType = enumXFRubyBottom; - } - pRubyStyle->SetPosition(eType); - - XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); - OUString rubyStyle = pXFStyleManager->AddStyle(pRubyStyle)->GetStyleName(); - pMarker->SetRubyStyleName(rubyStyle); - - LwpStory* pStory = GetContentStory(); - pStory->SetFoundry(m_pFoundry); - OUString textStyle = pStory->RegisterFirstFribStyle(); - pMarker->SetTextStyleName(textStyle); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |