diff options
author | Rohit Deshmukh <rohit.deshmukh@synerzip.com> | 2014-03-12 15:07:38 +0530 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-03-14 10:45:33 +0100 |
commit | 06f7d1a96eef5aa69d4872ff6d96eb5085296d09 (patch) | |
tree | 7b155faff164f15c78492b46a9c5586d05195e96 | |
parent | 7545a9054cd8fbca0073b4603b833080b4810a94 (diff) |
fdo#74775: Preseved Citation after round trip.
Conflicts:
sw/qa/extras/ooxmlexport/ooxmlexport.cxx
Reviewed on:
https://gerrit.libreoffice.org/8473
Change-Id: Ie1b0ac3cb4d4b9bf305323599d5e4b63f913fb1b
27 files changed, 198 insertions, 13 deletions
diff --git a/sw/inc/authfld.hxx b/sw/inc/authfld.hxx index 55ed5b77edee..a26cc6d30122 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 26df00f5b8ff..90cd505cc2e3 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 c9c87c6550d1..423fad5c48ed 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 df10cbd05154..60ab4a16cb3a 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 ee3b6c6ff841..f6c578fa390c 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 dbb343539d17..5bf5c9d5a735 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 Binary files differnew file mode 100644 index 000000000000..a8ee58895cf3 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/FDO74775.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index a0ea66438947..96c1995a920d 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 48e0951e7b1e..1da16aa7f5cf 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 7fb5b700162e..0896535a6134 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 c83a82fdee05..76fb0f9e12d3 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 1931d821c4ac..8f0abbc0e7d0 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 c5a105e91ff8..e4a59643646b 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 62875171feaf..c29bd7b402bd 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 1a745a735392..d59e0bea3f16 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 6df29075cf65..c368dc4e625f 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 81e47ff75eaa..999b27b79fbf 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 ddedefff7b54..94b785ad1da3 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 a4cfd0b7035c..a380dd0c5272 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 baaa4b0100a2..41c3929e0b1b 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 ce888085c73e..8bb8565deeae 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 8094d9d27e3f..7eb3134bc9ae 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 28743137aa99..fe1410b8a478 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 fe2865a7df5f..7b4d41c790a4 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 516c4361a333..b912ab48a62d 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 6b7ca583c9f6..fe8a93807078 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 9d3d360f8d3b..d4daff49526a 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 }; }} |