xref: /AOO41X/main/xmloff/source/text/XMLIndexTOCStylesContext.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
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 "XMLIndexTOCStylesContext.hxx"
29 #include <com/sun/star/beans/XPropertySet.hpp>
30 #include <com/sun/star/container/XIndexReplace.hpp>
31 #include <xmloff/xmlictxt.hxx>
32 #include <xmloff/xmlimp.hxx>
33 #include <xmloff/txtimp.hxx>
34 #include "xmloff/xmlnmspe.hxx"
35 #include <xmloff/nmspmap.hxx>
36 #include <xmloff/xmltoken.hxx>
37 #include <xmloff/xmluconv.hxx>
38 #include <com/sun/star/uno/Sequence.hxx>
39 #include <tools/debug.hxx>
40 #include <rtl/ustring.hxx>
41 
42 
43 using namespace ::xmloff::token;
44 
45 using ::rtl::OUString;
46 using ::com::sun::star::beans::XPropertySet;
47 using ::com::sun::star::uno::Reference;
48 using ::com::sun::star::uno::Sequence;
49 using ::com::sun::star::uno::Any;
50 using ::com::sun::star::container::XIndexReplace;
51 using ::com::sun::star::xml::sax::XAttributeList;
52 
53 
54 const sal_Char sAPI_LevelParagraphStyles[] = "LevelParagraphStyles";
55 
56 TYPEINIT1( XMLIndexTOCStylesContext, SvXMLImportContext );
57 
58 
XMLIndexTOCStylesContext(SvXMLImport & rImport,Reference<XPropertySet> & rPropSet,sal_uInt16 nPrfx,const OUString & rLocalName)59 XMLIndexTOCStylesContext::XMLIndexTOCStylesContext(
60     SvXMLImport& rImport,
61     Reference<XPropertySet> & rPropSet,
62     sal_uInt16 nPrfx,
63     const OUString& rLocalName )
64 :   SvXMLImportContext(rImport, nPrfx, rLocalName)
65 ,   sLevelParagraphStyles(RTL_CONSTASCII_USTRINGPARAM(sAPI_LevelParagraphStyles))
66 ,   rTOCPropertySet(rPropSet)
67 {
68 }
69 
~XMLIndexTOCStylesContext()70 XMLIndexTOCStylesContext::~XMLIndexTOCStylesContext()
71 {
72 }
73 
StartElement(const Reference<XAttributeList> & xAttrList)74 void XMLIndexTOCStylesContext::StartElement(
75     const Reference<XAttributeList> & xAttrList )
76 {
77     // find text:outline-level attribute
78     sal_Int16 nCount = xAttrList->getLength();
79     for(sal_Int16 nAttr = 0; nAttr < nCount; nAttr++)
80     {
81         OUString sLocalName;
82         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
83             GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
84                               &sLocalName );
85         if ( (XML_NAMESPACE_TEXT == nPrefix) &&
86              (IsXMLToken(sLocalName, XML_OUTLINE_LEVEL)) )
87         {
88             sal_Int32 nTmp;
89             if (SvXMLUnitConverter::convertNumber(
90                     nTmp, xAttrList->getValueByIndex(nAttr), 1,
91                     GetImport().GetTextImport()->GetChapterNumbering()->
92                                                                 getCount()))
93             {
94                 // API numbers 0..9, we number 1..10
95                 nOutlineLevel = nTmp-1;
96             }
97         }
98     }
99 }
100 
EndElement()101 void XMLIndexTOCStylesContext::EndElement()
102 {
103     // if valid...
104     if (nOutlineLevel >= 0)
105     {
106         // copy vector into sequence
107         const sal_Int32 nCount = aStyleNames.size();
108         Sequence<OUString> aStyleNamesSequence(nCount);
109         for(sal_Int32 i = 0; i < nCount; i++)
110         {
111             aStyleNamesSequence[i] = GetImport().GetStyleDisplayName(
112                             XML_STYLE_FAMILY_TEXT_PARAGRAPH,
113                             aStyleNames[i] );
114         }
115 
116         // get index replace
117         Any aAny = rTOCPropertySet->getPropertyValue(sLevelParagraphStyles);
118         Reference<XIndexReplace> xIndexReplace;
119         aAny >>= xIndexReplace;
120 
121         // set style names
122         aAny <<= aStyleNamesSequence;
123         xIndexReplace->replaceByIndex(nOutlineLevel, aAny);
124     }
125 }
126 
CreateChildContext(sal_uInt16 p_nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)127 SvXMLImportContext *XMLIndexTOCStylesContext::CreateChildContext(
128     sal_uInt16 p_nPrefix,
129     const OUString& rLocalName,
130     const Reference<XAttributeList> & xAttrList )
131 {
132     // check for index-source-style
133     if ( (XML_NAMESPACE_TEXT == p_nPrefix) &&
134          IsXMLToken( rLocalName, XML_INDEX_SOURCE_STYLE ) )
135     {
136         // find text:style-name attribute and record in aStyleNames
137         sal_Int16 nCount = xAttrList->getLength();
138         for(sal_Int16 nAttr = 0; nAttr < nCount; nAttr++)
139         {
140             OUString sLocalName;
141             sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
142                 GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
143                                   &sLocalName );
144             if ( (XML_NAMESPACE_TEXT == nPrefix) &&
145                  IsXMLToken( sLocalName, XML_STYLE_NAME ) )
146             {
147                 aStyleNames.push_back(xAttrList->getValueByIndex(nAttr));
148             }
149         }
150     }
151 
152     // always return default context; we already got the interesting info
153     return SvXMLImportContext::CreateChildContext(p_nPrefix, rLocalName,
154                                                   xAttrList);
155 }
156