diff options
Diffstat (limited to 'lotuswordpro/source/filter/lwpfoundry.cxx')
-rw-r--r-- | lotuswordpro/source/filter/lwpfoundry.cxx | 595 |
1 files changed, 595 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpfoundry.cxx b/lotuswordpro/source/filter/lwpfoundry.cxx new file mode 100644 index 000000000000..a2263d98ec91 --- /dev/null +++ b/lotuswordpro/source/filter/lwpfoundry.cxx @@ -0,0 +1,595 @@ +/* -*- 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 + ************************************************************************/ +/************************************************************************* + * Change History + Jan 2005 Created + ************************************************************************/ + +#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" + +LwpFoundry::LwpFoundry(LwpObjectStream *pStrm, LwpDocument* pDoc) + : m_pDoc(pDoc) + , m_bRegisteredAll(false) + , m_pPieceMgr(NULL) + , m_pStyleMgr(NULL) +{ + Read(pStrm); + m_pDropcapMgr = new LwpDropcapMgr; + m_pBulletStyleMgr = new LwpBulletStyleMgr(); + m_pBulletStyleMgr->SetFoundry(this); +} + +LwpFoundry::~LwpFoundry() +{ + if(m_pPieceMgr) + { + delete m_pPieceMgr; + } + if(m_pStyleMgr) + { + delete m_pStyleMgr; + } + if (m_pDropcapMgr) + delete m_pDropcapMgr; + if (m_pBulletStyleMgr) + { + delete m_pBulletStyleMgr; + } +} + +void LwpFoundry::Read(LwpObjectStream *pStrm) +{ + if (!m_pDoc->IsChildDoc()) + { + m_VerMgr.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); + + pStrm->QuickRead(&m_nLastClickHere, sizeof(m_nLastClickHere)); + m_SmartTextMgr.ReadIndexed(pStrm); + + m_ContentMgr.Read(pStrm); + m_FontMgr.Read(pStrm); + + if (!m_pDoc->IsChildDoc() && LwpFileHeader::m_nFileRevision >= 0x000B) + { + m_pPieceMgr = new LwpPieceManager(); + + m_pPieceMgr->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_pStyleMgr = new LwpStyleManager(); + m_pStyleMgr->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); + +} + +#include "xfilter/xfstylemanager.hxx" +#include "lwplayout.hxx" + +void LwpFoundry::RegisterAllLayouts() +{ + if (m_bRegisteredAll) + { + OSL_FAIL("recursive LwpFoundry::RegisterAllLayouts!\n"); + return; + } + + m_bRegisteredAll = true; + + //Register CellStyle + LwpObject* pStyle = m_CellStyle.obj(); + if( pStyle ) + { + pStyle->SetFoundry(this); + pStyle->RegisterStyle(); + } + + //register content page layout list: Layout + pStyle = m_Layout.obj(); + if( pStyle ) + { + pStyle->SetFoundry(this); + pStyle->RegisterStyle(); + } + + //Register page style layout list: PageStyle, such as "Default Page" + pStyle = m_PageStyle.obj(); + if( pStyle ) + { + pStyle->SetFoundry(this); + pStyle->RegisterStyle(); + } + + //Register FrameStyle + pStyle = m_FrameStyle.obj(); + if( pStyle ) + { + pStyle->SetFoundry(this); + pStyle->RegisterStyle(); + } + +} + +LwpBookMark* LwpFoundry::GetBookMark(LwpObjectID objMarker) +{ + LwpDLVListHeadHolder* pHeadHolder= static_cast + <LwpDLVListHeadHolder*>(m_BookMarkHead.obj()); + LwpObjectID* pObjID = pHeadHolder->GetHeadID(); + LwpBookMark* pBookMark; + if (pObjID) + pBookMark = static_cast<LwpBookMark*>(pObjID->obj()); + else + return NULL; + + while (pBookMark) + { + if (pBookMark->IsRightMarker(objMarker)) + return pBookMark; + pObjID = pBookMark->GetNext(); + if (pObjID) + pBookMark = static_cast<LwpBookMark*>(pObjID->obj()); + else + return NULL; + } + return NULL; +} + +sal_Bool LwpFoundry::FindBookMarkByName(OUString sName) +{ + LwpDLVListHeadHolder* pHeadHolder= static_cast + <LwpDLVListHeadHolder*>(m_BookMarkHead.obj()); + LwpObjectID* pObjID = pHeadHolder->GetHeadID(); + LwpBookMark* pBookMark; + if (pObjID) + pBookMark = static_cast<LwpBookMark*>(pObjID->obj()); + else + return sal_False; + + while (pBookMark) + { + if (pBookMark->IsRightName(sName)) + return sal_True; + pObjID = pBookMark->GetNext(); + if (pObjID) + pBookMark = static_cast<LwpBookMark*>(pObjID->obj()); + else + return sal_False; + } + return sal_False; +} + +/** +* @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 = static_cast<LwpVersionedPointer *>(m_DefaultTextStyle.obj()); + if (!pPointer) + return NULL; + + return pPointer->GetPointer(); +} + +/** +* @descr: Get paragraph style object id according to its style name +* +*/ +LwpObjectID * LwpFoundry::FindParaStyleByName(OUString name) +{ + //Register all text styles: para styles, character styles + LwpDLVListHeadHolder* pParaStyleHolder = static_cast<LwpDLVListHeadHolder*>(GetTextStyleHead()->obj()); + if(pParaStyleHolder) + { + LwpTextStyle* pParaStyle = static_cast<LwpTextStyle*> (pParaStyleHolder->GetHeadID()->obj()); + while(pParaStyle) + { + OUString strName = pParaStyle->GetName()->str(); + if(strName == name) + return pParaStyle->GetObjectID(); + pParaStyle = static_cast<LwpTextStyle*>(pParaStyle->GetNext()->obj()); + } + } + + return NULL; +} + +/** +* @descr: Get style name registed according the original style name +* +*/ +OUString LwpFoundry::FindActuralStyleName(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) +{ + + sal_uInt32 cNextUserVersionID; + pStrm->QuickRead(&cNextUserVersionID, sizeof(cNextUserVersionID)); + + sal_uInt16 Count; + pStrm->QuickRead(&Count, sizeof(Count)); + + sal_uInt32 tag; + while(Count--) + { + pStrm->QuickRead(&tag, sizeof(tag)); + sal_uInt16 len; + switch(tag) + { + case TAG_USER_VERSION: + // TODO: skip the CUserVersionControl + pStrm->QuickRead(&len, sizeof(len)); + pStrm->SeekRel(len); + //pStrm->SkipExtra(); //The length has included the extra + break; + + default: + pStrm->QuickRead(&len, sizeof(sal_uInt16)); + pStrm->SeekRel(len); + 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 = static_cast<LwpVersionedPointer*>(m_EnumHead.obj()); + return pPointer ? static_cast<LwpContent*>(pPointer->GetPointer()->obj()) : NULL; +} + +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 static_cast<LwpOrderedObject*>(pLast->GetNext()->obj()); + + LwpListList* pList = NULL; + if(pLast) + { + // We're at the end of Last's list (not Liszt's list). + // Start with the next active list + pList = static_cast<LwpListList*>(pLast->GetListList()->obj()); + pList= GetNextActiveListList(pList); + } + else + { + // Start with the first active ListList + pList = GetNextActiveListList(NULL); + } + + if(pList) + { + return static_cast<LwpOrderedObject*>(pList->GetHead()->obj()); + } + + return NULL; +} + +/** +* @descr: Get next listlist object, copy from lwp source code +* +*/ +LwpListList* LwpOrderedObjectManager::GetNextActiveListList(LwpListList * pLast) +{ + LwpListList* pList = NULL; + LwpContent* pContent = NULL; + if(pLast) + pList = static_cast<LwpListList*>(pLast->GetNext()->obj()); + else + { + LwpDLVListHeadHolder* pHeadHolder= static_cast<LwpDLVListHeadHolder*>(m_Head.obj()); + if(pHeadHolder) + { + pList = static_cast<LwpListList*>(pHeadHolder->GetHeadID()->obj()); + } + } + + while(pList) + { + pContent = static_cast<LwpContent*>(pList->GetObject()->obj()); + if(pContent && pContent->HasNonEmbeddedLayouts() && + !pContent->IsStyleContent()) + return pList; + pList = static_cast<LwpListList*>(pList->GetNext()->obj()); + } + return NULL; +} + +LwpStyleManager::LwpStyleManager() + : m_pFoundry(0) +{ +} + +LwpStyleManager::~LwpStyleManager() +{ + m_StyleList.clear(); +} + + +#include "xfilter/xfstylemanager.hxx" +/* +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 +*/ +IXFStyle* LwpStyleManager::AddStyle(LwpObjectID styleObjID, IXFStyle* pStyle) +{ + assert(pStyle); + //pStyle may change if same style is found in XFStyleManager + XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); + pStyle = pXFStyleManager->AddStyle(pStyle); + m_StyleList.insert(LwpStyleMap::value_type(styleObjID, pStyle)); + return 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 NULL; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |