summaryrefslogtreecommitdiffstats
path: root/lotuswordpro/source/filter/lwpmarker.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'lotuswordpro/source/filter/lwpmarker.cxx')
-rw-r--r--lotuswordpro/source/filter/lwpmarker.cxx537
1 files changed, 537 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpmarker.cxx b/lotuswordpro/source/filter/lwpmarker.cxx
new file mode 100644
index 000000000..e6b29c23c
--- /dev/null
+++ b/lotuswordpro/source/filter/lwpmarker.cxx
@@ -0,0 +1,537 @@
+/* -*- 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 <lwpfilehdr.hxx>
+#include "lwpstory.hxx"
+#include "lwpmarker.hxx"
+#include "lwpproplist.hxx"
+#include <lwpglobalmgr.hxx>
+#include <xfilter/xfplaceholder.hxx>
+#include <xfilter/xfinputlist.hxx>
+
+LwpMarker::LwpMarker(LwpObjectHeader const &objHdr, LwpSvStream *pStrm)
+ : LwpDLNFPVList(objHdr,pStrm)
+ , m_nFlag(0)
+ , m_nPageNumber(0)
+ , m_nNeedUpdate(0)
+{
+}
+
+void LwpMarker::Read()
+{
+ LwpDLNFPVList::Read();
+ m_objContent.ReadIndexed(m_pObjStrm.get());
+ m_objLayout.ReadIndexed(m_pObjStrm.get());
+ m_objMarkerList.ReadIndexed(m_pObjStrm.get());
+ m_nNeedUpdate = m_pObjStrm->QuickReaduInt16();
+ m_nFlag = m_pObjStrm->QuickReaduInt16();
+ m_nPageNumber = m_pObjStrm->QuickReaduInt16();
+
+ m_pObjStrm->SkipExtra();
+}
+
+OUString LwpMarker::GetNamedProperty(std::u16string_view name)
+{
+ LwpPropList* pProp = GetPropList();
+ if (pProp)
+ return pProp->GetNamedProperty(name);
+ else
+ return OUString();
+}
+
+LwpStoryMarker::LwpStoryMarker(LwpObjectHeader const &objHdr, LwpSvStream *pStrm)
+ : LwpMarker(objHdr,pStrm)
+ , m_nFlag(0)
+{
+}
+
+void LwpStoryMarker::Read()
+{
+ LwpMarker::Read();
+ m_nFlag = m_pObjStrm->QuickReaduInt16();
+ m_Range.Read(m_pObjStrm.get());
+ m_pObjStrm->SkipExtra();
+}
+
+void LwpFribRange::Read(LwpObjectStream* pObjStrm)
+{
+ m_StartPara.ReadIndexed(pObjStrm);
+ m_EndPara.ReadIndexed(pObjStrm);
+}
+
+LwpCHBlkMarker::LwpCHBlkMarker(LwpObjectHeader const &objHdr, LwpSvStream *pStrm)
+ : LwpStoryMarker(objHdr, pStrm)
+ , m_nTab(0)
+ , m_nFlag(0)
+ , m_nAction(0)
+{
+}
+
+void LwpCHBlkMarker::Read()
+{
+ LwpStoryMarker::Read();
+ m_objPromptStory.ReadIndexed(m_pObjStrm.get());
+ m_Help.Read(m_pObjStrm.get());
+ m_nAction = m_pObjStrm->QuickReaduInt16();
+ m_nTab = m_pObjStrm->QuickReaduInt32();
+ m_nFlag = m_pObjStrm->QuickReaduInt16();
+ if(m_pObjStrm->CheckExtra())
+ {
+ m_Mirror.Read(m_pObjStrm.get());
+ m_pObjStrm->SkipExtra();
+ }
+}
+
+OUString LwpCHBlkMarker::GetPromptText() const
+{
+ LwpStory* pStory = nullptr;
+ if (m_objPromptStory.obj().is())
+ pStory = dynamic_cast<LwpStory*>(m_objPromptStory.obj().get());
+ if (pStory)
+ return pStory->GetContentText();
+ return OUString();
+}
+
+void LwpCHBlkMarker::ConvertCHBlock(XFContentContainer* pXFPara, sal_uInt8 nType)
+{
+ sal_uInt16 nAction = GetAction();
+
+ switch(nAction)
+ {
+ case CLICKHERE_CHBEHAVIORTEXT:
+ case CLICKHERE_CHBEHAVIORTABLE:
+ case CLICKHERE_CHBEHAVIORPICTURE:
+ case CLICKHERE_CHBEHAVIOROLEOBJECT:
+ ProcessPlaceHolder(pXFPara,nAction,nType);
+ break;
+ case CLICKHERE_CHBEHAVIORCHART:
+ case CLICKHERE_CHBEHAVIORDRAWING:
+ case CLICKHERE_CHBEHAVIORGLOSSARY:
+ case CLICKHERE_CHBEHAVIOREQUATION:
+ case CLICKHERE_CHBEHAVIORSYMBOL:
+ case CLICKHERE_CHBEHAVIORPAGENUM:
+ case CLICKHERE_CHBEHAVIORDOCFIELD:
+ case CLICKHERE_CHBEHAVIORDATETIME:
+ ProcessOtherCHB(pXFPara,nType);
+ break;
+ case CLICKHERE_CHBEHAVIORSTRINGLIST:
+ ProcessKeylist(pXFPara,nType);
+ break;
+ default:
+ break;
+ }
+}
+
+void LwpCHBlkMarker::ProcessPlaceHolder(XFContentContainer* pXFPara,sal_uInt16 nAction,
+ sal_uInt8 nType)
+{
+ bool bFillFlag = IsHasFilled();
+ bool bHelpFlag = IsBubbleHelp();
+
+ if ( bFillFlag )
+ return;
+ if (nType == MARKER_START)
+ {
+ XFHolderStart* pHolder= new XFHolderStart;
+ switch(nAction)
+ {
+ case CLICKHERE_CHBEHAVIORTEXT:
+ pHolder->SetType("text");
+ break;
+ case CLICKHERE_CHBEHAVIORTABLE:
+ pHolder->SetType("table");
+ break;
+ case CLICKHERE_CHBEHAVIORPICTURE:
+ pHolder->SetType("image");
+ break;
+ case CLICKHERE_CHBEHAVIOROLEOBJECT:
+ pHolder->SetType("object");
+ break;
+ default:
+ break;
+ }
+
+ if (bHelpFlag)
+ pHolder->SetDesc(m_Help.str());
+ pHolder->SetPrompt(GetPromptText());
+ pXFPara->Add(pHolder);
+ }
+ else if (nType == MARKER_END)
+ {
+ XFHolderEnd* pHolder = new XFHolderEnd;
+ pXFPara->Add(pHolder);
+ }
+}
+
+void LwpCHBlkMarker::ProcessOtherCHB(XFContentContainer* pXFPara,sal_uInt8 nType)
+{
+ bool bFillFlag = IsHasFilled();
+ bool bHelpFlag = IsBubbleHelp();
+
+ if ( bFillFlag )
+ return;
+ if (nType == MARKER_START)
+ {
+ XFHolderStart* pHolder= new XFHolderStart;
+ pHolder->SetType("text");
+ if (bHelpFlag)
+ pHolder->SetDesc(m_Help.str());
+ pHolder->SetPrompt(GetPromptText());
+ pXFPara->Add(pHolder);
+ }
+ else if (nType == MARKER_END)
+ {
+ XFHolderEnd* pHolder = new XFHolderEnd;
+ pXFPara->Add(pHolder);
+ }
+
+}
+
+//note: there will be a blank to mark the list
+//all input content of key list processed as normal text
+void LwpCHBlkMarker::ProcessKeylist(XFContentContainer* pXFPara,sal_uInt8 nType)
+{
+ bool bFillFlag = IsHasFilled();
+
+ if ( bFillFlag )
+ {
+ if (nType == MARKER_START)
+ {
+ EnumAllKeywords();//traverse the proplist to find all keywords
+ XFInputList* pList = new XFInputList;
+ pList->SetName(LwpDLNFPVList::m_Name.str());
+ pList->SetLabels(std::vector(m_Keylist));
+ pXFPara->Add(pList);
+ }
+ // else skip MARKER_END
+ }
+ else
+ {
+ if (nType == MARKER_START)
+ {
+ EnumAllKeywords();
+ XFInputList* pList = new XFInputList;
+ pList->SetName(LwpDLNFPVList::m_Name.str());
+ pList->SetLabels(std::vector(m_Keylist));
+ pXFPara->Add(pList);
+
+ XFHolderStart* pHolder= new XFHolderStart;
+ pHolder->SetType("text");
+ pHolder->SetPrompt(GetPromptText());
+ pXFPara->Add(pHolder);
+ }
+ else if (nType == MARKER_END)
+ {
+ XFHolderEnd* pHolder = new XFHolderEnd;
+ pXFPara->Add(pHolder);
+ }
+ }
+}
+
+bool LwpCHBlkMarker::IsHasFilled() const
+{
+ return (CHB_PROMPT & m_nFlag) == 0;
+}
+
+bool LwpCHBlkMarker::IsBubbleHelp() const
+{
+ return (CHB_HELP & m_nFlag) != 0;
+}
+
+void LwpCHBlkMarker::EnumAllKeywords()
+{
+ OUString name1("");
+ OUString value1("");
+ OUString name2("start");
+ LwpPropList* pProp = GetPropList();
+ if (!pProp)
+ return;
+ while(!name2.isEmpty())
+ {
+ name2 = pProp->EnumNamedProperty(name1,value1);
+ if ( name1.match("LIST",0) )
+ {
+ m_Keylist.push_back(value1);
+ }
+ name1 = name2;
+ }
+}
+
+LwpBookMark::LwpBookMark(LwpObjectHeader const &objHdr, LwpSvStream *pStrm)
+ : LwpDLNFVList(objHdr,pStrm)
+ , m_nFlag(0)
+{
+}
+
+void LwpBookMark::Read()
+{
+ LwpDLNFVList::Read();
+ m_objMarker.ReadIndexed(m_pObjStrm.get());
+ if (LwpFileHeader::m_nFileRevision < 0x0008)
+ {
+ if (m_pObjStrm->QuickReadBool())
+ m_nFlag |= BKMK_NOTESFX;
+ }
+ else
+ m_nFlag = m_pObjStrm->QuickReaduInt16();
+ m_pObjStrm->SkipExtra();
+}
+
+bool LwpBookMark::IsRightMarker(LwpObjectID objMarker)
+{
+ return objMarker == m_objMarker;
+}
+
+OUString const & LwpBookMark::GetName()
+{
+ return LwpDLNFVList::GetName().str();
+}
+
+LwpFieldMark::LwpFieldMark(LwpObjectHeader const &objHdr, LwpSvStream *pStrm)
+ : LwpStoryMarker(objHdr,pStrm)
+ , m_nFlag(0)
+ , m_nFieldType(0)
+ , m_bHasStyle(false)
+ , m_bHasStart(false)
+ , m_pFrib(nullptr)
+ , m_bRevisionFlag(false)
+{
+}
+
+void LwpFieldMark::Read()
+{
+ LwpStoryMarker::Read();
+ m_Formula.Read(m_pObjStrm.get());
+ m_objFormulaStory.ReadIndexed(m_pObjStrm.get());
+ if (LwpFileHeader::m_nFileRevision < 0x000B)
+ return;
+ m_objResultContent.ReadIndexed(m_pObjStrm.get());
+ m_nFlag = m_pObjStrm->QuickReaduInt16();
+ m_nFieldType = m_pObjStrm->QuickReaduInt16();
+ m_pObjStrm->SkipExtra();
+}
+
+void LwpFieldMark::ParseIndex(OUString& sKey1,OUString& sKey2)
+{
+ OUString sFormula = m_Formula.str();
+ sal_Int32 index[4];
+ sal_Unicode ch(0x0022);//"
+ index[0] = sFormula.indexOf(ch);
+ index[1] = sFormula.indexOf(ch,index[0]+1);
+
+ index[2] = sFormula.indexOf(ch,index[1]+1);
+ index[3] = sFormula.indexOf(ch,index[2]+1);
+ if (index[0]>=0 && index[1]>=0)
+ sKey1 = sFormula.copy(index[0]+1,index[1]-index[0]-1);
+ else
+ sKey1.clear();
+ if (index[2]>=0 && index[3]>=0)
+ sKey2 = sFormula.copy(index[2]+1,index[3]-index[2]-1);
+ else
+ sKey2.clear();
+}
+
+void LwpFieldMark::ParseTOC(OUString& sLevel,OUString& sText)
+{
+ OUString sFormula = m_Formula.str();
+ sal_Int32 index[4];
+ sal_Unicode ch1(0x0020);//space
+ sal_Unicode ch2(0x0022);//"
+
+ index[0] = sFormula.indexOf(ch1);
+ index[1] = sFormula.indexOf(ch1,index[0]+1);
+
+ index[2] = sFormula.indexOf(ch2,index[1]+1);
+ index[3] = sFormula.indexOf(ch2,index[2]+1);
+ if (index[0]>=0 && index[1]>=0)
+ sLevel = sFormula.copy(index[0]+1,index[1]-index[0]-1);
+ else
+ sLevel.clear();
+ if (index[2]>=0 && index[3]>=0)
+ sText = sFormula.copy(index[2]+1,index[3]-index[2]-1);
+ else
+ sText.clear();
+}
+
+bool LwpFieldMark::IsFormulaInsert() const
+{
+ return (m_nFlag & FF_FORMULAINSERTED) != 0;
+}
+
+bool LwpFieldMark::IsDateTimeField(sal_uInt8& type,OUString& formula)
+{
+ OUString sFormula = m_Formula.str();
+ sal_Int32 index = sFormula.indexOf(0x20); // space
+ if (index < 0)
+ {
+ if (sFormula == "TotalEditingTime")
+ {
+ type = DATETIME_TOTALTIME;
+ return true;
+ }
+ return false;
+ }
+
+ std::u16string_view tag = sFormula.subView(0,index);
+ if (tag == u"Now()")
+ {
+ type = DATETIME_NOW;
+ formula = sFormula.copy(index+1);
+ return true;
+ }
+ else if (tag == u"CreateDate")
+ {
+ type = DATETIME_CREATE;
+ formula = sFormula.copy(index+1);
+ return true;
+ }
+ else if (tag == u"EditDate")
+ {
+ type = DATETIME_LASTEDIT;
+ formula = sFormula.copy(index+1);
+ return true;
+ }
+ else if (tag == u"YesterdaysDate" || tag == u"TomorrowsDate"
+ || tag == u"TodaysDate")
+ {
+ type = DATETIME_SKIP;
+ return true;
+ }
+ else
+ return false;
+}
+
+bool LwpFieldMark::IsCrossRefField(sal_uInt8& nType, OUString& sMarkName)
+{
+ OUString sFormula = m_Formula.str();
+ sal_Int32 index = sFormula.indexOf(0x20); // space
+ if (index < 0)
+ {
+ LwpGlobalMgr* pGlobal = LwpGlobalMgr::GetInstance();
+ LwpBookmarkMgr* pMarkMgr = pGlobal->GetLwpBookmarkMgr();
+ if (pMarkMgr->FindBookmark(sFormula))
+ {
+ sMarkName = sFormula;
+ nType = CROSSREF_TEXT;
+ return true;
+ }
+ else
+ return false;
+ }
+
+ std::u16string_view tag = sFormula.subView(0,index);
+ if (tag == u"PageRef")
+ {
+ sMarkName = sFormula.copy(index+1);
+ nType = CROSSREF_PAGE;
+ return true;
+ }
+ else if (tag == u"ParaRef")
+ {
+ sMarkName = sFormula.copy(index+1);
+ nType = CROSSREF_PARANUMBER;
+ return true;
+ }
+ else
+ return false;
+}
+
+bool LwpFieldMark::IsDocPowerField(sal_uInt8& nType,OUString& sFormula)
+{
+ sFormula = m_Formula.str();
+
+ if (sFormula == "Description")
+ {
+ nType = DOC_DESCRIPTION;
+ return true;
+ }
+ else if (sFormula == "NumPages")
+ {
+ nType = DOC_NUMPAGES;
+ return true;
+ }
+ else if (sFormula == "NumChars")
+ {
+ nType = DOC_NUMCHARS;
+ return true;
+ }
+ else if (sFormula == "NumWords")
+ {
+ nType = DOC_NUMWORDS;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+LwpRubyMarker::LwpRubyMarker(LwpObjectHeader const &objHdr, LwpSvStream *pStrm):LwpStoryMarker(objHdr,pStrm)
+{
+}
+
+void LwpRubyMarker::Read()
+{
+ LwpStoryMarker::Read();
+ m_objLayout.ReadIndexed(m_pObjStrm.get());
+ m_pObjStrm->SkipExtra();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */