diff options
Diffstat (limited to 'lotuswordpro/source/filter/lwpfribsection.cxx')
-rw-r--r-- | lotuswordpro/source/filter/lwpfribsection.cxx | 473 |
1 files changed, 473 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpfribsection.cxx b/lotuswordpro/source/filter/lwpfribsection.cxx new file mode 100644 index 000000000000..244823ec56e1 --- /dev/null +++ b/lotuswordpro/source/filter/lwpfribsection.cxx @@ -0,0 +1,473 @@ +/* -*- 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 section frib and process section and page layout + ************************************************************************/ +/************************************************************************* + * Change History +Jan 2005 Created + ************************************************************************/ +#include "lwpfribsection.hxx" +#include "lwpfribbreaks.hxx" +#include "lwpstory.hxx" +#include "lwpsection.hxx" +#include "xfilter/xfstylemanager.hxx" +#include "xfilter/xfsectionstyle.hxx" +#include "xfilter/xfsection.hxx" +#include "xfilter/xfindex.hxx" +#include "lwpfribptr.hxx" +#include "lwpglobalmgr.hxx" + +LwpFribSection::LwpFribSection(LwpPara *pPara) + : LwpFrib(pPara),m_pMasterPage(NULL) +{ + +} + +LwpFribSection::~LwpFribSection() +{ + if(m_pMasterPage) + { + delete m_pMasterPage; + m_pMasterPage = NULL; + } +} + +/** + * @descr: Read section frib information + * + */ +void LwpFribSection::Read(LwpObjectStream *pObjStrm, sal_uInt16 /*len*/) +{ + m_Section.ReadIndexed(pObjStrm); +} + +/** + * @descr: Get section pointer + * + */ +LwpSection* LwpFribSection::GetSection() +{ + return static_cast<LwpSection*>(m_Section.obj()); +} + +/** + * @descr: Register section style + * + */ +void LwpFribSection::RegisterSectionStyle() +{ + LwpPageLayout* pLayout = GetPageLayout(); + if(pLayout) + { + m_pMasterPage = new LwpMasterPage(m_pPara, pLayout); + m_pMasterPage->RegisterMasterPage(this); + } +} + +/** + * @descr: Register section style + * + */ +void LwpFribSection::SetSectionName() +{ + LwpSection* pSection = GetSection(); + if(pSection) + { + LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj()); + pStory->SetSectionName(pSection->GetSectionName()); + } +} + +/** + * @descr: Get page layout that current section points + * + */ +LwpPageLayout* LwpFribSection::GetPageLayout() +{ + if(GetSection()) + return GetSection()->GetPageLayout(); + return NULL; +} + +/** + * @descr: XFConvert section + * + */ +void LwpFribSection::ParseSection() +{ + LwpPageLayout* pLayout = GetPageLayout(); + if(pLayout) + { + // StartWithinColume not support now + LwpLayout::UseWhenType eSectionType = pLayout->GetUseWhenType(); + if(eSectionType==LwpLayout::StartWithinColume) + { + return; + } + if(m_pMasterPage) + { + m_pMasterPage->ParseSection(this); + } + } + else + { + LwpStory* pStory = static_cast<LwpStory*> ( m_pPara->GetStoryID()->obj() ); + if (m_Section.obj()->GetTag() == VO_INDEXSECTION) + { + //create a new section and add it to container + XFIndex* pIndex = new XFIndex; + pIndex->SetIndexType(enumXFIndexAlphabetical); + /* + sal_Bool bRunin = sal_False; + sal_Bool bSeparator = sal_False; + LwpIndexSection* pIndexSection = static_cast<LwpIndexSection*>(m_Section.obj()); + if (pIndexSection->IsFormatRunin()) + bRunin = sal_True; + if (pIndexSection->IsFormatSeparator()) + bSeparator = sal_True; + pIndex->SetDefaultAlphaIndex(A2OUSTR(""),bRunin,bSeparator); + */ + SetDefaultAlphaIndex(pIndex); + + pStory->AddXFContent( pIndex ); + m_pPara->SetXFContainer( pIndex ); + } + else + { + XFContentContainer* pContent = pStory->GetXFContent(); + m_pPara->SetXFContainer( pContent ); + } + } +} + +void LwpFribSection::SetDefaultAlphaIndex(XFIndex * pXFIndex) +{ + LwpFoundry* pFoundry = m_pPara->GetFoundry(); + OUString styleName = pFoundry->FindActuralStyleName(A2OUSTR("Separator")); + + LwpIndexSection* pIndexSection = static_cast<LwpIndexSection*>(m_Section.obj()); + XFIndexTemplate * pTemplateSep = new XFIndexTemplate(); + if (pIndexSection->IsFormatSeparator()) + { + pXFIndex->SetSeparator(sal_True); + pTemplateSep->AddEntry(enumXFIndexTemplateText,A2OUSTR("")); + } + //pXFIndex->AddTemplate(A2OUSTR("separator"),A2OUSTR("Separator"),pTemplateSep); + pXFIndex->AddTemplate(A2OUSTR("separator"),styleName,pTemplateSep); + + + styleName = pFoundry->FindActuralStyleName(A2OUSTR("Primary")); + + XFIndexTemplate * pTemplate1 = new XFIndexTemplate(); + pTemplate1->AddEntry(enumXFIndexTemplateText,A2OUSTR("")); + pTemplate1->AddEntry(enumXFIndexTemplateTab,A2OUSTR("")); + pTemplate1->AddEntry(enumXFIndexTemplatePage,A2OUSTR("")); + //pXFIndex->AddTemplate(Int32ToOUString(1),A2OUSTR("Primary"),pTemplate1); + pXFIndex->AddTemplate(Int32ToOUString(1),styleName,pTemplate1); + + XFIndexTemplate * pTemplate2 = new XFIndexTemplate(); + pTemplate2->AddEntry(enumXFIndexTemplateText,A2OUSTR("")); + pTemplate2->AddEntry(enumXFIndexTemplateTab,A2OUSTR("")); + pTemplate2->AddEntry(enumXFIndexTemplatePage,A2OUSTR("")); + XFIndexTemplate * pTemplate3 = new XFIndexTemplate(); + pTemplate3->AddEntry(enumXFIndexTemplateText,A2OUSTR("")); + pTemplate3->AddEntry(enumXFIndexTemplateTab,A2OUSTR("")); + pTemplate3->AddEntry(enumXFIndexTemplatePage,A2OUSTR("")); + + if (pIndexSection->IsFormatRunin()) + { + //pXFIndex->AddTemplate(Int32ToOUString(2),A2OUSTR("Primary"),pTemplate2); + //pXFIndex->AddTemplate(Int32ToOUString(3),A2OUSTR("Primary"),pTemplate3); + pXFIndex->AddTemplate(Int32ToOUString(2),styleName,pTemplate2); + pXFIndex->AddTemplate(Int32ToOUString(3),styleName,pTemplate3); + } + else + { + //pXFIndex->AddTemplate(Int32ToOUString(2),A2OUSTR("Secondary"),pTemplate2); + //pXFIndex->AddTemplate(Int32ToOUString(3),A2OUSTR("Secondary"),pTemplate3); + styleName = pFoundry->FindActuralStyleName(A2OUSTR("Secondary")); + pXFIndex->AddTemplate(Int32ToOUString(2),styleName,pTemplate2); + pXFIndex->AddTemplate(Int32ToOUString(3),styleName,pTemplate3); + } +} + + +LwpMasterPage::LwpMasterPage(LwpPara* pPara, LwpPageLayout* pLayout) + :m_bNewSection(sal_False),m_pPara(pPara),m_pLayout(pLayout) +{ +} + +/** + * @descr: Register master page style for para style and register section style if necessary + * + */ +sal_Bool LwpMasterPage::RegisterMasterPage(LwpFrib* pFrib) +{ + //if there is no other frib after current firb, register master page in starting para of next page + if(IsNextPageType()&&(!pFrib->HasNextFrib())) + { + LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj()); + pStory->SetCurrentLayout(m_pLayout); + RegisterFillerPageStyle(); + return sal_False; + } + + m_bNewSection = sal_False; + //sal_Bool bSectionColumns = sal_False; + + XFParaStyle* pOverStyle = new XFParaStyle; + *pOverStyle = *(m_pPara->GetXFParaStyle()); + pOverStyle->SetStyleName(A2OUSTR("")); + + LwpLayout::UseWhenType eUserType = m_pLayout->GetUseWhenType(); + switch(eUserType) + { + case LwpLayout::StartWithinColume://not support now + { + m_bNewSection = sal_False; + break; + } + case LwpLayout::StartWithinPage: + { + m_bNewSection = sal_True; + //bSectionColumns = sal_True; + break; + } + case LwpLayout::StartOnNextPage: //fall throught + case LwpLayout::StartOnOddPage: //fall throught + case LwpLayout::StartOnEvenPage: + { + LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj()); + pStory->SetCurrentLayout(m_pLayout); + //get odd page layout when the current pagelayout is mirror + m_pLayout = pStory->GetCurrentLayout(); + m_bNewSection = IsNeedSection(); + //bSectionColumns = m_bNewSection; + pOverStyle->SetMasterPage( m_pLayout->GetStyleName()); + RegisterFillerPageStyle(); + break; + } + default: + break; + } + + //register tab style; + LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj()); + pStory->SetTabLayout(m_pLayout); + m_pPara->RegisterTabStyle(pOverStyle); + + XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); + m_StyleName = pXFStyleManager->AddStyle(pOverStyle)->GetStyleName(); + //register section style here + if(m_bNewSection) + { + XFSectionStyle* pSectStyle= new XFSectionStyle(); + //set margin + pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj()); + if(pStory) + { + LwpPageLayout* pCurrentLayout = pStory->GetCurrentLayout(); + double fLeft = m_pLayout->GetMarginsValue(MARGIN_LEFT)- pCurrentLayout->GetMarginsValue(MARGIN_LEFT); + double fRight = m_pLayout->GetMarginsValue(MARGIN_RIGHT)- pCurrentLayout->GetMarginsValue(MARGIN_RIGHT); + pSectStyle->SetMarginLeft(fLeft); + pSectStyle->SetMarginRight(fRight); + } + + //if(bSectionColumns) + //{ + //set columns + XFColumns* pColumns = m_pLayout->GetXFColumns(); + if(pColumns) + { + pSectStyle->SetColumns(pColumns); + } + //} + m_SectionStyleName = pXFStyleManager->AddStyle(pSectStyle)->GetStyleName(); + } + return sal_False; +} + +/** + * @descr: Whether it need create a new section + * + */ +sal_Bool LwpMasterPage::IsNeedSection() +{ + sal_Bool bNewSection = sal_False; + //get story + LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj()); + //if pagelayout is modified, register the pagelayout + if(pStory->IsPMModified()) + { + bNewSection = pStory->IsNeedSection(); + } + return bNewSection; +} + +/** + * @descr: Create XFSection if necessary + * + */ +XFSection* LwpMasterPage::CreateXFSection() +{ + if(m_bNewSection) + { + //new a section + XFSection* pXFSection = new XFSection(); + pXFSection->SetStyleName(m_SectionStyleName); + return pXFSection; + } + return NULL; +} + +/** + * @descr: Parse section + * + */ +void LwpMasterPage::ParseSection(LwpFrib* pFrib) +{ + LwpFribPtr* pFribPtr = m_pPara->GetFribs(); + //XFParagraph * pXFPara = pFribPtr->GetXFPara(); + + //parse fillerpage text + if(m_pLayout->HasFillerPageText(m_pPara->GetFoundry())) + { + XFParagraph *pPara = new XFParagraph(); + pPara->SetStyleName(GetFillerPageStyleName()); + m_pPara->AddXFContent(pPara); + pFribPtr->SetXFPara(pPara); + + m_pLayout->ConvertFillerPageText(m_pPara->GetXFContainer()); + } + //create a new section and add it to container + XFContentContainer* pContent = CreateXFSection(); + if(pContent) + { + LwpStory* pStory = static_cast<LwpStory*> ( m_pPara->GetStoryID()->obj() ); + //delete the additional blank para, 06/28/2005 + XFParagraph* pCurrPara = pFribPtr->GetXFPara(); + if(!pCurrPara->HasContents()) + { + XFContentContainer* pCurrContainer = m_pPara->GetXFContainer(); + if(pFrib->HasNextFrib() && (pCurrContainer->GetLastContent() == pCurrPara)) + { + pCurrContainer->RemoveLastContent(); + } + } + //end,06/28/2005 + pStory->AddXFContent( pContent ); + } + else + { + LwpStory* pStory = static_cast<LwpStory*> ( m_pPara->GetStoryID()->obj() ); + pContent = pStory->GetXFContent(); + } + if(pContent) + { + m_pPara->SetXFContainer( pContent ); + } + //out put the contents after the section frib in the same para. + if(pFrib->HasNextFrib()) + { + XFParagraph *pNextPara = new XFParagraph(); + pNextPara->SetStyleName(GetStyleName()); + m_pPara->AddXFContent(pNextPara); + pFribPtr->SetXFPara(pNextPara); + } + +} + +/** + * @descr: Register filler page text style + * + */ +void LwpMasterPage::RegisterFillerPageStyle() +{ + LwpLayout::UseWhenType eUserType = m_pLayout->GetUseWhenType(); + if(eUserType==LwpLayout::StartOnOddPage + ||eUserType==LwpLayout::StartOnEvenPage) + { + if(m_pLayout->HasFillerPageText(m_pPara->GetFoundry())) + { + XFParaStyle* pPagebreakStyle = new XFParaStyle; + *pPagebreakStyle = *(m_pPara->GetXFParaStyle()); + pPagebreakStyle->SetStyleName(A2OUSTR("")); + pPagebreakStyle->SetBreaks(enumXFBreakAftPage); + XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); + m_FillerPageStyleName= pXFStyleManager->AddStyle(pPagebreakStyle)->GetStyleName(); + } + } +} + +/** + * @descr: Whether the layout is next page type + * + */ +sal_Bool LwpMasterPage::IsNextPageType() +{ + LwpLayout::UseWhenType eUserType = m_pLayout->GetUseWhenType(); + if(eUserType == LwpLayout::StartOnNextPage + || eUserType == LwpLayout::StartOnOddPage + || eUserType == LwpLayout::StartOnEvenPage ) + { + return sal_True; + } + return sal_False; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |