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 "XMLSectionImportContext.hxx"
27*b1cdbd2cSJim Jagielski #include "XMLSectionSourceImportContext.hxx"
28*b1cdbd2cSJim Jagielski #include "XMLSectionSourceDDEImportContext.hxx"
29*b1cdbd2cSJim Jagielski #include <xmloff/xmlictxt.hxx>
30*b1cdbd2cSJim Jagielski #include <xmloff/xmlimp.hxx>
31*b1cdbd2cSJim Jagielski #include <xmloff/txtimp.hxx>
32*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
33*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
34*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
35*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
36*b1cdbd2cSJim Jagielski #include <xmloff/prstylei.hxx>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNamed.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.h>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextContent.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/text/ControlCharacter.hpp>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski using ::rtl::OUString;
46*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::XPropertySet;
47*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
48*b1cdbd2cSJim Jagielski using ::com::sun::star::xml::sax::XAttributeList;
49*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::XMultiServiceFactory;
50*b1cdbd2cSJim Jagielski using ::com::sun::star::container::XNamed;
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
53*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::text;
54*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski TYPEINIT1( XMLSectionImportContext, SvXMLImportContext );
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski const sal_Char sAPI_TextSection[] = "com.sun.star.text.TextSection";
60*b1cdbd2cSJim Jagielski const sal_Char sAPI_IndexHeaderSection[] = "com.sun.star.text.IndexHeaderSection";
61*b1cdbd2cSJim Jagielski const sal_Char sAPI_IsProtected[] = "IsProtected";
62*b1cdbd2cSJim Jagielski const sal_Char sAPI_Condition[] = "Condition";
63*b1cdbd2cSJim Jagielski const sal_Char sAPI_IsVisible[] = "IsVisible";
64*b1cdbd2cSJim Jagielski const sal_Char sAPI_IsCurrentlyVisible[] = "IsCurrentlyVisible";
65*b1cdbd2cSJim Jagielski const sal_Char sAPI_ProtectionKey[] = "ProtectionKey";
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski enum XMLSectionToken
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski     XML_TOK_SECTION_XMLID,
70*b1cdbd2cSJim Jagielski 	XML_TOK_SECTION_STYLE_NAME,
71*b1cdbd2cSJim Jagielski 	XML_TOK_SECTION_NAME,
72*b1cdbd2cSJim Jagielski 	XML_TOK_SECTION_CONDITION,
73*b1cdbd2cSJim Jagielski 	XML_TOK_SECTION_DISPLAY,
74*b1cdbd2cSJim Jagielski 	XML_TOK_SECTION_PROTECT,
75*b1cdbd2cSJim Jagielski 	XML_TOK_SECTION_PROTECTION_KEY,
76*b1cdbd2cSJim Jagielski     XML_TOK_SECTION_IS_HIDDEN
77*b1cdbd2cSJim Jagielski };
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski static __FAR_DATA SvXMLTokenMapEntry aSectionTokenMap[] =
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski 	{ XML_NAMESPACE_XML , XML_ID, XML_TOK_SECTION_XMLID },
82*b1cdbd2cSJim Jagielski 	{ XML_NAMESPACE_TEXT, XML_STYLE_NAME, XML_TOK_SECTION_STYLE_NAME },
83*b1cdbd2cSJim Jagielski 	{ XML_NAMESPACE_TEXT, XML_NAME, XML_TOK_SECTION_NAME },
84*b1cdbd2cSJim Jagielski 	{ XML_NAMESPACE_TEXT, XML_CONDITION, XML_TOK_SECTION_CONDITION },
85*b1cdbd2cSJim Jagielski 	{ XML_NAMESPACE_TEXT, XML_DISPLAY, XML_TOK_SECTION_DISPLAY },
86*b1cdbd2cSJim Jagielski 	{ XML_NAMESPACE_TEXT, XML_PROTECTED, XML_TOK_SECTION_PROTECT },
87*b1cdbd2cSJim Jagielski 	{ XML_NAMESPACE_TEXT, XML_PROTECTION_KEY, XML_TOK_SECTION_PROTECTION_KEY},
88*b1cdbd2cSJim Jagielski     { XML_NAMESPACE_TEXT, XML_IS_HIDDEN, XML_TOK_SECTION_IS_HIDDEN },
89*b1cdbd2cSJim Jagielski 	// compatibility with SRC629 (or earlier) versions
90*b1cdbd2cSJim Jagielski 	{ XML_NAMESPACE_TEXT, XML_PROTECT, XML_TOK_SECTION_PROTECT },
91*b1cdbd2cSJim Jagielski 	XML_TOKEN_MAP_END
92*b1cdbd2cSJim Jagielski };
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski // section import: This one is fairly tricky due to a variety of
96*b1cdbd2cSJim Jagielski // limits of the core or the API. The main problem is that if you
97*b1cdbd2cSJim Jagielski // insert a section within another section, you can't move the cursor
98*b1cdbd2cSJim Jagielski // between the ends of the inner and the enclosing section. To avoid
99*b1cdbd2cSJim Jagielski // these problems, additional markers are first inserted and later deleted.
XMLSectionImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName)100*b1cdbd2cSJim Jagielski XMLSectionImportContext::XMLSectionImportContext(
101*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
102*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
103*b1cdbd2cSJim Jagielski 	const OUString& rLocalName )
104*b1cdbd2cSJim Jagielski :	SvXMLImportContext(rImport, nPrfx, rLocalName)
105*b1cdbd2cSJim Jagielski ,	sTextSection(RTL_CONSTASCII_USTRINGPARAM(sAPI_TextSection))
106*b1cdbd2cSJim Jagielski ,	sIndexHeaderSection(RTL_CONSTASCII_USTRINGPARAM(sAPI_IndexHeaderSection))
107*b1cdbd2cSJim Jagielski ,	sCondition(RTL_CONSTASCII_USTRINGPARAM(sAPI_Condition))
108*b1cdbd2cSJim Jagielski ,	sIsVisible(RTL_CONSTASCII_USTRINGPARAM(sAPI_IsVisible))
109*b1cdbd2cSJim Jagielski ,	sProtectionKey(RTL_CONSTASCII_USTRINGPARAM(sAPI_ProtectionKey))
110*b1cdbd2cSJim Jagielski ,	sIsProtected(RTL_CONSTASCII_USTRINGPARAM(sAPI_IsProtected))
111*b1cdbd2cSJim Jagielski ,	sIsCurrentlyVisible(RTL_CONSTASCII_USTRINGPARAM(sAPI_IsCurrentlyVisible))
112*b1cdbd2cSJim Jagielski ,	bProtect(sal_False)
113*b1cdbd2cSJim Jagielski ,	bCondOK(sal_False)
114*b1cdbd2cSJim Jagielski ,	bIsVisible(sal_True)
115*b1cdbd2cSJim Jagielski ,	bValid(sal_False)
116*b1cdbd2cSJim Jagielski ,	bSequenceOK(sal_False)
117*b1cdbd2cSJim Jagielski ,	bIsCurrentlyVisible(sal_True)
118*b1cdbd2cSJim Jagielski ,	bIsCurrentlyVisibleOK(sal_False)
119*b1cdbd2cSJim Jagielski ,	bHasContent(sal_False)
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
~XMLSectionImportContext()123*b1cdbd2cSJim Jagielski XMLSectionImportContext::~XMLSectionImportContext()
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski }
126*b1cdbd2cSJim Jagielski 
StartElement(const Reference<XAttributeList> & xAttrList)127*b1cdbd2cSJim Jagielski void XMLSectionImportContext::StartElement(
128*b1cdbd2cSJim Jagielski 	const Reference<XAttributeList> & xAttrList)
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski 	// process attributes
131*b1cdbd2cSJim Jagielski 	ProcessAttributes(xAttrList);
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 	// process index headers:
134*b1cdbd2cSJim Jagielski 	sal_Bool bIsIndexHeader = IsXMLToken( GetLocalName(), XML_INDEX_TITLE );
135*b1cdbd2cSJim Jagielski 	if (bIsIndexHeader)
136*b1cdbd2cSJim Jagielski 	{
137*b1cdbd2cSJim Jagielski 		bValid = sal_True;
138*b1cdbd2cSJim Jagielski 	}
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 	UniReference<XMLTextImportHelper> rHelper = GetImport().GetTextImport();
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 	// valid?
143*b1cdbd2cSJim Jagielski 	if (bValid)
144*b1cdbd2cSJim Jagielski 	{
145*b1cdbd2cSJim Jagielski 		// create text section (as XPropertySet)
146*b1cdbd2cSJim Jagielski 		Reference<XMultiServiceFactory> xFactory(
147*b1cdbd2cSJim Jagielski 			GetImport().GetModel(),UNO_QUERY);
148*b1cdbd2cSJim Jagielski 		if (xFactory.is())
149*b1cdbd2cSJim Jagielski 		{
150*b1cdbd2cSJim Jagielski 			Reference<XInterface> xIfc =
151*b1cdbd2cSJim Jagielski 				xFactory->createInstance( bIsIndexHeader ? sIndexHeaderSection
152*b1cdbd2cSJim Jagielski 														: sTextSection );
153*b1cdbd2cSJim Jagielski 			if (xIfc.is())
154*b1cdbd2cSJim Jagielski 			{
155*b1cdbd2cSJim Jagielski 				Reference<XPropertySet> xPropSet(xIfc, UNO_QUERY);
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 				// save PropertySet (for CreateChildContext)
158*b1cdbd2cSJim Jagielski 				xSectionPropertySet = xPropSet;
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 				// name
161*b1cdbd2cSJim Jagielski 				Reference<XNamed> xNamed(xPropSet, UNO_QUERY);
162*b1cdbd2cSJim Jagielski 				xNamed->setName(sName);
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 				// stylename?
165*b1cdbd2cSJim Jagielski 				if (sStyleName.getLength() > 0)
166*b1cdbd2cSJim Jagielski 				{
167*b1cdbd2cSJim Jagielski 					XMLPropStyleContext* pStyle = rHelper->
168*b1cdbd2cSJim Jagielski 						FindSectionStyle(sStyleName);
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 					if (pStyle != NULL)
171*b1cdbd2cSJim Jagielski 					{
172*b1cdbd2cSJim Jagielski 						pStyle->FillPropertySet( xPropSet );
173*b1cdbd2cSJim Jagielski 					}
174*b1cdbd2cSJim Jagielski 				}
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 				// IsVisible and condition (not for index headers)
177*b1cdbd2cSJim Jagielski 				if (! bIsIndexHeader)
178*b1cdbd2cSJim Jagielski 				{
179*b1cdbd2cSJim Jagielski 					Any aAny;
180*b1cdbd2cSJim Jagielski 					aAny.setValue( &bIsVisible, ::getBooleanCppuType() );
181*b1cdbd2cSJim Jagielski 					xPropSet->setPropertyValue( sIsVisible, aAny );
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski                     // #97450# hidden sections must be hidden on reload
184*b1cdbd2cSJim Jagielski                     // For backwards compatibilty, set flag only if it is
185*b1cdbd2cSJim Jagielski                     // present
186*b1cdbd2cSJim Jagielski                     if( bIsCurrentlyVisibleOK )
187*b1cdbd2cSJim Jagielski                     {
188*b1cdbd2cSJim Jagielski                         aAny.setValue( &bIsCurrentlyVisible,
189*b1cdbd2cSJim Jagielski                                        ::getBooleanCppuType() );
190*b1cdbd2cSJim Jagielski                         xPropSet->setPropertyValue( sIsCurrentlyVisible, aAny);
191*b1cdbd2cSJim Jagielski                     }
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 					if (bCondOK)
194*b1cdbd2cSJim Jagielski 					{
195*b1cdbd2cSJim Jagielski 						aAny <<= sCond;
196*b1cdbd2cSJim Jagielski 						xPropSet->setPropertyValue( sCondition, aAny );
197*b1cdbd2cSJim Jagielski 					}
198*b1cdbd2cSJim Jagielski 				}
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski 				// password (only for regular sections)
201*b1cdbd2cSJim Jagielski 				if ( bSequenceOK &&
202*b1cdbd2cSJim Jagielski                      IsXMLToken(GetLocalName(), XML_SECTION) )
203*b1cdbd2cSJim Jagielski 				{
204*b1cdbd2cSJim Jagielski 					Any aAny;
205*b1cdbd2cSJim Jagielski 					aAny <<= aSequence;
206*b1cdbd2cSJim Jagielski 					xPropSet->setPropertyValue(sProtectionKey, aAny);
207*b1cdbd2cSJim Jagielski 				}
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 				// protection
210*b1cdbd2cSJim Jagielski 				Any aAny;
211*b1cdbd2cSJim Jagielski 				aAny.setValue( &bProtect, ::getBooleanCppuType() );
212*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( sIsProtected, aAny );
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 				// insert marker, <paragraph>, marker; then insert
215*b1cdbd2cSJim Jagielski 				// section over the first marker character, and delete the
216*b1cdbd2cSJim Jagielski 				// last paragraph (and marker) when closing a section.
217*b1cdbd2cSJim Jagielski 				Reference<XTextRange> xStart =
218*b1cdbd2cSJim Jagielski 					rHelper->GetCursor()->getStart();
219*b1cdbd2cSJim Jagielski #ifndef DBG_UTIL
220*b1cdbd2cSJim Jagielski 				static const sal_Char sMarker[] = " ";
221*b1cdbd2cSJim Jagielski #else
222*b1cdbd2cSJim Jagielski 				static const sal_Char sMarker[] = "X";
223*b1cdbd2cSJim Jagielski #endif
224*b1cdbd2cSJim Jagielski 				OUString sMarkerString(RTL_CONSTASCII_USTRINGPARAM(sMarker));
225*b1cdbd2cSJim Jagielski 				rHelper->InsertString(sMarkerString);
226*b1cdbd2cSJim Jagielski 				rHelper->InsertControlCharacter(
227*b1cdbd2cSJim Jagielski 					ControlCharacter::APPEND_PARAGRAPH );
228*b1cdbd2cSJim Jagielski 				rHelper->InsertString(sMarkerString);
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski 				// select first marker
231*b1cdbd2cSJim Jagielski 				rHelper->GetCursor()->gotoRange(xStart, sal_False);
232*b1cdbd2cSJim Jagielski 				rHelper->GetCursor()->goRight(1, sal_True);
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 				// convert section to XTextContent
235*b1cdbd2cSJim Jagielski 				Reference<XTextContent> xTextContent(xSectionPropertySet,
236*b1cdbd2cSJim Jagielski 													 UNO_QUERY);
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 				// and insert (over marker)
239*b1cdbd2cSJim Jagielski 				rHelper->GetText()->insertTextContent(
240*b1cdbd2cSJim Jagielski 					rHelper->GetCursorAsRange(), xTextContent, sal_True );
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 				// and delete first marker (in section)
243*b1cdbd2cSJim Jagielski 				rHelper->GetText()->insertString(
244*b1cdbd2cSJim Jagielski 					rHelper->GetCursorAsRange(), sEmpty, sal_True);
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 				// finally, check for redlines that should start at
247*b1cdbd2cSJim Jagielski 				// the section start node
248*b1cdbd2cSJim Jagielski 				rHelper->RedlineAdjustStartNodeCursor(sal_True); // start ???
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski                 // xml:id for RDF metadata
251*b1cdbd2cSJim Jagielski                 GetImport().SetXmlId(xIfc, sXmlId);
252*b1cdbd2cSJim Jagielski 			}
253*b1cdbd2cSJim Jagielski 		}
254*b1cdbd2cSJim Jagielski 	}
255*b1cdbd2cSJim Jagielski }
256*b1cdbd2cSJim Jagielski 
ProcessAttributes(const Reference<XAttributeList> & xAttrList)257*b1cdbd2cSJim Jagielski void XMLSectionImportContext::ProcessAttributes(
258*b1cdbd2cSJim Jagielski 	const Reference<XAttributeList> & xAttrList )
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski 	SvXMLTokenMap aTokenMap(aSectionTokenMap);
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	sal_Int16 nLength = xAttrList->getLength();
263*b1cdbd2cSJim Jagielski 	for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
264*b1cdbd2cSJim Jagielski 	{
265*b1cdbd2cSJim Jagielski 		OUString sLocalName;
266*b1cdbd2cSJim Jagielski 		sal_uInt16 nNamePrefix = GetImport().GetNamespaceMap().
267*b1cdbd2cSJim Jagielski 			GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
268*b1cdbd2cSJim Jagielski 							  &sLocalName );
269*b1cdbd2cSJim Jagielski 		OUString sAttr = xAttrList->getValueByIndex(nAttr);
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 		switch (aTokenMap.Get(nNamePrefix, sLocalName))
272*b1cdbd2cSJim Jagielski 		{
273*b1cdbd2cSJim Jagielski 			case XML_TOK_SECTION_XMLID:
274*b1cdbd2cSJim Jagielski                 sXmlId = sAttr;
275*b1cdbd2cSJim Jagielski 				break;
276*b1cdbd2cSJim Jagielski 			case XML_TOK_SECTION_STYLE_NAME:
277*b1cdbd2cSJim Jagielski 				sStyleName = sAttr;
278*b1cdbd2cSJim Jagielski 				break;
279*b1cdbd2cSJim Jagielski 			case XML_TOK_SECTION_NAME:
280*b1cdbd2cSJim Jagielski 				sName = sAttr;
281*b1cdbd2cSJim Jagielski 				bValid = sal_True;
282*b1cdbd2cSJim Jagielski 				break;
283*b1cdbd2cSJim Jagielski 			case XML_TOK_SECTION_CONDITION:
284*b1cdbd2cSJim Jagielski 				{
285*b1cdbd2cSJim Jagielski 					OUString sTmp;
286*b1cdbd2cSJim Jagielski 					sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
287*b1cdbd2cSJim Jagielski 									_GetKeyByAttrName( sAttr, &sTmp, sal_False );
288*b1cdbd2cSJim Jagielski 					if( XML_NAMESPACE_OOOW == nPrefix )
289*b1cdbd2cSJim Jagielski 					{
290*b1cdbd2cSJim Jagielski 						sCond = sTmp;
291*b1cdbd2cSJim Jagielski 						bCondOK = sal_True;
292*b1cdbd2cSJim Jagielski 					}
293*b1cdbd2cSJim Jagielski 					else
294*b1cdbd2cSJim Jagielski 						sCond = sAttr;
295*b1cdbd2cSJim Jagielski 				}
296*b1cdbd2cSJim Jagielski 				break;
297*b1cdbd2cSJim Jagielski 			case XML_TOK_SECTION_DISPLAY:
298*b1cdbd2cSJim Jagielski 				if (IsXMLToken(sAttr, XML_TRUE))
299*b1cdbd2cSJim Jagielski 				{
300*b1cdbd2cSJim Jagielski 					bIsVisible = sal_True;
301*b1cdbd2cSJim Jagielski 				}
302*b1cdbd2cSJim Jagielski 				else if ( IsXMLToken(sAttr, XML_NONE) ||
303*b1cdbd2cSJim Jagielski 						  IsXMLToken(sAttr, XML_CONDITION) )
304*b1cdbd2cSJim Jagielski 				{
305*b1cdbd2cSJim Jagielski 					bIsVisible = sal_False;
306*b1cdbd2cSJim Jagielski 				}
307*b1cdbd2cSJim Jagielski 				// else: ignore
308*b1cdbd2cSJim Jagielski 				break;
309*b1cdbd2cSJim Jagielski 			case XML_TOK_SECTION_IS_HIDDEN:
310*b1cdbd2cSJim Jagielski                 {
311*b1cdbd2cSJim Jagielski                     sal_Bool bTmp;
312*b1cdbd2cSJim Jagielski                     if (SvXMLUnitConverter::convertBool(bTmp, sAttr))
313*b1cdbd2cSJim Jagielski                     {
314*b1cdbd2cSJim Jagielski                         bIsCurrentlyVisible = !bTmp;
315*b1cdbd2cSJim Jagielski                         bIsCurrentlyVisibleOK = sal_True;
316*b1cdbd2cSJim Jagielski                     }
317*b1cdbd2cSJim Jagielski                 }
318*b1cdbd2cSJim Jagielski                 break;
319*b1cdbd2cSJim Jagielski 			case XML_TOK_SECTION_PROTECTION_KEY:
320*b1cdbd2cSJim Jagielski 				SvXMLUnitConverter::decodeBase64(aSequence, sAttr);
321*b1cdbd2cSJim Jagielski 				bSequenceOK = sal_True;
322*b1cdbd2cSJim Jagielski 				break;
323*b1cdbd2cSJim Jagielski 			case XML_TOK_SECTION_PROTECT:
324*b1cdbd2cSJim Jagielski 			{
325*b1cdbd2cSJim Jagielski 				sal_Bool bTmp;
326*b1cdbd2cSJim Jagielski 				if (SvXMLUnitConverter::convertBool(bTmp, sAttr))
327*b1cdbd2cSJim Jagielski 				{
328*b1cdbd2cSJim Jagielski 					bProtect = bTmp;
329*b1cdbd2cSJim Jagielski 				}
330*b1cdbd2cSJim Jagielski 				break;
331*b1cdbd2cSJim Jagielski 			}
332*b1cdbd2cSJim Jagielski 			default:
333*b1cdbd2cSJim Jagielski 				; // ignore
334*b1cdbd2cSJim Jagielski 				break;
335*b1cdbd2cSJim Jagielski 		}
336*b1cdbd2cSJim Jagielski 	}
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski 
EndElement()339*b1cdbd2cSJim Jagielski void XMLSectionImportContext::EndElement()
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski 	// get rid of last paragraph
342*b1cdbd2cSJim Jagielski 	// (unless it's the only paragraph in the section)
343*b1cdbd2cSJim Jagielski 	UniReference<XMLTextImportHelper> rHelper = GetImport().GetTextImport();
344*b1cdbd2cSJim Jagielski 	rHelper->GetCursor()->goRight(1, sal_False);
345*b1cdbd2cSJim Jagielski 	if (bHasContent)
346*b1cdbd2cSJim Jagielski 	{
347*b1cdbd2cSJim Jagielski 		rHelper->GetCursor()->goLeft(1, sal_True);
348*b1cdbd2cSJim Jagielski 		rHelper->GetText()->insertString(rHelper->GetCursorAsRange(),
349*b1cdbd2cSJim Jagielski 										 sEmpty, sal_True);
350*b1cdbd2cSJim Jagielski 	}
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski 	// and delete second marker
353*b1cdbd2cSJim Jagielski 	rHelper->GetCursor()->goRight(1, sal_True);
354*b1cdbd2cSJim Jagielski 	rHelper->GetText()->insertString(rHelper->GetCursorAsRange(),
355*b1cdbd2cSJim Jagielski 									 sEmpty, sal_True);
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski     // check for redlines to our endnode
358*b1cdbd2cSJim Jagielski     rHelper->RedlineAdjustStartNodeCursor(sal_False);
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)361*b1cdbd2cSJim Jagielski SvXMLImportContext* XMLSectionImportContext::CreateChildContext(
362*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrefix,
363*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
364*b1cdbd2cSJim Jagielski 	const Reference<XAttributeList> & xAttrList )
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski 	SvXMLImportContext* pContext = NULL;
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 	// section-source (-dde) elements
369*b1cdbd2cSJim Jagielski 	if ( (XML_NAMESPACE_TEXT == nPrefix) &&
370*b1cdbd2cSJim Jagielski          IsXMLToken(rLocalName, XML_SECTION_SOURCE) )
371*b1cdbd2cSJim Jagielski 	{
372*b1cdbd2cSJim Jagielski 		pContext = new XMLSectionSourceImportContext(GetImport(),
373*b1cdbd2cSJim Jagielski 													 nPrefix, rLocalName,
374*b1cdbd2cSJim Jagielski 													 xSectionPropertySet);
375*b1cdbd2cSJim Jagielski 	}
376*b1cdbd2cSJim Jagielski 	else if ( (XML_NAMESPACE_OFFICE == nPrefix) &&
377*b1cdbd2cSJim Jagielski               IsXMLToken(rLocalName, XML_DDE_SOURCE) )
378*b1cdbd2cSJim Jagielski 	{
379*b1cdbd2cSJim Jagielski 		pContext = new XMLSectionSourceDDEImportContext(GetImport(),
380*b1cdbd2cSJim Jagielski 														nPrefix, rLocalName,
381*b1cdbd2cSJim Jagielski 														xSectionPropertySet);
382*b1cdbd2cSJim Jagielski 	}
383*b1cdbd2cSJim Jagielski 	else
384*b1cdbd2cSJim Jagielski 	{
385*b1cdbd2cSJim Jagielski 		// otherwise: text context
386*b1cdbd2cSJim Jagielski 		pContext = GetImport().GetTextImport()->CreateTextChildContext(
387*b1cdbd2cSJim Jagielski 			GetImport(), nPrefix, rLocalName, xAttrList,
388*b1cdbd2cSJim Jagielski 			XML_TEXT_TYPE_SECTION );
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 		// if that fails, default context
391*b1cdbd2cSJim Jagielski 		if (NULL == pContext)
392*b1cdbd2cSJim Jagielski 		{
393*b1cdbd2cSJim Jagielski 			pContext = new SvXMLImportContext( GetImport(),
394*b1cdbd2cSJim Jagielski 											   nPrefix, rLocalName );
395*b1cdbd2cSJim Jagielski 		}
396*b1cdbd2cSJim Jagielski 		else
397*b1cdbd2cSJim Jagielski 			bHasContent = sal_True;
398*b1cdbd2cSJim Jagielski 	}
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski 	return pContext;
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski 
403