sw/inc/authfld.hxx | 3 sw/inc/fldbas.hxx | 4 - sw/inc/poolfmt.hrc | 1 sw/inc/shellres.hxx | 1 sw/inc/tox.hxx | 15 ++++ sw/inc/toxe.hxx | 3 sw/qa/extras/ooxmlexport/data/FDO74775.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 10 ++ sw/source/core/doc/docnew.cxx | 2 sw/source/core/doc/doctxm.cxx | 4 - sw/source/core/fields/authfld.cxx | 7 + sw/source/core/fields/fldbas.cxx | 11 ++- sw/source/core/tox/tox.cxx | 2 sw/source/core/uibase/index/toxmgr.cxx | 1 sw/source/core/uibase/utlui/initui.cxx | 1 sw/source/core/uibase/utlui/initui.hrc | 1 sw/source/core/uibase/utlui/initui.src | 6 + sw/source/core/unocore/unoidx.cxx | 19 +++++ sw/source/filter/ww8/docxattributeoutput.cxx | 11 ++- sw/source/filter/ww8/fields.cxx | 3 sw/source/filter/ww8/fields.hxx | 3 sw/source/filter/ww8/ww8atr.cxx | 8 ++ sw/source/ui/index/cnttab.cxx | 3 sw/source/ui/utlui/poolfmt.src | 4 + writerfilter/source/dmapper/DomainMapper_Impl.cxx | 80 ++++++++++++++++++++++ writerfilter/source/dmapper/DomainMapper_Impl.hxx | 1 writerfilter/source/dmapper/FieldTypes.hxx | 7 + 27 files changed, 198 insertions(+), 13 deletions(-)
New commits: commit 06f7d1a96eef5aa69d4872ff6d96eb5085296d09 Author: Rohit Deshmukh <rohit.deshm...@synerzip.com> Date: Wed Mar 12 15:07:38 2014 +0530 fdo#74775: Preseved Citation after round trip. Conflicts: sw/qa/extras/ooxmlexport/ooxmlexport.cxx Reviewed on: https://gerrit.libreoffice.org/8473 Change-Id: Ie1b0ac3cb4d4b9bf305323599d5e4b63f913fb1b diff --git a/sw/inc/authfld.hxx b/sw/inc/authfld.hxx index 55ed5b7..a26cc6d 100644 --- a/sw/inc/authfld.hxx +++ b/sw/inc/authfld.hxx @@ -150,6 +150,9 @@ class SwAuthorityField : public SwField virtual SwField* Copy() const; public: + /// For internal use only, in general continue using ExpandField() instead. + OUString ConditionalExpand(ToxAuthorityField eField) const; + SwAuthorityField(SwAuthorityFieldType* pType, const OUString& rFieldContents); SwAuthorityField(SwAuthorityFieldType* pType, sal_IntPtr nHandle); ~SwAuthorityField(); diff --git a/sw/inc/fldbas.hxx b/sw/inc/fldbas.hxx index 26df00f..90cd505 100644 --- a/sw/inc/fldbas.hxx +++ b/sw/inc/fldbas.hxx @@ -26,7 +26,7 @@ #include <com/sun/star/uno/Any.hxx> #include <cppuhelper/weakref.hxx> #include <vector> - +#include <toxe.hxx> class SwDoc; class SvNumberFormatter; @@ -317,7 +317,7 @@ public: SwTxtFormatter::NewFldPortion() sets things up properly. @return the generated text (suitable for display) */ - OUString ExpandField(bool const bCached) const; + OUString ExpandField(bool const bCached, ToxAuthorityField eField = AUTH_FIELD_IDENTIFIER) const; /// @return name or content. virtual OUString GetFieldName() const; diff --git a/sw/inc/poolfmt.hrc b/sw/inc/poolfmt.hrc index c9c87c6..423fad5 100644 --- a/sw/inc/poolfmt.hrc +++ b/sw/inc/poolfmt.hrc @@ -221,6 +221,7 @@ #define STR_POOLCOLL_TOX_USER9 (RC_POOLCOLL_REGISTER_BEGIN+ 34) #define STR_POOLCOLL_TOX_USER10 (RC_POOLCOLL_REGISTER_BEGIN+ 35) +#define STR_POOLCOLL_TOX_CITATION (RC_POOLCOLL_REGISTER_BEGIN+ 36) // Category Chapter/Document #define STR_POOLCOLL_DOC_TITEL (RC_POOLCOLL_DOC_BEGIN+ 0) diff --git a/sw/inc/shellres.hxx b/sw/inc/shellres.hxx index df10cbd..60ab4a1 100644 --- a/sw/inc/shellres.hxx +++ b/sw/inc/shellres.hxx @@ -63,6 +63,7 @@ struct SW_DLLPUBLIC ShellResource : public Resource OUString aTOXObjectsName; OUString aTOXTablesName; OUString aTOXAuthoritiesName; + OUString aTOXCitationName; OUString aLinkCtrlClick; OUString aLinkClick; diff --git a/sw/inc/tox.hxx b/sw/inc/tox.hxx index ee3b6c6..f6c578f 100644 --- a/sw/inc/tox.hxx +++ b/sw/inc/tox.hxx @@ -56,6 +56,7 @@ class SW_DLLPUBLIC SwTOXMark OUString aAltText; // Text of caption is different. OUString aPrimaryKey; OUString aSecondaryKey; + OUString aCitationKeyReading; // three more strings for phonetic sorting OUString aTextReading; @@ -113,12 +114,14 @@ public: inline void SetTextReading(const OUString& rStr); inline void SetPrimaryKeyReading(const OUString& rStr ); inline void SetSecondaryKeyReading(const OUString& rStr); + inline void SetCitationKeyReading(const OUString& rStr); inline OUString GetPrimaryKey() const; inline OUString GetSecondaryKey() const; inline OUString GetTextReading() const; inline OUString GetPrimaryKeyReading() const; inline OUString GetSecondaryKeyReading() const; + inline OUString GetCitationKeyReading() const; sal_Bool IsAutoGenerated() const {return bAutoGenerated;} void SetAutoGenerated(sal_Bool bSet) {bAutoGenerated = bSet;} @@ -625,6 +628,12 @@ inline void SwTOXMark::SetPrimaryKeyReading( const OUString& rKey ) aPrimaryKeyReading = rKey; } +inline void SwTOXMark::SetCitationKeyReading( const OUString& rKey ) +{ + SAL_WARN_IF(GetTOXType()->GetType() != TOX_CITATION, "sw", "Wrong type"); + aCitationKeyReading = rKey; +} + inline void SwTOXMark::SetSecondaryKeyReading( const OUString& rKey ) { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); @@ -667,6 +676,12 @@ inline OUString SwTOXMark::GetSecondaryKeyReading() const return aSecondaryKeyReading; } +inline OUString SwTOXMark::GetCitationKeyReading() const +{ + SAL_WARN_IF(GetTOXType()->GetType() != TOX_CITATION, "sw", "Wrong type"); + return aCitationKeyReading; +} + //SwForm inline void SwForm::SetTemplate(sal_uInt16 nLevel, const OUString& rTemplate) diff --git a/sw/inc/toxe.hxx b/sw/inc/toxe.hxx index dbb3435..5bf5c9d5 100644 --- a/sw/inc/toxe.hxx +++ b/sw/inc/toxe.hxx @@ -42,7 +42,8 @@ enum TOXTypes TOX_OBJECTS, TOX_TABLES, TOX_AUTHORITIES, - TOX_BIBLIOGRAPHY + TOX_BIBLIOGRAPHY, + TOX_CITATION }; // this enum contains all types of sources enum ToxAuthorityType diff --git a/sw/qa/extras/ooxmlexport/data/FDO74775.docx b/sw/qa/extras/ooxmlexport/data/FDO74775.docx new file mode 100644 index 0000000..a8ee588 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO74775.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index a0ea664..96c1995 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -2768,7 +2768,17 @@ DECLARE_OOXMLEXPORT_TEST(testlvlPicBulletId, "lvlPicBulletId.docx") if (!pXmlDoc) return; assertXPath(pXmlDoc, "/w:numbering[1]/w:abstractNum[1]/w:lvl[1]/w:lvlPicBulletId[1]", 0); +} +DECLARE_OOXMLEXPORT_TEST(testCitation,"FDO74775.docx") +{ + xmlDocPtr pXmlDoc = parseExport(); + if (!pXmlDoc) + return; + xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc,"/w:document/w:body/w:p[1]/w:r[3]/w:instrText"); + xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; + OUString contents = OUString::createFromAscii((const char*)((pXmlNode->children[0]).content)); + CPPUNIT_ASSERT(contents.match(" CITATION [Kra06]")); } #endif diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx index 48e0951..1da16aa 100644 --- a/sw/source/core/doc/docnew.cxx +++ b/sw/source/core/doc/docnew.cxx @@ -1062,6 +1062,8 @@ void SwDoc::InitTOXTypes() mpTOXTypes->push_back( pNew ); pNew = new SwTOXType(TOX_AUTHORITIES, pShellRes->aTOXAuthoritiesName ); mpTOXTypes->push_back( pNew ); + pNew = new SwTOXType(TOX_CITATION, pShellRes->aTOXCitationName ); + mpTOXTypes->push_back( pNew ); } void SwDoc::ReplaceDefaults(const SwDoc& rSource) diff --git a/sw/source/core/doc/doctxm.cxx b/sw/source/core/doc/doctxm.cxx index 7fb5b70..0896535 100644 --- a/sw/source/core/doc/doctxm.cxx +++ b/sw/source/core/doc/doctxm.cxx @@ -464,6 +464,7 @@ const SwTOXBase* SwDoc::GetDefaultTOXBase( TOXTypes eTyp, bool bCreate ) case TOX_ILLUSTRATIONS: prBase = &mpDefTOXBases->pIllBase; break; case TOX_AUTHORITIES: prBase = &mpDefTOXBases->pAuthBase; break; case TOX_BIBLIOGRAPHY: prBase = &mpDefTOXBases->pBiblioBase; break; + case TOX_CITATION: /** TODO */break; } if(!(*prBase) && bCreate) { @@ -487,6 +488,7 @@ void SwDoc::SetDefaultTOXBase(const SwTOXBase& rBase) case TOX_ILLUSTRATIONS: prBase = &mpDefTOXBases->pIllBase; break; case TOX_AUTHORITIES: prBase = &mpDefTOXBases->pAuthBase; break; case TOX_BIBLIOGRAPHY: prBase = &mpDefTOXBases->pBiblioBase; break; + case TOX_CITATION: /** TODO */break; } if(*prBase) delete (*prBase); @@ -1092,7 +1094,7 @@ SwTxtFmtColl* SwTOXBaseSection::GetTxtFmtColl( sal_uInt16 nLevel ) case TOX_AUTHORITIES: case TOX_BIBLIOGRAPHY: nPoolFmt = RES_POOLCOLL_TOX_AUTHORITIESH; break; - + case TOX_CITATION: /** TODO */break; case TOX_CONTENT: // There's a jump in the ContentArea! if( nLevel < 6 ) diff --git a/sw/source/core/fields/authfld.cxx b/sw/source/core/fields/authfld.cxx index c83a82f..76fb0f9 100644 --- a/sw/source/core/fields/authfld.cxx +++ b/sw/source/core/fields/authfld.cxx @@ -540,9 +540,14 @@ SwAuthorityField::~SwAuthorityField() OUString SwAuthorityField::Expand() const { + return ConditionalExpand(AUTH_FIELD_IDENTIFIER); +} + +OUString SwAuthorityField::ConditionalExpand(ToxAuthorityField eField) const +{ SwAuthorityFieldType* pAuthType = (SwAuthorityFieldType*)GetTyp(); OUString sRet; - if(pAuthType->GetPrefix()) + if(pAuthType->GetPrefix() && eField != AUTH_FIELD_TITLE) sRet = OUString(pAuthType->GetPrefix()); if( pAuthType->IsSequence() ) diff --git a/sw/source/core/fields/fldbas.cxx b/sw/source/core/fields/fldbas.cxx index 1931d82..8f0abbc 100644 --- a/sw/source/core/fields/fldbas.cxx +++ b/sw/source/core/fields/fldbas.cxx @@ -40,6 +40,7 @@ #include <calc.hxx> #include <comcore.hrc> #include <docary.hxx> +#include <authfld.hxx> #include <math.h> @@ -384,13 +385,19 @@ sal_Bool SwField::IsFixed() const return bRet; } -OUString SwField::ExpandField(bool const bCached) const +OUString SwField::ExpandField(bool const bCached, ToxAuthorityField eField) const { if ( m_bUseFieldValueCache ) { if (!bCached) // #i85766# do not expand fields in clipboard documents { - m_Cache = Expand(); + if (GetTypeId() == TYP_AUTHORITY) + { + const SwAuthorityField* pAuthorityField = static_cast<const SwAuthorityField*>(this); + m_Cache = pAuthorityField->ConditionalExpand(eField); + } + else + m_Cache = Expand(); } return m_Cache; } diff --git a/sw/source/core/tox/tox.cxx b/sw/source/core/tox/tox.cxx index c5a105e..e4a5964 100644 --- a/sw/source/core/tox/tox.cxx +++ b/sw/source/core/tox/tox.cxx @@ -281,6 +281,7 @@ SwForm::SwForm( TOXTypes eTyp ) // #i21237# case TOX_OBJECTS : nPoolId = STR_POOLCOLL_TOX_OBJECTH; break; case TOX_TABLES : nPoolId = STR_POOLCOLL_TOX_TABLESH; break; case TOX_AUTHORITIES : nPoolId = STR_POOLCOLL_TOX_AUTHORITIESH; break; + case TOX_CITATION : nPoolId = STR_POOLCOLL_TOX_CITATION; break; default: OSL_ENSURE( !this, "invalid TOXTyp"); return ; @@ -393,6 +394,7 @@ sal_uInt16 SwForm::GetFormMaxLevel( TOXTypes eTOXType ) case TOX_OBJECTS : case TOX_TABLES : nRet = 2; break; case TOX_BIBLIOGRAPHY : + case TOX_CITATION: case TOX_AUTHORITIES : nRet = AUTH_TYPE_END + 1; break; } return nRet; diff --git a/sw/source/core/uibase/index/toxmgr.cxx b/sw/source/core/uibase/index/toxmgr.cxx index 6287517..c29bd7b 100644 --- a/sw/source/core/uibase/index/toxmgr.cxx +++ b/sw/source/core/uibase/index/toxmgr.cxx @@ -363,6 +363,7 @@ sal_Bool SwTOXMgr::UpdateOrInsertTOX(const SwTOXDescription& rDesc, pNewTOX->SetLevelFromChapter(rDesc.IsLevelFromChapter()); } break; + case TOX_CITATION: /** TODO */break; case TOX_OBJECTS: case TOX_TABLES: case TOX_AUTHORITIES: diff --git a/sw/source/core/uibase/utlui/initui.cxx b/sw/source/core/uibase/utlui/initui.cxx index 1a745a7..d59e0be 100644 --- a/sw/source/core/uibase/utlui/initui.cxx +++ b/sw/source/core/uibase/utlui/initui.cxx @@ -204,6 +204,7 @@ ShellResource::ShellResource() aTOXObjectsName( SW_RES(STR_TOX_OBJ)), aTOXTablesName( SW_RES(STR_TOX_TBL)), aTOXAuthoritiesName( SW_RES(STR_TOX_AUTH)), + aTOXCitationName( SW_RES(STR_TOX_CITATION)), aLinkCtrlClick(SW_RESSTR(STR_LINK_CTRL_CLICK)), aLinkClick(SW_RESSTR(STR_LINK_CLICK)), pAutoFmtNameLst(0), diff --git a/sw/source/core/uibase/utlui/initui.hrc b/sw/source/core/uibase/utlui/initui.hrc index 6df2907..c368dc4 100644 --- a/sw/source/core/uibase/utlui/initui.hrc +++ b/sw/source/core/uibase/utlui/initui.hrc @@ -52,6 +52,7 @@ #define STR_LINK_CLICK 29 #define STR_GETREFFLD_REFITEMNOTFOUND 30 #define STR_DURATION_FORMAT 31 +#define STR_TOX_CITATION 32 #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/uibase/utlui/initui.src b/sw/source/core/uibase/utlui/initui.src index 81e47ff..999b27b 100644 --- a/sw/source/core/uibase/utlui/initui.src +++ b/sw/source/core/uibase/utlui/initui.src @@ -121,6 +121,12 @@ Resource RID_SW_SHELLRES { Text [ en-US ] = "Bibliography"; }; + + String STR_TOX_CITATION + { + Text [ en-US ] = "Citation"; + }; + String STR_TOX_TBL { Text [ en-US ] = "Index of Tables"; diff --git a/sw/source/core/unocore/unoidx.cxx b/sw/source/core/unocore/unoidx.cxx index ddedeff..94b785a 100644 --- a/sw/source/core/unocore/unoidx.cxx +++ b/sw/source/core/unocore/unoidx.cxx @@ -1519,6 +1519,7 @@ lcl_TypeToPropertyMap_Mark(const TOXTypes eType) { case TOX_INDEX: return PROPERTY_MAP_INDEX_MARK; case TOX_CONTENT: return PROPERTY_MAP_CNTIDX_MARK; + case TOX_CITATION : return PROPERTY_MAP_FLDTYP_BIBLIOGRAPHY; //case TOX_USER: default: return PROPERTY_MAP_USER_MARK; @@ -1553,6 +1554,7 @@ public: OUString m_sPrimaryKeyReading; OUString m_sSecondaryKeyReading; OUString m_sUserIndexName; + OUString m_sCitaitonText; Impl( SwXDocumentIndexMark & rThis, SwDoc *const pDoc, @@ -1826,6 +1828,7 @@ throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception) { case TOX_INDEX: case TOX_CONTENT: + case TOX_CITATION: pTOXType = pDoc->GetTOXType( m_pImpl->m_eTOXType, 0 ); break; case TOX_USER: @@ -1899,6 +1902,13 @@ throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception) } aMark.SetMainEntry(m_pImpl->m_bMainEntry); break; + case TOX_CITATION: + if (!m_pImpl->m_sCitaitonText.isEmpty()) + { + aMark.SetCitationKeyReading(m_pImpl->m_sCitaitonText); + } + aMark.SetMainEntry(m_pImpl->m_bMainEntry); + break; case TOX_USER: case TOX_CONTENT: if (USHRT_MAX != m_pImpl->m_nLevel) @@ -2225,6 +2235,15 @@ throw (beans::UnknownPropertyException, beans::PropertyVetoException, case WID_MAIN_ENTRY: m_pImpl->m_bMainEntry = lcl_AnyToBool(rValue); break; + case PROPERTY_MAP_INDEX_OBJECTS: + { + uno::Sequence<com::sun::star::beans::PropertyValue> aValues(1); + com::sun::star::beans::PropertyValue propertyVal; + rValue >>= aValues; + propertyVal = aValues[0]; + m_pImpl->m_sCitaitonText = lcl_AnyToString(propertyVal.Value); + } + break; } } else diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index a4cfd0b..a380dd0 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -1043,8 +1043,15 @@ void DocxAttributeOutput::EndField_Impl( FieldInfos& rInfos ) { // Write the Field latest value m_pSerializer->startElementNS( XML_w, XML_r, FSEND ); - - OUString sExpand( rInfos.pField->ExpandField( true ) ); + OUString sExpand; + if(rInfos.eType == ww::eCITATION) + { + sExpand = rInfos.pField->ExpandField( false , AUTH_FIELD_TITLE); + } + else + { + sExpand = rInfos.pField->ExpandField( true ); + } // newlines embedded in fields are 0x0B in MSO and 0x0A for us RunText(sExpand.replace(0x0A, 0x0B)); diff --git a/sw/source/filter/ww8/fields.cxx b/sw/source/filter/ww8/fields.cxx index baaa4b0..41c3929 100644 --- a/sw/source/filter/ww8/fields.cxx +++ b/sw/source/filter/ww8/fields.cxx @@ -126,7 +126,8 @@ namespace ww /*93*/ "ADDRESSBLOCK", /*94*/ "GREETINGLINE", /*95*/ "SHAPE", - /*96*/ "BIBLIOGRAPHY" + /*96*/ "BIBLIOGRAPHY", + /*97*/ "CITATION" }; size_t nIndex = static_cast<size_t>(eIndex); diff --git a/sw/source/filter/ww8/fields.hxx b/sw/source/filter/ww8/fields.hxx index ce88808..8bb8565 100644 --- a/sw/source/filter/ww8/fields.hxx +++ b/sw/source/filter/ww8/fields.hxx @@ -121,7 +121,8 @@ namespace ww eADDRESSBLOCK = 93, eGREETINGLINE = 94, eSHAPE = 95, - eBIBLIOGRPAHY=96 + eBIBLIOGRPAHY=96, + eCITATION = 97 }; /** Find the English Field Name from a winword index diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index 8094d9d..7eb3134 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -116,6 +116,7 @@ #include <flddropdown.hxx> #include <chpfld.hxx> #include <fmthdft.hxx> +#include <authfld.hxx> #include <filter/msfilter/sprmids.hxx> @@ -2862,6 +2863,13 @@ void AttributeOutputBase::TextField( const SwFmtFld& rField ) bWriteExpand = true; } break; + case RES_AUTHORITY: + { + const OUString sStr = " CITATION " + + lcl_GetExpandedField(*pFld); + GetExport().OutputField( pFld, ww::eCITATION, sStr ); + } + break; case RES_POSTITFLD: //Sadly only possible for word in main document text if (GetExport().nTxtTyp == TXT_MAINTEXT) diff --git a/sw/source/ui/index/cnttab.cxx b/sw/source/ui/index/cnttab.cxx index 2874313..fe1410b 100644 --- a/sw/source/ui/index/cnttab.cxx +++ b/sw/source/ui/index/cnttab.cxx @@ -958,6 +958,7 @@ static long lcl_TOXTypesToUserData(CurTOXType eType) case TOX_TABLES : nRet = TO_TABLE; break; case TOX_AUTHORITIES : nRet = TO_AUTHORITIES; break; case TOX_BIBLIOGRAPHY : nRet = TO_BIBLIOGRAPHY; break; + case TOX_CITATION :break; } return nRet; } @@ -1195,6 +1196,8 @@ void SwTOXSelectTabPage::FillTOXDescription() rDesc.SetAuthSequence(m_pSequenceCB->IsChecked()); } break; + case TOX_CITATION : + break; } rDesc.SetLevelFromChapter( m_pLevelFromChapterCB->IsVisible() && diff --git a/sw/source/ui/utlui/poolfmt.src b/sw/source/ui/utlui/poolfmt.src index fe2865a..7b4d41c 100644 --- a/sw/source/ui/utlui/poolfmt.src +++ b/sw/source/ui/utlui/poolfmt.src @@ -583,6 +583,10 @@ String STR_POOLCOLL_TOX_USER10 { Text [ en-US ] = "User Index 10" ; }; +String STR_POOLCOLL_TOX_CITATION +{ + Text [ en-US ] = "Citation" ; +}; String STR_POOLCOLL_TOX_ILLUSH { Text [ en-US ] = "Illustration Index Heading"; diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 516c436..b912ab4 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -143,6 +143,7 @@ DomainMapper_Impl::DomainMapper_Impl( m_xTextFactory( xModel, uno::UNO_QUERY ), m_xComponentContext( xContext ), m_bSetUserFieldContent( false ), + m_bSetCitation( false ), m_bIsFirstSection( true ), m_bIsColumnBreakDeferred( false ), m_bIsPageBreakDeferred( false ), @@ -2395,6 +2396,7 @@ if(!bFilled) {OUString("INDEX"), "com.sun.star.text.DocumentIndex", "", FIELD_INDEX}, {OUString("XE"), "com.sun.star.text.DocumentIndexMark", "", FIELD_XE}, {OUString("BIBLIOGRAPHY"), "com.sun.star.text.Bibliography", "", FILED_BIBLIOGRAPHY}, + {OUString("CITATION"), "com.sun.star.text.TextField.Bibliography", "", FIELD_CITATION}, // {OUString(""), "", "", FIELD_}, @@ -3003,6 +3005,7 @@ void DomainMapper_Impl::CloseFieldCommand() if( pContext.get() ) { m_bSetUserFieldContent = false; + m_bSetCitation = false; FieldConversionMap_t aFieldConversionMap = lcl_GetFieldConversion(); try @@ -3029,6 +3032,7 @@ void DomainMapper_Impl::CloseFieldCommand() case FIELD_INDEX: case FIELD_XE: case FILED_BIBLIOGRAPHY: + case FIELD_CITATION: case FIELD_TC: case FIELD_EQ: bCreateField = false; @@ -3548,6 +3552,38 @@ void DomainMapper_Impl::CloseFieldCommand() } } break; + case FIELD_CITATION: + { + xFieldInterface = m_xTextFactory->createInstance( + OUString::createFromAscii(aIt->second.cFieldServiceName)); + uno::Reference< beans::XPropertySet > xTC(xFieldInterface, + uno::UNO_QUERY_THROW); + + if( !sFirstParam.isEmpty()){ + uno::Sequence<com::sun::star::beans::PropertyValue> aValues(1); + com::sun::star::beans::PropertyValue propertyVal; + propertyVal.Name = "Identifier"; + propertyVal.Value = uno::makeAny(sFirstParam); + aValues[0] = propertyVal; + xTC->setPropertyValue("Fields", + uno::makeAny(aValues)); + } + uno::Reference< text::XTextContent > xToInsert( xTC, uno::UNO_QUERY ); + uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend; + if (xTextAppend.is()) + { + uno::Reference< text::XTextCursor > xCrsr = xTextAppend->getText()->createTextCursor(); + uno::Reference< text::XText > xText = xTextAppend->getText(); + if(xCrsr.is() && xText.is()) + { + xCrsr->gotoEnd(false); + xText->insertTextContent(uno::Reference< text::XTextRange >( xCrsr, uno::UNO_QUERY_THROW ), xToInsert, sal_False); + } + } + m_bSetCitation = true; + } + break; + case FIELD_TC : { uno::Reference< beans::XPropertySet > xTC( @@ -3679,6 +3715,50 @@ void DomainMapper_Impl::SetFieldResult(OUString const& rResult) rPropNameSupplier.GetName(PROP_CONTENT), uno::makeAny( rResult )); } + else if ( m_bSetCitation ) + { + + uno::Reference< beans::XPropertySet > xFieldProperties( xTextField, uno::UNO_QUERY_THROW); + // In case of SetExpression, the field result contains the content of the variable. + uno::Reference<lang::XServiceInfo> xServiceInfo(xTextField, uno::UNO_QUERY); + + bool bIsSetbiblio = xServiceInfo->supportsService("com.sun.star.text.TextField.Bibliography"); + if( bIsSetbiblio ) + { + com::sun::star::uno::Any aProperty = xFieldProperties->getPropertyValue("Fields"); + uno::Sequence<com::sun::star::beans::PropertyValue> aValues ; + aProperty >>= aValues; + com::sun::star::beans::PropertyValue propertyVal; + bool bTitleFound = false; + int i=0; + for (; i < aValues.getLength(); i++) + { + propertyVal = aValues[i]; + if(propertyVal.Name == "Title") + { + bTitleFound = true; + break; + } + } + if(bTitleFound) + { + OUString titleStr; + uno::Any aValue(propertyVal.Value); + aValue >>= titleStr; + titleStr = titleStr + rResult; + propertyVal.Value = uno::makeAny(titleStr); + aValues[i] = propertyVal; + } + else + { + propertyVal.Name = "Title"; + propertyVal.Value = uno::makeAny(rResult); + aValues[i] = propertyVal; + } + xFieldProperties->setPropertyValue("Fields", + uno::makeAny(aValues)); + } + } else { uno::Reference< beans::XPropertySet > xFieldProperties( xTextField, uno::UNO_QUERY_THROW); diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 6b7ca58..fe8a938 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -313,6 +313,7 @@ private: FieldStack m_aFieldStack; bool m_bSetUserFieldContent; + bool m_bSetCitation; bool m_bIsFirstSection; bool m_bIsColumnBreakDeferred; bool m_bIsPageBreakDeferred; diff --git a/writerfilter/source/dmapper/FieldTypes.hxx b/writerfilter/source/dmapper/FieldTypes.hxx index 9d3d360..d4daff4 100644 --- a/writerfilter/source/dmapper/FieldTypes.hxx +++ b/writerfilter/source/dmapper/FieldTypes.hxx @@ -259,7 +259,7 @@ enum FieldId \f Builds a table of contents using TC entries instead of outline levels \h Hyperlinks the entries and page numbers within the table of contents \l Defines the TC entries field level used to build a table of contents - \n Builds a table of contents or a range of entries, sucah as 1-9, in a table of contents without page numbers + \n Builds a table of contents or a range of entries, sucah as �1-9�, in a table of contents without page numbers \o Builds a table of contents by using outline levels instead of TC entries \p Defines the separator between the table entry and its page number \s Builds a table of contents by using a sequence type @@ -271,7 +271,7 @@ enum FieldId */ ,FIELD_TOC /* - TOC entry: text + TOC entry: �text� \f TC entry in doc with multiple tables \l Outline Level \n Suppress page numbers @@ -297,6 +297,9 @@ enum FieldId * Bibliography */ ,FILED_BIBLIOGRAPHY + /* Citation + */ + ,FIELD_CITATION }; }}
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits