summaryrefslogtreecommitdiff
path: root/lotuswordpro/source/filter/lwptoc.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'lotuswordpro/source/filter/lwptoc.cxx')
-rw-r--r--lotuswordpro/source/filter/lwptoc.cxx456
1 files changed, 456 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwptoc.cxx b/lotuswordpro/source/filter/lwptoc.cxx
new file mode 100644
index 000000000000..014ea013479c
--- /dev/null
+++ b/lotuswordpro/source/filter/lwptoc.cxx
@@ -0,0 +1,456 @@
+/*************************************************************************
+ *
+ * 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
+ */
+/*************************************************************************
+ * Change History
+ April 2005 Created
+ April 2005 Modified
+ April 2005 Modified - add LwpTocLevelData class
+ ************************************************************************/
+#include "lwptoc.hxx"
+#include "lwpfoundry.hxx"
+#include "lwpdoc.hxx"
+#include "lwpframelayout.hxx"
+#include "lwpglobalmgr.hxx"
+
+#include "xfilter/xffont.hxx"
+#include "xfilter/xftextstyle.hxx"
+#include "xfilter/xfstylemanager.hxx"
+#include "xfilter/xfparagraph.hxx"
+#include "xfilter/xfparastyle.hxx"
+#include "xfilter/xfindex.hxx"
+#include "xfilter/xffloatframe.hxx"
+#include "xfilter/xfframestyle.hxx"
+#include "xfilter/xfframe.hxx"
+#include "xfilter/xftable.hxx"
+
+LwpTocSuperLayout::LwpTocSuperLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm)
+ : LwpSuperTableLayout(objHdr, pStrm)
+{}
+
+LwpTocSuperLayout::~LwpTocSuperLayout()
+{}
+/**
+ * @short Read TOCSUPERTABLELAYOUT object
+ * @return none
+ */
+void LwpTocSuperLayout::Read()
+{
+ LwpSuperTableLayout::Read();
+ m_TextMarker.Read(m_pObjStrm);
+ m_ParentName.Read(m_pObjStrm);
+ m_DivisionName.Read(m_pObjStrm);
+ m_SectionName.Read(m_pObjStrm);
+ m_nFrom = m_pObjStrm->QuickReaduInt16();
+
+ m_SearchItems.Read(m_pObjStrm);
+
+ sal_uInt16 i;
+ sal_uInt16 count = m_pObjStrm->QuickReaduInt16();
+ for (i = 0; (i < MAX_LEVELS) && (count > 0); i++, count--)
+ m_DestName[i].Read(m_pObjStrm);
+
+ count = m_pObjStrm->QuickReaduInt16();
+ for (i = 0; (i < MAX_LEVELS) && (count > 0); i++, count--)
+ m_DestPGName[i].Read(m_pObjStrm);
+
+ count = m_pObjStrm->QuickReaduInt16();
+ for (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
+ XFParaStyle* pBaseStyle = static_cast<XFParaStyle*>(m_pFoundry->GetStyleManager()->GetStyle(*m_pFoundry->GetDefaultTextStyle()));
+ XFTextStyle*pTextStyle = new XFTextStyle;
+ pTextStyle->SetFont(pBaseStyle->GetFont()); // who delete this font?????
+ XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
+ m_TabStyleName = pXFStyleManager->AddStyle(pTextStyle)->GetStyleName();
+
+}
+/**
+ * @short Convert TOC
+ * @param pCont - container
+ * @return none
+ */
+void LwpTocSuperLayout::XFConvert(XFContentContainer* pCont)
+{
+ XFIndex* pToc = new XFIndex();
+
+ pToc->SetProtected(sal_False);
+ pToc->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 an blank template so that SODC won't add default style to this level
+ pToc->AddTemplate(Int32ToOUString(i), String::CreateFromAscii(""), pTemplate);
+ continue;
+ }
+
+ sal_Bool bInserted = sal_False;
+ do
+ {
+ // One level has 1 template
+ if (!bInserted)
+ {
+ pTemplate->SetLevel(Int32ToOUString(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
+ {
+ char sSep[8];
+ switch(nLeaderType)
+ {
+ default: // go through
+ case NONE: // no leaders
+ strcpy(sSep, " ");
+ break;
+ case SEPARATORCOMMA:
+ strcpy(sSep, ", ");
+ break;
+ case SEPARATORDOTS:
+ strcpy(sSep, "...");
+ break;
+ }
+ pTemplate->AddTextEntry(A2OUSTR(sSep), m_TabStyleName);
+ }
+ //"TOC Page Number Text Style" style always exists in Word Pro file
+ pTemplate->AddEntry(enumXFIndexTemplatePage, A2OUSTR("TOC Page Number Text Style"));
+ }
+
+ pToc->AddTemplate(Int16ToOUString(i), m_pFoundry->FindActuralStyleName(pLevel->GetSearchStyle()), pTemplate);
+ bInserted = sal_True;
+ }
+
+ // 1 style in WordPro may be mapped to several styles in SODC
+ LwpDocument * pDocument = m_pFoundry->GetDocument()->GetRootDocument();
+ AddSourceStyle(pToc, pLevel, pDocument->GetFoundry());
+
+ // one level may have several corresponding Styles
+ pLevel = GetNextSearchLevelPtr(i, pLevel); // find next LwpTocLevelData which is same index
+ }while (pLevel != NULL);
+ }
+
+ m_pCont = pCont;
+ // add TOC content
+ LwpSuperTableLayout::XFConvert(pToc);
+
+ // if current TOC is located in a cell, we must add a frame between upper level container and TOC
+ if ( !GetContainerLayout()->IsCell() )
+ {
+ pCont->Add(pToc);
+ }
+}
+
+/**
+ * @short convert frame which anchor to page
+ * @param pCont -
+ * @return
+ */
+void LwpTocSuperLayout::XFConvertFrame(XFContentContainer* pCont, sal_Int32 nStart , sal_Int32 nEnd , sal_Bool bAll)
+{
+ if(m_pFrame)
+ {
+ XFFrame* pXFFrame = NULL;
+ if(nEnd < nStart)
+ {
+ pXFFrame = new XFFrame();
+ }
+ else
+ {
+ pXFFrame = new XFFloatFrame(nStart, nEnd, bAll);
+ }
+
+ m_pFrame->Parse(pXFFrame, static_cast<sal_uInt16>(nStart));
+
+ //parse table, and add table to frame or TOC
+ LwpTableLayout * pTableLayout = GetTableLayout();
+ if (pTableLayout)
+ {
+ XFContentContainer * pTableContainer = pXFFrame;
+ // if *this is a TOCSuperTableLayout and it's located in a cell
+ // add the frame to upper level and add TOCSuperTableLayout into the frame
+ if ( GetContainerLayout()->IsCell() )
+ {
+ pTableContainer = pCont; // TOC contain table directly
+ pXFFrame->Add(pCont);
+ m_pCont->Add(pXFFrame);
+ }
+ else
+ {
+ //add frame to the container
+ pCont ->Add(pXFFrame);
+ }
+ 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)
+ {
+ LwpDocument * pDoc = pFoundry->GetDocument();
+ if (pDoc && pDoc->IsChildDoc())
+ {
+ OUString sSodcStyleName = pFoundry->FindActuralStyleName(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
+ */
+sal_Bool LwpTocSuperLayout::GetRightAlignPageNumber(sal_uInt16 index)
+{
+ if (index < MAX_LEVELS)
+ return (m_nFlags[index] & TS_RIGHTALIGN) ? sal_True : sal_False;
+ return sal_False;
+}
+/**
+ * @short Get whether page number is used in TOC entries
+ * @param index - TOC level
+ * @return sal_Bool
+ */
+sal_Bool LwpTocSuperLayout::GetUsePageNumber(sal_uInt16 index)
+{
+ if (index < MAX_LEVELS)
+ return (m_nFlags[index] & TS_PAGENUMBER) ? sal_True : sal_False;
+ return sal_False;
+}
+/**
+ * @short Get what is used for separater
+ * @param index - TOC level
+ * @return sal_uInt16 - separator type
+ */
+sal_uInt16 LwpTocSuperLayout::GetSeparatorType(sal_uInt16 index)
+{
+ sal_uInt16 Flag = (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 = static_cast<LwpTocLevelData *>(pID->obj());
+
+ while(pObj)
+ {
+ if(pObj->GetLevel()== index)
+ {
+ return pObj;
+ }
+
+ pID = pObj->GetNext(); // not necessary to check pID NULL or not
+ pObj = static_cast<LwpTocLevelData *>(pID->obj());
+ }
+
+ return NULL;
+}
+/**
+ * @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 = static_cast<LwpTocLevelData *>(pID->obj());
+
+ while(pObj)
+ {
+ if(pObj->GetLevel()== index)
+ {
+ return pObj;
+ }
+
+ pID = pObj->GetNext(); // not necessary to check pID NULL or not
+ pObj = static_cast<LwpTocLevelData *>(pID->obj());
+ }
+
+ return NULL;
+}
+
+LwpTocLevelData::LwpTocLevelData(LwpObjectHeader &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);
+
+ m_pObjStrm->SkipExtra();
+}