summaryrefslogtreecommitdiffstats
path: root/lotuswordpro/source/filter/lwpfribsection.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'lotuswordpro/source/filter/lwpfribsection.cxx')
-rw-r--r--lotuswordpro/source/filter/lwpfribsection.cxx452
1 files changed, 452 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpfribsection.cxx b/lotuswordpro/source/filter/lwpfribsection.cxx
new file mode 100644
index 000000000..a65763f38
--- /dev/null
+++ b/lotuswordpro/source/filter/lwpfribsection.cxx
@@ -0,0 +1,452 @@
+/* -*- 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 <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)
+{
+}
+
+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<LwpSection*>(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<LwpStory*>(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<LwpStory*>(m_pPara->GetStoryID().obj().get()))
+ {
+ rtl::Reference<LwpObject> 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<LwpIndexSection*>(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<LwpStory*>(m_pPara->GetStoryID().obj().get());
+
+ if (pStory)
+ {
+ pStory->SetCurrentLayout(m_pLayout);
+ RegisterFillerPageStyle();
+ return;
+ }
+
+ m_bNewSection = false;
+ //sal_Bool bSectionColumns = sal_False;
+
+ std::unique_ptr<XFParaStyle> 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<LwpStory*>(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<LwpStory*>(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<XFSectionStyle> pSectStyle(new XFSectionStyle());
+ //set margin
+ pStory = dynamic_cast<LwpStory*>(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<LwpStory*>(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<LwpStory*>(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<LwpStory*>(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<XFParaStyle> 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: */