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