diff options
Diffstat (limited to 'xmloff/source/text/txtflde.cxx')
-rw-r--r-- | xmloff/source/text/txtflde.cxx | 107 |
1 files changed, 98 insertions, 9 deletions
diff --git a/xmloff/source/text/txtflde.cxx b/xmloff/source/text/txtflde.cxx index f86a1d57c76f..b8077b0ea799 100644 --- a/xmloff/source/text/txtflde.cxx +++ b/xmloff/source/text/txtflde.cxx @@ -2,9 +2,9 @@ * * $RCSfile: txtflde.cxx,v $ * - * $Revision: 1.20 $ + * $Revision: 1.21 $ * - * last change: $Author: mtg $ $Date: 2001-02-28 11:36:41 $ + * last change: $Author: dvo $ $Date: 2001-03-09 14:10:33 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -385,6 +385,7 @@ inline Date const GetDateProperty( const OUString& sPropName, XMLTextFieldExport::XMLTextFieldExport( SvXMLExport& rExp, XMLPropertyState* pCombinedCharState) : rExport(rExp), + pUsedMasters(NULL), sServicePrefix( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextField.")), sFieldMasterPrefix( @@ -457,13 +458,16 @@ XMLTextFieldExport::XMLTextFieldExport( SvXMLExport& rExp, sPropertyAuthor(RTL_CONSTASCII_USTRINGPARAM("Author")), sPropertyDate(RTL_CONSTASCII_USTRINGPARAM("Date")), sPropertyMeasureKind(RTL_CONSTASCII_USTRINGPARAM("Kind")), + sPropertyInstanceName(RTL_CONSTASCII_USTRINGPARAM("InstanceName")), pCombinedCharactersPropertyState(pCombinedCharState) { + SetExportOnlyUsedFieldDeclarations(); } XMLTextFieldExport::~XMLTextFieldExport() { delete pCombinedCharactersPropertyState; + delete pUsedMasters; } /// get the field ID (as in FieldIDEnum) from XTextField @@ -820,6 +824,33 @@ void XMLTextFieldExport::ExportFieldAutoStyle( // get property set Reference<XPropertySet> xPropSet(rTextField, UNO_QUERY); + // add field master to list of used field masters (if desired) + if (NULL != pUsedMasters) + { + Reference<XDependentTextField> xDepField(rTextField, UNO_QUERY); + if (xDepField.is()) + { + Reference<XText> xOurText = rTextField->getAnchor()->getText(); + + map<Reference<XText>, set<OUString> >::iterator aMapIter = + pUsedMasters->find(xOurText); + + // insert a list for our XText (if necessary) + if (aMapIter == pUsedMasters->end()) + { + set<OUString> * pSet = new set<OUString> ; + (*pUsedMasters)[xOurText] = *pSet; + aMapIter = pUsedMasters->find(xOurText); + } + + // insert this text field master + OUString sFieldMasterName = GetStringProperty( + sPropertyInstanceName, xDepField->getTextFieldMaster()); + aMapIter->second.insert( sFieldMasterName ); + } + // else: no dependent field -> no master -> ignore + } + // get Field ID sal_uInt16 nToken = GetFieldID(rTextField, xPropSet); @@ -1663,28 +1694,75 @@ void XMLTextFieldExport::ExportFieldHelper( } } + /// export field declarations / field masters void XMLTextFieldExport::ExportFieldDeclarations() { + Reference<XText> xEmptyText; + ExportFieldDeclarations(xEmptyText); +} + +/// export field declarations / field masters +void XMLTextFieldExport::ExportFieldDeclarations( + const Reference<XText> & rText ) +{ // store lists for decl elements vector<OUString> aVarName; vector<OUString> aUserName; vector<OUString> aSeqName; vector<OUString> aDdeName; - // get text fields supplier + // get text fields supplier and field master name access Reference<XTextFieldsSupplier> xTextFieldsSupp(GetExport().GetModel(), UNO_QUERY); - - // iterate over field masters Reference<container::XNameAccess> xFieldMasterNameAccess( xTextFieldsSupp->getTextFieldMasters(), UNO_QUERY); - Sequence<OUString> fieldMasters = - xFieldMasterNameAccess->getElementNames(); - for(sal_Int32 i=0; i<fieldMasters.getLength(); i++) { + + // where to get the text field masters from? + // a) we get a specific XText: then use pUsedMasters + // b) the XText is empty: then export all text fields + Sequence<OUString> aFieldMasters; + if (rText.is()) + { + // export only used masters + DBG_ASSERT(NULL != pUsedMasters, + "field masters must be recorded in order to be " + "written out separatly" ); + if (NULL != pUsedMasters) + { + map<Reference<XText>, set<OUString> > ::iterator aMapIter = + pUsedMasters->find(rText); + if (aMapIter != pUsedMasters->end()) + { + // found the set of used field masters + set<OUString> & rOurMasters = aMapIter->second; + + // copy set to sequence + aFieldMasters.realloc( rOurMasters.size() ); + sal_Int32 i = 0; + for( set<OUString>::iterator aSetIter = rOurMasters.begin(); + aSetIter != rOurMasters.end(); + aSetIter++, i++ ) + { + aFieldMasters[i] = *aSetIter; + } + + pUsedMasters->erase(rText); + } + // else: XText not found -> ignore + } + // else: no field masters have been recorded -> ignore + } + else + { + // no XText: export all! + aFieldMasters = xFieldMasterNameAccess->getElementNames(); + } + + for(sal_Int32 i=0; i<aFieldMasters.getLength(); i++) { // get field master name - OUString sFieldMaster = fieldMasters[i]; + OUString sFieldMaster = aFieldMasters[i]; // workaround for #no-bug# static const sal_Char sDB[] = @@ -1943,6 +2021,17 @@ void XMLTextFieldExport::ExportFieldDeclarations() // else: no declarations element } +void XMLTextFieldExport::SetExportOnlyUsedFieldDeclarations( + sal_Bool bExportOnlyUsed) +{ + delete pUsedMasters; + pUsedMasters = NULL; + + // create used masters set (if none is used) + if (bExportOnlyUsed) + pUsedMasters = new map<Reference<XText>, set<OUString> > ; +} + void XMLTextFieldExport::ExportElement(const sal_Char* pElementName, sal_Bool bAddSpace) { |