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/lwpfoundry.cxx | |
parent | Initial commit. (diff) | |
download | libreoffice-upstream.tar.xz libreoffice-upstream.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/lwpfoundry.cxx | 532 |
1 files changed, 532 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpfoundry.cxx b/lotuswordpro/source/filter/lwpfoundry.cxx new file mode 100644 index 000000000..07a5c872a --- /dev/null +++ b/lotuswordpro/source/filter/lwpfoundry.cxx @@ -0,0 +1,532 @@ +/* -*- 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 + ************************************************************************/ + +#include <lwpfoundry.hxx> +#include <lwpfilehdr.hxx> +#include "lwpdoc.hxx" +#include "lwpmarker.hxx" +#include "lwpholder.hxx" +#include "lwpbulletstylemgr.hxx" +#include "lwpcontent.hxx" +#include "lwpvpointer.hxx" +#include "lwpsection.hxx" +#include "lwpcharacterstyle.hxx" +#include <lwpglobalmgr.hxx> +#include <lwpobjtags.hxx> +#include <xfilter/xfstylemanager.hxx> + +#include <osl/diagnose.h> + +LwpFoundry::LwpFoundry(LwpObjectStream *pStrm, LwpDocument* pDoc) + : m_pDoc(pDoc) + , m_bRegisteredAll(false) +{ + Read(pStrm); + m_xDropcapMgr.reset(new LwpDropcapMgr); + m_xBulletStyleMgr.reset(new LwpBulletStyleMgr); + m_xBulletStyleMgr->SetFoundry(this); +} + +LwpFoundry::~LwpFoundry() +{ +} + +void LwpFoundry::Read(LwpObjectStream *pStrm) +{ + if (!m_pDoc->IsChildDoc()) + { + LwpVersionManager::Read(pStrm); + } + m_ObjMgr.Read(pStrm); + + m_MarkerHead.ReadIndexed(pStrm); + m_FootnoteMgr.ReadIndexed(pStrm); + + m_NumMgr.Read(pStrm); + m_BulMgr.Read(pStrm); + + m_SectionList.Read(pStrm); + m_Layout.ReadIndexed(pStrm); + + ReadStyles(pStrm); + + m_BookMarkHead.ReadIndexed(pStrm); + m_DdeLinkHead.ReadIndexed(pStrm); + m_DirtBagHead.ReadIndexed(pStrm); + m_NamedOutlineSeqHead.ReadIndexed(pStrm); + + m_EnumLayoutHead.ReadIndexed(pStrm); + m_EnumLayoutTail.ReadIndexed(pStrm); + m_NamedObjects.ReadIndexed(pStrm); + + m_nLastClickHere = pStrm->QuickReaduInt32(); + m_SmartTextMgr.ReadIndexed(pStrm); + + m_ContentMgr.Read(pStrm); + m_FontMgr.Read(pStrm); + + if (!m_pDoc->IsChildDoc() && LwpFileHeader::m_nFileRevision >= 0x000B) + { + m_xPieceMgr.reset(new LwpPieceManager); + m_xPieceMgr->Read(pStrm); + } + + if( LwpFileHeader::m_nFileRevision >= 0x000B) + { + m_DftDropCapStyle.ReadIndexed(pStrm); + } + if( LwpFileHeader::m_nFileRevision >= 0x000F) + { + m_DftHeaderStyle.ReadIndexed(pStrm); + m_DftFooterStyle.ReadIndexed(pStrm); + } + pStrm->SkipExtra(); + + m_xStyleMgr.reset(new LwpStyleManager); + m_xStyleMgr->SetFoundry(this); +} + +void LwpFoundry::ReadStyles(LwpObjectStream *pStrm) +{ + m_TextStyle.ReadIndexed(pStrm); + m_DefaultTextStyle.ReadIndexed(pStrm); + m_DefaultClickStyle.ReadIndexed(pStrm); + m_PageStyle.ReadIndexed(pStrm); + m_FrameStyle.ReadIndexed(pStrm); + + m_TableStyle.ReadIndexed(pStrm); + m_CellStyle.ReadIndexed(pStrm); + m_DftFrameStyle.ReadIndexed(pStrm); + m_DftPageStyle.ReadIndexed(pStrm); + m_DftTableStyle.ReadIndexed(pStrm); + + m_DftCellStyle.ReadIndexed(pStrm); + m_DftColumnStyle.ReadIndexed(pStrm); + m_DftLeftColumnStyle.ReadIndexed(pStrm); + m_DftRighColumnStyle.ReadIndexed(pStrm); + +} + +void LwpFoundry::RegisterAllLayouts() +{ + if (m_bRegisteredAll) + { + OSL_FAIL("recursive LwpFoundry::RegisterAllLayouts!"); + return; + } + + m_bRegisteredAll = true; + + //Register CellStyle + rtl::Reference<LwpObject> pStyle = m_CellStyle.obj(); + if( pStyle.is() ) + { + pStyle->SetFoundry(this); + pStyle->DoRegisterStyle(); + } + + //register content page layout list: Layout + pStyle = m_Layout.obj(); + if( pStyle.is() ) + { + pStyle->SetFoundry(this); + pStyle->DoRegisterStyle(); + } + + //Register page style layout list: PageStyle, such as "Default Page" + pStyle = m_PageStyle.obj(); + if( pStyle.is() ) + { + pStyle->SetFoundry(this); + pStyle->DoRegisterStyle(); + } + + //Register FrameStyle + pStyle = m_FrameStyle.obj(); + if( pStyle.is() ) + { + pStyle->SetFoundry(this); + pStyle->DoRegisterStyle(); + } + +} + +LwpBookMark* LwpFoundry::GetBookMark(LwpObjectID objMarker) +{ + LwpDLVListHeadHolder* pHeadHolder= dynamic_cast + <LwpDLVListHeadHolder*>(m_BookMarkHead.obj().get()); + + if (!pHeadHolder) + return nullptr; + + LwpObjectID* pObjID = &pHeadHolder->GetHeadID(); + LwpBookMark* pBookMark = dynamic_cast<LwpBookMark*>(pObjID->obj().get()); + + while (pBookMark) + { + if (pBookMark->IsRightMarker(objMarker)) + return pBookMark; + pObjID = &pBookMark->GetNext(); + pBookMark = dynamic_cast<LwpBookMark*>(pObjID->obj().get()); + } + return nullptr; +} + +/** +* @descr: Get next content +* +*/ +LwpContent* LwpFoundry::EnumContents(LwpContent * pContent) +{ + return GetContentManager().EnumContents(pContent); +} + +/** +* @descr: Get next section +* +*/ +LwpSection* LwpFoundry::EnumSections(LwpSection * pSection) +{ + return static_cast<LwpSection*>(m_SectionList.Enumerate(pSection)); +} + +/** +* @descr: Get default text style id +* +*/ +LwpObjectID * LwpFoundry::GetDefaultTextStyle() +{ + LwpVersionedPointer * pPointer = dynamic_cast<LwpVersionedPointer *>(m_DefaultTextStyle.obj().get()); + if (!pPointer) + return nullptr; + + return &pPointer->GetPointer(); +} + +/** +* @descr: Get paragraph style object id according to its style name +* +*/ +LwpObjectID * LwpFoundry::FindParaStyleByName(std::u16string_view name) +{ + LwpDLVListHeadHolder* pParaStyleHolder = dynamic_cast<LwpDLVListHeadHolder*>(GetTextStyleHead().obj().get()); + if(pParaStyleHolder) + { + LwpTextStyle* pParaStyle = dynamic_cast<LwpTextStyle*> (pParaStyleHolder->GetHeadID().obj().get()); + while(pParaStyle) + { + OUString strName = pParaStyle->GetName().str(); + if(strName == name) + return &pParaStyle->GetObjectID(); + pParaStyle = dynamic_cast<LwpTextStyle*>(pParaStyle->GetNext().obj().get()); + } + } + + return nullptr; +} + +/** +* @descr: Get style name registered according the original style name +* +*/ +OUString LwpFoundry::FindActualStyleName(const OUString& name) +{ + LwpObjectID* pID = FindParaStyleByName(name); + if(pID) + { + IXFStyle* pStyle = GetStyleManager()->GetStyle(*pID); + if(pStyle) + { + return pStyle->GetStyleName(); + } + } + + return name; +} + +void LwpVersionManager::Read(LwpObjectStream *pStrm) +{ + // TODO: skip the data for prototype + Skip(pStrm); +} + +void LwpVersionManager::Skip(LwpObjectStream *pStrm) +{ + pStrm->QuickReaduInt32(); + sal_uInt16 Count = pStrm->QuickReaduInt16(); + + while(Count--) + { + sal_uInt32 tag = pStrm->QuickReaduInt32(); + switch(tag) + { + case TAG_USER_VERSION: + // TODO: skip the CUserVersionControl + pStrm->SeekRel(pStrm->QuickReaduInt16()); + break; + + default: + pStrm->SeekRel(pStrm->QuickReaduInt16()); + pStrm->SkipExtra(); + break; + } + } + pStrm->SkipExtra(); +} + +void LwpObjectManager::Read(LwpObjectStream *pStrm) +{ + + LwpObjectID dummy; + dummy.Read(pStrm); + // TODO: judge if we need to set the cDelta by the dummy id + + m_Division.ReadIndexed(pStrm); + pStrm->SkipExtra(); +} + +void LwpNumberManager::Read(LwpObjectStream *pStrm) +{ + m_TableRange.ReadIndexed(pStrm); + pStrm->SkipExtra(); +} + +void LwpBulletManager::Read(LwpObjectStream *pStrm) +{ + m_Head.ReadIndexed(pStrm); + pStrm->SkipExtra(); +} + +void LwpContentManager::Read(LwpObjectStream *pStrm) +{ + m_ContentList.ReadIndexed(pStrm); + + // TODO: to judge the file revision + + m_EnumHead.ReadIndexed(pStrm); + m_EnumTail.ReadIndexed(pStrm); + + m_OleObjCount.ReadIndexed(pStrm); + + if( LwpFileHeader::m_nFileRevision >= 0x000B) + { + m_GrapHead.ReadIndexed(pStrm); + m_GrapTail.ReadIndexed(pStrm); + m_OleHead.ReadIndexed(pStrm); + m_OleTail.ReadIndexed(pStrm); + } + + pStrm->SkipExtra(); +} + +/** +* @descr: Get next content +* +*/ +LwpContent* LwpContentManager::EnumContents(LwpContent* pContent) +{ + if(pContent) + return pContent->GetNextEnumerated(); + LwpVersionedPointer* pPointer = dynamic_cast<LwpVersionedPointer*>(m_EnumHead.obj().get()); + return pPointer ? dynamic_cast<LwpContent*>(pPointer->GetPointer().obj().get()) : nullptr; +} + +void LwpPieceManager::Read(LwpObjectStream *pStrm) +{ + m_GeometryPieceList.ReadIndexed(pStrm); + m_ScalePieceList.ReadIndexed(pStrm); + m_MarginsPieceList.ReadIndexed(pStrm); + m_ColumnsPieceList.ReadIndexed(pStrm); + m_BorderStuffPieceList.ReadIndexed(pStrm); + + m_GutterStuffPieceList.ReadIndexed(pStrm); + m_BackgroundStuffPieceList.ReadIndexed(pStrm); + m_JoinStuffPieceList.ReadIndexed(pStrm); + m_ShadowPieceList.ReadIndexed(pStrm); + m_NumericsPieceList.ReadIndexed(pStrm); + + m_RelativityPieceList.ReadIndexed(pStrm); + m_AlignmentPieceList.ReadIndexed(pStrm); + m_IndentPieceList.ReadIndexed(pStrm); + m_ParaBorderPieceList.ReadIndexed(pStrm); + m_SpacingPieceList.ReadIndexed(pStrm); + + m_BreaksPieceList.ReadIndexed(pStrm); + m_NumberingPieceList.ReadIndexed(pStrm); + m_TabPieceList.ReadIndexed(pStrm); + m_CharacterBorderPieceList.ReadIndexed(pStrm); + m_AmikakePieceList.ReadIndexed(pStrm); + + if(pStrm->CheckExtra()) + { + m_ParaBackgroundPieceList.ReadIndexed(pStrm); + m_ExternalBorderStuffPieceList.ReadIndexed(pStrm); + m_ExternalJoinStuffPieceList.ReadIndexed(pStrm); + pStrm->SkipExtra(); + } +} + +void LwpOrderedObjectManager::Read(LwpObjectStream *pStrm) +{ + m_Head.ReadIndexed(pStrm); +} + +/** +* @descr: Get next orderedobject, copy from lwp source code +* +*/ +LwpOrderedObject* LwpOrderedObjectManager::Enumerate(LwpOrderedObject * pLast) +{ + // If Last has a next, return it. + if(pLast && !pLast->GetNext().IsNull()) + return dynamic_cast<LwpOrderedObject*>(pLast->GetNext().obj().get()); + + LwpListList* pList = nullptr; + if(pLast) + { + // We're at the end of Last's list (not list's list). + // Start with the next active list + pList = dynamic_cast<LwpListList*>(pLast->GetListList().obj().get()); + pList= GetNextActiveListList(pList); + } + else + { + // Start with the first active ListList + pList = GetNextActiveListList(nullptr); + } + + if(pList) + { + return dynamic_cast<LwpOrderedObject*>(pList->GetHead().obj().get()); + } + + return nullptr; +} + +/** +* @descr: Get next listlist object, copy from lwp source code +* +*/ +LwpListList* LwpOrderedObjectManager::GetNextActiveListList(LwpListList * pLast) +{ + LwpListList* pList = nullptr; + if(pLast) + pList = dynamic_cast<LwpListList*>(pLast->GetNext().obj().get()); + else + { + LwpDLVListHeadHolder* pHeadHolder= dynamic_cast<LwpDLVListHeadHolder*>(m_Head.obj().get()); + if(pHeadHolder) + { + pList = dynamic_cast<LwpListList*>(pHeadHolder->GetHeadID().obj().get()); + } + } + + while(pList) + { + LwpContent* pContent = dynamic_cast<LwpContent*>(pList->GetObject().obj().get()); + if (pContent && pContent->HasNonEmbeddedLayouts() && !pContent->IsStyleContent()) + return pList; + pList = dynamic_cast<LwpListList*>(pList->GetNext().obj().get()); + } + return nullptr; +} + +LwpStyleManager::LwpStyleManager() + : m_pFoundry(nullptr) +{ +} + +LwpStyleManager::~LwpStyleManager() +{ + m_StyleList.clear(); +} + +/* +VO_PARASTYLE/VO_CHARACTERSTYLE call this method to add its created style to XFStyleManager +1. Add the style to XFStyleManager, and return the <office:styles> style name +2. Add it to LwpParaStyleMap. +Prerequisite: pStyle has been created and all properties has been set to it. +Return the XFStyle* added by XFStyleManager +*/ +void LwpStyleManager::AddStyle(LwpObjectID styleObjID, std::unique_ptr<IXFStyle> pNewStyle) +{ + assert(pNewStyle); + //pStyle may change if same style is found in XFStyleManager + XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); + auto pStyle = pXFStyleManager->AddStyle(std::move(pNewStyle)).m_pStyle; + m_StyleList.emplace(styleObjID, pStyle); +} + +/* +Called by VO_PARA or other objects to get style name based on the Style object ID +1) Get style from LwpParaStyleMap based on the LwpObjectID of VO_PARASTYLE. +Prerequisite: VO_PARASTYLE/VO_CHARACTERSTYLE should call AddStyle first. +Return empty string if no style found. +*/ +IXFStyle* LwpStyleManager::GetStyle(const LwpObjectID &styleObjID) +{ + LwpStyleMap::const_iterator it = m_StyleList.find(styleObjID); + if (it != m_StyleList.end()) { + return((*it).second); + } + return nullptr; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |