1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_xmloff.hxx" 26 27 28 #include "XMLIndexAlphabeticalSourceContext.hxx" 29 #include <com/sun/star/beans/XPropertySet.hpp> 30 #include <com/sun/star/container/XIndexReplace.hpp> 31 #include "XMLIndexTemplateContext.hxx" 32 #include "XMLIndexTitleTemplateContext.hxx" 33 #include "XMLIndexTOCStylesContext.hxx" 34 #include <xmloff/xmlictxt.hxx> 35 #include <xmloff/xmlimp.hxx> 36 #include <xmloff/txtimp.hxx> 37 #include "xmloff/xmlnmspe.hxx" 38 #include <xmloff/nmspmap.hxx> 39 #include <xmloff/xmltoken.hxx> 40 #include <xmloff/xmluconv.hxx> 41 #include <tools/debug.hxx> 42 #include <rtl/ustring.hxx> 43 44 45 46 47 using ::rtl::OUString; 48 using ::com::sun::star::beans::XPropertySet; 49 using ::com::sun::star::uno::Reference; 50 using ::com::sun::star::uno::Any; 51 using ::com::sun::star::xml::sax::XAttributeList; 52 using ::xmloff::token::IsXMLToken; 53 using ::xmloff::token::XML_ALPHABETICAL_INDEX_ENTRY_TEMPLATE; 54 using ::xmloff::token::XML_OUTLINE_LEVEL; 55 56 const sal_Char sAPI_MainEntryCharacterStyleName[] = "MainEntryCharacterStyleName"; 57 const sal_Char sAPI_UseAlphabeticalSeparators[] = "UseAlphabeticalSeparators"; 58 const sal_Char sAPI_UseCombinedEntries[] = "UseCombinedEntries"; 59 const sal_Char sAPI_IsCaseSensitive[] = "IsCaseSensitive"; 60 const sal_Char sAPI_UseKeyAsEntry[] = "UseKeyAsEntry"; 61 const sal_Char sAPI_UseUpperCase[] = "UseUpperCase"; 62 const sal_Char sAPI_UseDash[] = "UseDash"; 63 const sal_Char sAPI_UsePP[] = "UsePP"; 64 const sal_Char sAPI_SortAlgorithm[] = "SortAlgorithm"; 65 const sal_Char sAPI_Locale[] = "Locale"; 66 67 68 TYPEINIT1( XMLIndexAlphabeticalSourceContext, XMLIndexSourceBaseContext ); 69 70 XMLIndexAlphabeticalSourceContext::XMLIndexAlphabeticalSourceContext( 71 SvXMLImport& rImport, 72 sal_uInt16 nPrfx, 73 const OUString& rLocalName, 74 Reference<XPropertySet> & rPropSet) 75 : XMLIndexSourceBaseContext(rImport, nPrfx, rLocalName, rPropSet, sal_False) 76 , sMainEntryCharacterStyleName(RTL_CONSTASCII_USTRINGPARAM(sAPI_MainEntryCharacterStyleName)) 77 , sUseAlphabeticalSeparators(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseAlphabeticalSeparators)) 78 , sUseCombinedEntries(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseCombinedEntries)) 79 , sIsCaseSensitive(RTL_CONSTASCII_USTRINGPARAM(sAPI_IsCaseSensitive)) 80 , sUseKeyAsEntry(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseKeyAsEntry)) 81 , sUseUpperCase(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseUpperCase)) 82 , sUseDash(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseDash)) 83 , sUsePP(RTL_CONSTASCII_USTRINGPARAM(sAPI_UsePP)) 84 , sIsCommaSeparated(RTL_CONSTASCII_USTRINGPARAM("IsCommaSeparated")) 85 , sSortAlgorithm(RTL_CONSTASCII_USTRINGPARAM(sAPI_SortAlgorithm)) 86 , sLocale(RTL_CONSTASCII_USTRINGPARAM(sAPI_Locale)) 87 , bMainEntryStyleNameOK(sal_False) 88 , bSeparators(sal_False) 89 , bCombineEntries(sal_True) 90 , bCaseSensitive(sal_True) 91 , bEntry(sal_False) 92 , bUpperCase(sal_False) 93 , bCombineDash(sal_False) 94 , bCombinePP(sal_True) 95 , bCommaSeparated(sal_False) 96 { 97 } 98 99 XMLIndexAlphabeticalSourceContext::~XMLIndexAlphabeticalSourceContext() 100 { 101 } 102 103 void XMLIndexAlphabeticalSourceContext::ProcessAttribute( 104 enum IndexSourceParamEnum eParam, 105 const OUString& rValue) 106 { 107 sal_Bool bTmp; 108 109 switch (eParam) 110 { 111 case XML_TOK_INDEXSOURCE_MAIN_ENTRY_STYLE: 112 { 113 sMainEntryStyleName = rValue; 114 OUString sDisplayStyleName = GetImport().GetStyleDisplayName( 115 XML_STYLE_FAMILY_TEXT_TEXT, sMainEntryStyleName ); 116 const Reference < ::com::sun::star::container::XNameContainer >& 117 rStyles = GetImport().GetTextImport()->GetTextStyles(); 118 bMainEntryStyleNameOK = rStyles.is() && rStyles->hasByName( sDisplayStyleName ); 119 } 120 break; 121 122 case XML_TOK_INDEXSOURCE_IGNORE_CASE: 123 if (SvXMLUnitConverter::convertBool(bTmp, rValue)) 124 { 125 bCaseSensitive = !bTmp; 126 } 127 break; 128 129 case XML_TOK_INDEXSOURCE_SEPARATORS: 130 if (SvXMLUnitConverter::convertBool(bTmp, rValue)) 131 { 132 bSeparators = bTmp; 133 } 134 break; 135 136 case XML_TOK_INDEXSOURCE_COMBINE_ENTRIES: 137 if (SvXMLUnitConverter::convertBool(bTmp, rValue)) 138 { 139 bCombineEntries = bTmp; 140 } 141 break; 142 143 case XML_TOK_INDEXSOURCE_COMBINE_WITH_DASH: 144 if (SvXMLUnitConverter::convertBool(bTmp, rValue)) 145 { 146 bCombineDash = bTmp; 147 } 148 break; 149 case XML_TOK_INDEXSOURCE_KEYS_AS_ENTRIES: 150 if (SvXMLUnitConverter::convertBool(bTmp, rValue)) 151 { 152 bEntry = bTmp; 153 } 154 break; 155 156 case XML_TOK_INDEXSOURCE_COMBINE_WITH_PP: 157 if (SvXMLUnitConverter::convertBool(bTmp, rValue)) 158 { 159 bCombinePP = bTmp; 160 } 161 break; 162 163 case XML_TOK_INDEXSOURCE_CAPITALIZE: 164 if (SvXMLUnitConverter::convertBool(bTmp, rValue)) 165 { 166 bUpperCase = bTmp; 167 } 168 break; 169 170 case XML_TOK_INDEXSOURCE_COMMA_SEPARATED: 171 if (SvXMLUnitConverter::convertBool(bTmp, rValue)) 172 { 173 bCommaSeparated = bTmp; 174 } 175 break; 176 177 case XML_TOK_INDEXSOURCE_SORT_ALGORITHM: 178 sAlgorithm = rValue; 179 break; 180 case XML_TOK_INDEXSOURCE_LANGUAGE: 181 aLocale.Language = rValue; 182 break; 183 case XML_TOK_INDEXSOURCE_COUNTRY: 184 aLocale.Country = rValue; 185 break; 186 187 default: 188 XMLIndexSourceBaseContext::ProcessAttribute(eParam, rValue); 189 break; 190 } 191 } 192 193 void XMLIndexAlphabeticalSourceContext::EndElement() 194 { 195 196 Any aAny; 197 198 if (bMainEntryStyleNameOK) 199 { 200 aAny <<= GetImport().GetStyleDisplayName( 201 XML_STYLE_FAMILY_TEXT_TEXT, sMainEntryStyleName ); 202 rIndexPropertySet->setPropertyValue(sMainEntryCharacterStyleName,aAny); 203 } 204 205 aAny.setValue(&bSeparators, ::getBooleanCppuType()); 206 rIndexPropertySet->setPropertyValue(sUseAlphabeticalSeparators, aAny); 207 208 aAny.setValue(&bCombineEntries, ::getBooleanCppuType()); 209 rIndexPropertySet->setPropertyValue(sUseCombinedEntries, aAny); 210 211 aAny.setValue(&bCaseSensitive, ::getBooleanCppuType()); 212 rIndexPropertySet->setPropertyValue(sIsCaseSensitive, aAny); 213 214 aAny.setValue(&bEntry, ::getBooleanCppuType()); 215 rIndexPropertySet->setPropertyValue(sUseKeyAsEntry, aAny); 216 217 aAny.setValue(&bUpperCase, ::getBooleanCppuType()); 218 rIndexPropertySet->setPropertyValue(sUseUpperCase, aAny); 219 220 aAny.setValue(&bCombineDash, ::getBooleanCppuType()); 221 rIndexPropertySet->setPropertyValue(sUseDash, aAny); 222 223 aAny.setValue(&bCombinePP, ::getBooleanCppuType()); 224 rIndexPropertySet->setPropertyValue(sUsePP, aAny); 225 226 aAny.setValue(&bCommaSeparated, ::getBooleanCppuType()); 227 rIndexPropertySet->setPropertyValue(sIsCommaSeparated, aAny); 228 229 230 if (sAlgorithm.getLength() > 0) 231 { 232 aAny <<= sAlgorithm; 233 rIndexPropertySet->setPropertyValue(sSortAlgorithm, aAny); 234 } 235 236 if ( (aLocale.Language.getLength() > 0) && 237 (aLocale.Country.getLength() > 0) ) 238 { 239 aAny <<= aLocale; 240 rIndexPropertySet->setPropertyValue(sLocale, aAny); 241 } 242 243 XMLIndexSourceBaseContext::EndElement(); 244 } 245 246 SvXMLImportContext* XMLIndexAlphabeticalSourceContext::CreateChildContext( 247 sal_uInt16 nPrefix, 248 const OUString& rLocalName, 249 const Reference<XAttributeList> & xAttrList ) 250 { 251 if ( (XML_NAMESPACE_TEXT == nPrefix) && 252 IsXMLToken( rLocalName, XML_ALPHABETICAL_INDEX_ENTRY_TEMPLATE ) ) 253 { 254 return new XMLIndexTemplateContext(GetImport(), rIndexPropertySet, 255 nPrefix, rLocalName, 256 aLevelNameAlphaMap, 257 XML_OUTLINE_LEVEL, 258 aLevelStylePropNameAlphaMap, 259 aAllowedTokenTypesAlpha); 260 } 261 else 262 { 263 return XMLIndexSourceBaseContext::CreateChildContext(nPrefix, 264 rLocalName, 265 xAttrList); 266 } 267 } 268