From ed5640d8b587fbcfed7dd7967f3de04b37a76f26 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:06:44 +0200 Subject: Adding upstream version 4:7.4.7. Signed-off-by: Daniel Baumann --- lotuswordpro/source/filter/lwpsilverbullet.cxx | 452 +++++++++++++++++++++++++ 1 file changed, 452 insertions(+) create mode 100644 lotuswordpro/source/filter/lwpsilverbullet.cxx (limited to 'lotuswordpro/source/filter/lwpsilverbullet.cxx') diff --git a/lotuswordpro/source/filter/lwpsilverbullet.cxx b/lotuswordpro/source/filter/lwpsilverbullet.cxx new file mode 100644 index 000000000..629b5affc --- /dev/null +++ b/lotuswordpro/source/filter/lwpsilverbullet.cxx @@ -0,0 +1,452 @@ +/* -*- 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 +#include +#include "lwpsilverbullet.hxx" +#include "lwpdoc.hxx" +#include "lwpdivinfo.hxx" +#include "lwpfribheader.hxx" +#include +#include "lwpstory.hxx" +#include "lwppara.hxx" +#include +#include + +LwpSilverBullet::LwpSilverBullet(LwpObjectHeader const & objHdr, LwpSvStream* pStrm) + : LwpDLNFVList(objHdr, pStrm) + , m_nFlags(0) + , m_nUseCount(0) + , m_pAtomHolder(new LwpAtomHolder) +{ + memset(m_pHideLevels, 0, sizeof(m_pHideLevels)); +} + +LwpSilverBullet::~LwpSilverBullet() +{ +} + +void LwpSilverBullet::Read() +{ + LwpDLNFVList::Read(); + + m_nFlags = m_pObjStrm->QuickReaduInt16(); + m_aStory.ReadIndexed(m_pObjStrm.get()); + + sal_uInt16 nNumPos = m_pObjStrm->QuickReaduInt16(); + + if (nNumPos > SAL_N_ELEMENTS(m_pResetPositionFlags)) + throw std::range_error("corrupt SilverBullet"); + + for (sal_uInt16 nC = 0; nC < nNumPos; nC++) + m_pResetPositionFlags[nC] = m_pObjStrm->QuickReaduInt8(); + + if (nNumPos < SAL_N_ELEMENTS(m_pResetPositionFlags)) + std::fill(m_pResetPositionFlags + nNumPos, m_pResetPositionFlags + SAL_N_ELEMENTS(m_pResetPositionFlags), 0); + + m_nUseCount = m_pObjStrm->QuickReaduInt32(); + + m_pAtomHolder->Read(m_pObjStrm.get()); +} + +/** + * @short: Register bullet or numbering style-list and store the returned + * name from XFStyleManager. + * @descr: + */ +void LwpSilverBullet::RegisterStyle() +{ + std::unique_ptr xListStyle(new XFListStyle()); + XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); + + GetBulletPara(); + + if (IsBulletOrdered() && HasName()) + { + //todo: find the flag in the file + bool bCumulative = false; + + for (sal_uInt8 nPos = 1; nPos < 10; nPos++) + { + ParaNumbering aParaNumbering; + //get numbering format according to the position. + m_xBulletPara->GetParaNumber(nPos, &aParaNumbering); + LwpFribParaNumber* pParaNumber = aParaNumbering.pParaNumber; + if (pParaNumber) + { + if (pParaNumber->GetStyleID() != NUMCHAR_other) + { + m_pHideLevels[nPos] = aParaNumbering.nNumLevel; + sal_uInt16 nDisplayLevel = GetDisplayLevel(nPos); + bCumulative = (nDisplayLevel > 1); + OUString aPrefix = GetAdditionalName(nPos); + + XFNumFmt aFmt; + if (!bCumulative && aParaNumbering.pPrefix) + { + aFmt.SetPrefix(aPrefix + aParaNumbering.pPrefix->GetText()); + } + + aFmt.SetFormat(GetNumCharByStyleID(pParaNumber)); + + if (aParaNumbering.pSuffix) + { + aFmt.SetSuffix(aParaNumbering.pSuffix->GetText()); + } + + //set numbering format into the style-list. + xListStyle->SetListNumber(nPos, aFmt, pParaNumber->GetStart()+1); + + if (bCumulative && nPos > 1) + { + xListStyle->SetDisplayLevel(nPos, nDisplayLevel); + } + + } + else + { + OUString aPrefix, aSuffix; + if (aParaNumbering.pPrefix) + { + aPrefix = aParaNumbering.pPrefix->GetText(); + } + if (aParaNumbering.pSuffix) + { + aSuffix = aParaNumbering.pSuffix->GetText(); + } + + xListStyle->SetListBullet(nPos, GetNumCharByStyleID(pParaNumber), + "Times New Roman", aPrefix, aSuffix); + } + + xListStyle->SetListPosition(nPos, 0.0, 0.635, 0.0); + aParaNumbering.clear(); + } + } + } + + //add style-list to style manager. + m_strStyleName = pXFStyleManager->AddStyle(std::move(xListStyle)).m_pStyle->GetStyleName(); +} + +/** + * @short: Get the font name of the bullet. + * @descr: + * @return: Font name of the bullet. + */ +OUString LwpSilverBullet::GetBulletFontName() +{ + //foundry has been set? + if (!m_pFoundry) + { + return OUString(); + } + + LwpFontManager& rFontMgr = m_pFoundry->GetFontManager(); + + sal_uInt32 nBulletFontID = m_xBulletPara->GetBulletFontID(); + sal_uInt16 nFinalFont = static_cast((nBulletFontID >> 16) & 0xFFFF); + + //final fontid is valid? + if (nFinalFont > 255 || nFinalFont == 0) + { + return OUString(); + } + + //get font name from font manager. + OUString aFontName = rFontMgr.GetNameByID(nBulletFontID); + + return aFontName; +} +/** + * @short: Get bullet character of the bullet vo_para. + * @descr: + * @return: An UChar32 bullet character. + */ +OUString const & LwpSilverBullet::GetBulletChar() const +{ + return m_xBulletPara->GetBulletChar(); +} + +/** + * @short: Get the LwpPara object through story id. + */ +LwpPara* LwpSilverBullet::GetBulletPara() +{ + if (!m_xBulletPara.is()) + { + LwpStory* pStory = dynamic_cast(m_aStory.obj(VO_STORY).get()); + if (!pStory) + { + return nullptr; + } + + m_xBulletPara.set(dynamic_cast(pStory->GetFirstPara().obj(VO_PARA).get())); + } + + return m_xBulletPara.get(); +} + +/** + * @short: Get numbering character of the bullet vo_para. + * @descr: + * @param: pParaNumber a pointer to the structure LwpFribParaNumber which + * includes numbering prefix, format and suffix. + * @return: An OUString object which store the numbering character. + */ +OUString LwpSilverBullet::GetNumCharByStyleID(LwpFribParaNumber const * pParaNumber) +{ + if (!pParaNumber) + { + assert(false); + return OUString(); + } + + OUString strNumChar("1"); + sal_uInt16 nStyleID = pParaNumber->GetStyleID(); + + switch (nStyleID) + { + case NUMCHAR_1: + case NUMCHAR_01: + case NUMCHAR_Chinese4: + strNumChar = "1"; + break; + case NUMCHAR_A : + strNumChar = "A"; + break; + case NUMCHAR_a: + strNumChar = "a"; + break; + case NUMCHAR_I: + strNumChar = "I"; + break; + case NUMCHAR_i: + strNumChar = "i"; + break; + case NUMCHAR_other: + strNumChar = OUString(sal_Unicode(pParaNumber->GetNumberChar())); + break; + case NUMCHAR_Chinese1: + { + static constexpr OUStringLiteral sBuf = u"\u58f9\u002c\u0020\u8d30, \u53c1, ..."; + strNumChar = OUString(sBuf); + } + break; + case NUMCHAR_Chinese2: + { + static constexpr OUStringLiteral sBuf = u"\u4e00, \u4e8c, \u4e09, ..."; + strNumChar = OUString(sBuf); + } + break; + case NUMCHAR_Chinese3: + { + static constexpr OUStringLiteral sBuf = u"\u7532, \u4e59, \u4e19, ..."; + strNumChar = OUString(sBuf); + } + break; + case NUMCHAR_none: + strNumChar.clear(); + break; + default: + break; + }//mod end + return strNumChar; +} + +/** + * @short: To judge the silverbullet list is ordered or not. + * @descr: + * @return: sal_True if list is ordered, sal_False if list is unordered. + */ +bool LwpSilverBullet::IsBulletOrdered() +{ + if (!m_xBulletPara.is()) + return false; + + LwpFribPtr& rFribs = m_xBulletPara->GetFribs(); + + return (rFribs.HasFrib(FRIB_TAG_PARANUMBER) != nullptr); +} + +/** + * @short: Calculate the displaylevel according to the position and hidelevels. + * @descr: + * @param: nPos position of the numbering. + * @return: displaylevel of the position passed in. + */ +sal_uInt16 LwpSilverBullet::GetDisplayLevel(sal_uInt8 nPos) +{ + if (nPos > 1) + { + sal_uInt16 nHideBit = (1 << nPos); + for (sal_uInt8 nC = nPos-1; nC > 0; nC--) + { + sal_uInt16 nAttrMask = ~m_pHideLevels[nC]; + if (!(nAttrMask & nHideBit)) + { + return static_cast(nPos - nC); + } + } + } + + return static_cast(nPos); +} + +/** + * @descr: Get the additional information, "Division name" or "Section Name" from document + * variable frib according to numbering position. Whether we should add a + * Division/Section name or not is determined by the hidelevels of the frib. + * @param: nPos position of the numbering. + * @return: Division or Section name. + */ +OUString LwpSilverBullet::GetAdditionalName(sal_uInt8 nPos) +{ + OUString aRet; + sal_uInt16 nHideBit = (1 << nPos); + bool bDivisionName = false; + bool bSectionName = false; + + LwpFrib* pParaFrib = m_xBulletPara->GetFribs().GetFribs(); + if (!pParaFrib) + { + return OUString(); + } + + while (pParaFrib) + { + if (pParaFrib->GetType() == FRIB_TAG_DOCVAR) + { + ModifierInfo* pMoInfo = pParaFrib->GetModifiers(); + if (!pMoInfo) + { + return OUString(); + } + sal_uInt16 nHideLevels = pMoInfo->aTxtAttrOverride.GetHideLevels(); + sal_uInt16 nType = static_cast(pParaFrib)->GetType(); + + if (~nHideLevels & nHideBit) + { + if (nType == 0x000D) + { + bDivisionName = true; + } + else if (nType == 0x000E) + { + bSectionName= true; + } + } + } + pParaFrib = pParaFrib->GetNext(); + } + + if (bDivisionName) + { + aRet += GetDivisionName(); + } + if (bSectionName) + { + aRet += GetSectionName(); + } + + return aRet; +} + +OUString LwpSilverBullet::GetDivisionName() +{ + OUString aRet; + + if (!m_pFoundry) + { + return aRet; + } + + LwpDocument* pDoc = m_pFoundry->GetDocument(); + if (pDoc) + { + LwpObjectID& rID = pDoc->GetDivInfoID(); + if (!rID.IsNull()) + { + LwpDivInfo *pInfo = dynamic_cast(rID.obj(VO_DIVISIONINFO).get()); + if (pInfo) + aRet = pInfo->GetDivName(); + } + } + + return aRet; +} + +OUString LwpSilverBullet::GetSectionName() const +{ + LwpStory* pStory = dynamic_cast(m_aStory.obj(VO_STORY).get()); + if (!pStory) + { + return OUString(); + } + + return pStory->GetSectionName(); +} + +bool LwpSilverBullet::HasName() +{ + LwpAtomHolder& rName = GetName(); + return (!rName.str().isEmpty()); +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3