/* -*- 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 ************************************************************************/ #include "lwpfribsection.hxx" #include "lwpstory.hxx" #include "lwpsection.hxx" #include #include #include #include #include "lwpfribptr.hxx" #include LwpFribSection::LwpFribSection(LwpPara* pPara) : LwpFrib(pPara) { } LwpFribSection::~LwpFribSection() {} /** * @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 dynamic_cast(m_Section.obj().get()); } /** * @descr: Register section style * */ void LwpFribSection::RegisterSectionStyle() { LwpPageLayout* pLayout = GetPageLayout(); if (pLayout) { m_pMasterPage.reset(new LwpMasterPage(m_pPara, pLayout)); m_pMasterPage->RegisterMasterPage(this); } } /** * @descr: Register section style * */ void LwpFribSection::SetSectionName() { LwpSection* pSection = GetSection(); if (!pSection) return; LwpStory* pStory = dynamic_cast(m_pPara->GetStoryID().obj().get()); if (!pStory) return; pStory->SetSectionName(pSection->GetSectionName()); } /** * @descr: Get page layout that current section points * */ LwpPageLayout* LwpFribSection::GetPageLayout() { if (LwpSection* pSection = GetSection()) return pSection->GetPageLayout(); return nullptr; } /** * @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 if (LwpStory* pStory = dynamic_cast(m_pPara->GetStoryID().obj().get())) { rtl::Reference xObj(m_Section.obj()); if (xObj.is() && xObj->GetTag() == VO_INDEXSECTION) { //create a new section and add it to container XFIndex* pIndex = new XFIndex; pIndex->SetIndexType(enumXFIndexAlphabetical); 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->FindActualStyleName("Separator"); LwpIndexSection* pIndexSection = dynamic_cast(m_Section.obj().get()); XFIndexTemplate* pTemplateSep = new XFIndexTemplate(); if (pIndexSection && pIndexSection->IsFormatSeparator()) { pXFIndex->SetSeparator(true); pTemplateSep->AddEntry(enumXFIndexTemplateText, ""); } //pXFIndex->AddTemplate("separator","Separator",pTemplateSep); pXFIndex->AddTemplate("separator", styleName, pTemplateSep); styleName = pFoundry->FindActualStyleName("Primary"); XFIndexTemplate* pTemplate1 = new XFIndexTemplate(); pTemplate1->AddEntry(enumXFIndexTemplateText, ""); pTemplate1->AddEntry(enumXFIndexTemplateTab, ""); pTemplate1->AddEntry(enumXFIndexTemplatePage, ""); //pXFIndex->AddTemplate(OUString::number(1),"Primary",pTemplate1); pXFIndex->AddTemplate(OUString::number(1), styleName, pTemplate1); XFIndexTemplate* pTemplate2 = new XFIndexTemplate(); pTemplate2->AddEntry(enumXFIndexTemplateText, ""); pTemplate2->AddEntry(enumXFIndexTemplateTab, ""); pTemplate2->AddEntry(enumXFIndexTemplatePage, ""); XFIndexTemplate* pTemplate3 = new XFIndexTemplate(); pTemplate3->AddEntry(enumXFIndexTemplateText, ""); pTemplate3->AddEntry(enumXFIndexTemplateTab, ""); pTemplate3->AddEntry(enumXFIndexTemplatePage, ""); if (pIndexSection && pIndexSection->IsFormatRunin()) { //pXFIndex->AddTemplate(OUString::number(2),"Primary",pTemplate2); //pXFIndex->AddTemplate(OUString::number(3),"Primary",pTemplate3); pXFIndex->AddTemplate(OUString::number(2), styleName, pTemplate2); pXFIndex->AddTemplate(OUString::number(3), styleName, pTemplate3); } else { //pXFIndex->AddTemplate(OUString::number(2),"Secondary",pTemplate2); //pXFIndex->AddTemplate(OUString::number(3),"Secondary",pTemplate3); styleName = pFoundry->FindActualStyleName("Secondary"); pXFIndex->AddTemplate(OUString::number(2), styleName, pTemplate2); pXFIndex->AddTemplate(OUString::number(3), styleName, pTemplate3); } } LwpMasterPage::LwpMasterPage(LwpPara* pPara, LwpPageLayout* pLayout) : m_bNewSection(false) , m_pPara(pPara) , m_pLayout(pLayout) { } /** * @descr: Register master page style for para style and register section style if necessary * */ void LwpMasterPage::RegisterMasterPage(LwpFrib* pFrib) { //if there is no other frib after current frib, register master page in starting para of next page LwpStory* pStory = nullptr; if (IsNextPageType() && (!pFrib->HasNextFrib())) pStory = dynamic_cast(m_pPara->GetStoryID().obj().get()); if (pStory) { pStory->SetCurrentLayout(m_pLayout); RegisterFillerPageStyle(); return; } m_bNewSection = false; //sal_Bool bSectionColumns = sal_False; std::unique_ptr xOverStyle(new XFParaStyle); *xOverStyle = *(m_pPara->GetXFParaStyle()); xOverStyle->SetStyleName(""); LwpLayout::UseWhenType eUserType = m_pLayout->GetUseWhenType(); switch (eUserType) { case LwpLayout::StartWithinColume: //not support now { m_bNewSection = false; break; } case LwpLayout::StartWithinPage: { m_bNewSection = true; //bSectionColumns = sal_True; break; } case LwpLayout::StartOnNextPage: //fall through case LwpLayout::StartOnOddPage: //fall through case LwpLayout::StartOnEvenPage: { pStory = dynamic_cast(m_pPara->GetStoryID().obj().get()); if (pStory) { pStory->SetCurrentLayout(m_pLayout); //get odd page layout when the current pagelayout is mirror m_pLayout = pStory->GetCurrentLayout(); m_bNewSection = IsNeedSection(); //bSectionColumns = m_bNewSection; xOverStyle->SetMasterPage(m_pLayout->GetStyleName()); RegisterFillerPageStyle(); } break; } default: break; } //register tab style; pStory = dynamic_cast(m_pPara->GetStoryID().obj().get()); if (!pStory) return; pStory->SetTabLayout(m_pLayout); m_pPara->RegisterTabStyle(xOverStyle.get()); XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); m_StyleName = pXFStyleManager->AddStyle(std::move(xOverStyle)).m_pStyle->GetStyleName(); //register section style here if (!m_bNewSection) return; std::unique_ptr pSectStyle(new XFSectionStyle()); //set margin pStory = dynamic_cast(m_pPara->GetStoryID().obj().get()); LwpPageLayout* pCurrentLayout = pStory ? pStory->GetCurrentLayout() : nullptr; if (pCurrentLayout) { 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); } XFColumns* pColumns = m_pLayout->GetXFColumns(); if (pColumns) { pSectStyle->SetColumns(pColumns); } m_SectionStyleName = pXFStyleManager->AddStyle(std::move(pSectStyle)).m_pStyle->GetStyleName(); } /** * @descr: Whether it needs to create a new section * */ bool LwpMasterPage::IsNeedSection() { bool bNewSection = false; //get story LwpStory* pStory = dynamic_cast(m_pPara->GetStoryID().obj().get()); //if pagelayout is modified, register the pagelayout if (pStory && 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 nullptr; } /** * @descr: Parse section * */ void LwpMasterPage::ParseSection(LwpFrib* pFrib) { LwpFribPtr& rFribPtr = m_pPara->GetFribs(); //XFParagraph * pXFPara = rFribPtr.GetXFPara(); //parse fillerpage text if (m_pLayout->HasFillerPageText(m_pPara->GetFoundry())) { XFParagraph* pPara = new XFParagraph(); pPara->SetStyleName(m_FillerPageStyleName); m_pPara->AddXFContent(pPara); rFribPtr.SetXFPara(pPara); m_pLayout->ConvertFillerPageText(m_pPara->GetXFContainer()); } //create a new section and add it to container XFContentContainer* pContent = CreateXFSection(); if (pContent) { LwpStory* pStory = dynamic_cast(m_pPara->GetStoryID().obj().get()); //delete the additional blank para XFParagraph* pCurrPara = rFribPtr.GetXFPara(); if (!pCurrPara->HasContents()) { XFContentContainer* pCurrContainer = m_pPara->GetXFContainer(); if (pFrib->HasNextFrib() && (pCurrContainer->GetLastContent() == pCurrPara)) { pCurrContainer->RemoveLastContent(); } } if (pStory) pStory->AddXFContent(pContent); } else { LwpStory* pStory = dynamic_cast(m_pPara->GetStoryID().obj().get()); pContent = pStory ? pStory->GetXFContent() : nullptr; } 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(m_StyleName); m_pPara->AddXFContent(pNextPara); rFribPtr.SetXFPara(pNextPara); } } /** * @descr: Register filler page text style * */ void LwpMasterPage::RegisterFillerPageStyle() { LwpLayout::UseWhenType eUserType = m_pLayout->GetUseWhenType(); if (eUserType != LwpLayout::StartOnOddPage && eUserType != LwpLayout::StartOnEvenPage) return; if (m_pLayout->HasFillerPageText(m_pPara->GetFoundry())) { std::unique_ptr pPagebreakStyle(new XFParaStyle); *pPagebreakStyle = *(m_pPara->GetXFParaStyle()); pPagebreakStyle->SetStyleName(""); pPagebreakStyle->SetBreaks(enumXFBreakAftPage); XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); m_FillerPageStyleName = pXFStyleManager->AddStyle(std::move(pPagebreakStyle)).m_pStyle->GetStyleName(); } } /** * @descr: Whether the layout is next page type * */ bool LwpMasterPage::IsNextPageType() { LwpLayout::UseWhenType eUserType = m_pLayout->GetUseWhenType(); return eUserType == LwpLayout::StartOnNextPage || eUserType == LwpLayout::StartOnOddPage || eUserType == LwpLayout::StartOnEvenPage; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */