diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
commit | ed5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch) | |
tree | 7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /lotuswordpro/source/filter/lwptoc.cxx | |
parent | Initial commit. (diff) | |
download | libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.tar.xz libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.zip |
Adding upstream version 4:7.4.7.upstream/4%7.4.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | lotuswordpro/source/filter/lwptoc.cxx | 471 |
1 files changed, 471 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwptoc.cxx b/lotuswordpro/source/filter/lwptoc.cxx new file mode 100644 index 000000000..9268f8e33 --- /dev/null +++ b/lotuswordpro/source/filter/lwptoc.cxx @@ -0,0 +1,471 @@ +/* -*- 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 + * For LWP filter architecture prototype - TOC related object + */ + +#include "lwptoc.hxx" +#include <lwpfoundry.hxx> +#include "lwpdoc.hxx" +#include "lwpframelayout.hxx" +#include <lwpglobalmgr.hxx> + +#include <xfilter/xftextstyle.hxx> +#include <xfilter/xfstylemanager.hxx> +#include <xfilter/xfparastyle.hxx> +#include <xfilter/xfindex.hxx> +#include <xfilter/xffloatframe.hxx> +#include <xfilter/xfframe.hxx> + +LwpTocSuperLayout::LwpTocSuperLayout(LwpObjectHeader const &objHdr, LwpSvStream* pStrm) + : LwpSuperTableLayout(objHdr, pStrm) + , m_nFrom(0) + , m_pCont(nullptr) +{ +} + +LwpTocSuperLayout::~LwpTocSuperLayout() +{ +} + +/** + * @short Read TOCSUPERTABLELAYOUT object + * @return none + */ +void LwpTocSuperLayout::Read() +{ + LwpSuperTableLayout::Read(); + m_TextMarker.Read(m_pObjStrm.get()); + m_ParentName.Read(m_pObjStrm.get()); + m_DivisionName.Read(m_pObjStrm.get()); + m_SectionName.Read(m_pObjStrm.get()); + m_nFrom = m_pObjStrm->QuickReaduInt16(); + + m_SearchItems.Read(m_pObjStrm.get()); + + sal_uInt16 count = m_pObjStrm->QuickReaduInt16(); + if (count > MAX_LEVELS) + throw std::range_error("corrupt LwpTocSuperLayout"); + for (sal_uInt16 i = 0; i < count; ++i) + m_DestName[i].Read(m_pObjStrm.get()); + + count = m_pObjStrm->QuickReaduInt16(); + if (count > MAX_LEVELS) + throw std::range_error("corrupt LwpTocSuperLayout"); + for (sal_uInt16 i = 0; i < count; ++i) + m_DestPGName[i].Read(m_pObjStrm.get()); + + count = m_pObjStrm->QuickReaduInt16(); + if (count > MAX_LEVELS) + throw std::range_error("corrupt LwpTocSuperLayout"); + for (sal_uInt16 i = 0; i < count; ++i) + m_nFlags[i] = m_pObjStrm->QuickReaduInt32(); + + m_pObjStrm->SkipExtra(); +} +/** + * @short Register style of TOC + * @return none + */ +void LwpTocSuperLayout::RegisterStyle() +{ + LwpSuperTableLayout::RegisterStyle(); + + // Get font info of default text style and set into tab style + const LwpObjectID *pDefaultTextStyle = m_pFoundry ? m_pFoundry->GetDefaultTextStyle() : nullptr; + XFParaStyle* pBaseStyle = pDefaultTextStyle ? dynamic_cast<XFParaStyle*>(m_pFoundry->GetStyleManager()->GetStyle(*pDefaultTextStyle)) : nullptr; + std::unique_ptr<XFTextStyle> pTextStyle(new XFTextStyle); + if (pBaseStyle) + pTextStyle->SetFont(pBaseStyle->GetFont()); // who delete this font????? + XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); + m_TabStyleName = pXFStyleManager->AddStyle(std::move(pTextStyle)).m_pStyle->GetStyleName(); + +} +/** + * @short Convert TOC + * @param pCont - container + * @return none + */ +void LwpTocSuperLayout::XFConvert(XFContentContainer* pCont) +{ + rtl::Reference<XFIndex> xToc(new XFIndex); + + xToc->SetProtected(false); + xToc->SetIndexType(enumXFIndexTOC); + + // add TOC template + for (sal_uInt16 i = 1; i<= MAX_LEVELS; i++) + { + LwpTocLevelData * pLevel = GetSearchLevelPtr(i); + XFIndexTemplate * pTemplate = new XFIndexTemplate(); + + if(!pLevel) + { + // add a blank template so that SODC won't add default style to this level + xToc->AddTemplate(OUString::number(i), OUString(), pTemplate); + continue; + } + + bool bInserted = false; + do + { + // One level has 1 template + if (!bInserted) + { + pTemplate->SetLevel(OUString::number(i)); + if(pLevel->GetUseLeadingText()) + { + pTemplate->AddEntry(enumXFIndexTemplateChapter, pLevel->GetSearchStyle()); + } + if(pLevel->GetUseText()) + { + pTemplate->AddEntry(enumXFIndexTemplateText, pLevel->GetSearchStyle()); + } + if(GetUsePageNumber(i)) + { + sal_uInt16 nLeaderType = GetSeparatorType(i); + if (GetRightAlignPageNumber(i)) + { + char cSep = ' '; + switch(nLeaderType) + { + default: // go through + case NONE: // no leaders + cSep = ' '; + break; + case LEADERDOTS: + cSep = '.'; + break; + case LEADERDASHES: + cSep = '-'; + break; + case LEADERUNDERLINE: + cSep = '_'; + break; + } + + pTemplate->AddTabEntry(enumXFTabRight, 0, cSep, 'd', m_TabStyleName); + } + else + { + OUString sSep; + switch(nLeaderType) + { + default: // go through + case NONE: // no leaders + sSep = " "; + break; + case SEPARATORCOMMA: + sSep = ", "; + break; + case SEPARATORDOTS: + sSep = "..."; + break; + } + pTemplate->AddTextEntry(sSep, m_TabStyleName); + } + //"TOC Page Number Text Style" style always exists in Word Pro file + pTemplate->AddEntry(enumXFIndexTemplatePage, "TOC Page Number Text Style"); + } + + xToc->AddTemplate(OUString::number(static_cast<sal_Int32>(i)), m_pFoundry->FindActualStyleName(pLevel->GetSearchStyle()), pTemplate); + bInserted = true; + } + + // 1 style in WordPro may be mapped to several styles in SODC + LwpDocument * pDocument = m_pFoundry->GetDocument()->GetRootDocument(); + AddSourceStyle(xToc.get(), pLevel, pDocument->GetFoundry()); + + // one level may have several corresponding Styles + pLevel = GetNextSearchLevelPtr(i, pLevel); // find next LwpTocLevelData which is same index + }while (pLevel != nullptr); + } + + m_pCont = pCont; + // add TOC content + LwpSuperTableLayout::XFConvert(xToc.get()); + + rtl::Reference<LwpVirtualLayout> xContainer(GetContainerLayout()); + if (!xContainer.is()) + return; + + // if current TOC is located in a cell, we must add a frame between upper level container and TOC + if (!xContainer->IsCell()) + { + pCont->Add(xToc.get()); + } +} + +/** + * @short convert frame which anchor to page + * @param pCont - + * @return + */ +void LwpTocSuperLayout::XFConvertFrame(XFContentContainer* pCont, sal_Int32 nStart, sal_Int32 nEnd, bool bAll) +{ + if (!m_pFrame) + return; + + rtl::Reference<XFFrame> xXFFrame; + if(nEnd < nStart) + { + xXFFrame.set(new XFFrame); + } + else + { + xXFFrame.set(new XFFloatFrame(nStart, nEnd, bAll)); + } + + m_pFrame->Parse(xXFFrame.get(), static_cast<sal_uInt16>(nStart)); + + //parse table, and add table to frame or TOC + LwpTableLayout * pTableLayout = GetTableLayout(); + if (!pTableLayout) + return; + + XFContentContainer* pTableContainer = xXFFrame.get(); + // if *this is a TOCSuperTableLayout and it's located in a cell + // add the frame to upper level and add TOCSuperTableLayout into the frame + rtl::Reference<LwpVirtualLayout> xContainer(GetContainerLayout()); + if (!xContainer.is()) + return; + if (xContainer->IsCell()) + { + pTableContainer = pCont; // TOC contain table directly + xXFFrame->Add(pCont); + m_pCont->Add(xXFFrame.get()); + } + else + { + //add frame to the container + pCont->Add(xXFFrame.get()); + } + pTableLayout->XFConvert(pTableContainer); + +} + +/** + * @short Add source style into TOC + * @param pToc - TOC pointer + * @param pLevel - TOC level data + * @param pFoundry - foundry pointer + * @return sal_Bool + */ +void LwpTocSuperLayout::AddSourceStyle(XFIndex* pToc, LwpTocLevelData * pLevel, LwpFoundry * pFoundry) +{ + if (!pLevel) + { + return; + } + + OUString sLwpStyleName = pLevel->GetSearchStyle(); + + if (!pFoundry) + return; + + LwpDocument * pDoc = pFoundry->GetDocument(); + if (pDoc && pDoc->IsChildDoc()) + { + OUString sSodcStyleName = pFoundry->FindActualStyleName(sLwpStyleName); + pToc->AddTocSource(pLevel->GetLevel(), sSodcStyleName); + } + else + { + pDoc = pDoc->GetFirstDivision(); + while (pDoc) + { + AddSourceStyle(pToc, pLevel, pDoc->GetFoundry() ); + pDoc = pDoc->GetNextDivision(); + } + } +} + +/** + * @short Get whether page number is right alignment + * @param index - TOC level + * @return sal_Bool + */ +bool LwpTocSuperLayout::GetRightAlignPageNumber(sal_uInt16 index) +{ + if (index < MAX_LEVELS) + return (m_nFlags[index] & TS_RIGHTALIGN) != 0; + return false; +} +/** + * @short Get whether page number is used in TOC entries + * @param index - TOC level + * @return sal_Bool + */ +bool LwpTocSuperLayout::GetUsePageNumber(sal_uInt16 index) +{ + if (index < MAX_LEVELS) + return (m_nFlags[index] & TS_PAGENUMBER) != 0; + return false; +} +/** + * @short Get what is used for separator + * @param index - TOC level + * @return sal_uInt16 - separator type + */ +sal_uInt16 LwpTocSuperLayout::GetSeparatorType(sal_uInt16 index) +{ + if (index >= MAX_LEVELS) + return NONE; + + sal_uInt16 Flag = static_cast<sal_uInt16>(m_nFlags[index]); + + if (Flag & TS_LEADERDOTS) + return LEADERDOTS; + else if (Flag & TS_LEADERDASHES) + return LEADERDASHES; + else if (Flag & TS_LEADERUNDERLINE) + return LEADERUNDERLINE; + else if (Flag & TS_SEPARATORCOMMA) + return SEPARATORCOMMA; + else if (Flag & TS_SEPARATORDOTS) + return SEPARATORDOTS; + else + return NONE; +} + +/** + * @short Get TOCLEVELDATA obj + * @param index - TOC level + * @return LwpTocLevelData * - pointer to TOCLEVELDATA obj + */ +LwpTocLevelData * LwpTocSuperLayout::GetSearchLevelPtr(sal_uInt16 index) +{ + LwpObjectID * pID = &m_SearchItems.GetHead(); // not necessary to check pID NULL or not + LwpTocLevelData * pObj = dynamic_cast<LwpTocLevelData *>(pID->obj().get()); + + while(pObj) + { + if(pObj->GetLevel()== index) + { + return pObj; + } + + pID = &pObj->GetNext(); // not necessary to check pID NULL or not + pObj = dynamic_cast<LwpTocLevelData *>(pID->obj().get()); + } + + return nullptr; +} +/** + * @short Get next TOCLEVELDATA obj from current position + * @param index - TOC level + * @param pCurData - current LwpTocLevelData + * @return LwpTocLevelData * - pointer to TOCLEVELDATA obj + */ +LwpTocLevelData * LwpTocSuperLayout::GetNextSearchLevelPtr(sal_uInt16 index, LwpTocLevelData * pCurData) +{ + LwpObjectID * pID = &pCurData->GetNext(); + LwpTocLevelData * pObj = dynamic_cast<LwpTocLevelData *>(pID->obj().get()); + + while(pObj) + { + if(pObj->GetLevel()== index) + { + return pObj; + } + + pID = &pObj->GetNext(); // not necessary to check pID NULL or not + pObj = dynamic_cast<LwpTocLevelData *>(pID->obj().get()); + } + + return nullptr; +} + +LwpTocLevelData::LwpTocLevelData(LwpObjectHeader const &objHdr, LwpSvStream* pStrm) + : LwpDLVList(objHdr, pStrm), m_nFlags(0), m_nLevel(0) +{ +} +LwpTocLevelData::~LwpTocLevelData() +{ +} +/** + * @short Register style + * @param + * @return + */ +void LwpTocLevelData::RegisterStyle() +{ +} +/** + * @short Convert + * @param pCont - container + * @return none + */ +void LwpTocLevelData::XFConvert(XFContentContainer* /*pCont*/) +{ +} +/** + * @short Read TOCLEVELDATA obj + * @param + * @return + */ +void LwpTocLevelData::Read() +{ + LwpDLVList::Read(); + m_nFlags = m_pObjStrm->QuickReaduInt16(); + m_nLevel = m_pObjStrm->QuickReaduInt16(); + m_SearchName.Read(m_pObjStrm.get()); + + m_pObjStrm->SkipExtra(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |