|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_xmloff.hxx" | 
|  |  | 
|  |  | 
|  | #include "XMLIndexBibliographyConfigurationContext.hxx" | 
|  | #include "XMLIndexBibliographyEntryContext.hxx" | 
|  | #include <xmloff/xmlictxt.hxx> | 
|  | #include <xmloff/xmlimp.hxx> | 
|  | #include <xmloff/txtimp.hxx> | 
|  | #include <xmloff/nmspmap.hxx> | 
|  | #include "xmloff/xmlnmspe.hxx" | 
|  | #include <xmloff/xmltoken.hxx> | 
|  | #include <xmloff/xmluconv.hxx> | 
|  | #include <tools/debug.hxx> | 
|  | #include <rtl/ustring.hxx> | 
|  | #include <com/sun/star/beans/XPropertySet.hpp> | 
|  | #include <com/sun/star/lang/XMultiServiceFactory.hpp> | 
|  |  | 
|  | using namespace ::com::sun::star::text; | 
|  | using namespace ::com::sun::star::uno; | 
|  | using namespace ::xmloff::token; | 
|  |  | 
|  | using ::rtl::OUString; | 
|  | using ::com::sun::star::xml::sax::XAttributeList; | 
|  | using ::com::sun::star::beans::PropertyValue; | 
|  | using ::com::sun::star::beans::XPropertySet; | 
|  | using ::com::sun::star::lang::XMultiServiceFactory; | 
|  |  | 
|  | const sal_Char sAPI_FieldMaster_Bibliography[] = | 
|  | "com.sun.star.text.FieldMaster.Bibliography"; | 
|  |  | 
|  |  | 
|  | TYPEINIT1( XMLIndexBibliographyConfigurationContext, SvXMLStyleContext ); | 
|  |  | 
|  | XMLIndexBibliographyConfigurationContext::XMLIndexBibliographyConfigurationContext( | 
|  | SvXMLImport& rImport, | 
|  | sal_uInt16 nPrfx, | 
|  | const OUString& rLocalName, | 
|  | const Reference<XAttributeList> & xAttrList) : | 
|  | SvXMLStyleContext(rImport, nPrfx, rLocalName, xAttrList, XML_STYLE_FAMILY_TEXT_BIBLIOGRAPHYCONFIG), | 
|  | sFieldMaster_Bibliography( | 
|  | RTL_CONSTASCII_USTRINGPARAM(sAPI_FieldMaster_Bibliography)), | 
|  | sBracketBefore(RTL_CONSTASCII_USTRINGPARAM("BracketBefore")), | 
|  | sBracketAfter(RTL_CONSTASCII_USTRINGPARAM("BracketAfter")), | 
|  | sIsNumberEntries(RTL_CONSTASCII_USTRINGPARAM("IsNumberEntries")), | 
|  | sIsSortByPosition(RTL_CONSTASCII_USTRINGPARAM("IsSortByPosition")), | 
|  | sSortKeys(RTL_CONSTASCII_USTRINGPARAM("SortKeys")), | 
|  | sSortKey(RTL_CONSTASCII_USTRINGPARAM("SortKey")), | 
|  | sIsSortAscending(RTL_CONSTASCII_USTRINGPARAM("IsSortAscending")), | 
|  | sSortAlgorithm(RTL_CONSTASCII_USTRINGPARAM("SortAlgorithm")), | 
|  | sLocale(RTL_CONSTASCII_USTRINGPARAM("Locale")), | 
|  | sSuffix(), | 
|  | sPrefix(), | 
|  | sAlgorithm(), | 
|  | aLocale(), | 
|  | bNumberedEntries(sal_False), | 
|  | bSortByPosition(sal_True) | 
|  | { | 
|  | } | 
|  |  | 
|  | XMLIndexBibliographyConfigurationContext::~XMLIndexBibliographyConfigurationContext() | 
|  | { | 
|  | } | 
|  |  | 
|  | void XMLIndexBibliographyConfigurationContext::StartElement( | 
|  | const Reference<XAttributeList> & xAttrList) | 
|  | { | 
|  | sal_Int16 nLength = xAttrList->getLength(); | 
|  | for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++) | 
|  | { | 
|  | OUString sLocalName; | 
|  | sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). | 
|  | GetKeyByAttrName( xAttrList->getNameByIndex(nAttr), | 
|  | &sLocalName ); | 
|  |  | 
|  | ProcessAttribute(nPrefix, sLocalName, | 
|  | xAttrList->getValueByIndex(nAttr)); | 
|  | // else: ignore | 
|  | } | 
|  | } | 
|  |  | 
|  | void XMLIndexBibliographyConfigurationContext::ProcessAttribute( | 
|  | sal_uInt16 nPrefix, | 
|  | OUString sLocalName, | 
|  | OUString sValue) | 
|  | { | 
|  | if( XML_NAMESPACE_TEXT == nPrefix ) | 
|  | { | 
|  | if( IsXMLToken(sLocalName, XML_PREFIX) ) | 
|  | { | 
|  | sPrefix = sValue; | 
|  | } | 
|  | else if( IsXMLToken(sLocalName, XML_SUFFIX) ) | 
|  | { | 
|  | sSuffix = sValue; | 
|  | } | 
|  | else if( IsXMLToken(sLocalName, XML_NUMBERED_ENTRIES) ) | 
|  | { | 
|  | sal_Bool bTmp; | 
|  | if( SvXMLUnitConverter::convertBool(bTmp, sValue) ) | 
|  | { | 
|  | bNumberedEntries = bTmp; | 
|  | } | 
|  | } | 
|  | else if( IsXMLToken(sLocalName, XML_SORT_BY_POSITION) ) | 
|  | { | 
|  | sal_Bool bTmp; | 
|  | if (SvXMLUnitConverter::convertBool(bTmp, sValue)) | 
|  | { | 
|  | bSortByPosition = bTmp; | 
|  | } | 
|  | } | 
|  | else if( IsXMLToken(sLocalName, XML_SORT_ALGORITHM) ) | 
|  | { | 
|  | sAlgorithm = sValue; | 
|  | } | 
|  | } | 
|  | else if( XML_NAMESPACE_FO == nPrefix ) | 
|  | { | 
|  | if( IsXMLToken(sLocalName, XML_LANGUAGE) ) | 
|  | { | 
|  | aLocale.Language = sValue; | 
|  | } | 
|  | else if( IsXMLToken(sLocalName, XML_COUNTRY) ) | 
|  | { | 
|  | aLocale.Country = sValue; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | SvXMLImportContext *XMLIndexBibliographyConfigurationContext::CreateChildContext( | 
|  | sal_uInt16 nPrefix, | 
|  | const OUString& rLocalName, | 
|  | const Reference<XAttributeList> & xAttrList ) | 
|  | { | 
|  | OUString sKey; | 
|  | sal_Bool bSort(sal_True); | 
|  |  | 
|  | // process children here and use default context! | 
|  | if ( ( nPrefix == XML_NAMESPACE_TEXT ) && | 
|  | IsXMLToken( rLocalName, XML_SORT_KEY ) ) | 
|  | { | 
|  | sal_Int16 nLength = xAttrList->getLength(); | 
|  | for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++) | 
|  | { | 
|  | OUString sLocalName; | 
|  | sal_uInt16 nPrfx = GetImport().GetNamespaceMap(). | 
|  | GetKeyByAttrName( xAttrList->getNameByIndex(nAttr), | 
|  | &sLocalName ); | 
|  |  | 
|  | if (nPrfx == XML_NAMESPACE_TEXT) | 
|  | { | 
|  | if ( IsXMLToken( sLocalName, XML_KEY ) ) | 
|  | { | 
|  | sKey = xAttrList->getValueByIndex(nAttr); | 
|  | } | 
|  | else if ( IsXMLToken( sLocalName, XML_SORT_ASCENDING ) ) | 
|  | { | 
|  | sal_Bool bTmp; | 
|  | if (SvXMLUnitConverter::convertBool( | 
|  | bTmp, xAttrList->getValueByIndex(nAttr))) | 
|  | { | 
|  | bSort = bTmp; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // valid data? | 
|  | sal_uInt16 nKey; | 
|  | if (SvXMLUnitConverter::convertEnum(nKey, sKey, | 
|  | aBibliographyDataFieldMap)) | 
|  | { | 
|  |  | 
|  | Any aAny; | 
|  | Sequence<PropertyValue> aKey(2); | 
|  |  | 
|  | PropertyValue aNameValue; | 
|  | aNameValue.Name = sSortKey; | 
|  | aAny <<= (sal_Int16)nKey; | 
|  | aNameValue.Value = aAny; | 
|  | aKey[0] = aNameValue; | 
|  |  | 
|  | PropertyValue aSortValue; | 
|  | aSortValue.Name = sIsSortAscending; | 
|  | aAny.setValue(&bSort, ::getBooleanCppuType()); | 
|  | aSortValue.Value = aAny; | 
|  | aKey[1] = aSortValue; | 
|  |  | 
|  | aSortKeys.push_back(aKey); | 
|  | } | 
|  | } | 
|  |  | 
|  | return SvXMLImportContext::CreateChildContext(nPrefix, rLocalName, | 
|  | xAttrList); | 
|  | } | 
|  |  | 
|  | void XMLIndexBibliographyConfigurationContext::CreateAndInsert(sal_Bool) | 
|  | { | 
|  | // (code almost the same as export...) | 
|  |  | 
|  | // insert and block mode is handled in insertStyleFamily | 
|  |  | 
|  | // first: get field master | 
|  | // (we'll create one, and get the only master for this type) | 
|  | Reference<XMultiServiceFactory> xFactory(GetImport().GetModel(),UNO_QUERY); | 
|  | if( xFactory.is() ) | 
|  | { | 
|  | Sequence<rtl::OUString> aServices = xFactory->getAvailableServiceNames(); | 
|  | sal_Bool bFound(sal_False); | 
|  | sal_Int32 i(0); | 
|  | sal_Int32 nServiceCount(aServices.getLength()); | 
|  | while (i < nServiceCount && !bFound) | 
|  | { | 
|  | if (aServices[i].equals(sFieldMaster_Bibliography)) | 
|  | // here we should use a methode which compares in reverse order if available | 
|  | // #85282# | 
|  | bFound = sal_True; | 
|  | else | 
|  | i++; | 
|  | } | 
|  | if (bFound) | 
|  | { | 
|  | Reference<XInterface> xIfc = | 
|  | xFactory->createInstance(sFieldMaster_Bibliography); | 
|  | if( xIfc.is() ) | 
|  | { | 
|  | Reference<XPropertySet> xPropSet( xIfc, UNO_QUERY ); | 
|  | Any aAny; | 
|  |  | 
|  | aAny <<= sSuffix; | 
|  | xPropSet->setPropertyValue(sBracketAfter, aAny); | 
|  |  | 
|  | aAny <<= sPrefix; | 
|  | xPropSet->setPropertyValue(sBracketBefore, aAny); | 
|  |  | 
|  | aAny.setValue(&bNumberedEntries, ::getBooleanCppuType()); | 
|  | xPropSet->setPropertyValue(sIsNumberEntries, aAny); | 
|  |  | 
|  | aAny.setValue(&bSortByPosition, ::getBooleanCppuType()); | 
|  | xPropSet->setPropertyValue(sIsSortByPosition, aAny); | 
|  |  | 
|  | if( (aLocale.Language.getLength() > 0) && | 
|  | (aLocale.Country.getLength() > 0)     ) | 
|  | { | 
|  | aAny <<= aLocale; | 
|  | xPropSet->setPropertyValue(sLocale, aAny); | 
|  | } | 
|  |  | 
|  | if( sAlgorithm.getLength() > 0 ) | 
|  | { | 
|  | aAny <<= sAlgorithm; | 
|  | xPropSet->setPropertyValue(sSortAlgorithm, aAny); | 
|  | } | 
|  |  | 
|  | sal_Int32 nCount = aSortKeys.size(); | 
|  | Sequence<Sequence<PropertyValue> > aKeysSeq(nCount); | 
|  | for(i = 0; i < nCount; i++) | 
|  | { | 
|  | aKeysSeq[i] = aSortKeys[i]; | 
|  | } | 
|  | aAny <<= aKeysSeq; | 
|  | xPropSet->setPropertyValue(sSortKeys, aAny); | 
|  | } | 
|  | // else: can't get FieldMaster -> ignore | 
|  | } | 
|  | } | 
|  | // else: can't even get Factory -> ignore | 
|  | } |