diff options
Diffstat (limited to 'lotuswordpro/source/filter/lwpbulletstylemgr.cxx')
-rw-r--r-- | lotuswordpro/source/filter/lwpbulletstylemgr.cxx | 590 |
1 files changed, 590 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpbulletstylemgr.cxx b/lotuswordpro/source/filter/lwpbulletstylemgr.cxx new file mode 100644 index 000000000000..f430cc9f912b --- /dev/null +++ b/lotuswordpro/source/filter/lwpbulletstylemgr.cxx @@ -0,0 +1,590 @@ +/************************************************************************* + * + * 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 "lwpbulletstylemgr.hxx" +#include "lwpdoc.hxx" +#include "lwpstory.hxx" +#include "lwpdivinfo.hxx" +#include "lwppara.hxx" +#include "lwpsilverbullet.hxx" +#include "lwptools.hxx" +#include "lwpparaproperty.hxx" +#include "xfilter/xfliststyle.hxx" +#include "xfilter/xfstylemanager.hxx" +#include "xfilter/xflist.hxx" +#include "lwpglobalmgr.hxx" + +LwpBulletStyleMgr::LwpBulletStyleMgr() : +m_pBulletList(NULL), m_bContinue(sal_True), m_bIsBulletSkipped(sal_False), m_nCurrentPos(0xFF) +{ +} + +LwpBulletStyleMgr::~LwpBulletStyleMgr() +{ + if (m_pBulletList) + { + delete m_pBulletList; + } + + m_vIDsPairList.clear(); + m_vStyleNameList.clear(); +} + +/** + * @short Register bullet style to style-list. The function only register the bullet and single customized numbering + * not inluding the numbering sequence. + * @param pPara pointer to the current paragraph which has a bullet/numbering. + * @param pBullOver pointer to the bulletoverride of current paragraph. + * @param pIndent pointer to the indentoverride of current paragraph. + */ +rtl::OUString LwpBulletStyleMgr::RegisterBulletStyle(LwpPara* pPara, LwpBulletOverride* pBullOver, + LwpIndentOverride* pIndent) +{ + if(!pPara || !pIndent || !pBullOver) + { +// assert(false); + return rtl::OUString::createFromAscii(""); + } + + LwpSilverBullet* pSilverBullet = pPara->GetSilverBullet(); + if (!pSilverBullet) + { + assert(false); + return rtl::OUString::createFromAscii(""); + } + + LwpPara* pBulletPara = pSilverBullet->GetBulletPara(); + if (!pBulletPara) + { + assert(false); + return rtl::OUString::createFromAscii(""); + } + + LwpParaProperty* pProp = pPara->GetProperty(PP_LOCAL_INDENT); + LwpParaIndentProperty* pIndentProp = NULL; + LwpObjectID aIndentID; + if (pProp) + { + pIndentProp = static_cast<LwpParaIndentProperty*>(pProp); + aIndentID = pIndentProp->GetIndentID(); + } + + LwpObjectID aBulletID = pBullOver->GetSilverBullet(); + LwpBulletOverride aBulletOver = *pBullOver; + + sal_uInt16 nNameIndex = 0; + std::vector <OverridePair>::iterator iter; + for(iter = m_vIDsPairList.begin(); iter != m_vIDsPairList.end(); iter++) + { + if (iter->first.GetSilverBullet() == aBulletID && iter->second == aIndentID + && iter->first.IsRightAligned() == pBullOver->IsRightAligned()) + { + return m_vStyleNameList[nNameIndex]; + } + else + { + nNameIndex++; + } + } + + m_vIDsPairList.push_back(std::make_pair(aBulletOver, aIndentID)); + rtl::OUString aStyleName; + + LwpFribPtr* pBulletParaFribs = pBulletPara->GetFribs(); + sal_Bool bIsNumbering = (sal_Bool)(pBulletParaFribs->HasFrib(FRIB_TAG_PARANUMBER) != 0); + + enumXFAlignType eAlign = enumXFAlignStart; + if (pBullOver->IsRightAligned()) + { + eAlign = enumXFAlignEnd; + } + + XFListStyle* pListStyle = new XFListStyle(); + XFStyleManager* pXFStyleMgr = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); + + if (!bIsNumbering) + { + for (sal_uInt8 nC = 1; nC < 11; nC++) + { + pListStyle->SetListBullet(nC, pSilverBullet->GetBulletChar(), pSilverBullet->GetBulletFontName(), + pSilverBullet->GetPrefix(), pSilverBullet->GetSuffix()); + + if (pIndent->GetMRest() > 0.001) + { + pListStyle->SetListPosition(nC, 0.0, + LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(pIndent->GetMRest())), 0.0, eAlign); + } + else + { + pListStyle->SetListPosition(nC, 0.0, + 0.0, LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(pIndent->GetMFirst())), eAlign); + } + } + + aStyleName = pXFStyleMgr->AddStyle(pListStyle)->GetStyleName(); + } + else + { + rtl::OUString aPrefix = rtl::OUString::createFromAscii(""); + + LwpFrib* pFrib = pBulletParaFribs->HasFrib(FRIB_TAG_DOCVAR); + LwpFribDocVar* pDocVarFrib = NULL; + if (pFrib) + { + pDocVarFrib = static_cast<LwpFribDocVar*>(pFrib); +// ModifierInfo* pInfo = pDocVarFrib->GetModifiers(); + switch (pDocVarFrib->GetType()) + { + case 0x000D: // division name + aPrefix = this->GetDivisionName(); + break; + case 0x000E: // section name + aPrefix = this->GetSectionName(pPara); + break; + } + } + ParaNumbering aParaNumbering; + pBulletPara->GetParaNumber(1, &aParaNumbering); + LwpFribParaNumber* pParaNumber = aParaNumbering.pParaNumber; + if (pParaNumber) + { + for (sal_uInt8 nPos = 1; nPos < 10; nPos++) + { + aPrefix = rtl::OUString::createFromAscii(""); + if (pParaNumber->GetStyleID() != NUMCHAR_other) + { + XFNumFmt aFmt; + if (aParaNumbering.pPrefix) + { + aPrefix += aParaNumbering.pPrefix->GetText(); +// aFmt.SetPrefix(aParaNumbering.pPrefix->GetText() + aAdditionalInfoName); + } + + rtl::OUString aNumber = LwpSilverBullet::GetNumCharByStyleID(pParaNumber); + if (pParaNumber->GetStyleID() == NUMCHAR_01 || pParaNumber->GetStyleID() == NUMCHAR_Chinese4) + { + aPrefix += rtl::OUString::createFromAscii("0"); + } + aFmt.SetPrefix(aPrefix); + + aFmt.SetFormat(aNumber); + + if (aParaNumbering.pSuffix) + { + aFmt.SetSuffix(aParaNumbering.pSuffix->GetText()); + } + + //set numbering format into the style-list. + pListStyle->SetListNumber(nPos, aFmt, pParaNumber->GetStart()+1); + + } + else + { + rtl::OUString aPrefix, aSuffix; + if (aParaNumbering.pPrefix) + { + aPrefix = aParaNumbering.pPrefix->GetText(); + } + if (aParaNumbering.pSuffix) + { + aSuffix = aParaNumbering.pSuffix->GetText(); + } + + pListStyle->SetListBullet(nPos, LwpSilverBullet::GetNumCharByStyleID(pParaNumber).toChar(), + rtl::OUString::createFromAscii("Times New Roman"), aPrefix, aSuffix); + } + + pListStyle->SetListPosition(nPos, 0.0, 0.635, 0.0); + } + aStyleName = pXFStyleMgr->AddStyle(pListStyle)->GetStyleName(); + } + + } + + m_vStyleNameList.push_back(aStyleName); + return aStyleName; + +} + +/** + * @short No use now. + * @param rContent + * @param nFontID + * @param pIndent + */ +/*rtl::OUString LwpBulletStyleMgr::RegisterBulletStyle(const rtl::OUString& rContent, sal_uInt32 nFontID, LwpIndentOverride* pIndent) +{ + if (!pIndent) + { + assert(false); + } + + if (!m_pFoundry) + { + return rtl::OUString::createFromAscii(""); + } + LwpFontManager* pFontMgr = m_pFoundry->GetFontManger(); + + rtl::OUString aFontName = pFontMgr->GetNameByID(nFontID); + UChar32 cBulletChar = rContent.toChar(); + rtl::OUString aSuffix = rContent.copy(1); + XFListStyle* pListStyle = new XFListStyle(); + XFStyleManager* pXFStyleMgr = XFStyleManager::Instance(); + + for (sal_uInt8 nC = 1; nC < 11; nC++) + { + pListStyle->SetListBullet(nC, cBulletChar, aFontName, rtl::OUString::createFromAscii(""), aSuffix); + + if (pIndent->GetMRest() > 0.001) + { + pListStyle->SetListPosition(nC, 0.0, + LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(pIndent->GetMRest())), 0.0); + } + else + { + pListStyle->SetListPosition(nC, 0.0, + 0.0, LwpTools::ConvertToMetric(LwpTools::ConvertFromUnits(pIndent->GetMFirst()))); + } + } + return pXFStyleMgr->AddStyle(pListStyle); +}*/ + +/** + * @short No use now. + * @param pListStyle + * @param pXFStyleMgr + */ +/*void LwpBulletStyleMgr::CreateNewListStyle(XFListStyle*& pListStyle, XFStyleManager* pXFStyleMgr) +{ + pListStyle = new XFListStyle(); + m_aBulletStyleList.push_back(pListStyle); + m_aCurrentStyleName = pXFStyleMgr->AddStyle(pListStyle); +}*/ + +/** + * @short No use now. + * @param pSilverBullet + * @param nLevel + */ +/*rtl::OUString LwpBulletStyleMgr::AddStyleToList(LwpSilverBullet* pSilverBullet, sal_uInt16 nLevel) +{ + XFListStyle* pListStyle = NULL; + XFStyleManager* pXFStyleMgr = XFStyleManager::Instance(); + + if (m_aBulletStyleList.empty()) + { + // pListStyle = new XFListStyle(); + // m_aBulletStyleList.push_back(pListStyle); + // m_aCurrentStyleName = pXFStyleMgr->AddStyle(pListStyle); + // this->CreateNewListStyle(pListStyle, pXFStyleMgr); + if (pSilverBullet->IsBulletOrdered()) + { + m_strCurrentNumberingName = pSilverBullet->GetNumberingName(); + } + else + { + m_nCurrentChar = pSilverBullet->GetBulletChar(); + m_strCurrentFontName = pSilverBullet->GetBulletFontName(); + } + } + else if (nLevel == 1) + { + if (pSilverBullet->IsBulletOrdered()) + { + if (m_strCurrentNumberingName == pSilverBullet->GetNumberingName()) + { + pListStyle = m_aBulletStyleList.back(); + } + else + { + this->CreateNewListStyle(pListStyle, pXFStyleMgr); + } + } + else + { + if ((m_nCurrentChar == pSilverBullet->GetBulletChar()) && + (m_strCurrentFontName == pSilverBullet->GetBulletFontName())) + { + pListStyle = m_aBulletStyleList.back(); + } + else + { + this->CreateNewListStyle(pListStyle, pXFStyleMgr); + } + } + } + else + { + pListStyle = m_aBulletStyleList.back(); + } + + if (pSilverBullet->IsBulletOrdered()) + { +// pListStyle->SetListNumber(int level, XFNumFmt & fmt, sal_Int16 start); + } + else + { + pListStyle->SetListBullet(nLevel, pSilverBullet->GetBulletChar(), pSilverBullet->GetBulletFontName(), + pSilverBullet->GetPrefix(), pSilverBullet->GetSuffix()); + } + + return m_aCurrentStyleName; +}*/ + +/** + * @short Output bullet list header, such as <text:ordered-list> and <text:list-item> + * @param pOutputStream pointer of XFstream to be written in. + * @param bIsOrdered if the list if ordered or not. + * @param rStyleName style name of the list + * @param nLevel level of the paragraph + */ +void LwpBulletStyleMgr::OutputBulletListHeader(IXFStream* pOutputStream, sal_Bool bIsOrdered, + const rtl::OUString& rStyleName, sal_Int16 nLevel, sal_Bool bIsBulletSkiped) +{ + if (nLevel == 0) + { + return; + } + + m_bIsBulletSkipped = bIsBulletSkiped; + + if (m_pBulletList) + { + delete m_pBulletList; + } + + m_pBulletList = new XFList(); + + //todo: need judge here. + sal_Bool bContinue = m_bContinue; + + if (bIsOrdered) + { + m_pBulletList->SetOrdered(sal_True); + } + else + { + bContinue = sal_False; + m_pBulletList->SetOrdered(sal_False); + } + m_pBulletList->SetStyleName(rStyleName); +// if (nLevels < 0) +// { +// m_pBulletList->StartList(pOutputStream); +// } +// else +// { + for (sal_uInt8 nC = 0; nC < nLevel; nC++) + { + //continue numbering + if (nC == nLevel-1) + { + m_pBulletList->StartList(pOutputStream, bContinue); + } + else + { + m_pBulletList->StartList(pOutputStream); + } + if ((nC == nLevel-1) && bIsBulletSkiped) + { + XFList::StartListHeader(pOutputStream); + } + else + { + XFList::StartListItem(pOutputStream); + } + } +// } +} + +#include "xfilter/xflistitem.hxx" +//Create nested XFList and XFItems and then add it to XFContentContainer(pCont) +//Return the inner XFItem created. +XFContentContainer* LwpBulletStyleMgr::AddBulletList( + XFContentContainer* pCont, sal_Bool bIsOrdered, + const rtl::OUString& rStyleName, sal_Int16 nLevel, sal_Bool bIsBulletSkiped) +{ + assert(nLevel>0); + + m_bIsBulletSkipped = bIsBulletSkiped; + + //todo: need judge here. + sal_Bool bContinue = m_bContinue; + + XFList* theList; + XFList* prevList = NULL; + XFListItem* theItem; + XFListItem* InnerItem = NULL; + for (sal_Int8 nC = nLevel-1; nC >= 0; nC--) + { + theList = new XFList(); + theItem = new XFListItem(); + theList->Add(theItem); + + if (bIsOrdered) + { + theList->SetOrdered(sal_True); + } + else + { + bContinue = sal_False; + theList->SetOrdered(sal_False); + } + + if (nC == nLevel-1) + { + theList->SetContinueNumber(bContinue); + } + //Add the outer list to pCont + if (nC == 0) + { + theList->SetStyleName(rStyleName); + pCont->Add(theList); + } + + if ((nC == nLevel-1) && bIsBulletSkiped) + { + theItem->SetIsHeader(sal_True); + + theList->SetContinueNumber(sal_True); + // end of add + } + + if(nC == nLevel-1) + { + InnerItem = theItem; + } + + if(prevList) + { + theItem->Add(prevList); + } + prevList = theList; + } + return InnerItem; +} + +/** + * @short Output bullet list header, such as </text:ordered-list> and </text:list-item> + * @param pOutputStream pointer of XFstream to be written in. + * @param nLevel level of the paragraph + */ +void LwpBulletStyleMgr::OutputBulletListTail(IXFStream* pOutputStream, sal_uInt16 nLevel) +{ + if ( !m_pBulletList ) + { + return; + } + + for (sal_uInt8 nC = 0; nC < nLevel; nC++) + { + if (m_bIsBulletSkipped) + { + XFList::EndListHeader(pOutputStream); + m_bIsBulletSkipped = sal_False; + } + else + { + XFList::EndListItem(pOutputStream); + } + m_pBulletList->EndList(pOutputStream); + } +} + +rtl::OUString LwpBulletStyleMgr::GetDivisionName() +{ + if (!m_pFoundry) + { + return rtl::OUString::createFromAscii(""); + } + + rtl::OUString aRet = rtl::OUString::createFromAscii(""); + + LwpDocument* pDoc = m_pFoundry->GetDocument(); + if (pDoc) + { + LwpObjectID* pID = pDoc->GetDivInfoID(); + if (!pID->IsNull()) + { + aRet = static_cast<LwpDivInfo*>(pID->obj(VO_DIVISIONINFO))->GetDivName(); + } + } + + return aRet; +} + +rtl::OUString LwpBulletStyleMgr::GetSectionName(LwpPara* pPara) +{ + LwpObjectID* pStoryID = pPara->GetStoryID(); + if (pStoryID->IsNull()) + { + return rtl::OUString::createFromAscii(""); + } + + LwpStory* pStory = static_cast<LwpStory*>(pStoryID->obj(VO_STORY)); + if (!pStory) + { + return rtl::OUString::createFromAscii(""); + } + + return pStory->GetSectionName(); +} |