1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_xmloff.hxx"
26*b1cdbd2cSJim Jagielski #include "XMLSectionExport.hxx"
27*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
28*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <vector>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/Locale.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexReplace.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValues.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyState.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XText.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextSection.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/text/SectionFileLink.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNamed.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XDocumentIndex.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XInterface.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/text/BibliographyDataField.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextFieldsSupplier.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XChapterNumberingSupplier.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/text/ChapterFormat.hpp> //i90246
51*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
52*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
53*b1cdbd2cSJim Jagielski #include <xmloff/families.hxx>
54*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
55*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
56*b1cdbd2cSJim Jagielski #include <xmloff/xmlexp.hxx>
57*b1cdbd2cSJim Jagielski #include <xmloff/xmltkmap.hxx>
58*b1cdbd2cSJim Jagielski #include "txtflde.hxx"
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
63*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::text;
64*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
65*b1cdbd2cSJim Jagielski using namespace ::std;
66*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski using ::rtl::OUString;
69*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
70*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::XPropertySet;
71*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::PropertyValue;
72*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::PropertyValues;
73*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::PropertyState;
74*b1cdbd2cSJim Jagielski using ::com::sun::star::container::XIndexReplace;
75*b1cdbd2cSJim Jagielski using ::com::sun::star::container::XNameAccess;
76*b1cdbd2cSJim Jagielski using ::com::sun::star::container::XNamed;
77*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::XServiceInfo;
78*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::Locale;
79*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::XInterface;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski 
XMLSectionExport(SvXMLExport & rExp,XMLTextParagraphExport & rParaExp)82*b1cdbd2cSJim Jagielski XMLSectionExport::XMLSectionExport(
83*b1cdbd2cSJim Jagielski 	SvXMLExport& rExp,
84*b1cdbd2cSJim Jagielski 	XMLTextParagraphExport& rParaExp)
85*b1cdbd2cSJim Jagielski :	sCondition(RTL_CONSTASCII_USTRINGPARAM("Condition"))
86*b1cdbd2cSJim Jagielski ,	sCreateFromChapter(RTL_CONSTASCII_USTRINGPARAM("CreateFromChapter"))
87*b1cdbd2cSJim Jagielski ,	sCreateFromEmbeddedObjects(RTL_CONSTASCII_USTRINGPARAM("CreateFromEmbeddedObjects"))
88*b1cdbd2cSJim Jagielski ,	sCreateFromGraphicObjects(RTL_CONSTASCII_USTRINGPARAM("CreateFromGraphicObjects"))
89*b1cdbd2cSJim Jagielski ,	sCreateFromLabels(RTL_CONSTASCII_USTRINGPARAM("CreateFromLabels"))
90*b1cdbd2cSJim Jagielski ,	sCreateFromMarks(RTL_CONSTASCII_USTRINGPARAM("CreateFromMarks"))
91*b1cdbd2cSJim Jagielski ,	sCreateFromOtherEmbeddedObjects(RTL_CONSTASCII_USTRINGPARAM("CreateFromOtherEmbeddedObjects"))
92*b1cdbd2cSJim Jagielski ,	sCreateFromOutline(RTL_CONSTASCII_USTRINGPARAM("CreateFromOutline"))
93*b1cdbd2cSJim Jagielski ,	sCreateFromStarCalc(RTL_CONSTASCII_USTRINGPARAM("CreateFromStarCalc"))
94*b1cdbd2cSJim Jagielski ,	sCreateFromStarChart(RTL_CONSTASCII_USTRINGPARAM("CreateFromStarChart"))
95*b1cdbd2cSJim Jagielski ,	sCreateFromStarDraw(RTL_CONSTASCII_USTRINGPARAM("CreateFromStarDraw"))
96*b1cdbd2cSJim Jagielski ,	sCreateFromStarImage(RTL_CONSTASCII_USTRINGPARAM("CreateFromStarImage"))
97*b1cdbd2cSJim Jagielski ,	sCreateFromStarMath(RTL_CONSTASCII_USTRINGPARAM("CreateFromStarMath"))
98*b1cdbd2cSJim Jagielski ,	sCreateFromTables(RTL_CONSTASCII_USTRINGPARAM("CreateFromTables"))
99*b1cdbd2cSJim Jagielski ,	sCreateFromTextFrames(RTL_CONSTASCII_USTRINGPARAM("CreateFromTextFrames"))
100*b1cdbd2cSJim Jagielski ,	sDdeCommandElement(RTL_CONSTASCII_USTRINGPARAM("DDECommandElement"))
101*b1cdbd2cSJim Jagielski ,	sDdeCommandFile(RTL_CONSTASCII_USTRINGPARAM("DDECommandFile"))
102*b1cdbd2cSJim Jagielski ,	sDdeCommandType(RTL_CONSTASCII_USTRINGPARAM("DDECommandType"))
103*b1cdbd2cSJim Jagielski ,	sFileLink(RTL_CONSTASCII_USTRINGPARAM("FileLink"))
104*b1cdbd2cSJim Jagielski ,	sIsCaseSensitive(RTL_CONSTASCII_USTRINGPARAM("IsCaseSensitive"))
105*b1cdbd2cSJim Jagielski ,	sIsProtected(RTL_CONSTASCII_USTRINGPARAM("IsProtected"))
106*b1cdbd2cSJim Jagielski ,	sIsVisible(RTL_CONSTASCII_USTRINGPARAM("IsVisible"))
107*b1cdbd2cSJim Jagielski ,	sLabelCategory(RTL_CONSTASCII_USTRINGPARAM("LabelCategory"))
108*b1cdbd2cSJim Jagielski ,	sLabelDisplayType(RTL_CONSTASCII_USTRINGPARAM("LabelDisplayType"))
109*b1cdbd2cSJim Jagielski ,	sLevel(RTL_CONSTASCII_USTRINGPARAM("Level"))
110*b1cdbd2cSJim Jagielski ,	sLevelFormat(RTL_CONSTASCII_USTRINGPARAM("LevelFormat"))
111*b1cdbd2cSJim Jagielski ,	sLevelParagraphStyles(RTL_CONSTASCII_USTRINGPARAM("LevelParagraphStyles"))
112*b1cdbd2cSJim Jagielski ,	sLinkRegion(RTL_CONSTASCII_USTRINGPARAM("LinkRegion"))
113*b1cdbd2cSJim Jagielski ,	sMainEntryCharacterStyleName(RTL_CONSTASCII_USTRINGPARAM("MainEntryCharacterStyleName"))
114*b1cdbd2cSJim Jagielski ,	sParaStyleHeading(RTL_CONSTASCII_USTRINGPARAM("ParaStyleHeading"))
115*b1cdbd2cSJim Jagielski ,	sParaStyleLevel(RTL_CONSTASCII_USTRINGPARAM("ParaStyleLevel"))
116*b1cdbd2cSJim Jagielski ,	sTitle(RTL_CONSTASCII_USTRINGPARAM("Title"))
117*b1cdbd2cSJim Jagielski ,	sName(RTL_CONSTASCII_USTRINGPARAM("Name"))
118*b1cdbd2cSJim Jagielski ,	sUseAlphabeticalSeparators(RTL_CONSTASCII_USTRINGPARAM("UseAlphabeticalSeparators"))
119*b1cdbd2cSJim Jagielski ,	sUseCombinedEntries(RTL_CONSTASCII_USTRINGPARAM("UseCombinedEntries"))
120*b1cdbd2cSJim Jagielski ,	sUseDash(RTL_CONSTASCII_USTRINGPARAM("UseDash"))
121*b1cdbd2cSJim Jagielski ,	sUseKeyAsEntry(RTL_CONSTASCII_USTRINGPARAM("UseKeyAsEntry"))
122*b1cdbd2cSJim Jagielski ,	sUseLevelFromSource(RTL_CONSTASCII_USTRINGPARAM("UseLevelFromSource"))
123*b1cdbd2cSJim Jagielski ,	sUsePP(RTL_CONSTASCII_USTRINGPARAM("UsePP"))
124*b1cdbd2cSJim Jagielski ,	sUseUpperCase(RTL_CONSTASCII_USTRINGPARAM("UseUpperCase"))
125*b1cdbd2cSJim Jagielski ,	sIsCommaSeparated(RTL_CONSTASCII_USTRINGPARAM("IsCommaSeparated"))
126*b1cdbd2cSJim Jagielski ,	sIsAutomaticUpdate(RTL_CONSTASCII_USTRINGPARAM("IsAutomaticUpdate"))
127*b1cdbd2cSJim Jagielski ,	sIsRelativeTabstops(RTL_CONSTASCII_USTRINGPARAM("IsRelativeTabstops"))
128*b1cdbd2cSJim Jagielski ,	sCreateFromLevelParagraphStyles(RTL_CONSTASCII_USTRINGPARAM("CreateFromLevelParagraphStyles"))
129*b1cdbd2cSJim Jagielski ,	sDocumentIndex(RTL_CONSTASCII_USTRINGPARAM("DocumentIndex"))
130*b1cdbd2cSJim Jagielski ,	sContentSection(RTL_CONSTASCII_USTRINGPARAM("ContentSection"))
131*b1cdbd2cSJim Jagielski ,	sHeaderSection(RTL_CONSTASCII_USTRINGPARAM("HeaderSection"))
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski ,	sTextSection(RTL_CONSTASCII_USTRINGPARAM("TextSection"))
134*b1cdbd2cSJim Jagielski ,	sIsGlobalDocumentSection(RTL_CONSTASCII_USTRINGPARAM("IsGlobalDocumentSection"))
135*b1cdbd2cSJim Jagielski ,	sProtectionKey(RTL_CONSTASCII_USTRINGPARAM("ProtectionKey"))
136*b1cdbd2cSJim Jagielski ,	sSortAlgorithm(RTL_CONSTASCII_USTRINGPARAM("SortAlgorithm"))
137*b1cdbd2cSJim Jagielski ,	sLocale(RTL_CONSTASCII_USTRINGPARAM("Locale"))
138*b1cdbd2cSJim Jagielski ,	sUserIndexName(RTL_CONSTASCII_USTRINGPARAM("UserIndexName"))
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski ,	sIsCurrentlyVisible(RTL_CONSTASCII_USTRINGPARAM("IsCurrentlyVisible"))
141*b1cdbd2cSJim Jagielski ,	sHeadingStyleName(RTL_CONSTASCII_USTRINGPARAM("HeadingStyleName"))
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski ,	rExport(rExp)
144*b1cdbd2cSJim Jagielski ,	rParaExport(rParaExp)
145*b1cdbd2cSJim Jagielski ,	bHeadingDummiesExported( sal_False )
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski }
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 
ExportSectionStart(const Reference<XTextSection> & rSection,sal_Bool bAutoStyles)150*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportSectionStart(
151*b1cdbd2cSJim Jagielski 	const Reference<XTextSection> & rSection,
152*b1cdbd2cSJim Jagielski 	sal_Bool bAutoStyles)
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xPropertySet(rSection, UNO_QUERY);
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 	// always export section (auto) style
157*b1cdbd2cSJim Jagielski 	if (bAutoStyles)
158*b1cdbd2cSJim Jagielski 	{
159*b1cdbd2cSJim Jagielski 		// get PropertySet and add section style
160*b1cdbd2cSJim Jagielski 		GetParaExport().Add( XML_STYLE_FAMILY_TEXT_SECTION, xPropertySet );
161*b1cdbd2cSJim Jagielski 	}
162*b1cdbd2cSJim Jagielski 	else
163*b1cdbd2cSJim Jagielski 	{
164*b1cdbd2cSJim Jagielski 		// always export section style
165*b1cdbd2cSJim Jagielski 		GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_STYLE_NAME,
166*b1cdbd2cSJim Jagielski 									 GetParaExport().Find(
167*b1cdbd2cSJim Jagielski 									 XML_STYLE_FAMILY_TEXT_SECTION,
168*b1cdbd2cSJim Jagielski 									 xPropertySet, sEmpty ) );
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski         // xml:id for RDF metadata
171*b1cdbd2cSJim Jagielski         GetExport().AddAttributeXmlId(rSection);
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 		// export index or regular section
174*b1cdbd2cSJim Jagielski 		Reference<XDocumentIndex> xIndex;
175*b1cdbd2cSJim Jagielski 		if (GetIndex(rSection, xIndex))
176*b1cdbd2cSJim Jagielski 		{
177*b1cdbd2cSJim Jagielski 			if (xIndex.is())
178*b1cdbd2cSJim Jagielski 			{
179*b1cdbd2cSJim Jagielski 				// we are an index
180*b1cdbd2cSJim Jagielski 				ExportIndexStart(xIndex);
181*b1cdbd2cSJim Jagielski 			}
182*b1cdbd2cSJim Jagielski 			else
183*b1cdbd2cSJim Jagielski 			{
184*b1cdbd2cSJim Jagielski 				// we are an index header
185*b1cdbd2cSJim Jagielski 				ExportIndexHeaderStart(rSection);
186*b1cdbd2cSJim Jagielski 			}
187*b1cdbd2cSJim Jagielski 		}
188*b1cdbd2cSJim Jagielski 		else
189*b1cdbd2cSJim Jagielski 		{
190*b1cdbd2cSJim Jagielski 			// we are not an index
191*b1cdbd2cSJim Jagielski 			ExportRegularSectionStart(rSection);
192*b1cdbd2cSJim Jagielski 		}
193*b1cdbd2cSJim Jagielski 	}
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
GetIndex(const Reference<XTextSection> & rSection,Reference<XDocumentIndex> & rIndex) const196*b1cdbd2cSJim Jagielski sal_Bool XMLSectionExport::GetIndex(
197*b1cdbd2cSJim Jagielski 	const Reference<XTextSection> & rSection,
198*b1cdbd2cSJim Jagielski 	Reference<XDocumentIndex> & rIndex) const
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski 	// first, reset result
201*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
202*b1cdbd2cSJim Jagielski 	rIndex = NULL;
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 	// get section Properties
205*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xSectionPropSet(rSection, UNO_QUERY);
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 	// then check if this section happens to be inside an index
208*b1cdbd2cSJim Jagielski 	if (xSectionPropSet->getPropertySetInfo()->
209*b1cdbd2cSJim Jagielski 									hasPropertyByName(sDocumentIndex))
210*b1cdbd2cSJim Jagielski 	{
211*b1cdbd2cSJim Jagielski 		Any aAny = xSectionPropSet->getPropertyValue(sDocumentIndex);
212*b1cdbd2cSJim Jagielski 		Reference<XDocumentIndex> xDocumentIndex;
213*b1cdbd2cSJim Jagielski 		aAny >>= xDocumentIndex;
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 		// OK, are we inside of an index
216*b1cdbd2cSJim Jagielski 		if (xDocumentIndex.is())
217*b1cdbd2cSJim Jagielski 		{
218*b1cdbd2cSJim Jagielski 			// is the enclosing index identical with "our" section?
219*b1cdbd2cSJim Jagielski 			Reference<XPropertySet> xIndexPropSet(xDocumentIndex, UNO_QUERY);
220*b1cdbd2cSJim Jagielski 			aAny = xIndexPropSet->getPropertyValue(sContentSection);
221*b1cdbd2cSJim Jagielski 			Reference<XTextSection> xEnclosingSection;
222*b1cdbd2cSJim Jagielski 			aAny >>= xEnclosingSection;
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 			// if the enclosing section is "our" section, then we are an index!
225*b1cdbd2cSJim Jagielski 			if (rSection == xEnclosingSection)
226*b1cdbd2cSJim Jagielski 			{
227*b1cdbd2cSJim Jagielski 				rIndex = xDocumentIndex;
228*b1cdbd2cSJim Jagielski 				bRet = sal_True;
229*b1cdbd2cSJim Jagielski 			}
230*b1cdbd2cSJim Jagielski 			// else: index header or regular section
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski 			// is the enclosing index identical with the header section?
233*b1cdbd2cSJim Jagielski 			aAny = xIndexPropSet->getPropertyValue(sHeaderSection);
234*b1cdbd2cSJim Jagielski 			// now mis-named: contains header section
235*b1cdbd2cSJim Jagielski 			aAny >>= xEnclosingSection;
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 			// if the enclosing section is "our" section, then we are an index!
238*b1cdbd2cSJim Jagielski 			if (rSection == xEnclosingSection)
239*b1cdbd2cSJim Jagielski 			{
240*b1cdbd2cSJim Jagielski 				bRet = sal_True;
241*b1cdbd2cSJim Jagielski 			}
242*b1cdbd2cSJim Jagielski 			// else: regular section
243*b1cdbd2cSJim Jagielski 		}
244*b1cdbd2cSJim Jagielski 		// else: we aren't even inside of an index
245*b1cdbd2cSJim Jagielski 	}
246*b1cdbd2cSJim Jagielski 	// else: we don't even know what an index is.
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 	return bRet;
249*b1cdbd2cSJim Jagielski }
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski 
ExportSectionEnd(const Reference<XTextSection> & rSection,sal_Bool bAutoStyles)252*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportSectionEnd(
253*b1cdbd2cSJim Jagielski 	const Reference<XTextSection> & rSection,
254*b1cdbd2cSJim Jagielski 	sal_Bool bAutoStyles)
255*b1cdbd2cSJim Jagielski {
256*b1cdbd2cSJim Jagielski 	// no end section for styles
257*b1cdbd2cSJim Jagielski 	if (!bAutoStyles)
258*b1cdbd2cSJim Jagielski 	{
259*b1cdbd2cSJim Jagielski 		enum XMLTokenEnum eElement = XML_TOKEN_INVALID;
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 		// export index or regular section end
262*b1cdbd2cSJim Jagielski 		Reference<XDocumentIndex> xIndex;
263*b1cdbd2cSJim Jagielski 		if (GetIndex(rSection, xIndex))
264*b1cdbd2cSJim Jagielski 		{
265*b1cdbd2cSJim Jagielski 			if (xIndex.is())
266*b1cdbd2cSJim Jagielski 			{
267*b1cdbd2cSJim Jagielski 				// index end: close index body element
268*b1cdbd2cSJim Jagielski 				GetExport().EndElement( XML_NAMESPACE_TEXT,	XML_INDEX_BODY,
269*b1cdbd2cSJim Jagielski                                         sal_True );
270*b1cdbd2cSJim Jagielski 				GetExport().IgnorableWhitespace();
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 				switch (MapSectionType(xIndex->getServiceName()))
273*b1cdbd2cSJim Jagielski 				{
274*b1cdbd2cSJim Jagielski 					case TEXT_SECTION_TYPE_TOC:
275*b1cdbd2cSJim Jagielski 						eElement = XML_TABLE_OF_CONTENT;
276*b1cdbd2cSJim Jagielski 						break;
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski 					case TEXT_SECTION_TYPE_ILLUSTRATION:
279*b1cdbd2cSJim Jagielski 						eElement = XML_ILLUSTRATION_INDEX;
280*b1cdbd2cSJim Jagielski 						break;
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 					case TEXT_SECTION_TYPE_ALPHABETICAL:
283*b1cdbd2cSJim Jagielski 						eElement = XML_ALPHABETICAL_INDEX;
284*b1cdbd2cSJim Jagielski 						break;
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 					case TEXT_SECTION_TYPE_TABLE:
287*b1cdbd2cSJim Jagielski 						eElement = XML_TABLE_INDEX;
288*b1cdbd2cSJim Jagielski 						break;
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 					case TEXT_SECTION_TYPE_OBJECT:
291*b1cdbd2cSJim Jagielski 						eElement = XML_OBJECT_INDEX;
292*b1cdbd2cSJim Jagielski 						break;
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski 					case TEXT_SECTION_TYPE_USER:
295*b1cdbd2cSJim Jagielski 						eElement = XML_USER_INDEX;
296*b1cdbd2cSJim Jagielski 						break;
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski 					case TEXT_SECTION_TYPE_BIBLIOGRAPHY:
299*b1cdbd2cSJim Jagielski 						eElement = XML_BIBLIOGRAPHY;
300*b1cdbd2cSJim Jagielski 						break;
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 					default:
303*b1cdbd2cSJim Jagielski 						OSL_ENSURE(false, "unknown index type");
304*b1cdbd2cSJim Jagielski 						// default: skip index!
305*b1cdbd2cSJim Jagielski 						break;
306*b1cdbd2cSJim Jagielski 				}
307*b1cdbd2cSJim Jagielski 			}
308*b1cdbd2cSJim Jagielski 			else
309*b1cdbd2cSJim Jagielski 			{
310*b1cdbd2cSJim Jagielski 				eElement = XML_INDEX_TITLE;
311*b1cdbd2cSJim Jagielski 			}
312*b1cdbd2cSJim Jagielski 		}
313*b1cdbd2cSJim Jagielski 		else
314*b1cdbd2cSJim Jagielski 		{
315*b1cdbd2cSJim Jagielski 			eElement = XML_SECTION;
316*b1cdbd2cSJim Jagielski 		}
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski 		if (XML_TOKEN_INVALID != eElement)
319*b1cdbd2cSJim Jagielski 		{
320*b1cdbd2cSJim Jagielski 			// any old attributes?
321*b1cdbd2cSJim Jagielski 			GetExport().CheckAttrList();
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski 			// element surrounded by whitespace
324*b1cdbd2cSJim Jagielski 			GetExport().EndElement( XML_NAMESPACE_TEXT,	eElement, sal_True);
325*b1cdbd2cSJim Jagielski 			GetExport().IgnorableWhitespace();
326*b1cdbd2cSJim Jagielski 		}
327*b1cdbd2cSJim Jagielski 		else
328*b1cdbd2cSJim Jagielski 		{
329*b1cdbd2cSJim Jagielski 			OSL_ENSURE(false, "Need element name!");
330*b1cdbd2cSJim Jagielski 		}
331*b1cdbd2cSJim Jagielski 	}
332*b1cdbd2cSJim Jagielski 	// else: autostyles -> ignore
333*b1cdbd2cSJim Jagielski }
334*b1cdbd2cSJim Jagielski 
ExportIndexStart(const Reference<XDocumentIndex> & rIndex)335*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportIndexStart(
336*b1cdbd2cSJim Jagielski 	const Reference<XDocumentIndex> & rIndex)
337*b1cdbd2cSJim Jagielski {
338*b1cdbd2cSJim Jagielski 	// get PropertySet
339*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xPropertySet(rIndex, UNO_QUERY);
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 	switch (MapSectionType(rIndex->getServiceName()))
342*b1cdbd2cSJim Jagielski 	{
343*b1cdbd2cSJim Jagielski 		case TEXT_SECTION_TYPE_TOC:
344*b1cdbd2cSJim Jagielski 			ExportTableOfContentStart(xPropertySet);
345*b1cdbd2cSJim Jagielski 			break;
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski 		case TEXT_SECTION_TYPE_ILLUSTRATION:
348*b1cdbd2cSJim Jagielski 			ExportIllustrationIndexStart(xPropertySet);
349*b1cdbd2cSJim Jagielski 			break;
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski 		case TEXT_SECTION_TYPE_ALPHABETICAL:
352*b1cdbd2cSJim Jagielski 			ExportAlphabeticalIndexStart(xPropertySet);
353*b1cdbd2cSJim Jagielski 			break;
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski 		case TEXT_SECTION_TYPE_TABLE:
356*b1cdbd2cSJim Jagielski 			ExportTableIndexStart(xPropertySet);
357*b1cdbd2cSJim Jagielski 			break;
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski 		case TEXT_SECTION_TYPE_OBJECT:
360*b1cdbd2cSJim Jagielski 			ExportObjectIndexStart(xPropertySet);
361*b1cdbd2cSJim Jagielski 			break;
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 		case TEXT_SECTION_TYPE_USER:
364*b1cdbd2cSJim Jagielski 			ExportUserIndexStart(xPropertySet);
365*b1cdbd2cSJim Jagielski 			break;
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 		case TEXT_SECTION_TYPE_BIBLIOGRAPHY:
368*b1cdbd2cSJim Jagielski 			ExportBibliographyStart(xPropertySet);
369*b1cdbd2cSJim Jagielski 			break;
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 		default:
372*b1cdbd2cSJim Jagielski 			// skip index
373*b1cdbd2cSJim Jagielski 			OSL_ENSURE(false, "unknown index type");
374*b1cdbd2cSJim Jagielski 			break;
375*b1cdbd2cSJim Jagielski 	}
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski 
ExportIndexHeaderStart(const Reference<XTextSection> & rSection)378*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportIndexHeaderStart(
379*b1cdbd2cSJim Jagielski 	const Reference<XTextSection> & rSection)
380*b1cdbd2cSJim Jagielski {
381*b1cdbd2cSJim Jagielski 	// export name, dammit!
382*b1cdbd2cSJim Jagielski 	Reference<XNamed> xName(rSection, UNO_QUERY);
383*b1cdbd2cSJim Jagielski 	GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, xName->getName());
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 	// format already handled -> export only start element
386*b1cdbd2cSJim Jagielski 	GetExport().StartElement( XML_NAMESPACE_TEXT, XML_INDEX_TITLE, sal_True );
387*b1cdbd2cSJim Jagielski 	GetExport().IgnorableWhitespace();
388*b1cdbd2cSJim Jagielski }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski SvXMLEnumStringMapEntry __READONLY_DATA aIndexTypeMap[] =
392*b1cdbd2cSJim Jagielski {
393*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "com.sun.star.text.ContentIndex", TEXT_SECTION_TYPE_TOC ),
394*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "com.sun.star.text.DocumentIndex", TEXT_SECTION_TYPE_ALPHABETICAL ),
395*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "com.sun.star.text.TableIndex", TEXT_SECTION_TYPE_TABLE ),
396*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "com.sun.star.text.ObjectIndex", TEXT_SECTION_TYPE_OBJECT ),
397*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "com.sun.star.text.Bibliography", TEXT_SECTION_TYPE_BIBLIOGRAPHY ),
398*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "com.sun.star.text.UserIndex", TEXT_SECTION_TYPE_USER ),
399*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "com.sun.star.text.IllustrationsIndex", TEXT_SECTION_TYPE_ILLUSTRATION ),
400*b1cdbd2cSJim Jagielski     ENUM_STRING_MAP_END()
401*b1cdbd2cSJim Jagielski };
402*b1cdbd2cSJim Jagielski 
MapSectionType(const OUString & rServiceName)403*b1cdbd2cSJim Jagielski enum SectionTypeEnum XMLSectionExport::MapSectionType(
404*b1cdbd2cSJim Jagielski 	const OUString& rServiceName)
405*b1cdbd2cSJim Jagielski {
406*b1cdbd2cSJim Jagielski 	enum SectionTypeEnum eType = TEXT_SECTION_TYPE_UNKNOWN;
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski 	sal_uInt16 nTmp;
409*b1cdbd2cSJim Jagielski 	if (SvXMLUnitConverter::convertEnum(nTmp, rServiceName, aIndexTypeMap))
410*b1cdbd2cSJim Jagielski 	{
411*b1cdbd2cSJim Jagielski 		eType = (enum SectionTypeEnum)nTmp;
412*b1cdbd2cSJim Jagielski 	}
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski 	// TODO: index header section types, etc.
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski 	return eType;
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski 
ExportRegularSectionStart(const Reference<XTextSection> & rSection)419*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportRegularSectionStart(
420*b1cdbd2cSJim Jagielski 	const Reference<XTextSection> & rSection)
421*b1cdbd2cSJim Jagielski {
422*b1cdbd2cSJim Jagielski 	// style name already handled in ExportSectionStart(...)
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski 	Reference<XNamed> xName(rSection, UNO_QUERY);
425*b1cdbd2cSJim Jagielski 	GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, xName->getName());
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 	// get XPropertySet for other values
428*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xPropSet(rSection, UNO_QUERY);
429*b1cdbd2cSJim Jagielski 	Any aAny;
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 	// condition and display
432*b1cdbd2cSJim Jagielski 	aAny = xPropSet->getPropertyValue(sCondition);
433*b1cdbd2cSJim Jagielski 	OUString sCond;
434*b1cdbd2cSJim Jagielski 	aAny >>= sCond;
435*b1cdbd2cSJim Jagielski 	enum XMLTokenEnum eDisplay = XML_TOKEN_INVALID;
436*b1cdbd2cSJim Jagielski 	if (sCond.getLength() > 0)
437*b1cdbd2cSJim Jagielski 	{
438*b1cdbd2cSJim Jagielski 		OUString sQValue =
439*b1cdbd2cSJim Jagielski 			GetExport().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OOOW,
440*b1cdbd2cSJim Jagielski 														 sCond, sal_False );
441*b1cdbd2cSJim Jagielski 		GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_CONDITION, sQValue);
442*b1cdbd2cSJim Jagielski 		eDisplay = XML_CONDITION;
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski         // #97450# store hidden-status (of conditional sections only)
445*b1cdbd2cSJim Jagielski         aAny = xPropSet->getPropertyValue(sIsCurrentlyVisible);
446*b1cdbd2cSJim Jagielski         if (! *(sal_Bool*)aAny.getValue())
447*b1cdbd2cSJim Jagielski         {
448*b1cdbd2cSJim Jagielski             GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_IS_HIDDEN,
449*b1cdbd2cSJim Jagielski                                      XML_TRUE);
450*b1cdbd2cSJim Jagielski         }
451*b1cdbd2cSJim Jagielski 	}
452*b1cdbd2cSJim Jagielski 	else
453*b1cdbd2cSJim Jagielski 	{
454*b1cdbd2cSJim Jagielski 		eDisplay = XML_NONE;
455*b1cdbd2cSJim Jagielski 	}
456*b1cdbd2cSJim Jagielski 	aAny = xPropSet->getPropertyValue(sIsVisible);
457*b1cdbd2cSJim Jagielski 	if (! *(sal_Bool*)aAny.getValue())
458*b1cdbd2cSJim Jagielski 	{
459*b1cdbd2cSJim Jagielski 		GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_DISPLAY, eDisplay);
460*b1cdbd2cSJim Jagielski 	}
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski 	// protect + protection key
463*b1cdbd2cSJim Jagielski 	aAny = xPropSet->getPropertyValue(sIsProtected);
464*b1cdbd2cSJim Jagielski 	if (*(sal_Bool*)aAny.getValue())
465*b1cdbd2cSJim Jagielski 	{
466*b1cdbd2cSJim Jagielski 		GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_PROTECTED, XML_TRUE);
467*b1cdbd2cSJim Jagielski 	}
468*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aPassword;
469*b1cdbd2cSJim Jagielski 	xPropSet->getPropertyValue(sProtectionKey) >>= aPassword;
470*b1cdbd2cSJim Jagielski 	if (aPassword.getLength() > 0)
471*b1cdbd2cSJim Jagielski 	{
472*b1cdbd2cSJim Jagielski 		OUStringBuffer aBuffer;
473*b1cdbd2cSJim Jagielski 		SvXMLUnitConverter::encodeBase64(aBuffer, aPassword);
474*b1cdbd2cSJim Jagielski 		GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_PROTECTION_KEY,
475*b1cdbd2cSJim Jagielski 								 aBuffer.makeStringAndClear());
476*b1cdbd2cSJim Jagielski 	}
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski 	// export element
479*b1cdbd2cSJim Jagielski 	GetExport().IgnorableWhitespace();
480*b1cdbd2cSJim Jagielski 	GetExport().StartElement( XML_NAMESPACE_TEXT, XML_SECTION, sal_True );
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 	// data source
483*b1cdbd2cSJim Jagielski 	// unfortunately, we have to test all relevant strings for non-zero length
484*b1cdbd2cSJim Jagielski 	aAny = xPropSet->getPropertyValue(sFileLink);
485*b1cdbd2cSJim Jagielski 	SectionFileLink aFileLink;
486*b1cdbd2cSJim Jagielski 	aAny >>= aFileLink;
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski 	aAny = xPropSet->getPropertyValue(sLinkRegion);
489*b1cdbd2cSJim Jagielski 	OUString sRegionName;
490*b1cdbd2cSJim Jagielski 	aAny >>= sRegionName;
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski 	if ( (aFileLink.FileURL.getLength() > 0) ||
493*b1cdbd2cSJim Jagielski 		 (aFileLink.FilterName.getLength() > 0) ||
494*b1cdbd2cSJim Jagielski 		 (sRegionName.getLength() > 0) )
495*b1cdbd2cSJim Jagielski 	{
496*b1cdbd2cSJim Jagielski 		if (aFileLink.FileURL.getLength() > 0)
497*b1cdbd2cSJim Jagielski 		{
498*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_XLINK, XML_HREF,
499*b1cdbd2cSJim Jagielski 									 GetExport().GetRelativeReference( aFileLink.FileURL) );
500*b1cdbd2cSJim Jagielski 		}
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski 		if (aFileLink.FilterName.getLength() > 0)
503*b1cdbd2cSJim Jagielski 		{
504*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_FILTER_NAME,
505*b1cdbd2cSJim Jagielski 									 aFileLink.FilterName);
506*b1cdbd2cSJim Jagielski 		}
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski 		if (sRegionName.getLength() > 0)
509*b1cdbd2cSJim Jagielski 		{
510*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_SECTION_NAME,
511*b1cdbd2cSJim Jagielski 									 sRegionName);
512*b1cdbd2cSJim Jagielski 		}
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 		SvXMLElementExport aElem(GetExport(),
515*b1cdbd2cSJim Jagielski 								 XML_NAMESPACE_TEXT, XML_SECTION_SOURCE,
516*b1cdbd2cSJim Jagielski 								 sal_True, sal_True);
517*b1cdbd2cSJim Jagielski 	}
518*b1cdbd2cSJim Jagielski 	else
519*b1cdbd2cSJim Jagielski 	{
520*b1cdbd2cSJim Jagielski 		// check for DDE first
521*b1cdbd2cSJim Jagielski 		if (xPropSet->getPropertySetInfo()->hasPropertyByName(sDdeCommandFile))
522*b1cdbd2cSJim Jagielski 		{
523*b1cdbd2cSJim Jagielski 			// data source DDE
524*b1cdbd2cSJim Jagielski 			// unfortunately, we have to test all relevant strings for
525*b1cdbd2cSJim Jagielski 			// non-zero length
526*b1cdbd2cSJim Jagielski 			aAny = xPropSet->getPropertyValue(sDdeCommandFile);
527*b1cdbd2cSJim Jagielski 			OUString sApplication;
528*b1cdbd2cSJim Jagielski 			aAny >>= sApplication;
529*b1cdbd2cSJim Jagielski 			aAny = xPropSet->getPropertyValue(sDdeCommandType);
530*b1cdbd2cSJim Jagielski 			OUString sTopic;
531*b1cdbd2cSJim Jagielski 			aAny >>= sTopic;
532*b1cdbd2cSJim Jagielski 			aAny = xPropSet->getPropertyValue(sDdeCommandElement);
533*b1cdbd2cSJim Jagielski 			OUString sItem;
534*b1cdbd2cSJim Jagielski 			aAny >>= sItem;
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski 			if ( (sApplication.getLength() > 0) ||
537*b1cdbd2cSJim Jagielski 				 (sTopic.getLength() > 0) ||
538*b1cdbd2cSJim Jagielski 				 (sItem.getLength() > 0 )   )
539*b1cdbd2cSJim Jagielski 			{
540*b1cdbd2cSJim Jagielski 				GetExport().AddAttribute(XML_NAMESPACE_OFFICE,
541*b1cdbd2cSJim Jagielski 										 XML_DDE_APPLICATION, sApplication);
542*b1cdbd2cSJim Jagielski 				GetExport().AddAttribute(XML_NAMESPACE_OFFICE, XML_DDE_TOPIC,
543*b1cdbd2cSJim Jagielski 										 sTopic);
544*b1cdbd2cSJim Jagielski 				GetExport().AddAttribute(XML_NAMESPACE_OFFICE, XML_DDE_ITEM,
545*b1cdbd2cSJim Jagielski 										 sItem);
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski 				aAny = xPropSet->getPropertyValue(sIsAutomaticUpdate);
548*b1cdbd2cSJim Jagielski 				if (*(sal_Bool*)aAny.getValue())
549*b1cdbd2cSJim Jagielski 				{
550*b1cdbd2cSJim Jagielski 					GetExport().AddAttribute(XML_NAMESPACE_OFFICE,
551*b1cdbd2cSJim Jagielski                                              XML_AUTOMATIC_UPDATE, XML_TRUE);
552*b1cdbd2cSJim Jagielski 				}
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski 				SvXMLElementExport aElem(GetExport(),
555*b1cdbd2cSJim Jagielski 										 XML_NAMESPACE_OFFICE,
556*b1cdbd2cSJim Jagielski 										 XML_DDE_SOURCE, sal_True, sal_True);
557*b1cdbd2cSJim Jagielski 			}
558*b1cdbd2cSJim Jagielski 			// else: no DDE data source
559*b1cdbd2cSJim Jagielski 		}
560*b1cdbd2cSJim Jagielski 		// else: no DDE on this system
561*b1cdbd2cSJim Jagielski 	}
562*b1cdbd2cSJim Jagielski }
563*b1cdbd2cSJim Jagielski 
ExportTableOfContentStart(const Reference<XPropertySet> & rPropertySet)564*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportTableOfContentStart(
565*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
566*b1cdbd2cSJim Jagielski {
567*b1cdbd2cSJim Jagielski 	// export TOC element start
568*b1cdbd2cSJim Jagielski 	ExportBaseIndexStart(XML_TABLE_OF_CONTENT, rPropertySet);
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski 	// scope for table-of-content-source element
571*b1cdbd2cSJim Jagielski 	{
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski 		Any aAny;
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 		// TOC specific index source attributes:
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski         // outline-level: 1..10
578*b1cdbd2cSJim Jagielski         sal_Int16 nLevel = sal_Int16();
579*b1cdbd2cSJim Jagielski         if( rPropertySet->getPropertyValue(sLevel) >>= nLevel )
580*b1cdbd2cSJim Jagielski         {
581*b1cdbd2cSJim Jagielski             OUStringBuffer sBuffer;
582*b1cdbd2cSJim Jagielski             SvXMLUnitConverter::convertNumber(sBuffer, (sal_Int32)nLevel);
583*b1cdbd2cSJim Jagielski             GetExport().AddAttribute(XML_NAMESPACE_TEXT,
584*b1cdbd2cSJim Jagielski                                      XML_OUTLINE_LEVEL,
585*b1cdbd2cSJim Jagielski                                      sBuffer.makeStringAndClear());
586*b1cdbd2cSJim Jagielski         }
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski         // use outline level
589*b1cdbd2cSJim Jagielski         ExportBoolean(rPropertySet, sCreateFromOutline,
590*b1cdbd2cSJim Jagielski                           XML_USE_OUTLINE_LEVEL, sal_True);
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 		// use index marks
593*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromMarks,
594*b1cdbd2cSJim Jagielski 					  XML_USE_INDEX_MARKS, sal_True);
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski 		// use level styles
597*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromLevelParagraphStyles,
598*b1cdbd2cSJim Jagielski 					  XML_USE_INDEX_SOURCE_STYLES, sal_False);
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski 		ExportBaseIndexSource(TEXT_SECTION_TYPE_TOC, rPropertySet);
601*b1cdbd2cSJim Jagielski 	}
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 	ExportBaseIndexBody(TEXT_SECTION_TYPE_TOC, rPropertySet);
604*b1cdbd2cSJim Jagielski }
605*b1cdbd2cSJim Jagielski 
ExportObjectIndexStart(const Reference<XPropertySet> & rPropertySet)606*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportObjectIndexStart(
607*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
608*b1cdbd2cSJim Jagielski {
609*b1cdbd2cSJim Jagielski 	// export index start
610*b1cdbd2cSJim Jagielski 	ExportBaseIndexStart(XML_OBJECT_INDEX, rPropertySet);
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski 	// scope for index source element
613*b1cdbd2cSJim Jagielski 	{
614*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromOtherEmbeddedObjects,
615*b1cdbd2cSJim Jagielski 					  XML_USE_OTHER_OBJECTS, sal_False);
616*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromStarCalc,
617*b1cdbd2cSJim Jagielski 					  XML_USE_SPREADSHEET_OBJECTS, sal_False);
618*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromStarChart,
619*b1cdbd2cSJim Jagielski 					  XML_USE_CHART_OBJECTS, sal_False);
620*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromStarDraw,
621*b1cdbd2cSJim Jagielski 					  XML_USE_DRAW_OBJECTS, sal_False);
622*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromStarMath,
623*b1cdbd2cSJim Jagielski 					  XML_USE_MATH_OBJECTS, sal_False);
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski 		ExportBaseIndexSource(TEXT_SECTION_TYPE_OBJECT, rPropertySet);
626*b1cdbd2cSJim Jagielski 	}
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski 	ExportBaseIndexBody(TEXT_SECTION_TYPE_OBJECT, rPropertySet);
629*b1cdbd2cSJim Jagielski }
630*b1cdbd2cSJim Jagielski 
ExportIllustrationIndexStart(const Reference<XPropertySet> & rPropertySet)631*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportIllustrationIndexStart(
632*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
633*b1cdbd2cSJim Jagielski {
634*b1cdbd2cSJim Jagielski 	// export index start
635*b1cdbd2cSJim Jagielski 	ExportBaseIndexStart(XML_ILLUSTRATION_INDEX, rPropertySet);
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 	// scope for index source element
638*b1cdbd2cSJim Jagielski 	{
639*b1cdbd2cSJim Jagielski 		// export common attributes for illustration and table indices
640*b1cdbd2cSJim Jagielski 		ExportTableAndIllustrationIndexSourceAttributes(rPropertySet);
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski 		ExportBaseIndexSource(TEXT_SECTION_TYPE_ILLUSTRATION, rPropertySet);
643*b1cdbd2cSJim Jagielski 	}
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski 	ExportBaseIndexBody(TEXT_SECTION_TYPE_ILLUSTRATION, rPropertySet);
646*b1cdbd2cSJim Jagielski }
647*b1cdbd2cSJim Jagielski 
ExportTableIndexStart(const Reference<XPropertySet> & rPropertySet)648*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportTableIndexStart(
649*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
650*b1cdbd2cSJim Jagielski {
651*b1cdbd2cSJim Jagielski 	// export index start
652*b1cdbd2cSJim Jagielski 	ExportBaseIndexStart(XML_TABLE_INDEX, rPropertySet);
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski 	// scope for index source element
655*b1cdbd2cSJim Jagielski 	{
656*b1cdbd2cSJim Jagielski 		// export common attributes for illustration and table indices
657*b1cdbd2cSJim Jagielski 		ExportTableAndIllustrationIndexSourceAttributes(rPropertySet);
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski 		ExportBaseIndexSource(TEXT_SECTION_TYPE_TABLE, rPropertySet);
660*b1cdbd2cSJim Jagielski 	}
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski 	ExportBaseIndexBody(TEXT_SECTION_TYPE_TABLE, rPropertySet);
663*b1cdbd2cSJim Jagielski }
664*b1cdbd2cSJim Jagielski 
ExportAlphabeticalIndexStart(const Reference<XPropertySet> & rPropertySet)665*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportAlphabeticalIndexStart(
666*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
667*b1cdbd2cSJim Jagielski {
668*b1cdbd2cSJim Jagielski 	// export TOC element start
669*b1cdbd2cSJim Jagielski 	ExportBaseIndexStart(XML_ALPHABETICAL_INDEX, rPropertySet);
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski 	// scope for table-of-content-source element
672*b1cdbd2cSJim Jagielski 	{
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 		// style name (if present)
675*b1cdbd2cSJim Jagielski 		Any aAny;
676*b1cdbd2cSJim Jagielski 		aAny = rPropertySet->getPropertyValue(sMainEntryCharacterStyleName);
677*b1cdbd2cSJim Jagielski 		OUString sStyleName;
678*b1cdbd2cSJim Jagielski 		aAny >>= sStyleName;
679*b1cdbd2cSJim Jagielski 		if (sStyleName.getLength())
680*b1cdbd2cSJim Jagielski 		{
681*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_TEXT,
682*b1cdbd2cSJim Jagielski 									 XML_MAIN_ENTRY_STYLE_NAME,
683*b1cdbd2cSJim Jagielski 									 GetExport().EncodeStyleName( sStyleName ));
684*b1cdbd2cSJim Jagielski 		}
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski 		// other (boolean) attributes
687*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sIsCaseSensitive, XML_IGNORE_CASE,
688*b1cdbd2cSJim Jagielski 					  sal_False, sal_True);
689*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sUseAlphabeticalSeparators,
690*b1cdbd2cSJim Jagielski 					  XML_ALPHABETICAL_SEPARATORS, sal_False);
691*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sUseCombinedEntries, XML_COMBINE_ENTRIES,
692*b1cdbd2cSJim Jagielski 					  sal_True);
693*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sUseDash, XML_COMBINE_ENTRIES_WITH_DASH,
694*b1cdbd2cSJim Jagielski 					  sal_False);
695*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sUseKeyAsEntry, XML_USE_KEYS_AS_ENTRIES,
696*b1cdbd2cSJim Jagielski 					  sal_False);
697*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sUsePP, XML_COMBINE_ENTRIES_WITH_PP,
698*b1cdbd2cSJim Jagielski 					  sal_True);
699*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sUseUpperCase, XML_CAPITALIZE_ENTRIES,
700*b1cdbd2cSJim Jagielski 					  sal_False);
701*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sIsCommaSeparated, XML_COMMA_SEPARATED,
702*b1cdbd2cSJim Jagielski 					  sal_False);
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski         // sort algorithm
705*b1cdbd2cSJim Jagielski         aAny = rPropertySet->getPropertyValue(sSortAlgorithm);
706*b1cdbd2cSJim Jagielski         OUString sAlgorithm;
707*b1cdbd2cSJim Jagielski         aAny >>= sAlgorithm;
708*b1cdbd2cSJim Jagielski         if (sAlgorithm.getLength() > 0)
709*b1cdbd2cSJim Jagielski         {
710*b1cdbd2cSJim Jagielski             GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_SORT_ALGORITHM,
711*b1cdbd2cSJim Jagielski                                       sAlgorithm );
712*b1cdbd2cSJim Jagielski         }
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski         // locale
715*b1cdbd2cSJim Jagielski         aAny = rPropertySet->getPropertyValue(sLocale);
716*b1cdbd2cSJim Jagielski         Locale aLocale;
717*b1cdbd2cSJim Jagielski         aAny >>= aLocale;
718*b1cdbd2cSJim Jagielski         GetExport().AddAttribute(XML_NAMESPACE_FO, XML_LANGUAGE,
719*b1cdbd2cSJim Jagielski                                  aLocale.Language);
720*b1cdbd2cSJim Jagielski         GetExport().AddAttribute(XML_NAMESPACE_FO, XML_COUNTRY,
721*b1cdbd2cSJim Jagielski                                  aLocale.Country);
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski 		ExportBaseIndexSource(TEXT_SECTION_TYPE_ALPHABETICAL, rPropertySet);
724*b1cdbd2cSJim Jagielski 	}
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski 	ExportBaseIndexBody(TEXT_SECTION_TYPE_ALPHABETICAL, rPropertySet);
727*b1cdbd2cSJim Jagielski }
728*b1cdbd2cSJim Jagielski 
ExportUserIndexStart(const Reference<XPropertySet> & rPropertySet)729*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportUserIndexStart(
730*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
731*b1cdbd2cSJim Jagielski {
732*b1cdbd2cSJim Jagielski 	// export TOC element start
733*b1cdbd2cSJim Jagielski 	ExportBaseIndexStart(XML_USER_INDEX, rPropertySet);
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 	// scope for table-of-content-source element
736*b1cdbd2cSJim Jagielski 	{
737*b1cdbd2cSJim Jagielski 		// bool attributes
738*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromEmbeddedObjects,
739*b1cdbd2cSJim Jagielski 					  XML_USE_OBJECTS, sal_False);
740*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromGraphicObjects,
741*b1cdbd2cSJim Jagielski 					  XML_USE_GRAPHICS, sal_False);
742*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromMarks,
743*b1cdbd2cSJim Jagielski 					  XML_USE_INDEX_MARKS, sal_False);
744*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromTables,
745*b1cdbd2cSJim Jagielski 					  XML_USE_TABLES, sal_False);
746*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromTextFrames,
747*b1cdbd2cSJim Jagielski 					  XML_USE_FLOATING_FRAMES, sal_False);
748*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sUseLevelFromSource,
749*b1cdbd2cSJim Jagielski 					  XML_COPY_OUTLINE_LEVELS, sal_False);
750*b1cdbd2cSJim Jagielski 		ExportBoolean(rPropertySet, sCreateFromLevelParagraphStyles,
751*b1cdbd2cSJim Jagielski 					  XML_USE_INDEX_SOURCE_STYLES, sal_False);
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski         Any aAny = rPropertySet->getPropertyValue( sUserIndexName );
754*b1cdbd2cSJim Jagielski         OUString sIndexName;
755*b1cdbd2cSJim Jagielski         aAny >>= sIndexName;
756*b1cdbd2cSJim Jagielski         GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_INDEX_NAME,
757*b1cdbd2cSJim Jagielski                                  sIndexName);
758*b1cdbd2cSJim Jagielski 
759*b1cdbd2cSJim Jagielski 		ExportBaseIndexSource(TEXT_SECTION_TYPE_USER, rPropertySet);
760*b1cdbd2cSJim Jagielski 	}
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski 	ExportBaseIndexBody(TEXT_SECTION_TYPE_USER, rPropertySet);
763*b1cdbd2cSJim Jagielski }
764*b1cdbd2cSJim Jagielski 
ExportBibliographyStart(const Reference<XPropertySet> & rPropertySet)765*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportBibliographyStart(
766*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
767*b1cdbd2cSJim Jagielski {
768*b1cdbd2cSJim Jagielski 	// export TOC element start
769*b1cdbd2cSJim Jagielski 	ExportBaseIndexStart(XML_BIBLIOGRAPHY, rPropertySet);
770*b1cdbd2cSJim Jagielski 
771*b1cdbd2cSJim Jagielski 	// scope for table-of-content-source element
772*b1cdbd2cSJim Jagielski 	{
773*b1cdbd2cSJim Jagielski 		// No attributes. Fine.
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 		ExportBaseIndexSource(TEXT_SECTION_TYPE_BIBLIOGRAPHY, rPropertySet);
776*b1cdbd2cSJim Jagielski 	}
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski 	ExportBaseIndexBody(TEXT_SECTION_TYPE_BIBLIOGRAPHY, rPropertySet);
779*b1cdbd2cSJim Jagielski }
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski 
ExportBaseIndexStart(XMLTokenEnum eElement,const Reference<XPropertySet> & rPropertySet)782*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportBaseIndexStart(
783*b1cdbd2cSJim Jagielski     XMLTokenEnum eElement,
784*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
785*b1cdbd2cSJim Jagielski {
786*b1cdbd2cSJim Jagielski 	// protect + protection key
787*b1cdbd2cSJim Jagielski 	Any aAny = rPropertySet->getPropertyValue(sIsProtected);
788*b1cdbd2cSJim Jagielski 	if (*(sal_Bool*)aAny.getValue())
789*b1cdbd2cSJim Jagielski 	{
790*b1cdbd2cSJim Jagielski 		GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_PROTECTED, XML_TRUE);
791*b1cdbd2cSJim Jagielski 	}
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski     // index name
794*b1cdbd2cSJim Jagielski     OUString sIndexName;
795*b1cdbd2cSJim Jagielski     rPropertySet->getPropertyValue(sName) >>= sIndexName;
796*b1cdbd2cSJim Jagielski     if ( sIndexName.getLength() > 0 )
797*b1cdbd2cSJim Jagielski     {
798*b1cdbd2cSJim Jagielski         GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, sIndexName);
799*b1cdbd2cSJim Jagielski     }
800*b1cdbd2cSJim Jagielski 
801*b1cdbd2cSJim Jagielski 	// index  Element start
802*b1cdbd2cSJim Jagielski 	GetExport().IgnorableWhitespace();
803*b1cdbd2cSJim Jagielski 	GetExport().StartElement( XML_NAMESPACE_TEXT, eElement, sal_False );
804*b1cdbd2cSJim Jagielski }
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski static const XMLTokenEnum aTypeSourceElementNameMap[] =
807*b1cdbd2cSJim Jagielski {
808*b1cdbd2cSJim Jagielski 	XML_TABLE_OF_CONTENT_SOURCE,		// TOC
809*b1cdbd2cSJim Jagielski 	XML_TABLE_INDEX_SOURCE,			// table index
810*b1cdbd2cSJim Jagielski 	XML_ILLUSTRATION_INDEX_SOURCE,		// illustration index
811*b1cdbd2cSJim Jagielski 	XML_OBJECT_INDEX_SOURCE,			// object index
812*b1cdbd2cSJim Jagielski 	XML_USER_INDEX_SOURCE,				// user index
813*b1cdbd2cSJim Jagielski 	XML_ALPHABETICAL_INDEX_SOURCE,		// alphabetical index
814*b1cdbd2cSJim Jagielski 	XML_BIBLIOGRAPHY_SOURCE			// bibliography
815*b1cdbd2cSJim Jagielski };
816*b1cdbd2cSJim Jagielski 
ExportBaseIndexSource(SectionTypeEnum eType,const Reference<XPropertySet> & rPropertySet)817*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportBaseIndexSource(
818*b1cdbd2cSJim Jagielski 	SectionTypeEnum eType,
819*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
820*b1cdbd2cSJim Jagielski {
821*b1cdbd2cSJim Jagielski 	// check type
822*b1cdbd2cSJim Jagielski 	OSL_ENSURE(eType >= TEXT_SECTION_TYPE_TOC, "illegal index type");
823*b1cdbd2cSJim Jagielski 	OSL_ENSURE(eType <= TEXT_SECTION_TYPE_BIBLIOGRAPHY, "illegal index type");
824*b1cdbd2cSJim Jagielski 
825*b1cdbd2cSJim Jagielski 	Any aAny;
826*b1cdbd2cSJim Jagielski 
827*b1cdbd2cSJim Jagielski 	// common attributes; not supported by bibliography
828*b1cdbd2cSJim Jagielski 	if (eType != TEXT_SECTION_TYPE_BIBLIOGRAPHY)
829*b1cdbd2cSJim Jagielski 	{
830*b1cdbd2cSJim Jagielski 		// document or chapter index?
831*b1cdbd2cSJim Jagielski 		aAny = rPropertySet->getPropertyValue(sCreateFromChapter);
832*b1cdbd2cSJim Jagielski 		if (*(sal_Bool*)aAny.getValue())
833*b1cdbd2cSJim Jagielski 		{
834*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_TEXT,
835*b1cdbd2cSJim Jagielski                                      XML_INDEX_SCOPE, XML_CHAPTER);
836*b1cdbd2cSJim Jagielski 		}
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski 		// tab-stops relative to margin?
839*b1cdbd2cSJim Jagielski 		aAny = rPropertySet->getPropertyValue(sIsRelativeTabstops);
840*b1cdbd2cSJim Jagielski 		if (! *(sal_Bool*)aAny.getValue())
841*b1cdbd2cSJim Jagielski 		{
842*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_TEXT,
843*b1cdbd2cSJim Jagielski                                      XML_RELATIVE_TAB_STOP_POSITION,
844*b1cdbd2cSJim Jagielski                                      XML_FALSE);
845*b1cdbd2cSJim Jagielski 		}
846*b1cdbd2cSJim Jagielski     }
847*b1cdbd2cSJim Jagielski 
848*b1cdbd2cSJim Jagielski 	// the index source element (all indices)
849*b1cdbd2cSJim Jagielski 	SvXMLElementExport aElem(GetExport(),
850*b1cdbd2cSJim Jagielski 							 XML_NAMESPACE_TEXT,
851*b1cdbd2cSJim Jagielski 							 GetXMLToken(
852*b1cdbd2cSJim Jagielski                                  aTypeSourceElementNameMap[
853*b1cdbd2cSJim Jagielski                                     eType - TEXT_SECTION_TYPE_TOC]),
854*b1cdbd2cSJim Jagielski 							 sal_True, sal_True);
855*b1cdbd2cSJim Jagielski 
856*b1cdbd2cSJim Jagielski 	// scope for title template (all indices)
857*b1cdbd2cSJim Jagielski 	{
858*b1cdbd2cSJim Jagielski 		// header style name
859*b1cdbd2cSJim Jagielski 		aAny = rPropertySet->getPropertyValue(sParaStyleHeading);
860*b1cdbd2cSJim Jagielski 		OUString sStyleName;
861*b1cdbd2cSJim Jagielski 		aAny >>= sStyleName;
862*b1cdbd2cSJim Jagielski 		GetExport().AddAttribute(XML_NAMESPACE_TEXT,
863*b1cdbd2cSJim Jagielski 								 XML_STYLE_NAME,
864*b1cdbd2cSJim Jagielski 								 GetExport().EncodeStyleName( sStyleName ));
865*b1cdbd2cSJim Jagielski 
866*b1cdbd2cSJim Jagielski 		// title template
867*b1cdbd2cSJim Jagielski 		SvXMLElementExport aHeaderTemplate(GetExport(),
868*b1cdbd2cSJim Jagielski 										   XML_NAMESPACE_TEXT,
869*b1cdbd2cSJim Jagielski 										   XML_INDEX_TITLE_TEMPLATE,
870*b1cdbd2cSJim Jagielski 										   sal_True, sal_False);
871*b1cdbd2cSJim Jagielski 
872*b1cdbd2cSJim Jagielski 		// title as element content
873*b1cdbd2cSJim Jagielski 		aAny = rPropertySet->getPropertyValue(sTitle);
874*b1cdbd2cSJim Jagielski 		OUString sTitleString;
875*b1cdbd2cSJim Jagielski 		aAny >>= sTitleString;
876*b1cdbd2cSJim Jagielski 		GetExport().Characters(sTitleString);
877*b1cdbd2cSJim Jagielski 	}
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski 	// export level templates (all indices)
880*b1cdbd2cSJim Jagielski 	aAny = rPropertySet->getPropertyValue(sLevelFormat);
881*b1cdbd2cSJim Jagielski 	Reference<XIndexReplace> xLevelTemplates;
882*b1cdbd2cSJim Jagielski 	aAny >>= xLevelTemplates;
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski 	// iterate over level formats;
885*b1cdbd2cSJim Jagielski 	// skip element 0 (empty template for title)
886*b1cdbd2cSJim Jagielski 	sal_Int32 nLevelCount = xLevelTemplates->getCount();
887*b1cdbd2cSJim Jagielski 	for(sal_Int32 i = 1; i<nLevelCount; i++)
888*b1cdbd2cSJim Jagielski 	{
889*b1cdbd2cSJim Jagielski 		// get sequence
890*b1cdbd2cSJim Jagielski 		Sequence<PropertyValues> aTemplateSequence;
891*b1cdbd2cSJim Jagielski 		aAny = xLevelTemplates->getByIndex(i);
892*b1cdbd2cSJim Jagielski 		aAny >>= aTemplateSequence;
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski 		// export the sequence (abort export if an error occured; #91214#)
895*b1cdbd2cSJim Jagielski 		sal_Bool bResult =
896*b1cdbd2cSJim Jagielski             ExportIndexTemplate(eType, i, rPropertySet, aTemplateSequence);
897*b1cdbd2cSJim Jagielski         if ( !bResult )
898*b1cdbd2cSJim Jagielski             break;
899*b1cdbd2cSJim Jagielski 	}
900*b1cdbd2cSJim Jagielski 
901*b1cdbd2cSJim Jagielski 	// only TOC and user index:
902*b1cdbd2cSJim Jagielski 	// styles from which to build the index (LevelParagraphStyles)
903*b1cdbd2cSJim Jagielski 	if ( (TEXT_SECTION_TYPE_TOC == eType) ||
904*b1cdbd2cSJim Jagielski 		 (TEXT_SECTION_TYPE_USER == eType)   )
905*b1cdbd2cSJim Jagielski 	{
906*b1cdbd2cSJim Jagielski 		aAny = rPropertySet->getPropertyValue(sLevelParagraphStyles);
907*b1cdbd2cSJim Jagielski 		Reference<XIndexReplace> xLevelParagraphStyles;
908*b1cdbd2cSJim Jagielski 		aAny >>= xLevelParagraphStyles;
909*b1cdbd2cSJim Jagielski 		ExportLevelParagraphStyles(xLevelParagraphStyles);
910*b1cdbd2cSJim Jagielski 	}
911*b1cdbd2cSJim Jagielski }
912*b1cdbd2cSJim Jagielski 
913*b1cdbd2cSJim Jagielski 
ExportBaseIndexBody(SectionTypeEnum eType,const Reference<XPropertySet> &)914*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportBaseIndexBody(
915*b1cdbd2cSJim Jagielski 	SectionTypeEnum
916*b1cdbd2cSJim Jagielski     #if OSL_DEBUG_LEVEL > 0
917*b1cdbd2cSJim Jagielski     eType
918*b1cdbd2cSJim Jagielski     #endif
919*b1cdbd2cSJim Jagielski     ,
920*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> &)
921*b1cdbd2cSJim Jagielski {
922*b1cdbd2cSJim Jagielski 	// type not used; checked anyway.
923*b1cdbd2cSJim Jagielski 	OSL_ENSURE(eType >= TEXT_SECTION_TYPE_TOC, "illegal index type");
924*b1cdbd2cSJim Jagielski 	OSL_ENSURE(eType <= TEXT_SECTION_TYPE_BIBLIOGRAPHY, "illegal index type");
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski 	// export start only
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski 	// any old attributes?
929*b1cdbd2cSJim Jagielski 	GetExport().CheckAttrList();
930*b1cdbd2cSJim Jagielski 
931*b1cdbd2cSJim Jagielski 	// start surrounded by whitespace
932*b1cdbd2cSJim Jagielski 	GetExport().IgnorableWhitespace();
933*b1cdbd2cSJim Jagielski 	GetExport().StartElement( XML_NAMESPACE_TEXT, XML_INDEX_BODY, sal_True );
934*b1cdbd2cSJim Jagielski }
935*b1cdbd2cSJim Jagielski 
ExportTableAndIllustrationIndexSourceAttributes(const Reference<XPropertySet> & rPropertySet)936*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportTableAndIllustrationIndexSourceAttributes(
937*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet)
938*b1cdbd2cSJim Jagielski {
939*b1cdbd2cSJim Jagielski 	// use caption
940*b1cdbd2cSJim Jagielski 	Any aAny = rPropertySet->getPropertyValue(sCreateFromLabels);
941*b1cdbd2cSJim Jagielski 	if (! *(sal_Bool*)aAny.getValue())
942*b1cdbd2cSJim Jagielski 	{
943*b1cdbd2cSJim Jagielski 		GetExport().AddAttribute(XML_NAMESPACE_TEXT,
944*b1cdbd2cSJim Jagielski                                  XML_USE_CAPTION, XML_FALSE);
945*b1cdbd2cSJim Jagielski 	}
946*b1cdbd2cSJim Jagielski 
947*b1cdbd2cSJim Jagielski 	// sequence name
948*b1cdbd2cSJim Jagielski 	aAny = rPropertySet->getPropertyValue(sLabelCategory);
949*b1cdbd2cSJim Jagielski 	OUString sSequenceName;
950*b1cdbd2cSJim Jagielski 	aAny >>= sSequenceName;
951*b1cdbd2cSJim Jagielski 	GetExport().AddAttribute(XML_NAMESPACE_TEXT,
952*b1cdbd2cSJim Jagielski 							 XML_CAPTION_SEQUENCE_NAME,
953*b1cdbd2cSJim Jagielski 							 sSequenceName);
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski 	// caption format
956*b1cdbd2cSJim Jagielski 	aAny = rPropertySet->getPropertyValue(sLabelDisplayType);
957*b1cdbd2cSJim Jagielski 	sal_Int16 nType = 0;
958*b1cdbd2cSJim Jagielski 	aAny >>= nType;
959*b1cdbd2cSJim Jagielski 	GetExport().AddAttribute(XML_NAMESPACE_TEXT,
960*b1cdbd2cSJim Jagielski                              XML_CAPTION_SEQUENCE_FORMAT,
961*b1cdbd2cSJim Jagielski                              XMLTextFieldExport::MapReferenceType(nType));
962*b1cdbd2cSJim Jagielski }
963*b1cdbd2cSJim Jagielski 
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski // map index of LevelFormats to attribute value;
966*b1cdbd2cSJim Jagielski // level 0 is always the header
967*b1cdbd2cSJim Jagielski static const XMLTokenEnum aLevelNameTOCMap[] =
968*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID, XML_1, XML_2, XML_3, XML_4, XML_5, XML_6, XML_7,
969*b1cdbd2cSJim Jagielski 		  XML_8, XML_9, XML_10, XML_TOKEN_INVALID };
970*b1cdbd2cSJim Jagielski static const XMLTokenEnum aLevelNameTableMap[] =
971*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID, XML__EMPTY, XML_TOKEN_INVALID };
972*b1cdbd2cSJim Jagielski static const XMLTokenEnum aLevelNameAlphaMap[] =
973*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID, XML_SEPARATOR, XML_1, XML_2, XML_3, XML_TOKEN_INVALID };
974*b1cdbd2cSJim Jagielski static const XMLTokenEnum aLevelNameBibliographyMap[] =
975*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID, XML_ARTICLE, XML_BOOK, XML_BOOKLET, XML_CONFERENCE,
976*b1cdbd2cSJim Jagielski 		  XML_CUSTOM1, XML_CUSTOM2, XML_CUSTOM3, XML_CUSTOM4,
977*b1cdbd2cSJim Jagielski 		  XML_CUSTOM5, XML_EMAIL, XML_INBOOK, XML_INCOLLECTION,
978*b1cdbd2cSJim Jagielski 		  XML_INPROCEEDINGS, XML_JOURNAL,
979*b1cdbd2cSJim Jagielski 		  XML_MANUAL, XML_MASTERSTHESIS, XML_MISC, XML_PHDTHESIS,
980*b1cdbd2cSJim Jagielski 		  XML_PROCEEDINGS, XML_TECHREPORT, XML_UNPUBLISHED, XML_WWW,
981*b1cdbd2cSJim Jagielski 		  XML_TOKEN_INVALID };
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski static const XMLTokenEnum* aTypeLevelNameMap[] =
984*b1cdbd2cSJim Jagielski {
985*b1cdbd2cSJim Jagielski 	aLevelNameTOCMap,			// TOC
986*b1cdbd2cSJim Jagielski 	aLevelNameTableMap,			// table index
987*b1cdbd2cSJim Jagielski 	aLevelNameTableMap,			// illustration index
988*b1cdbd2cSJim Jagielski 	aLevelNameTableMap,			// object index
989*b1cdbd2cSJim Jagielski 	aLevelNameTOCMap,			// user index
990*b1cdbd2cSJim Jagielski 	aLevelNameAlphaMap,			// alphabetical index
991*b1cdbd2cSJim Jagielski 	aLevelNameBibliographyMap	// bibliography
992*b1cdbd2cSJim Jagielski };
993*b1cdbd2cSJim Jagielski 
994*b1cdbd2cSJim Jagielski static const sal_Char* aLevelStylePropNameTOCMap[] =
995*b1cdbd2cSJim Jagielski 	{ NULL, "ParaStyleLevel1", "ParaStyleLevel2", "ParaStyleLevel3",
996*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel4", "ParaStyleLevel5", "ParaStyleLevel6",
997*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel7", "ParaStyleLevel8", "ParaStyleLevel9",
998*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel10", NULL };
999*b1cdbd2cSJim Jagielski static const sal_Char* aLevelStylePropNameTableMap[] =
1000*b1cdbd2cSJim Jagielski 	{ NULL, "ParaStyleLevel1", NULL };
1001*b1cdbd2cSJim Jagielski static const sal_Char* aLevelStylePropNameAlphaMap[] =
1002*b1cdbd2cSJim Jagielski 	{ NULL, "ParaStyleSeparator", "ParaStyleLevel1", "ParaStyleLevel2",
1003*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel3", NULL };
1004*b1cdbd2cSJim Jagielski static const sal_Char* aLevelStylePropNameBibliographyMap[] =
1005*b1cdbd2cSJim Jagielski 		  // TODO: replace with real property names, when available
1006*b1cdbd2cSJim Jagielski 	{ NULL, "ParaStyleLevel1", "ParaStyleLevel1", "ParaStyleLevel1",
1007*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel1", "ParaStyleLevel1", "ParaStyleLevel1",
1008*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel1", "ParaStyleLevel1", "ParaStyleLevel1",
1009*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel1", "ParaStyleLevel1", "ParaStyleLevel1",
1010*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel1", "ParaStyleLevel1", "ParaStyleLevel1",
1011*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel1", "ParaStyleLevel1", "ParaStyleLevel1",
1012*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel1", "ParaStyleLevel1", "ParaStyleLevel1",
1013*b1cdbd2cSJim Jagielski 		  "ParaStyleLevel1",
1014*b1cdbd2cSJim Jagielski 		  NULL };
1015*b1cdbd2cSJim Jagielski 
1016*b1cdbd2cSJim Jagielski static const sal_Char** aTypeLevelStylePropNameMap[] =
1017*b1cdbd2cSJim Jagielski {
1018*b1cdbd2cSJim Jagielski 	aLevelStylePropNameTOCMap,			// TOC
1019*b1cdbd2cSJim Jagielski 	aLevelStylePropNameTableMap,		// table index
1020*b1cdbd2cSJim Jagielski 	aLevelStylePropNameTableMap,		// illustration index
1021*b1cdbd2cSJim Jagielski 	aLevelStylePropNameTableMap,		// object index
1022*b1cdbd2cSJim Jagielski 	aLevelStylePropNameTOCMap,			// user index
1023*b1cdbd2cSJim Jagielski 	aLevelStylePropNameAlphaMap,		// alphabetical index
1024*b1cdbd2cSJim Jagielski 	aLevelStylePropNameBibliographyMap	// bibliography
1025*b1cdbd2cSJim Jagielski };
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski static const XMLTokenEnum aTypeLevelAttrMap[] =
1028*b1cdbd2cSJim Jagielski {
1029*b1cdbd2cSJim Jagielski 	XML_OUTLINE_LEVEL,		// TOC
1030*b1cdbd2cSJim Jagielski 	XML_TOKEN_INVALID,		// table index
1031*b1cdbd2cSJim Jagielski 	XML_TOKEN_INVALID,		// illustration index
1032*b1cdbd2cSJim Jagielski 	XML_TOKEN_INVALID,		// object index
1033*b1cdbd2cSJim Jagielski 	XML_OUTLINE_LEVEL,		// user index
1034*b1cdbd2cSJim Jagielski 	XML_OUTLINE_LEVEL,		// alphabetical index
1035*b1cdbd2cSJim Jagielski 	XML_BIBLIOGRAPHY_TYPE	// bibliography
1036*b1cdbd2cSJim Jagielski };
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski static const XMLTokenEnum aTypeElementNameMap[] =
1039*b1cdbd2cSJim Jagielski {
1040*b1cdbd2cSJim Jagielski 	XML_TABLE_OF_CONTENT_ENTRY_TEMPLATE,	// TOC
1041*b1cdbd2cSJim Jagielski 	XML_TABLE_INDEX_ENTRY_TEMPLATE,		// table index
1042*b1cdbd2cSJim Jagielski 	XML_ILLUSTRATION_INDEX_ENTRY_TEMPLATE,	// illustration index
1043*b1cdbd2cSJim Jagielski 	XML_OBJECT_INDEX_ENTRY_TEMPLATE,		// object index
1044*b1cdbd2cSJim Jagielski 	XML_USER_INDEX_ENTRY_TEMPLATE,			// user index
1045*b1cdbd2cSJim Jagielski 	XML_ALPHABETICAL_INDEX_ENTRY_TEMPLATE,	// alphabetical index
1046*b1cdbd2cSJim Jagielski 	XML_BIBLIOGRAPHY_ENTRY_TEMPLATE		// bibliography
1047*b1cdbd2cSJim Jagielski };
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski 
ExportIndexTemplate(SectionTypeEnum eType,sal_Int32 nOutlineLevel,const Reference<XPropertySet> & rPropertySet,Sequence<Sequence<PropertyValue>> & rValues)1050*b1cdbd2cSJim Jagielski sal_Bool XMLSectionExport::ExportIndexTemplate(
1051*b1cdbd2cSJim Jagielski 	SectionTypeEnum eType,
1052*b1cdbd2cSJim Jagielski 	sal_Int32 nOutlineLevel,
1053*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropertySet,
1054*b1cdbd2cSJim Jagielski 	Sequence<Sequence<PropertyValue> > & rValues)
1055*b1cdbd2cSJim Jagielski {
1056*b1cdbd2cSJim Jagielski 	OSL_ENSURE(eType >= TEXT_SECTION_TYPE_TOC, "illegal index type");
1057*b1cdbd2cSJim Jagielski 	OSL_ENSURE(eType <= TEXT_SECTION_TYPE_BIBLIOGRAPHY, "illegal index type");
1058*b1cdbd2cSJim Jagielski 	OSL_ENSURE(nOutlineLevel >= 0, "illegal outline level");
1059*b1cdbd2cSJim Jagielski 
1060*b1cdbd2cSJim Jagielski 	if ( (eType >= TEXT_SECTION_TYPE_TOC) &&
1061*b1cdbd2cSJim Jagielski 		 (eType <= TEXT_SECTION_TYPE_BIBLIOGRAPHY) &&
1062*b1cdbd2cSJim Jagielski 		 (nOutlineLevel >= 0) )
1063*b1cdbd2cSJim Jagielski 	{
1064*b1cdbd2cSJim Jagielski 		// get level name and level attribute name from aLevelNameMap;
1065*b1cdbd2cSJim Jagielski 		const XMLTokenEnum eLevelAttrName(
1066*b1cdbd2cSJim Jagielski 			aTypeLevelAttrMap[eType-TEXT_SECTION_TYPE_TOC]);
1067*b1cdbd2cSJim Jagielski 		const XMLTokenEnum eLevelName(
1068*b1cdbd2cSJim Jagielski 			aTypeLevelNameMap[eType-TEXT_SECTION_TYPE_TOC][nOutlineLevel]);
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski         // #92124#: some old documents may be broken, then they have
1071*b1cdbd2cSJim Jagielski         // too many template levels; we need to recognize this and
1072*b1cdbd2cSJim Jagielski         // export only as many as is legal for the respective index
1073*b1cdbd2cSJim Jagielski         // type. To do this, we simply return an error flag, which
1074*b1cdbd2cSJim Jagielski         // will then abort further template level exports.
1075*b1cdbd2cSJim Jagielski 		OSL_ENSURE(XML_TOKEN_INVALID != eLevelName, "can't find level name");
1076*b1cdbd2cSJim Jagielski         if ( XML_TOKEN_INVALID == eLevelName )
1077*b1cdbd2cSJim Jagielski         {
1078*b1cdbd2cSJim Jagielski             // output level not found? Then end of templates! #91214#
1079*b1cdbd2cSJim Jagielski             return sal_False;
1080*b1cdbd2cSJim Jagielski         }
1081*b1cdbd2cSJim Jagielski 
1082*b1cdbd2cSJim Jagielski 		// output level name
1083*b1cdbd2cSJim Jagielski 		if ((XML_TOKEN_INVALID != eLevelName) && (XML_TOKEN_INVALID != eLevelAttrName))
1084*b1cdbd2cSJim Jagielski 		{
1085*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_TEXT,
1086*b1cdbd2cSJim Jagielski 										  GetXMLToken(eLevelAttrName),
1087*b1cdbd2cSJim Jagielski 										  GetXMLToken(eLevelName));
1088*b1cdbd2cSJim Jagielski 		}
1089*b1cdbd2cSJim Jagielski 
1090*b1cdbd2cSJim Jagielski 		// paragraph level style name
1091*b1cdbd2cSJim Jagielski 		const sal_Char* pPropName(
1092*b1cdbd2cSJim Jagielski 			aTypeLevelStylePropNameMap[eType-TEXT_SECTION_TYPE_TOC][nOutlineLevel]);
1093*b1cdbd2cSJim Jagielski 		OSL_ENSURE(NULL != pPropName, "can't find property name");
1094*b1cdbd2cSJim Jagielski 		if (NULL != pPropName)
1095*b1cdbd2cSJim Jagielski 		{
1096*b1cdbd2cSJim Jagielski 			Any aAny = rPropertySet->getPropertyValue(
1097*b1cdbd2cSJim Jagielski 				OUString::createFromAscii(pPropName));
1098*b1cdbd2cSJim Jagielski 			OUString sParaStyleName;
1099*b1cdbd2cSJim Jagielski 			aAny >>= sParaStyleName;
1100*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_TEXT,
1101*b1cdbd2cSJim Jagielski 									 XML_STYLE_NAME,
1102*b1cdbd2cSJim Jagielski 									 GetExport().EncodeStyleName( sParaStyleName ));
1103*b1cdbd2cSJim Jagielski 		}
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski 		// template element
1106*b1cdbd2cSJim Jagielski 		const XMLTokenEnum eElementName(
1107*b1cdbd2cSJim Jagielski 			aTypeElementNameMap[eType - TEXT_SECTION_TYPE_TOC]);
1108*b1cdbd2cSJim Jagielski 		SvXMLElementExport aLevelTemplate(GetExport(),
1109*b1cdbd2cSJim Jagielski 										  XML_NAMESPACE_TEXT,
1110*b1cdbd2cSJim Jagielski 										  GetXMLToken(eElementName),
1111*b1cdbd2cSJim Jagielski 										  sal_True, sal_True);
1112*b1cdbd2cSJim Jagielski 
1113*b1cdbd2cSJim Jagielski 		// export sequence
1114*b1cdbd2cSJim Jagielski 		sal_Int32 nTemplateCount = rValues.getLength();
1115*b1cdbd2cSJim Jagielski 		for(sal_Int32 nTemplateNo = 0;
1116*b1cdbd2cSJim Jagielski 			nTemplateNo < nTemplateCount;
1117*b1cdbd2cSJim Jagielski 			nTemplateNo++)
1118*b1cdbd2cSJim Jagielski 		{
1119*b1cdbd2cSJim Jagielski 			ExportIndexTemplateElement(
1120*b1cdbd2cSJim Jagielski                 eType,  //i90246
1121*b1cdbd2cSJim Jagielski 				rValues[nTemplateNo]);
1122*b1cdbd2cSJim Jagielski 		}
1123*b1cdbd2cSJim Jagielski 	}
1124*b1cdbd2cSJim Jagielski 
1125*b1cdbd2cSJim Jagielski     return sal_True;
1126*b1cdbd2cSJim Jagielski }
1127*b1cdbd2cSJim Jagielski 
1128*b1cdbd2cSJim Jagielski 
1129*b1cdbd2cSJim Jagielski enum TemplateTypeEnum
1130*b1cdbd2cSJim Jagielski {
1131*b1cdbd2cSJim Jagielski 	TOK_TTYPE_ENTRY_NUMBER,
1132*b1cdbd2cSJim Jagielski 	TOK_TTYPE_ENTRY_TEXT,
1133*b1cdbd2cSJim Jagielski 	TOK_TTYPE_TAB_STOP,
1134*b1cdbd2cSJim Jagielski 	TOK_TTYPE_TEXT,
1135*b1cdbd2cSJim Jagielski 	TOK_TTYPE_PAGE_NUMBER,
1136*b1cdbd2cSJim Jagielski 	TOK_TTYPE_CHAPTER_INFO,
1137*b1cdbd2cSJim Jagielski 	TOK_TTYPE_HYPERLINK_START,
1138*b1cdbd2cSJim Jagielski 	TOK_TTYPE_HYPERLINK_END,
1139*b1cdbd2cSJim Jagielski 	TOK_TTYPE_BIBLIOGRAPHY,
1140*b1cdbd2cSJim Jagielski 	TOK_TTYPE_INVALID
1141*b1cdbd2cSJim Jagielski };
1142*b1cdbd2cSJim Jagielski 
1143*b1cdbd2cSJim Jagielski enum TemplateParamEnum
1144*b1cdbd2cSJim Jagielski {
1145*b1cdbd2cSJim Jagielski 	TOK_TPARAM_TOKEN_TYPE,
1146*b1cdbd2cSJim Jagielski 	TOK_TPARAM_CHAR_STYLE,
1147*b1cdbd2cSJim Jagielski 	TOK_TPARAM_TAB_RIGHT_ALIGNED,
1148*b1cdbd2cSJim Jagielski 	TOK_TPARAM_TAB_POSITION,
1149*b1cdbd2cSJim Jagielski 	TOK_TPARAM_TAB_WITH_TAB, // #i21237#
1150*b1cdbd2cSJim Jagielski 	TOK_TPARAM_TAB_FILL_CHAR,
1151*b1cdbd2cSJim Jagielski 	TOK_TPARAM_TEXT,
1152*b1cdbd2cSJim Jagielski 	TOK_TPARAM_CHAPTER_FORMAT,
1153*b1cdbd2cSJim Jagielski 	TOK_TPARAM_CHAPTER_LEVEL,//i53420
1154*b1cdbd2cSJim Jagielski 	TOK_TPARAM_BIBLIOGRAPHY_DATA
1155*b1cdbd2cSJim Jagielski };
1156*b1cdbd2cSJim Jagielski 
1157*b1cdbd2cSJim Jagielski SvXMLEnumStringMapEntry __READONLY_DATA aTemplateTypeMap[] =
1158*b1cdbd2cSJim Jagielski {
1159*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "TokenEntryNumber",  TOK_TTYPE_ENTRY_NUMBER ),
1160*b1cdbd2cSJim Jagielski     ENUM_STRING_MAP_ENTRY( "TokenEntryText",    TOK_TTYPE_ENTRY_TEXT ),
1161*b1cdbd2cSJim Jagielski     ENUM_STRING_MAP_ENTRY( "TokenTabStop",      TOK_TTYPE_TAB_STOP ),
1162*b1cdbd2cSJim Jagielski     ENUM_STRING_MAP_ENTRY( "TokenText",         TOK_TTYPE_TEXT ),
1163*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "TokenPageNumber",   TOK_TTYPE_PAGE_NUMBER ),
1164*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "TokenChapterInfo",  TOK_TTYPE_CHAPTER_INFO ),
1165*b1cdbd2cSJim Jagielski     ENUM_STRING_MAP_ENTRY( "TokenHyperlinkStart", TOK_TTYPE_HYPERLINK_START ),
1166*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "TokenHyperlinkEnd",	TOK_TTYPE_HYPERLINK_END ),
1167*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "TokenBibliographyDataField", TOK_TTYPE_BIBLIOGRAPHY ),
1168*b1cdbd2cSJim Jagielski     ENUM_STRING_MAP_END()
1169*b1cdbd2cSJim Jagielski };
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski SvXMLEnumStringMapEntry __READONLY_DATA aTemplateParamMap[] =
1172*b1cdbd2cSJim Jagielski {
1173*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "TokenType",             TOK_TPARAM_TOKEN_TYPE ),
1174*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "CharacterStyleName",    TOK_TPARAM_CHAR_STYLE ),
1175*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "TabStopRightAligned",   TOK_TPARAM_TAB_RIGHT_ALIGNED ),
1176*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "TabStopPosition",       TOK_TPARAM_TAB_POSITION ),
1177*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "TabStopFillCharacter",  TOK_TPARAM_TAB_FILL_CHAR ),
1178*b1cdbd2cSJim Jagielski     // #i21237#
1179*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "WithTab",               TOK_TPARAM_TAB_WITH_TAB ),
1180*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "Text",                  TOK_TPARAM_TEXT ),
1181*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "ChapterFormat",         TOK_TPARAM_CHAPTER_FORMAT ),
1182*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "ChapterLevel",          TOK_TPARAM_CHAPTER_LEVEL ),//i53420
1183*b1cdbd2cSJim Jagielski 	ENUM_STRING_MAP_ENTRY( "BibliographyDataField", TOK_TPARAM_BIBLIOGRAPHY_DATA ),
1184*b1cdbd2cSJim Jagielski     ENUM_STRING_MAP_END()
1185*b1cdbd2cSJim Jagielski };
1186*b1cdbd2cSJim Jagielski 
1187*b1cdbd2cSJim Jagielski SvXMLEnumMapEntry __READONLY_DATA aBibliographyDataFieldMap[] =
1188*b1cdbd2cSJim Jagielski {
1189*b1cdbd2cSJim Jagielski 	{ XML_ADDRESS,				BibliographyDataField::ADDRESS },
1190*b1cdbd2cSJim Jagielski 	{ XML_ANNOTE,				BibliographyDataField::ANNOTE },
1191*b1cdbd2cSJim Jagielski 	{ XML_AUTHOR,				BibliographyDataField::AUTHOR },
1192*b1cdbd2cSJim Jagielski 	{ XML_BIBLIOGRAPHY_TYPE,    BibliographyDataField::BIBILIOGRAPHIC_TYPE },
1193*b1cdbd2cSJim Jagielski 	{ XML_BOOKTITLE,			BibliographyDataField::BOOKTITLE },
1194*b1cdbd2cSJim Jagielski 	{ XML_CHAPTER,				BibliographyDataField::CHAPTER },
1195*b1cdbd2cSJim Jagielski 	{ XML_CUSTOM1,				BibliographyDataField::CUSTOM1 },
1196*b1cdbd2cSJim Jagielski 	{ XML_CUSTOM2,				BibliographyDataField::CUSTOM2 },
1197*b1cdbd2cSJim Jagielski 	{ XML_CUSTOM3,				BibliographyDataField::CUSTOM3 },
1198*b1cdbd2cSJim Jagielski 	{ XML_CUSTOM4,				BibliographyDataField::CUSTOM4 },
1199*b1cdbd2cSJim Jagielski 	{ XML_CUSTOM5,				BibliographyDataField::CUSTOM5 },
1200*b1cdbd2cSJim Jagielski 	{ XML_EDITION,				BibliographyDataField::EDITION },
1201*b1cdbd2cSJim Jagielski 	{ XML_EDITOR,				BibliographyDataField::EDITOR },
1202*b1cdbd2cSJim Jagielski 	{ XML_HOWPUBLISHED,		    BibliographyDataField::HOWPUBLISHED },
1203*b1cdbd2cSJim Jagielski 	{ XML_IDENTIFIER,			BibliographyDataField::IDENTIFIER },
1204*b1cdbd2cSJim Jagielski 	{ XML_INSTITUTION,			BibliographyDataField::INSTITUTION },
1205*b1cdbd2cSJim Jagielski 	{ XML_ISBN,				    BibliographyDataField::ISBN },
1206*b1cdbd2cSJim Jagielski 	{ XML_JOURNAL,				BibliographyDataField::JOURNAL },
1207*b1cdbd2cSJim Jagielski 	{ XML_MONTH,				BibliographyDataField::MONTH },
1208*b1cdbd2cSJim Jagielski 	{ XML_NOTE,				    BibliographyDataField::NOTE },
1209*b1cdbd2cSJim Jagielski 	{ XML_NUMBER,				BibliographyDataField::NUMBER },
1210*b1cdbd2cSJim Jagielski 	{ XML_ORGANIZATIONS,		BibliographyDataField::ORGANIZATIONS },
1211*b1cdbd2cSJim Jagielski 	{ XML_PAGES,				BibliographyDataField::PAGES },
1212*b1cdbd2cSJim Jagielski 	{ XML_PUBLISHER,			BibliographyDataField::PUBLISHER },
1213*b1cdbd2cSJim Jagielski 	{ XML_REPORT_TYPE,			BibliographyDataField::REPORT_TYPE },
1214*b1cdbd2cSJim Jagielski 	{ XML_SCHOOL,				BibliographyDataField::SCHOOL },
1215*b1cdbd2cSJim Jagielski     { XML_SERIES,				BibliographyDataField::SERIES },
1216*b1cdbd2cSJim Jagielski 	{ XML_TITLE,				BibliographyDataField::TITLE },
1217*b1cdbd2cSJim Jagielski 	{ XML_URL,					BibliographyDataField::URL },
1218*b1cdbd2cSJim Jagielski 	{ XML_VOLUME,				BibliographyDataField::VOLUME },
1219*b1cdbd2cSJim Jagielski 	{ XML_YEAR,				    BibliographyDataField::YEAR },
1220*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID, 0 }
1221*b1cdbd2cSJim Jagielski };
1222*b1cdbd2cSJim Jagielski 
ExportIndexTemplateElement(SectionTypeEnum eType,Sequence<PropertyValue> & rValues)1223*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportIndexTemplateElement(
1224*b1cdbd2cSJim Jagielski     SectionTypeEnum eType,  //i90246
1225*b1cdbd2cSJim Jagielski     Sequence<PropertyValue> & rValues)
1226*b1cdbd2cSJim Jagielski {
1227*b1cdbd2cSJim Jagielski 	// variables for template values
1228*b1cdbd2cSJim Jagielski 
1229*b1cdbd2cSJim Jagielski 	// char style
1230*b1cdbd2cSJim Jagielski 	OUString sCharStyle;
1231*b1cdbd2cSJim Jagielski 	sal_Bool bCharStyleOK = sal_False;
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski 	// text
1234*b1cdbd2cSJim Jagielski 	OUString sText;
1235*b1cdbd2cSJim Jagielski 	sal_Bool bTextOK = sal_False;
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski 	// tab position
1238*b1cdbd2cSJim Jagielski 	sal_Bool bRightAligned = sal_False;
1239*b1cdbd2cSJim Jagielski 	sal_Bool bRightAlignedOK = sal_False;
1240*b1cdbd2cSJim Jagielski 
1241*b1cdbd2cSJim Jagielski 	// tab position
1242*b1cdbd2cSJim Jagielski 	sal_Int32 nTabPosition = 0;
1243*b1cdbd2cSJim Jagielski 	sal_Bool bTabPositionOK = sal_False;
1244*b1cdbd2cSJim Jagielski 
1245*b1cdbd2cSJim Jagielski 	// fill character
1246*b1cdbd2cSJim Jagielski 	OUString sFillChar;
1247*b1cdbd2cSJim Jagielski 	sal_Bool bFillCharOK = sal_False;
1248*b1cdbd2cSJim Jagielski 
1249*b1cdbd2cSJim Jagielski 	// chapter format
1250*b1cdbd2cSJim Jagielski 	sal_Int16 nChapterFormat = 0;
1251*b1cdbd2cSJim Jagielski 	sal_Bool bChapterFormatOK = sal_False;
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski     // outline max level
1254*b1cdbd2cSJim Jagielski 	sal_Int16 nLevel = 0;
1255*b1cdbd2cSJim Jagielski 	sal_Bool bLevelOK = sal_False;
1256*b1cdbd2cSJim Jagielski 
1257*b1cdbd2cSJim Jagielski 	// Bibliography Data
1258*b1cdbd2cSJim Jagielski 	sal_Int16 nBibliographyData = 0;
1259*b1cdbd2cSJim Jagielski 	sal_Bool bBibliographyDataOK = sal_False;
1260*b1cdbd2cSJim Jagielski 
1261*b1cdbd2cSJim Jagielski     // With Tab Stop #i21237#
1262*b1cdbd2cSJim Jagielski     sal_Bool bWithTabStop = sal_False;
1263*b1cdbd2cSJim Jagielski     sal_Bool bWithTabStopOK = sal_False;
1264*b1cdbd2cSJim Jagielski 
1265*b1cdbd2cSJim Jagielski     //i90246, the ODF version being written to is:
1266*b1cdbd2cSJim Jagielski     const SvtSaveOptions::ODFDefaultVersion aODFVersion = rExport.getDefaultVersion();
1267*b1cdbd2cSJim Jagielski     //the above version cannot be used for old OOo (OOo 1.0) formats!
1268*b1cdbd2cSJim Jagielski 
1269*b1cdbd2cSJim Jagielski     // token type
1270*b1cdbd2cSJim Jagielski 	enum TemplateTypeEnum nTokenType = TOK_TTYPE_INVALID;
1271*b1cdbd2cSJim Jagielski 
1272*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = rValues.getLength();
1273*b1cdbd2cSJim Jagielski 	for(sal_Int32 i = 0; i<nCount; i++)
1274*b1cdbd2cSJim Jagielski 	{
1275*b1cdbd2cSJim Jagielski 		sal_uInt16 nToken;
1276*b1cdbd2cSJim Jagielski 		if ( SvXMLUnitConverter::convertEnum( nToken, rValues[i].Name,
1277*b1cdbd2cSJim Jagielski 											  aTemplateParamMap ) )
1278*b1cdbd2cSJim Jagielski 		{
1279*b1cdbd2cSJim Jagielski 			// Only use direct and default values.
1280*b1cdbd2cSJim Jagielski 			// Wrong. no property states, so ignore.
1281*b1cdbd2cSJim Jagielski 			// if ( (beans::PropertyState_DIRECT_VALUE == rValues[i].State) ||
1282*b1cdbd2cSJim Jagielski 			//      (beans::PropertyState_DEFAULT_VALUE == rValues[i].State)  )
1283*b1cdbd2cSJim Jagielski 
1284*b1cdbd2cSJim Jagielski 			switch (nToken)
1285*b1cdbd2cSJim Jagielski 			{
1286*b1cdbd2cSJim Jagielski 				case TOK_TPARAM_TOKEN_TYPE:
1287*b1cdbd2cSJim Jagielski 				{
1288*b1cdbd2cSJim Jagielski 					sal_uInt16 nTmp;
1289*b1cdbd2cSJim Jagielski 					OUString sVal;
1290*b1cdbd2cSJim Jagielski 					rValues[i].Value >>= sVal;
1291*b1cdbd2cSJim Jagielski 					if (SvXMLUnitConverter::convertEnum( nTmp, sVal,
1292*b1cdbd2cSJim Jagielski 														 aTemplateTypeMap))
1293*b1cdbd2cSJim Jagielski 					{
1294*b1cdbd2cSJim Jagielski 						nTokenType = (enum TemplateTypeEnum)nTmp;
1295*b1cdbd2cSJim Jagielski 					}
1296*b1cdbd2cSJim Jagielski 					break;
1297*b1cdbd2cSJim Jagielski 				}
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski 				case TOK_TPARAM_CHAR_STYLE:
1300*b1cdbd2cSJim Jagielski 					// only valid, if not empty
1301*b1cdbd2cSJim Jagielski 					rValues[i].Value >>= sCharStyle;
1302*b1cdbd2cSJim Jagielski 					bCharStyleOK = sCharStyle.getLength() > 0;
1303*b1cdbd2cSJim Jagielski 					break;
1304*b1cdbd2cSJim Jagielski 
1305*b1cdbd2cSJim Jagielski 				case TOK_TPARAM_TEXT:
1306*b1cdbd2cSJim Jagielski 					rValues[i].Value >>= sText;
1307*b1cdbd2cSJim Jagielski 					bTextOK = sal_True;
1308*b1cdbd2cSJim Jagielski 					break;
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski 				case TOK_TPARAM_TAB_RIGHT_ALIGNED:
1311*b1cdbd2cSJim Jagielski 					bRightAligned =
1312*b1cdbd2cSJim Jagielski 						*(sal_Bool *)rValues[i].Value.getValue();
1313*b1cdbd2cSJim Jagielski 					bRightAlignedOK = sal_True;
1314*b1cdbd2cSJim Jagielski 					break;
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski 				case TOK_TPARAM_TAB_POSITION:
1317*b1cdbd2cSJim Jagielski 					rValues[i].Value >>= nTabPosition;
1318*b1cdbd2cSJim Jagielski 					bTabPositionOK = sal_True;
1319*b1cdbd2cSJim Jagielski 					break;
1320*b1cdbd2cSJim Jagielski 
1321*b1cdbd2cSJim Jagielski                 // #i21237#
1322*b1cdbd2cSJim Jagielski                 case TOK_TPARAM_TAB_WITH_TAB:
1323*b1cdbd2cSJim Jagielski 					bWithTabStop = *(sal_Bool *)rValues[i].Value.getValue();
1324*b1cdbd2cSJim Jagielski 					bWithTabStopOK = sal_True;
1325*b1cdbd2cSJim Jagielski 					break;
1326*b1cdbd2cSJim Jagielski 
1327*b1cdbd2cSJim Jagielski 				case TOK_TPARAM_TAB_FILL_CHAR:
1328*b1cdbd2cSJim Jagielski 					rValues[i].Value >>= sFillChar;
1329*b1cdbd2cSJim Jagielski 					bFillCharOK = sal_True;
1330*b1cdbd2cSJim Jagielski 					break;
1331*b1cdbd2cSJim Jagielski 
1332*b1cdbd2cSJim Jagielski 				case TOK_TPARAM_CHAPTER_FORMAT:
1333*b1cdbd2cSJim Jagielski 					rValues[i].Value >>= nChapterFormat;
1334*b1cdbd2cSJim Jagielski 					bChapterFormatOK = sal_True;
1335*b1cdbd2cSJim Jagielski 					break;
1336*b1cdbd2cSJim Jagielski //---> i53420
1337*b1cdbd2cSJim Jagielski                 case TOK_TPARAM_CHAPTER_LEVEL:
1338*b1cdbd2cSJim Jagielski                     rValues[i].Value >>= nLevel;
1339*b1cdbd2cSJim Jagielski                     bLevelOK = sal_True;
1340*b1cdbd2cSJim Jagielski                     break;
1341*b1cdbd2cSJim Jagielski //<---
1342*b1cdbd2cSJim Jagielski 				case TOK_TPARAM_BIBLIOGRAPHY_DATA:
1343*b1cdbd2cSJim Jagielski 					rValues[i].Value >>= nBibliographyData;
1344*b1cdbd2cSJim Jagielski 					bBibliographyDataOK = sal_True;
1345*b1cdbd2cSJim Jagielski 					break;
1346*b1cdbd2cSJim Jagielski 			}
1347*b1cdbd2cSJim Jagielski 		}
1348*b1cdbd2cSJim Jagielski 	}
1349*b1cdbd2cSJim Jagielski 
1350*b1cdbd2cSJim Jagielski 	// convert type to token (and check validity) ...
1351*b1cdbd2cSJim Jagielski 	XMLTokenEnum eElement(XML_TOKEN_INVALID);
1352*b1cdbd2cSJim Jagielski 	switch(nTokenType)
1353*b1cdbd2cSJim Jagielski 	{
1354*b1cdbd2cSJim Jagielski 		case TOK_TTYPE_ENTRY_TEXT:
1355*b1cdbd2cSJim Jagielski 			eElement = XML_INDEX_ENTRY_TEXT;
1356*b1cdbd2cSJim Jagielski 			break;
1357*b1cdbd2cSJim Jagielski 		case TOK_TTYPE_TAB_STOP:
1358*b1cdbd2cSJim Jagielski 			// test validity
1359*b1cdbd2cSJim Jagielski 			if ( bRightAligned || bTabPositionOK || bFillCharOK )
1360*b1cdbd2cSJim Jagielski             {
1361*b1cdbd2cSJim Jagielski 				eElement = XML_INDEX_ENTRY_TAB_STOP;
1362*b1cdbd2cSJim Jagielski             }
1363*b1cdbd2cSJim Jagielski 			break;
1364*b1cdbd2cSJim Jagielski 		case TOK_TTYPE_TEXT:
1365*b1cdbd2cSJim Jagielski 			// test validity
1366*b1cdbd2cSJim Jagielski 			if (bTextOK)
1367*b1cdbd2cSJim Jagielski             {
1368*b1cdbd2cSJim Jagielski                 eElement = XML_INDEX_ENTRY_SPAN;
1369*b1cdbd2cSJim Jagielski             }
1370*b1cdbd2cSJim Jagielski 			break;
1371*b1cdbd2cSJim Jagielski 		case TOK_TTYPE_PAGE_NUMBER:
1372*b1cdbd2cSJim Jagielski 			eElement = XML_INDEX_ENTRY_PAGE_NUMBER;
1373*b1cdbd2cSJim Jagielski 			break;
1374*b1cdbd2cSJim Jagielski 		case TOK_TTYPE_CHAPTER_INFO:	// keyword index
1375*b1cdbd2cSJim Jagielski 			eElement = XML_INDEX_ENTRY_CHAPTER;
1376*b1cdbd2cSJim Jagielski 			break;
1377*b1cdbd2cSJim Jagielski 		case TOK_TTYPE_ENTRY_NUMBER:	// table of content
1378*b1cdbd2cSJim Jagielski 			eElement = XML_INDEX_ENTRY_CHAPTER;
1379*b1cdbd2cSJim Jagielski 			break;
1380*b1cdbd2cSJim Jagielski 		case TOK_TTYPE_HYPERLINK_START:
1381*b1cdbd2cSJim Jagielski 			eElement = XML_INDEX_ENTRY_LINK_START;
1382*b1cdbd2cSJim Jagielski 			break;
1383*b1cdbd2cSJim Jagielski 		case TOK_TTYPE_HYPERLINK_END:
1384*b1cdbd2cSJim Jagielski 			eElement = XML_INDEX_ENTRY_LINK_END;
1385*b1cdbd2cSJim Jagielski 			break;
1386*b1cdbd2cSJim Jagielski 		case TOK_TTYPE_BIBLIOGRAPHY:
1387*b1cdbd2cSJim Jagielski 			if (bBibliographyDataOK)
1388*b1cdbd2cSJim Jagielski             {
1389*b1cdbd2cSJim Jagielski 				eElement = XML_INDEX_ENTRY_BIBLIOGRAPHY;
1390*b1cdbd2cSJim Jagielski             }
1391*b1cdbd2cSJim Jagielski 			break;
1392*b1cdbd2cSJim Jagielski 		default:
1393*b1cdbd2cSJim Jagielski 			; // unknown/unimplemented template
1394*b1cdbd2cSJim Jagielski 			break;
1395*b1cdbd2cSJim Jagielski 	}
1396*b1cdbd2cSJim Jagielski 
1397*b1cdbd2cSJim Jagielski     //--->i90246
1398*b1cdbd2cSJim Jagielski     //check the ODF version being exported
1399*b1cdbd2cSJim Jagielski     if( aODFVersion == SvtSaveOptions::ODFVER_011
1400*b1cdbd2cSJim Jagielski         || aODFVersion == SvtSaveOptions::ODFVER_010)
1401*b1cdbd2cSJim Jagielski     {
1402*b1cdbd2cSJim Jagielski         bLevelOK = sal_False;
1403*b1cdbd2cSJim Jagielski         if (TOK_TTYPE_CHAPTER_INFO == nTokenType)
1404*b1cdbd2cSJim Jagielski         {
1405*b1cdbd2cSJim Jagielski             //if we are emitting for ODF 1.1 or 1.0, this information can be used for alphabetical index only
1406*b1cdbd2cSJim Jagielski             //it's not permitted in other indexes
1407*b1cdbd2cSJim Jagielski             if (eType != TEXT_SECTION_TYPE_ALPHABETICAL)
1408*b1cdbd2cSJim Jagielski             {
1409*b1cdbd2cSJim Jagielski                 eElement = XML_TOKEN_INVALID; //not permitted, invalidate the element
1410*b1cdbd2cSJim Jagielski             }
1411*b1cdbd2cSJim Jagielski             else //maps format for 1.1 & 1.0
1412*b1cdbd2cSJim Jagielski             {
1413*b1cdbd2cSJim Jagielski                 // a few word here: OOo up to 2.4 uses the field chapter info in Alphabetical index
1414*b1cdbd2cSJim Jagielski                 // in a way different from the ODF 1.1/1.0 specification:
1415*b1cdbd2cSJim Jagielski                 //
1416*b1cdbd2cSJim Jagielski                 // ODF1.1/1.0         OOo display in chapter info                       ODF1.2
1417*b1cdbd2cSJim Jagielski                 //                    (used in alphabetical index only
1418*b1cdbd2cSJim Jagielski                 //
1419*b1cdbd2cSJim Jagielski                 // number             chapter number without pre/postfix                plain-number
1420*b1cdbd2cSJim Jagielski                 // number-and-name    chapter number without pre/postfix plus title     plain-number-and-name
1421*b1cdbd2cSJim Jagielski                 //
1422*b1cdbd2cSJim Jagielski                 // with issue i89791 the reading of ODF 1.1 and 1.0 was corrected
1423*b1cdbd2cSJim Jagielski                 // this one corrects the writing back from ODF 1.2 to ODF 1.1/1.0
1424*b1cdbd2cSJim Jagielski                 // unfortunately if there is another application which interprets correctly ODF1.1/1.0,
1425*b1cdbd2cSJim Jagielski                 // the resulting alphabetical index will be rendered wrong by OOo 2.4 version
1426*b1cdbd2cSJim Jagielski                 //
1427*b1cdbd2cSJim Jagielski                 switch( nChapterFormat )
1428*b1cdbd2cSJim Jagielski                 {
1429*b1cdbd2cSJim Jagielski                 case ChapterFormat::DIGIT:
1430*b1cdbd2cSJim Jagielski                     nChapterFormat = ChapterFormat::NUMBER;
1431*b1cdbd2cSJim Jagielski                     break;
1432*b1cdbd2cSJim Jagielski                 case ChapterFormat::NO_PREFIX_SUFFIX:
1433*b1cdbd2cSJim Jagielski                     nChapterFormat = ChapterFormat::NAME_NUMBER;
1434*b1cdbd2cSJim Jagielski                     break;
1435*b1cdbd2cSJim Jagielski                 }
1436*b1cdbd2cSJim Jagielski             }
1437*b1cdbd2cSJim Jagielski         }
1438*b1cdbd2cSJim Jagielski         else if (TOK_TTYPE_ENTRY_NUMBER == nTokenType)
1439*b1cdbd2cSJim Jagielski         {
1440*b1cdbd2cSJim Jagielski             //in case of ODF 1.1 or 1.0 the only allowed number format is "number"
1441*b1cdbd2cSJim Jagielski             //so, force it...
1442*b1cdbd2cSJim Jagielski             // The only expected 'foreign' nChapterFormat is
1443*b1cdbd2cSJim Jagielski             // ' ChapterFormat::DIGIT', forced to 'none, since the
1444*b1cdbd2cSJim Jagielski             // 'value allowed in ODF 1.1 and 1.0 is 'number' the default
1445*b1cdbd2cSJim Jagielski             // this can be obtained by simply disabling the chapter format
1446*b1cdbd2cSJim Jagielski             bChapterFormatOK = sal_False;
1447*b1cdbd2cSJim Jagielski         }
1448*b1cdbd2cSJim Jagielski     }
1449*b1cdbd2cSJim Jagielski //<---
1450*b1cdbd2cSJim Jagielski 
1451*b1cdbd2cSJim Jagielski     // ... and write Element
1452*b1cdbd2cSJim Jagielski 	if (eElement != XML_TOKEN_INVALID)
1453*b1cdbd2cSJim Jagielski 	{
1454*b1cdbd2cSJim Jagielski 		// character style (for most templates)
1455*b1cdbd2cSJim Jagielski 		if (bCharStyleOK)
1456*b1cdbd2cSJim Jagielski 		{
1457*b1cdbd2cSJim Jagielski 			switch (nTokenType)
1458*b1cdbd2cSJim Jagielski 			{
1459*b1cdbd2cSJim Jagielski 				case TOK_TTYPE_ENTRY_TEXT:
1460*b1cdbd2cSJim Jagielski 				case TOK_TTYPE_TEXT:
1461*b1cdbd2cSJim Jagielski 				case TOK_TTYPE_PAGE_NUMBER:
1462*b1cdbd2cSJim Jagielski 				case TOK_TTYPE_ENTRY_NUMBER:
1463*b1cdbd2cSJim Jagielski 				case TOK_TTYPE_HYPERLINK_START:
1464*b1cdbd2cSJim Jagielski 				case TOK_TTYPE_HYPERLINK_END:
1465*b1cdbd2cSJim Jagielski 				case TOK_TTYPE_BIBLIOGRAPHY:
1466*b1cdbd2cSJim Jagielski                 case TOK_TTYPE_CHAPTER_INFO:
1467*b1cdbd2cSJim Jagielski                 case TOK_TTYPE_TAB_STOP:
1468*b1cdbd2cSJim Jagielski 					GetExport().AddAttribute(XML_NAMESPACE_TEXT,
1469*b1cdbd2cSJim Jagielski 											 XML_STYLE_NAME,
1470*b1cdbd2cSJim Jagielski 								 GetExport().EncodeStyleName( sCharStyle) );
1471*b1cdbd2cSJim Jagielski 					break;
1472*b1cdbd2cSJim Jagielski 				default:
1473*b1cdbd2cSJim Jagielski 					; // nothing: no character style
1474*b1cdbd2cSJim Jagielski 					break;
1475*b1cdbd2cSJim Jagielski 			}
1476*b1cdbd2cSJim Jagielski 		}
1477*b1cdbd2cSJim Jagielski 
1478*b1cdbd2cSJim Jagielski 		// tab properties
1479*b1cdbd2cSJim Jagielski 		if (TOK_TTYPE_TAB_STOP == nTokenType)
1480*b1cdbd2cSJim Jagielski 		{
1481*b1cdbd2cSJim Jagielski 			// tab type
1482*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_STYLE, XML_TYPE,
1483*b1cdbd2cSJim Jagielski                                      bRightAligned ? XML_RIGHT : XML_LEFT);
1484*b1cdbd2cSJim Jagielski 
1485*b1cdbd2cSJim Jagielski 			if (bTabPositionOK && (! bRightAligned))
1486*b1cdbd2cSJim Jagielski 			{
1487*b1cdbd2cSJim Jagielski 				// position for left tabs (convert to measure)
1488*b1cdbd2cSJim Jagielski 				OUStringBuffer sBuf;
1489*b1cdbd2cSJim Jagielski 				GetExport().GetMM100UnitConverter().convertMeasure(sBuf,
1490*b1cdbd2cSJim Jagielski 																 nTabPosition);
1491*b1cdbd2cSJim Jagielski 				GetExport().AddAttribute(XML_NAMESPACE_STYLE,
1492*b1cdbd2cSJim Jagielski 										 XML_POSITION,
1493*b1cdbd2cSJim Jagielski 										 sBuf.makeStringAndClear());
1494*b1cdbd2cSJim Jagielski 			}
1495*b1cdbd2cSJim Jagielski 
1496*b1cdbd2cSJim Jagielski 			// fill char ("leader char")
1497*b1cdbd2cSJim Jagielski 			if (bFillCharOK && (sFillChar.getLength() > 0))
1498*b1cdbd2cSJim Jagielski 			{
1499*b1cdbd2cSJim Jagielski 				GetExport().AddAttribute(XML_NAMESPACE_STYLE,
1500*b1cdbd2cSJim Jagielski 										 XML_LEADER_CHAR, sFillChar);
1501*b1cdbd2cSJim Jagielski 			}
1502*b1cdbd2cSJim Jagielski 
1503*b1cdbd2cSJim Jagielski             // #i21237#
1504*b1cdbd2cSJim Jagielski             if (bWithTabStopOK && ! bWithTabStop)
1505*b1cdbd2cSJim Jagielski             {
1506*b1cdbd2cSJim Jagielski                	GetExport().AddAttribute(XML_NAMESPACE_STYLE,
1507*b1cdbd2cSJim Jagielski 										 XML_WITH_TAB,
1508*b1cdbd2cSJim Jagielski 										 XML_FALSE);
1509*b1cdbd2cSJim Jagielski             }
1510*b1cdbd2cSJim Jagielski 		}
1511*b1cdbd2cSJim Jagielski 
1512*b1cdbd2cSJim Jagielski 		// bibliography data
1513*b1cdbd2cSJim Jagielski 		if (TOK_TTYPE_BIBLIOGRAPHY == nTokenType)
1514*b1cdbd2cSJim Jagielski 		{
1515*b1cdbd2cSJim Jagielski 			OSL_ENSURE(bBibliographyDataOK, "need bibl data");
1516*b1cdbd2cSJim Jagielski 			OUStringBuffer sBuf;
1517*b1cdbd2cSJim Jagielski 			if (SvXMLUnitConverter::convertEnum( sBuf, nBibliographyData,
1518*b1cdbd2cSJim Jagielski 												 aBibliographyDataFieldMap ) )
1519*b1cdbd2cSJim Jagielski 			{
1520*b1cdbd2cSJim Jagielski 				GetExport().AddAttribute(XML_NAMESPACE_TEXT,
1521*b1cdbd2cSJim Jagielski 										 XML_BIBLIOGRAPHY_DATA_FIELD,
1522*b1cdbd2cSJim Jagielski 										 sBuf.makeStringAndClear());
1523*b1cdbd2cSJim Jagielski 			}
1524*b1cdbd2cSJim Jagielski 		}
1525*b1cdbd2cSJim Jagielski 
1526*b1cdbd2cSJim Jagielski 		// chapter info
1527*b1cdbd2cSJim Jagielski 		if (TOK_TTYPE_CHAPTER_INFO == nTokenType)
1528*b1cdbd2cSJim Jagielski 		{
1529*b1cdbd2cSJim Jagielski 			OSL_ENSURE(bChapterFormatOK, "need chapter info");
1530*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(
1531*b1cdbd2cSJim Jagielski 				XML_NAMESPACE_TEXT, XML_DISPLAY,
1532*b1cdbd2cSJim Jagielski 				XMLTextFieldExport::MapChapterDisplayFormat(nChapterFormat));
1533*b1cdbd2cSJim Jagielski //---> i53420
1534*b1cdbd2cSJim Jagielski             if (bLevelOK)
1535*b1cdbd2cSJim Jagielski                 GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_OUTLINE_LEVEL,
1536*b1cdbd2cSJim Jagielski                                      OUString::valueOf((sal_Int32)nLevel));
1537*b1cdbd2cSJim Jagielski //<---
1538*b1cdbd2cSJim Jagielski 		}
1539*b1cdbd2cSJim Jagielski 
1540*b1cdbd2cSJim Jagielski //--->i53420
1541*b1cdbd2cSJim Jagielski         if (TOK_TTYPE_ENTRY_NUMBER == nTokenType)
1542*b1cdbd2cSJim Jagielski         {
1543*b1cdbd2cSJim Jagielski             if (bChapterFormatOK)
1544*b1cdbd2cSJim Jagielski                 GetExport().AddAttribute(
1545*b1cdbd2cSJim Jagielski                     XML_NAMESPACE_TEXT, XML_DISPLAY,
1546*b1cdbd2cSJim Jagielski                     XMLTextFieldExport::MapChapterDisplayFormat(nChapterFormat));
1547*b1cdbd2cSJim Jagielski 
1548*b1cdbd2cSJim Jagielski             if (bLevelOK)
1549*b1cdbd2cSJim Jagielski                 GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_OUTLINE_LEVEL,
1550*b1cdbd2cSJim Jagielski                                      OUString::valueOf((sal_Int32)nLevel));
1551*b1cdbd2cSJim Jagielski         }
1552*b1cdbd2cSJim Jagielski //<---
1553*b1cdbd2cSJim Jagielski 		// export template
1554*b1cdbd2cSJim Jagielski 		SvXMLElementExport aTemplateElement(GetExport(), XML_NAMESPACE_TEXT,
1555*b1cdbd2cSJim Jagielski 											GetXMLToken(eElement),
1556*b1cdbd2cSJim Jagielski                                             sal_True, sal_False)
1557*b1cdbd2cSJim Jagielski             ;
1558*b1cdbd2cSJim Jagielski 
1559*b1cdbd2cSJim Jagielski 		// entry text or span element: write text
1560*b1cdbd2cSJim Jagielski 		if (TOK_TTYPE_TEXT == nTokenType)
1561*b1cdbd2cSJim Jagielski 		{
1562*b1cdbd2cSJim Jagielski 			GetExport().Characters(sText);
1563*b1cdbd2cSJim Jagielski 		}
1564*b1cdbd2cSJim Jagielski 	}
1565*b1cdbd2cSJim Jagielski }
1566*b1cdbd2cSJim Jagielski 
ExportLevelParagraphStyles(Reference<XIndexReplace> & xLevelParagraphStyles)1567*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportLevelParagraphStyles(
1568*b1cdbd2cSJim Jagielski 	Reference<XIndexReplace> & xLevelParagraphStyles)
1569*b1cdbd2cSJim Jagielski {
1570*b1cdbd2cSJim Jagielski 	// iterate over levels
1571*b1cdbd2cSJim Jagielski 	sal_Int32 nPLevelCount = xLevelParagraphStyles->getCount();
1572*b1cdbd2cSJim Jagielski 	for(sal_Int32 nLevel = 0; nLevel < nPLevelCount; nLevel++)
1573*b1cdbd2cSJim Jagielski 	{
1574*b1cdbd2cSJim Jagielski 		Any aAny = xLevelParagraphStyles->getByIndex(nLevel);
1575*b1cdbd2cSJim Jagielski 		Sequence<OUString> aStyleNames;
1576*b1cdbd2cSJim Jagielski 		aAny >>= aStyleNames;
1577*b1cdbd2cSJim Jagielski 
1578*b1cdbd2cSJim Jagielski 		// export only if at least one style is contained
1579*b1cdbd2cSJim Jagielski 		sal_Int32 nNamesCount = aStyleNames.getLength();
1580*b1cdbd2cSJim Jagielski 		if (nNamesCount > 0)
1581*b1cdbd2cSJim Jagielski 		{
1582*b1cdbd2cSJim Jagielski 			// level attribute; we count 1..10; API 0..9
1583*b1cdbd2cSJim Jagielski 			OUStringBuffer sBuf;
1584*b1cdbd2cSJim Jagielski 			sal_Int32 nLevelPlusOne = nLevel + 1;
1585*b1cdbd2cSJim Jagielski 			SvXMLUnitConverter::convertNumber(sBuf, nLevelPlusOne);
1586*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute(XML_NAMESPACE_TEXT,
1587*b1cdbd2cSJim Jagielski 									 XML_OUTLINE_LEVEL,
1588*b1cdbd2cSJim Jagielski 									 sBuf.makeStringAndClear());
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski 			// source styles element
1591*b1cdbd2cSJim Jagielski 			SvXMLElementExport aParaStyles(GetExport(),
1592*b1cdbd2cSJim Jagielski 										   XML_NAMESPACE_TEXT,
1593*b1cdbd2cSJim Jagielski 										   XML_INDEX_SOURCE_STYLES,
1594*b1cdbd2cSJim Jagielski 										   sal_True, sal_True);
1595*b1cdbd2cSJim Jagielski 
1596*b1cdbd2cSJim Jagielski 			// iterate over styles in this level
1597*b1cdbd2cSJim Jagielski 			for(sal_Int32 nName = 0; nName < nNamesCount; nName++)
1598*b1cdbd2cSJim Jagielski 			{
1599*b1cdbd2cSJim Jagielski 				// stylename attribute
1600*b1cdbd2cSJim Jagielski 				GetExport().AddAttribute(XML_NAMESPACE_TEXT,
1601*b1cdbd2cSJim Jagielski 										 XML_STYLE_NAME,
1602*b1cdbd2cSJim Jagielski 							 GetExport().EncodeStyleName( aStyleNames[nName]) );
1603*b1cdbd2cSJim Jagielski 
1604*b1cdbd2cSJim Jagielski 				// element
1605*b1cdbd2cSJim Jagielski 				SvXMLElementExport aParaStyle(GetExport(),
1606*b1cdbd2cSJim Jagielski 											  XML_NAMESPACE_TEXT,
1607*b1cdbd2cSJim Jagielski 											  XML_INDEX_SOURCE_STYLE,
1608*b1cdbd2cSJim Jagielski 											  sal_True, sal_False);
1609*b1cdbd2cSJim Jagielski 			}
1610*b1cdbd2cSJim Jagielski 		}
1611*b1cdbd2cSJim Jagielski 	}
1612*b1cdbd2cSJim Jagielski }
1613*b1cdbd2cSJim Jagielski 
ExportBoolean(const Reference<XPropertySet> & rPropSet,const OUString & sPropertyName,enum XMLTokenEnum eAttributeName,sal_Bool bDefault,sal_Bool bInvert)1614*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportBoolean(
1615*b1cdbd2cSJim Jagielski 	const Reference<XPropertySet> & rPropSet,
1616*b1cdbd2cSJim Jagielski 	const OUString& sPropertyName,
1617*b1cdbd2cSJim Jagielski 	enum XMLTokenEnum eAttributeName,
1618*b1cdbd2cSJim Jagielski 	sal_Bool bDefault,
1619*b1cdbd2cSJim Jagielski 	sal_Bool bInvert)
1620*b1cdbd2cSJim Jagielski {
1621*b1cdbd2cSJim Jagielski 	OSL_ENSURE(eAttributeName != XML_TOKEN_INVALID, "Need attribute name");
1622*b1cdbd2cSJim Jagielski 
1623*b1cdbd2cSJim Jagielski 	Any aAny = rPropSet->getPropertyValue(sPropertyName);
1624*b1cdbd2cSJim Jagielski 	sal_Bool bTmp = *(sal_Bool*)aAny.getValue();
1625*b1cdbd2cSJim Jagielski 
1626*b1cdbd2cSJim Jagielski 	// value = value ^ bInvert
1627*b1cdbd2cSJim Jagielski 	// omit if value == default
1628*b1cdbd2cSJim Jagielski 	// negate forces sal_Bool to 0/1, making them comparable
1629*b1cdbd2cSJim Jagielski 	if ((!(bTmp ^ bInvert)) != (!bDefault))
1630*b1cdbd2cSJim Jagielski 	{
1631*b1cdbd2cSJim Jagielski 		// export non-default value (since default is omitted)
1632*b1cdbd2cSJim Jagielski 		GetExport().AddAttribute(XML_NAMESPACE_TEXT,
1633*b1cdbd2cSJim Jagielski                                  eAttributeName,
1634*b1cdbd2cSJim Jagielski                                  bDefault ? XML_FALSE : XML_TRUE);
1635*b1cdbd2cSJim Jagielski 	}
1636*b1cdbd2cSJim Jagielski }
1637*b1cdbd2cSJim Jagielski 
1638*b1cdbd2cSJim Jagielski const sal_Char sAPI_FieldMaster_Bibliography[] =
1639*b1cdbd2cSJim Jagielski 								"com.sun.star.text.FieldMaster.Bibliography";
1640*b1cdbd2cSJim Jagielski const sal_Char sAPI_SortKey[] = "SortKey";
1641*b1cdbd2cSJim Jagielski const sal_Char sAPI_IsSortAscending[] = "IsSortAscending";
1642*b1cdbd2cSJim Jagielski 
ExportBibliographyConfiguration(SvXMLExport & rExport)1643*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportBibliographyConfiguration(SvXMLExport& rExport)
1644*b1cdbd2cSJim Jagielski {
1645*b1cdbd2cSJim Jagielski 	// first: get field master (via text field supplier)
1646*b1cdbd2cSJim Jagielski 	Reference<XTextFieldsSupplier> xTextFieldsSupp( rExport.GetModel(),
1647*b1cdbd2cSJim Jagielski                                                     UNO_QUERY );
1648*b1cdbd2cSJim Jagielski     if ( xTextFieldsSupp.is() )
1649*b1cdbd2cSJim Jagielski     {
1650*b1cdbd2cSJim Jagielski 		const OUString sFieldMaster_Bibliography(
1651*b1cdbd2cSJim Jagielski 			RTL_CONSTASCII_USTRINGPARAM(sAPI_FieldMaster_Bibliography));
1652*b1cdbd2cSJim Jagielski 
1653*b1cdbd2cSJim Jagielski         // get bibliography field master
1654*b1cdbd2cSJim Jagielski         Reference<XNameAccess> xMasters =
1655*b1cdbd2cSJim Jagielski             xTextFieldsSupp->getTextFieldMasters();
1656*b1cdbd2cSJim Jagielski         if ( xMasters->hasByName(sFieldMaster_Bibliography) )
1657*b1cdbd2cSJim Jagielski         {
1658*b1cdbd2cSJim Jagielski             Any aAny =
1659*b1cdbd2cSJim Jagielski                 xMasters->getByName(sFieldMaster_Bibliography);
1660*b1cdbd2cSJim Jagielski             Reference<XPropertySet> xPropSet;
1661*b1cdbd2cSJim Jagielski             aAny >>= xPropSet;
1662*b1cdbd2cSJim Jagielski 
1663*b1cdbd2cSJim Jagielski             OSL_ENSURE( xPropSet.is(), "field master must have XPropSet" );
1664*b1cdbd2cSJim Jagielski 
1665*b1cdbd2cSJim Jagielski             const OUString sBracketBefore(
1666*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_USTRINGPARAM("BracketBefore"));
1667*b1cdbd2cSJim Jagielski             const OUString sBracketAfter(
1668*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_USTRINGPARAM("BracketAfter"));
1669*b1cdbd2cSJim Jagielski             const OUString sIsNumberEntries(
1670*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_USTRINGPARAM("IsNumberEntries"));
1671*b1cdbd2cSJim Jagielski             const OUString sIsSortByPosition(
1672*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_USTRINGPARAM("IsSortByPosition"));
1673*b1cdbd2cSJim Jagielski             const OUString sSortKeys(
1674*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_USTRINGPARAM("SortKeys"));
1675*b1cdbd2cSJim Jagielski             const OUString sSortAlgorithm(
1676*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_USTRINGPARAM("SortAlgorithm"));
1677*b1cdbd2cSJim Jagielski             const OUString sLocale(
1678*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_USTRINGPARAM("Locale"));
1679*b1cdbd2cSJim Jagielski 
1680*b1cdbd2cSJim Jagielski 			OUString sTmp;
1681*b1cdbd2cSJim Jagielski 
1682*b1cdbd2cSJim Jagielski 			aAny = xPropSet->getPropertyValue(sBracketBefore);
1683*b1cdbd2cSJim Jagielski 			aAny >>= sTmp;
1684*b1cdbd2cSJim Jagielski 			rExport.AddAttribute(XML_NAMESPACE_TEXT, XML_PREFIX, sTmp);
1685*b1cdbd2cSJim Jagielski 
1686*b1cdbd2cSJim Jagielski 			aAny = xPropSet->getPropertyValue(sBracketAfter);
1687*b1cdbd2cSJim Jagielski 			aAny >>= sTmp;
1688*b1cdbd2cSJim Jagielski 			rExport.AddAttribute(XML_NAMESPACE_TEXT, XML_SUFFIX, sTmp);
1689*b1cdbd2cSJim Jagielski 
1690*b1cdbd2cSJim Jagielski 			aAny = xPropSet->getPropertyValue(sIsNumberEntries);
1691*b1cdbd2cSJim Jagielski 			if (*(sal_Bool*)aAny.getValue())
1692*b1cdbd2cSJim Jagielski 			{
1693*b1cdbd2cSJim Jagielski 				rExport.AddAttribute(XML_NAMESPACE_TEXT,
1694*b1cdbd2cSJim Jagielski                                      XML_NUMBERED_ENTRIES, XML_TRUE);
1695*b1cdbd2cSJim Jagielski 			}
1696*b1cdbd2cSJim Jagielski 
1697*b1cdbd2cSJim Jagielski 			aAny = xPropSet->getPropertyValue(sIsSortByPosition);
1698*b1cdbd2cSJim Jagielski 			if (! *(sal_Bool*)aAny.getValue())
1699*b1cdbd2cSJim Jagielski 			{
1700*b1cdbd2cSJim Jagielski 				rExport.AddAttribute(XML_NAMESPACE_TEXT,
1701*b1cdbd2cSJim Jagielski                                      XML_SORT_BY_POSITION, XML_FALSE);
1702*b1cdbd2cSJim Jagielski 			}
1703*b1cdbd2cSJim Jagielski 
1704*b1cdbd2cSJim Jagielski             // sort algorithm
1705*b1cdbd2cSJim Jagielski             aAny = xPropSet->getPropertyValue(sSortAlgorithm);
1706*b1cdbd2cSJim Jagielski             OUString sAlgorithm;
1707*b1cdbd2cSJim Jagielski             aAny >>= sAlgorithm;
1708*b1cdbd2cSJim Jagielski             if( sAlgorithm.getLength() > 0 )
1709*b1cdbd2cSJim Jagielski             {
1710*b1cdbd2cSJim Jagielski                 rExport.AddAttribute( XML_NAMESPACE_TEXT,
1711*b1cdbd2cSJim Jagielski                                       XML_SORT_ALGORITHM, sAlgorithm );
1712*b1cdbd2cSJim Jagielski             }
1713*b1cdbd2cSJim Jagielski 
1714*b1cdbd2cSJim Jagielski             // locale
1715*b1cdbd2cSJim Jagielski             aAny = xPropSet->getPropertyValue(sLocale);
1716*b1cdbd2cSJim Jagielski             Locale aLocale;
1717*b1cdbd2cSJim Jagielski             aAny >>= aLocale;
1718*b1cdbd2cSJim Jagielski             rExport.AddAttribute(XML_NAMESPACE_FO, XML_LANGUAGE,
1719*b1cdbd2cSJim Jagielski                                      aLocale.Language);
1720*b1cdbd2cSJim Jagielski             rExport.AddAttribute(XML_NAMESPACE_FO, XML_COUNTRY,
1721*b1cdbd2cSJim Jagielski                                      aLocale.Country);
1722*b1cdbd2cSJim Jagielski 
1723*b1cdbd2cSJim Jagielski 			// configuration element
1724*b1cdbd2cSJim Jagielski 			SvXMLElementExport aElement(rExport, XML_NAMESPACE_TEXT,
1725*b1cdbd2cSJim Jagielski 										XML_BIBLIOGRAPHY_CONFIGURATION,
1726*b1cdbd2cSJim Jagielski 										sal_True, sal_True);
1727*b1cdbd2cSJim Jagielski 
1728*b1cdbd2cSJim Jagielski 			// sort keys
1729*b1cdbd2cSJim Jagielski 			aAny = xPropSet->getPropertyValue(sSortKeys);
1730*b1cdbd2cSJim Jagielski 			Sequence<Sequence<PropertyValue> > aKeys;
1731*b1cdbd2cSJim Jagielski 			aAny >>= aKeys;
1732*b1cdbd2cSJim Jagielski 			sal_Int32 nKeysCount = aKeys.getLength();
1733*b1cdbd2cSJim Jagielski 			for(sal_Int32 nKeys = 0; nKeys < nKeysCount; nKeys++)
1734*b1cdbd2cSJim Jagielski 			{
1735*b1cdbd2cSJim Jagielski 				Sequence<PropertyValue> & rKey = aKeys[nKeys];
1736*b1cdbd2cSJim Jagielski 
1737*b1cdbd2cSJim Jagielski 				sal_Int32 nKeyCount = rKey.getLength();
1738*b1cdbd2cSJim Jagielski 				for(sal_Int32 nPropertyKey = 0; nPropertyKey < nKeyCount; nPropertyKey++)
1739*b1cdbd2cSJim Jagielski 				{
1740*b1cdbd2cSJim Jagielski 					PropertyValue& rValue = rKey[nPropertyKey];
1741*b1cdbd2cSJim Jagielski 
1742*b1cdbd2cSJim Jagielski 					if (rValue.Name.equalsAsciiL(sAPI_SortKey,
1743*b1cdbd2cSJim Jagielski 												 sizeof(sAPI_SortKey)-1))
1744*b1cdbd2cSJim Jagielski 					{
1745*b1cdbd2cSJim Jagielski 						sal_Int16 nKey = 0;
1746*b1cdbd2cSJim Jagielski 						rValue.Value >>= nKey;
1747*b1cdbd2cSJim Jagielski 						OUStringBuffer sBuf;
1748*b1cdbd2cSJim Jagielski 						if (SvXMLUnitConverter::convertEnum( sBuf, nKey,
1749*b1cdbd2cSJim Jagielski 												 aBibliographyDataFieldMap ) )
1750*b1cdbd2cSJim Jagielski 						{
1751*b1cdbd2cSJim Jagielski 							rExport.AddAttribute(XML_NAMESPACE_TEXT, XML_KEY,
1752*b1cdbd2cSJim Jagielski 												 sBuf.makeStringAndClear());
1753*b1cdbd2cSJim Jagielski 						}
1754*b1cdbd2cSJim Jagielski 					}
1755*b1cdbd2cSJim Jagielski 					else if (rValue.Name.equalsAsciiL(sAPI_IsSortAscending,
1756*b1cdbd2cSJim Jagielski 											sizeof(sAPI_IsSortAscending)-1))
1757*b1cdbd2cSJim Jagielski 					{
1758*b1cdbd2cSJim Jagielski 						sal_Bool bTmp = *(sal_Bool*)rValue.Value.getValue();
1759*b1cdbd2cSJim Jagielski 						rExport.AddAttribute(XML_NAMESPACE_TEXT,
1760*b1cdbd2cSJim Jagielski                                              XML_SORT_ASCENDING,
1761*b1cdbd2cSJim Jagielski                                              bTmp ? XML_TRUE : XML_FALSE);
1762*b1cdbd2cSJim Jagielski 					}
1763*b1cdbd2cSJim Jagielski 				}
1764*b1cdbd2cSJim Jagielski 
1765*b1cdbd2cSJim Jagielski 				SvXMLElementExport aKeyElem(rExport,
1766*b1cdbd2cSJim Jagielski 											XML_NAMESPACE_TEXT, XML_SORT_KEY,
1767*b1cdbd2cSJim Jagielski 											sal_True, sal_True);
1768*b1cdbd2cSJim Jagielski 			}
1769*b1cdbd2cSJim Jagielski 		}
1770*b1cdbd2cSJim Jagielski 	}
1771*b1cdbd2cSJim Jagielski }
1772*b1cdbd2cSJim Jagielski 
1773*b1cdbd2cSJim Jagielski 
IsMuteSection(const Reference<XTextSection> & rSection) const1774*b1cdbd2cSJim Jagielski sal_Bool XMLSectionExport::IsMuteSection(
1775*b1cdbd2cSJim Jagielski 	const Reference<XTextSection> & rSection) const
1776*b1cdbd2cSJim Jagielski {
1777*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
1778*b1cdbd2cSJim Jagielski 
1779*b1cdbd2cSJim Jagielski 	// a section is mute if
1780*b1cdbd2cSJim Jagielski 	// 1) it exists
1781*b1cdbd2cSJim Jagielski 	// 2) the SaveLinkedSections flag (at the export) is false
1782*b1cdbd2cSJim Jagielski 	// 3) the IsGlobalDocumentSection property is true
1783*b1cdbd2cSJim Jagielski     // 4) it is not an Index
1784*b1cdbd2cSJim Jagielski 
1785*b1cdbd2cSJim Jagielski 	if ( (!rExport.IsSaveLinkedSections()) && rSection.is() )
1786*b1cdbd2cSJim Jagielski 	{
1787*b1cdbd2cSJim Jagielski 		// walk the section chain and set bRet if any is linked
1788*b1cdbd2cSJim Jagielski 		for(Reference<XTextSection> aSection(rSection);
1789*b1cdbd2cSJim Jagielski 			aSection.is();
1790*b1cdbd2cSJim Jagielski 			aSection = aSection->getParentSection())
1791*b1cdbd2cSJim Jagielski 		{
1792*b1cdbd2cSJim Jagielski 			// check if it is a global document section (linked or index)
1793*b1cdbd2cSJim Jagielski 			Reference<XPropertySet> xPropSet(aSection, UNO_QUERY);
1794*b1cdbd2cSJim Jagielski 			if (xPropSet.is())
1795*b1cdbd2cSJim Jagielski 			{
1796*b1cdbd2cSJim Jagielski 				Any aAny = xPropSet->getPropertyValue(sIsGlobalDocumentSection);
1797*b1cdbd2cSJim Jagielski 
1798*b1cdbd2cSJim Jagielski                 if ( *(sal_Bool*)aAny.getValue() )
1799*b1cdbd2cSJim Jagielski                 {
1800*b1cdbd2cSJim Jagielski                     Reference<XDocumentIndex> xIndex;
1801*b1cdbd2cSJim Jagielski                     if (! GetIndex(rSection, xIndex))
1802*b1cdbd2cSJim Jagielski                     {
1803*b1cdbd2cSJim Jagielski                         bRet = sal_True;
1804*b1cdbd2cSJim Jagielski 
1805*b1cdbd2cSJim Jagielski                         // early out if result is known
1806*b1cdbd2cSJim Jagielski                         break;
1807*b1cdbd2cSJim Jagielski                     }
1808*b1cdbd2cSJim Jagielski                 }
1809*b1cdbd2cSJim Jagielski 			}
1810*b1cdbd2cSJim Jagielski 			// section has no properties: ignore
1811*b1cdbd2cSJim Jagielski 		}
1812*b1cdbd2cSJim Jagielski 	}
1813*b1cdbd2cSJim Jagielski 	// else: no section, or always save sections: default (false)
1814*b1cdbd2cSJim Jagielski 
1815*b1cdbd2cSJim Jagielski 	return bRet;
1816*b1cdbd2cSJim Jagielski }
1817*b1cdbd2cSJim Jagielski 
IsMuteSection(const Reference<XTextContent> & rSection,sal_Bool bDefault) const1818*b1cdbd2cSJim Jagielski sal_Bool XMLSectionExport::IsMuteSection(
1819*b1cdbd2cSJim Jagielski 	const Reference<XTextContent> & rSection,
1820*b1cdbd2cSJim Jagielski 	sal_Bool bDefault) const
1821*b1cdbd2cSJim Jagielski {
1822*b1cdbd2cSJim Jagielski 	// default: like default argument
1823*b1cdbd2cSJim Jagielski 	sal_Bool bRet = bDefault;
1824*b1cdbd2cSJim Jagielski 
1825*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xPropSet(rSection->getAnchor(), UNO_QUERY);
1826*b1cdbd2cSJim Jagielski 	if (xPropSet.is())
1827*b1cdbd2cSJim Jagielski 	{
1828*b1cdbd2cSJim Jagielski 		if (xPropSet->getPropertySetInfo()->hasPropertyByName(sTextSection))
1829*b1cdbd2cSJim Jagielski 		{
1830*b1cdbd2cSJim Jagielski 			Any aAny = xPropSet->getPropertyValue(sTextSection);
1831*b1cdbd2cSJim Jagielski 			Reference<XTextSection> xSection;
1832*b1cdbd2cSJim Jagielski 			aAny >>= xSection;
1833*b1cdbd2cSJim Jagielski 
1834*b1cdbd2cSJim Jagielski 			bRet = IsMuteSection(xSection);
1835*b1cdbd2cSJim Jagielski 		}
1836*b1cdbd2cSJim Jagielski 		// else: return default
1837*b1cdbd2cSJim Jagielski 	}
1838*b1cdbd2cSJim Jagielski 	// else: return default
1839*b1cdbd2cSJim Jagielski 
1840*b1cdbd2cSJim Jagielski 	return bRet;
1841*b1cdbd2cSJim Jagielski }
1842*b1cdbd2cSJim Jagielski 
IsInSection(const Reference<XTextSection> & rEnclosingSection,const Reference<XTextContent> & rContent,sal_Bool bDefault)1843*b1cdbd2cSJim Jagielski sal_Bool XMLSectionExport::IsInSection(
1844*b1cdbd2cSJim Jagielski 	const Reference<XTextSection> & rEnclosingSection,
1845*b1cdbd2cSJim Jagielski 	const Reference<XTextContent> & rContent,
1846*b1cdbd2cSJim Jagielski 	sal_Bool bDefault)
1847*b1cdbd2cSJim Jagielski {
1848*b1cdbd2cSJim Jagielski 	// default: like default argument
1849*b1cdbd2cSJim Jagielski 	sal_Bool bRet = bDefault;
1850*b1cdbd2cSJim Jagielski 	OSL_ENSURE(rEnclosingSection.is(), "enclosing section expected");
1851*b1cdbd2cSJim Jagielski 
1852*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xPropSet(rContent, UNO_QUERY);
1853*b1cdbd2cSJim Jagielski 	if (xPropSet.is())
1854*b1cdbd2cSJim Jagielski 	{
1855*b1cdbd2cSJim Jagielski 		if (xPropSet->getPropertySetInfo()->hasPropertyByName(sTextSection))
1856*b1cdbd2cSJim Jagielski 		{
1857*b1cdbd2cSJim Jagielski 			Any aAny = xPropSet->getPropertyValue(sTextSection);
1858*b1cdbd2cSJim Jagielski 			Reference<XTextSection> xSection;
1859*b1cdbd2cSJim Jagielski 			aAny >>= xSection;
1860*b1cdbd2cSJim Jagielski 
1861*b1cdbd2cSJim Jagielski 			// now walk chain of text sections (if we have one)
1862*b1cdbd2cSJim Jagielski 			if (xSection.is())
1863*b1cdbd2cSJim Jagielski 			{
1864*b1cdbd2cSJim Jagielski 				do
1865*b1cdbd2cSJim Jagielski 				{
1866*b1cdbd2cSJim Jagielski 					bRet = (rEnclosingSection == xSection);
1867*b1cdbd2cSJim Jagielski 					xSection = xSection->getParentSection();
1868*b1cdbd2cSJim Jagielski 				}
1869*b1cdbd2cSJim Jagielski 				while (!bRet && xSection.is());
1870*b1cdbd2cSJim Jagielski 			}
1871*b1cdbd2cSJim Jagielski 			else
1872*b1cdbd2cSJim Jagielski 				bRet = sal_False;	// no section -> can't be inside
1873*b1cdbd2cSJim Jagielski 		}
1874*b1cdbd2cSJim Jagielski 		// else: no TextSection property -> return default
1875*b1cdbd2cSJim Jagielski 	}
1876*b1cdbd2cSJim Jagielski 	// else: no XPropertySet -> return default
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski 	return bRet;
1879*b1cdbd2cSJim Jagielski }
1880*b1cdbd2cSJim Jagielski 
1881*b1cdbd2cSJim Jagielski 
ExportMasterDocHeadingDummies()1882*b1cdbd2cSJim Jagielski void XMLSectionExport::ExportMasterDocHeadingDummies()
1883*b1cdbd2cSJim Jagielski {
1884*b1cdbd2cSJim Jagielski 	if( bHeadingDummiesExported )
1885*b1cdbd2cSJim Jagielski 		return;
1886*b1cdbd2cSJim Jagielski 
1887*b1cdbd2cSJim Jagielski 	Reference< XChapterNumberingSupplier > xCNSupplier( rExport.GetModel(),
1888*b1cdbd2cSJim Jagielski 														UNO_QUERY );
1889*b1cdbd2cSJim Jagielski 
1890*b1cdbd2cSJim Jagielski 	Reference< XIndexReplace > xChapterNumbering;
1891*b1cdbd2cSJim Jagielski 	if( xCNSupplier.is() )
1892*b1cdbd2cSJim Jagielski 		xChapterNumbering = xCNSupplier->getChapterNumberingRules();
1893*b1cdbd2cSJim Jagielski 
1894*b1cdbd2cSJim Jagielski 	if( !xChapterNumbering.is() )
1895*b1cdbd2cSJim Jagielski 		return;
1896*b1cdbd2cSJim Jagielski 
1897*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = xChapterNumbering->getCount();
1898*b1cdbd2cSJim Jagielski 	for( sal_Int32 nLevel = 0; nLevel < nCount; nLevel++ )
1899*b1cdbd2cSJim Jagielski 	{
1900*b1cdbd2cSJim Jagielski 		OUString sStyle;
1901*b1cdbd2cSJim Jagielski 		Sequence<PropertyValue> aProperties;
1902*b1cdbd2cSJim Jagielski 		xChapterNumbering->getByIndex( nLevel ) >>= aProperties;
1903*b1cdbd2cSJim Jagielski 		for( sal_Int32 i = 0; i < aProperties.getLength(); i++ )
1904*b1cdbd2cSJim Jagielski 		{
1905*b1cdbd2cSJim Jagielski 			if( aProperties[i].Name == sHeadingStyleName )
1906*b1cdbd2cSJim Jagielski 			{
1907*b1cdbd2cSJim Jagielski 				aProperties[i].Value >>= sStyle;
1908*b1cdbd2cSJim Jagielski 				break;
1909*b1cdbd2cSJim Jagielski 			}
1910*b1cdbd2cSJim Jagielski 		}
1911*b1cdbd2cSJim Jagielski 		if( sStyle.getLength() > 0 )
1912*b1cdbd2cSJim Jagielski 		{
1913*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_STYLE_NAME,
1914*b1cdbd2cSJim Jagielski 									  GetExport().EncodeStyleName( sStyle ) );
1915*b1cdbd2cSJim Jagielski 
1916*b1cdbd2cSJim Jagielski 			OUStringBuffer sTmp;
1917*b1cdbd2cSJim Jagielski 			sTmp.append( nLevel + 1 );
1918*b1cdbd2cSJim Jagielski 			GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_LEVEL,
1919*b1cdbd2cSJim Jagielski 								  	  sTmp.makeStringAndClear() );
1920*b1cdbd2cSJim Jagielski 			SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT, XML_H,
1921*b1cdbd2cSJim Jagielski 								  	  sal_True, sal_False );
1922*b1cdbd2cSJim Jagielski 		}
1923*b1cdbd2cSJim Jagielski 	}
1924*b1cdbd2cSJim Jagielski 
1925*b1cdbd2cSJim Jagielski 	bHeadingDummiesExported  = sal_True;
1926*b1cdbd2cSJim Jagielski }
1927