summaryrefslogtreecommitdiffstats
path: root/lotuswordpro/source/filter/lwpfrib.cxx
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:06:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:06:44 +0000
commited5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch)
tree7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /lotuswordpro/source/filter/lwpfrib.cxx
parentInitial commit. (diff)
downloadlibreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.tar.xz
libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.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 'lotuswordpro/source/filter/lwpfrib.cxx')
-rw-r--r--lotuswordpro/source/filter/lwpfrib.cxx455
1 files changed, 455 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpfrib.cxx b/lotuswordpro/source/filter/lwpfrib.cxx
new file mode 100644
index 000000000..fb4c47ebd
--- /dev/null
+++ b/lotuswordpro/source/filter/lwpfrib.cxx
@@ -0,0 +1,455 @@
+/* -*- 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 <memory>
+#include <lwpfrib.hxx>
+#include "lwphyperlinkmgr.hxx"
+#include <xfilter/xfhyperlink.hxx>
+#include <xfilter/xfstylemanager.hxx>
+#include <xfilter/xftextspan.hxx>
+#include <xfilter/xftextstyle.hxx>
+#include <xfilter/xftextcontent.hxx>
+#include "lwpfribheader.hxx"
+#include "lwpfribtext.hxx"
+#include "lwpfribtable.hxx"
+#include "lwpfribbreaks.hxx"
+#include "lwpfribframe.hxx"
+#include "lwpfribsection.hxx"
+#include "lwpcharacterstyle.hxx"
+#include "lwpfootnote.hxx"
+#include "lwpnotes.hxx"
+#include "lwpfribmark.hxx"
+#include <lwpglobalmgr.hxx>
+
+#include <osl/diagnose.h>
+
+LwpFrib::LwpFrib(LwpPara* pPara)
+ : m_pFribMap(nullptr)
+ , m_pPara(pPara)
+ , m_pNext(nullptr)
+ , m_nFribType(0)
+ , m_ModFlag(false)
+ , m_nRevisionType(0)
+ , m_bRevisionFlag(false)
+ , m_nEditor(0)
+{
+}
+
+LwpFrib::~LwpFrib() { Deregister(); }
+
+LwpFrib* LwpFrib::CreateFrib(LwpPara* pPara, LwpObjectStream* pObjStrm, sal_uInt8 fribtag,
+ sal_uInt8 editID)
+{
+ //Read Modifier
+ std::unique_ptr<ModifierInfo> xModInfo;
+ if (fribtag & FRIB_TAG_MODIFIER)
+ {
+ xModInfo.reset(new ModifierInfo);
+ xModInfo->CodePage = 0;
+ xModInfo->FontID = 0;
+ xModInfo->RevisionType = 0;
+ xModInfo->RevisionFlag = false;
+ xModInfo->HasCharStyle = false;
+ xModInfo->HasLangOverride = false;
+ xModInfo->HasHighlight = false;
+ ReadModifiers(pObjStrm, xModInfo.get());
+ }
+
+ //Read frib data
+ std::unique_ptr<LwpFrib> newFrib;
+ sal_uInt16 friblen = pObjStrm->QuickReaduInt16();
+ sal_uInt8 fribtype = fribtag & ~FRIB_TAG_TYPEMASK;
+ switch (fribtype)
+ {
+ case FRIB_TAG_INVALID: //fall through
+ case FRIB_TAG_EOP: //fall through
+ default:
+ newFrib.reset(new LwpFrib(pPara));
+ break;
+ case FRIB_TAG_TEXT:
+ {
+ newFrib.reset(new LwpFribText(pPara, (fribtag & FRIB_TAG_NOUNICODE) != 0));
+ break;
+ }
+ case FRIB_TAG_TABLE:
+ newFrib.reset(new LwpFribTable(pPara));
+ break;
+ case FRIB_TAG_TAB:
+ newFrib.reset(new LwpFribTab(pPara));
+ break;
+ case FRIB_TAG_PAGEBREAK:
+ newFrib.reset(new LwpFribPageBreak(pPara));
+ break;
+ case FRIB_TAG_FRAME:
+ newFrib.reset(new LwpFribFrame(pPara));
+ break;
+ case FRIB_TAG_FOOTNOTE:
+ newFrib.reset(new LwpFribFootnote(pPara));
+ break;
+ case FRIB_TAG_COLBREAK:
+ newFrib.reset(new LwpFribColumnBreak(pPara));
+ break;
+ case FRIB_TAG_LINEBREAK:
+ newFrib.reset(new LwpFribLineBreak(pPara));
+ break;
+ case FRIB_TAG_HARDSPACE:
+ newFrib.reset(new LwpFribHardSpace(pPara));
+ break;
+ case FRIB_TAG_SOFTHYPHEN:
+ newFrib.reset(new LwpFribSoftHyphen(pPara));
+ break;
+ case FRIB_TAG_PARANUMBER:
+ newFrib.reset(new LwpFribParaNumber(pPara));
+ break;
+ case FRIB_TAG_UNICODE: //fall through
+ case FRIB_TAG_UNICODE2: //fall through
+ case FRIB_TAG_UNICODE3: //fall through
+ newFrib.reset(new LwpFribUnicode(pPara));
+ break;
+ case FRIB_TAG_NOTE:
+ newFrib.reset(new LwpFribNote(pPara));
+ break;
+ case FRIB_TAG_SECTION:
+ newFrib.reset(new LwpFribSection(pPara));
+ break;
+ case FRIB_TAG_PAGENUMBER:
+ newFrib.reset(new LwpFribPageNumber(pPara));
+ break;
+ case FRIB_TAG_DOCVAR:
+ newFrib.reset(new LwpFribDocVar(pPara));
+ break;
+ case FRIB_TAG_BOOKMARK:
+ newFrib.reset(new LwpFribBookMark(pPara));
+ break;
+ case FRIB_TAG_FIELD:
+ newFrib.reset(new LwpFribField(pPara));
+ break;
+ case FRIB_TAG_CHBLOCK:
+ newFrib.reset(new LwpFribCHBlock(pPara));
+ break;
+ case FRIB_TAG_RUBYMARKER:
+ newFrib.reset(new LwpFribRubyMarker(pPara));
+ break;
+ case FRIB_TAG_RUBYFRAME:
+ newFrib.reset(new LwpFribRubyFrame(pPara));
+ break;
+ }
+
+ //Do not know why the fribTag judgment is necessary, to be checked with
+ if (fribtag & FRIB_TAG_MODIFIER)
+ {
+ newFrib->SetModifiers(xModInfo.release());
+ }
+
+ newFrib->m_nFribType = fribtype;
+ newFrib->m_nEditor = editID;
+ newFrib->Read(pObjStrm, friblen);
+ return newFrib.release();
+}
+
+void LwpFrib::Read(LwpObjectStream* pObjStrm, sal_uInt16 len) { pObjStrm->SeekRel(len); }
+
+void LwpFrib::SetModifiers(ModifierInfo* pModifiers)
+{
+ if (pModifiers)
+ {
+ m_pModifiers.reset(pModifiers);
+ m_ModFlag = true;
+ if (pModifiers->RevisionFlag)
+ {
+ m_bRevisionFlag = true;
+ m_nRevisionType = pModifiers->RevisionType;
+ }
+ }
+}
+
+void LwpFrib::RegisterStyle(LwpFoundry* pFoundry)
+{
+ if (!m_pModifiers)
+ return;
+ if (!m_pModifiers->FontID && !m_pModifiers->HasCharStyle && !m_pModifiers->HasHighlight)
+ {
+ m_ModFlag = false;
+ return;
+ }
+ //we only read four modifiers, in these modifiers,CodePage and LangOverride are not styles,
+ //so we can only handle fontid and charstyle, if others, we should not reg style
+ //note by ,1-27
+ rtl::Reference<XFFont> pFont;
+ XFTextStyle* pStyle = nullptr;
+ m_StyleName.clear();
+ XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
+ XFTextStyle* pNamedStyle = nullptr;
+ if (m_pModifiers->HasCharStyle && pFoundry)
+ {
+ pNamedStyle = dynamic_cast<XFTextStyle*>(
+ pFoundry->GetStyleManager()->GetStyle(m_pModifiers->CharStyleID));
+ }
+ if (pNamedStyle)
+ {
+ LwpCharacterStyle* pCharStyle = nullptr;
+ if (m_pModifiers->FontID && pFoundry)
+ pCharStyle = dynamic_cast<LwpCharacterStyle*>(m_pModifiers->CharStyleID.obj().get());
+ if (pCharStyle)
+ {
+ std::unique_ptr<XFTextStyle> pNewStyle(new XFTextStyle());
+ *pNewStyle = *pNamedStyle;
+
+ pNewStyle->SetStyleName("");
+ pFont = pFoundry->GetFontManager().CreateOverrideFont(pCharStyle->GetFinalFontID(),
+ m_pModifiers->FontID);
+ pNewStyle->SetFont(pFont);
+ IXFStyleRet aNewStyle = pXFStyleManager->AddStyle(std::move(pNewStyle));
+ m_StyleName = aNewStyle.m_pStyle->GetStyleName();
+ pStyle = dynamic_cast<XFTextStyle*>(aNewStyle.m_pStyle);
+ if (aNewStyle.m_bOrigDeleted)
+ pStyle = nullptr;
+ }
+ else
+ m_StyleName = pNamedStyle->GetStyleName();
+ }
+ else
+ {
+ if (m_pModifiers->FontID && pFoundry)
+ {
+ std::unique_ptr<XFTextStyle> pNewStyle(new XFTextStyle());
+ pFont = pFoundry->GetFontManager().CreateFont(m_pModifiers->FontID);
+ pNewStyle->SetFont(pFont);
+ IXFStyleRet aNewStyle = pXFStyleManager->AddStyle(std::move(pNewStyle));
+ m_StyleName = aNewStyle.m_pStyle->GetStyleName();
+ pStyle = dynamic_cast<XFTextStyle*>(aNewStyle.m_pStyle);
+ if (aNewStyle.m_bOrigDeleted)
+ pStyle = nullptr;
+ }
+ }
+
+ if (!m_pModifiers->HasHighlight)
+ return;
+
+ XFColor aColor = GetHighlightColor(); //right yellow
+ if (pStyle) //change the style directly
+ pStyle->GetFont()->SetBackColor(aColor);
+ else //register a new style
+ {
+ std::unique_ptr<XFTextStyle> pNewStyle(new XFTextStyle());
+
+ if (!m_StyleName.isEmpty())
+ {
+ XFTextStyle* pOldStyle = pXFStyleManager->FindTextStyle(m_StyleName);
+ *pNewStyle = *pOldStyle;
+ pNewStyle->GetFont()->SetBackColor(aColor);
+ }
+ else
+ {
+ pFont = new XFFont;
+ pFont->SetBackColor(aColor);
+ pNewStyle->SetFont(pFont);
+ }
+ m_StyleName = pXFStyleManager->AddStyle(std::move(pNewStyle)).m_pStyle->GetStyleName();
+ }
+}
+
+void LwpFrib::ReadModifiers(LwpObjectStream* pObjStrm, ModifierInfo* pModInfo)
+{
+ for (;;)
+ {
+ bool bFailure;
+
+ // Get the modifier type
+ sal_uInt8 Modifier = pObjStrm->QuickReaduInt8(&bFailure);
+ if (bFailure)
+ break;
+
+ // Stop when we hit the last modifier
+ if (Modifier == FRIB_MTAG_NONE)
+ break;
+
+ // Get the modifier length
+ sal_uInt8 len = pObjStrm->QuickReaduInt8(&bFailure);
+ if (bFailure)
+ break;
+
+ switch (Modifier)
+ {
+ case FRIB_MTAG_FONT:
+ if (len != sizeof(pModInfo->FontID))
+ {
+ OSL_FAIL("FRIB_MTAG_FONT entry wrong size");
+ pObjStrm->SeekRel(len);
+ }
+ else
+ pModInfo->FontID = pObjStrm->QuickReaduInt32();
+ break;
+ case FRIB_MTAG_CHARSTYLE:
+ pModInfo->HasCharStyle = true;
+ pModInfo->CharStyleID.ReadIndexed(pObjStrm);
+ break;
+ case FRIB_MTAG_LANGUAGE:
+ pModInfo->HasLangOverride = true;
+ pModInfo->Language.Read(pObjStrm);
+ break;
+ case FRIB_MTAG_CODEPAGE:
+ if (len != sizeof(pModInfo->CodePage))
+ {
+ OSL_FAIL("FRIB_MTAG_CODEPAGE entry wrong size");
+ pObjStrm->SeekRel(len);
+ }
+ else
+ pModInfo->CodePage = pObjStrm->QuickReaduInt16();
+ break;
+ case FRIB_MTAG_ATTRIBUTE:
+ pModInfo->aTxtAttrOverride.Read(pObjStrm);
+ if (pModInfo->aTxtAttrOverride.IsHighlight())
+ pModInfo->HasHighlight = true;
+ break;
+ case FRIB_MTAG_REVISION:
+ pModInfo->RevisionType = pObjStrm->QuickReaduInt8();
+ pModInfo->RevisionFlag = true;
+ break;
+ default:
+ pObjStrm->SeekRel(len);
+ break;
+ }
+ // TODO: read the modifier data
+ }
+}
+
+/**
+* @descr: Whether there are other fribs following current frib.
+* @return: True if having following fribs, or false.
+*/
+bool LwpFrib::HasNextFrib() { return GetNext() && GetNext()->GetType() != FRIB_TAG_EOP; }
+
+void LwpFrib::ConvertChars(XFContentContainer* pXFPara, const OUString& text)
+{
+ if (m_ModFlag)
+ {
+ OUString strStyleName = GetStyleName();
+ XFTextSpan* pSpan = new XFTextSpan(text, strStyleName);
+ pXFPara->Add(pSpan);
+ }
+ else
+ {
+ XFTextContent* pSpan = new XFTextContent();
+ pSpan->SetText(text);
+ pXFPara->Add(pSpan);
+ }
+}
+
+void LwpFrib::ConvertHyperLink(XFContentContainer* pXFPara, const LwpHyperlinkMgr* pHyperlink,
+ const OUString& text)
+{
+ XFHyperlink* pHyper = new XFHyperlink;
+ pHyper->SetHRef(pHyperlink->GetHyperlink());
+ pHyper->SetText(text);
+ pHyper->SetStyleName(GetStyleName());
+ pXFPara->Add(pHyper);
+}
+
+/**
+* @descr: Get the current frib font style
+* @return: XFFont pointer
+*/
+rtl::Reference<XFFont> LwpFrib::GetFont()
+{
+ rtl::Reference<XFFont> pFont;
+ if (m_pModifiers && m_pModifiers->FontID)
+ {
+ LwpFoundry* pFoundry = m_pPara->GetFoundry();
+ if (pFoundry)
+ pFont = pFoundry->GetFontManager().CreateFont(m_pModifiers->FontID);
+ }
+ else
+ {
+ XFParaStyle* pXFParaStyle = m_pPara->GetXFParaStyle();
+ pFont = pXFParaStyle->GetFont();
+ }
+ return pFont;
+}
+
+OUString LwpFrib::GetEditor()
+{
+ LwpGlobalMgr* pGlobal = LwpGlobalMgr::GetInstance();
+ return pGlobal->GetEditorName(m_nEditor);
+}
+
+XFColor LwpFrib::GetHighlightColor()
+{
+ LwpGlobalMgr* pGlobal = LwpGlobalMgr::GetInstance();
+ return pGlobal->GetHighlightColor(m_nEditor);
+}
+
+void LwpFrib::Register(std::map<LwpFrib*, OUString>* pFribMap)
+{
+ if (m_pFribMap)
+ throw std::runtime_error("registered already");
+ m_pFribMap = pFribMap;
+}
+
+void LwpFrib::Deregister()
+{
+ if (m_pFribMap)
+ {
+ m_pFribMap->erase(this);
+ m_pFribMap = nullptr;
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */