1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*63bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*63bba73cSAndrew Rist  * distributed with this work for additional information
6*63bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*63bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*63bba73cSAndrew Rist  *
11*63bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*63bba73cSAndrew Rist  *
13*63bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist  * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*63bba73cSAndrew Rist  * specific language governing permissions and limitations
18*63bba73cSAndrew Rist  * under the License.
19*63bba73cSAndrew Rist  *
20*63bba73cSAndrew Rist  *************************************************************/
21*63bba73cSAndrew Rist 
22*63bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include "XMLIndexSourceBaseContext.hxx"
29cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
30cdf0e10cSrcweir #include <com/sun/star/container/XIndexReplace.hpp>
31cdf0e10cSrcweir #include "XMLIndexTemplateContext.hxx"
32cdf0e10cSrcweir #include "XMLIndexTitleTemplateContext.hxx"
33cdf0e10cSrcweir #include "XMLIndexTOCStylesContext.hxx"
34cdf0e10cSrcweir #include <xmloff/xmlictxt.hxx>
35cdf0e10cSrcweir #include <xmloff/xmlimp.hxx>
36cdf0e10cSrcweir #include <xmloff/txtimp.hxx>
37cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
38cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
39cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
40cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
41cdf0e10cSrcweir #include <tools/debug.hxx>
42cdf0e10cSrcweir #include <rtl/ustring.hxx>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir 
45cdf0e10cSrcweir 
46cdf0e10cSrcweir using namespace ::xmloff::token;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir using ::rtl::OUString;
49cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet;
50cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
51cdf0e10cSrcweir using ::com::sun::star::uno::Any;
52cdf0e10cSrcweir using ::com::sun::star::xml::sax::XAttributeList;
53cdf0e10cSrcweir 
54cdf0e10cSrcweir const sal_Char sAPI_CreateFromChapter[] = "CreateFromChapter";
55cdf0e10cSrcweir const sal_Char sAPI_IsRelativeTabstops[] = "IsRelativeTabstops";
56cdf0e10cSrcweir 
57cdf0e10cSrcweir static __FAR_DATA SvXMLTokenMapEntry aIndexSourceTokenMap[] =
58cdf0e10cSrcweir {
59cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
60cdf0e10cSrcweir 		  XML_OUTLINE_LEVEL,
61cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_OUTLINE_LEVEL},
62cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
63cdf0e10cSrcweir 		  XML_USE_INDEX_MARKS,
64cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_INDEX_MARKS },
65cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
66cdf0e10cSrcweir 		  XML_INDEX_SCOPE,
67cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_INDEX_SCOPE },
68cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
69cdf0e10cSrcweir 		  XML_RELATIVE_TAB_STOP_POSITION,
70cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_RELATIVE_TABS } ,
71cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
72cdf0e10cSrcweir 		  XML_USE_OTHER_OBJECTS,
73cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_OTHER_OBJECTS },
74cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
75cdf0e10cSrcweir 		  XML_USE_SPREADSHEET_OBJECTS,
76cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_SHEET },
77cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
78cdf0e10cSrcweir 		  XML_USE_CHART_OBJECTS,
79cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_CHART },
80cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
81cdf0e10cSrcweir 		  XML_USE_DRAW_OBJECTS,
82cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_DRAW },
83cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
84cdf0e10cSrcweir 		  XML_USE_IMAGE_OBJECTS,
85cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_IMAGE },
86cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
87cdf0e10cSrcweir 		  XML_USE_MATH_OBJECTS,
88cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_MATH },
89cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
90cdf0e10cSrcweir 		  XML_MAIN_ENTRY_STYLE_NAME,
91cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_MAIN_ENTRY_STYLE },
92cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
93cdf0e10cSrcweir 		  XML_IGNORE_CASE,
94cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_IGNORE_CASE },
95cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
96cdf0e10cSrcweir 		  XML_ALPHABETICAL_SEPARATORS,
97cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_SEPARATORS },
98cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
99cdf0e10cSrcweir 		  XML_COMBINE_ENTRIES,
100cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_COMBINE_ENTRIES },
101cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
102cdf0e10cSrcweir 		  XML_COMBINE_ENTRIES_WITH_DASH,
103cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_COMBINE_WITH_DASH },
104cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
105cdf0e10cSrcweir 		  XML_USE_KEYS_AS_ENTRIES,
106cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_KEYS_AS_ENTRIES },
107cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
108cdf0e10cSrcweir 		  XML_COMBINE_ENTRIES_WITH_PP,
109cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_COMBINE_WITH_PP },
110cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
111cdf0e10cSrcweir 		  XML_CAPITALIZE_ENTRIES,
112cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_CAPITALIZE },
113cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
114cdf0e10cSrcweir 		  XML_USE_OBJECTS,
115cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_OBJECTS },
116cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
117cdf0e10cSrcweir 		  XML_USE_GRAPHICS,
118cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_GRAPHICS },
119cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
120cdf0e10cSrcweir 		  XML_USE_TABLES,
121cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_TABLES },
122cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
123cdf0e10cSrcweir 		  XML_USE_FLOATING_FRAMES,
124cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_FRAMES },
125cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
126cdf0e10cSrcweir 		  XML_COPY_OUTLINE_LEVELS,
127cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_COPY_OUTLINE_LEVELS },
128cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
129cdf0e10cSrcweir 		  XML_USE_CAPTION,
130cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_CAPTION },
131cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
132cdf0e10cSrcweir 		  XML_CAPTION_SEQUENCE_NAME,
133cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_SEQUENCE_NAME },
134cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
135cdf0e10cSrcweir 		  XML_CAPTION_SEQUENCE_FORMAT,
136cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_SEQUENCE_FORMAT },
137cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
138cdf0e10cSrcweir 		  XML_COMMA_SEPARATED,
139cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_COMMA_SEPARATED },
140cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
141cdf0e10cSrcweir 		  XML_USE_INDEX_SOURCE_STYLES,
142cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_INDEX_SOURCE_STYLES },
143cdf0e10cSrcweir     { XML_NAMESPACE_TEXT, XML_SORT_ALGORITHM,
144cdf0e10cSrcweir           XML_TOK_INDEXSOURCE_SORT_ALGORITHM },
145cdf0e10cSrcweir     { XML_NAMESPACE_FO, XML_LANGUAGE, XML_TOK_INDEXSOURCE_LANGUAGE },
146cdf0e10cSrcweir     { XML_NAMESPACE_FO, XML_COUNTRY, XML_TOK_INDEXSOURCE_COUNTRY },
147cdf0e10cSrcweir     { XML_NAMESPACE_TEXT, XML_INDEX_NAME, XML_TOK_INDEXSOURCE_USER_INDEX_NAME },
148cdf0e10cSrcweir 	{ XML_NAMESPACE_TEXT,
149cdf0e10cSrcweir 		  XML_USE_OUTLINE_LEVEL,
150cdf0e10cSrcweir 		  XML_TOK_INDEXSOURCE_USE_OUTLINE_LEVEL},
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 	XML_TOKEN_MAP_END
153cdf0e10cSrcweir };
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 
156cdf0e10cSrcweir TYPEINIT1( XMLIndexSourceBaseContext, SvXMLImportContext );
157cdf0e10cSrcweir 
XMLIndexSourceBaseContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,Reference<XPropertySet> & rPropSet,sal_Bool bLevelFormats)158cdf0e10cSrcweir XMLIndexSourceBaseContext::XMLIndexSourceBaseContext(
159cdf0e10cSrcweir 	SvXMLImport& rImport,
160cdf0e10cSrcweir 	sal_uInt16 nPrfx,
161cdf0e10cSrcweir 	const OUString& rLocalName,
162cdf0e10cSrcweir 	Reference<XPropertySet> & rPropSet,
163cdf0e10cSrcweir 	sal_Bool bLevelFormats)
164cdf0e10cSrcweir :	SvXMLImportContext(rImport, nPrfx, rLocalName)
165cdf0e10cSrcweir ,	sCreateFromChapter(RTL_CONSTASCII_USTRINGPARAM(sAPI_CreateFromChapter))
166cdf0e10cSrcweir ,	sIsRelativeTabstops(RTL_CONSTASCII_USTRINGPARAM(sAPI_IsRelativeTabstops))
167cdf0e10cSrcweir ,	bUseLevelFormats(bLevelFormats)
168cdf0e10cSrcweir ,	bChapterIndex(sal_False)
169cdf0e10cSrcweir ,	bRelativeTabs(sal_True)
170cdf0e10cSrcweir ,	rIndexPropertySet(rPropSet)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir }
173cdf0e10cSrcweir 
~XMLIndexSourceBaseContext()174cdf0e10cSrcweir XMLIndexSourceBaseContext::~XMLIndexSourceBaseContext()
175cdf0e10cSrcweir {
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
StartElement(const Reference<XAttributeList> & xAttrList)178cdf0e10cSrcweir void XMLIndexSourceBaseContext::StartElement(
179cdf0e10cSrcweir 	const Reference<XAttributeList> & xAttrList)
180cdf0e10cSrcweir {
181cdf0e10cSrcweir 	SvXMLTokenMap aTokenMap(aIndexSourceTokenMap);
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	// process attributes
184cdf0e10cSrcweir 	sal_Int16 nLength = xAttrList->getLength();
185cdf0e10cSrcweir 	for(sal_Int16 i=0; i<nLength; i++)
186cdf0e10cSrcweir 	{
187cdf0e10cSrcweir 		// map to IndexSourceParamEnum
188cdf0e10cSrcweir 		OUString sLocalName;
189cdf0e10cSrcweir 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
190cdf0e10cSrcweir 			GetKeyByAttrName( xAttrList->getNameByIndex(i), &sLocalName );
191cdf0e10cSrcweir 		sal_uInt16 nToken = aTokenMap.Get(nPrefix, sLocalName);
192cdf0e10cSrcweir 
193cdf0e10cSrcweir 		// process attribute
194cdf0e10cSrcweir 		ProcessAttribute((enum IndexSourceParamEnum)nToken,
195cdf0e10cSrcweir 						 xAttrList->getValueByIndex(i));
196cdf0e10cSrcweir 	}
197cdf0e10cSrcweir }
198cdf0e10cSrcweir 
ProcessAttribute(enum IndexSourceParamEnum eParam,const OUString & rValue)199cdf0e10cSrcweir void XMLIndexSourceBaseContext::ProcessAttribute(
200cdf0e10cSrcweir 	enum IndexSourceParamEnum eParam,
201cdf0e10cSrcweir 	const OUString& rValue)
202cdf0e10cSrcweir {
203cdf0e10cSrcweir 	switch (eParam)
204cdf0e10cSrcweir 	{
205cdf0e10cSrcweir 		case XML_TOK_INDEXSOURCE_INDEX_SCOPE:
206cdf0e10cSrcweir 			if ( IsXMLToken( rValue, XML_CHAPTER ) )
207cdf0e10cSrcweir 			{
208cdf0e10cSrcweir 				bChapterIndex = sal_True;
209cdf0e10cSrcweir 			}
210cdf0e10cSrcweir 			break;
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 		case XML_TOK_INDEXSOURCE_RELATIVE_TABS:
213cdf0e10cSrcweir 		{
214cdf0e10cSrcweir 			sal_Bool bTmp;
215cdf0e10cSrcweir 			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
216cdf0e10cSrcweir 			{
217cdf0e10cSrcweir 				bRelativeTabs = bTmp;
218cdf0e10cSrcweir 			}
219cdf0e10cSrcweir 			break;
220cdf0e10cSrcweir 		}
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 		default:
223cdf0e10cSrcweir 			// unknown attribute -> ignore
224cdf0e10cSrcweir 			break;
225cdf0e10cSrcweir 	}
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
EndElement()228cdf0e10cSrcweir void XMLIndexSourceBaseContext::EndElement()
229cdf0e10cSrcweir {
230cdf0e10cSrcweir 	Any aAny;
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 	aAny.setValue(&bRelativeTabs, ::getBooleanCppuType());
233cdf0e10cSrcweir 	rIndexPropertySet->setPropertyValue(sIsRelativeTabstops, aAny);
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 	aAny.setValue(&bChapterIndex, ::getBooleanCppuType());
236cdf0e10cSrcweir 	rIndexPropertySet->setPropertyValue(sCreateFromChapter, aAny);
237cdf0e10cSrcweir }
238cdf0e10cSrcweir 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)239cdf0e10cSrcweir SvXMLImportContext* XMLIndexSourceBaseContext::CreateChildContext(
240cdf0e10cSrcweir 	sal_uInt16 nPrefix,
241cdf0e10cSrcweir 	const OUString& rLocalName,
242cdf0e10cSrcweir 	const Reference<XAttributeList> & xAttrList )
243cdf0e10cSrcweir {
244cdf0e10cSrcweir 	SvXMLImportContext* pContext = NULL;
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 	if (XML_NAMESPACE_TEXT == nPrefix)
247cdf0e10cSrcweir 	{
248cdf0e10cSrcweir 		if ( IsXMLToken( rLocalName, XML_INDEX_TITLE_TEMPLATE ) )
249cdf0e10cSrcweir 		{
250cdf0e10cSrcweir 			pContext = new XMLIndexTitleTemplateContext(GetImport(),
251cdf0e10cSrcweir 														rIndexPropertySet,
252cdf0e10cSrcweir 														nPrefix, rLocalName);
253cdf0e10cSrcweir 		}
254cdf0e10cSrcweir 		else if ( bUseLevelFormats &&
255cdf0e10cSrcweir                   IsXMLToken( rLocalName, XML_INDEX_SOURCE_STYLES ) )
256cdf0e10cSrcweir 		{
257cdf0e10cSrcweir 			pContext = new XMLIndexTOCStylesContext(GetImport(),
258cdf0e10cSrcweir 													rIndexPropertySet,
259cdf0e10cSrcweir 													nPrefix, rLocalName);
260cdf0e10cSrcweir 		}
261cdf0e10cSrcweir 		// else: unknown element in text namespace -> ignore
262cdf0e10cSrcweir 	}
263cdf0e10cSrcweir 	// else: unknown namespace -> ignore
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 	// use default context
266cdf0e10cSrcweir 	if (pContext == NULL)
267cdf0e10cSrcweir 	{
268cdf0e10cSrcweir 		pContext = SvXMLImportContext::CreateChildContext(nPrefix, rLocalName,
269cdf0e10cSrcweir 														  xAttrList);
270cdf0e10cSrcweir 	}
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 	return pContext;
273cdf0e10cSrcweir }
274