xref: /AOO41X/main/xmloff/source/text/XMLTextMarkImportContext.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*63bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*63bba73cSAndrew Rist  * distributed with this work for additional information
6*63bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*63bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*63bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*63bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist  * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*63bba73cSAndrew Rist  * specific language governing permissions and limitations
18*63bba73cSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*63bba73cSAndrew Rist  *************************************************************/
21*63bba73cSAndrew Rist 
22*63bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include "XMLTextMarkImportContext.hxx"
29cdf0e10cSrcweir 
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <rtl/ustring.hxx>
32cdf0e10cSrcweir #include <tools/debug.hxx>
33cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
34cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
35cdf0e10cSrcweir #include <xmloff/xmlimp.hxx>
36cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
37cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
38cdf0e10cSrcweir #include <xmloff/odffields.hxx>
39cdf0e10cSrcweir #include <com/sun/star/xml/sax/XAttributeList.hpp>
40cdf0e10cSrcweir #include <com/sun/star/text/XTextContent.hpp>
41cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
42cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
43cdf0e10cSrcweir #include <com/sun/star/container/XNamed.hpp>
44cdf0e10cSrcweir #include <com/sun/star/rdf/XMetadatable.hpp>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #include <com/sun/star/text/XFormField.hpp>
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include "RDFaImportHelper.hxx"
49cdf0e10cSrcweir 
50cdf0e10cSrcweir 
51cdf0e10cSrcweir using ::rtl::OUString;
52cdf0e10cSrcweir using ::rtl::OUStringBuffer;
53cdf0e10cSrcweir 
54cdf0e10cSrcweir using namespace ::com::sun::star;
55cdf0e10cSrcweir using namespace ::com::sun::star::text;
56cdf0e10cSrcweir using namespace ::com::sun::star::uno;
57cdf0e10cSrcweir using namespace ::com::sun::star::beans;
58cdf0e10cSrcweir using namespace ::com::sun::star::lang;
59cdf0e10cSrcweir using namespace ::com::sun::star::container;
60cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax;
61cdf0e10cSrcweir using namespace ::xmloff::token;
62cdf0e10cSrcweir 
63cdf0e10cSrcweir 
XMLFieldParamImportContext(SvXMLImport & rImport,XMLTextImportHelper & rHlp,sal_uInt16 nPrefix,const OUString & rLocalName)64cdf0e10cSrcweir XMLFieldParamImportContext::XMLFieldParamImportContext(
65cdf0e10cSrcweir 	SvXMLImport& rImport,
66cdf0e10cSrcweir 	XMLTextImportHelper& rHlp,
67cdf0e10cSrcweir 	sal_uInt16 nPrefix,
68cdf0e10cSrcweir 	const OUString& rLocalName ) :
69cdf0e10cSrcweir 		SvXMLImportContext(rImport, nPrefix, rLocalName),
70cdf0e10cSrcweir 		rHelper(rHlp)
71cdf0e10cSrcweir {
72cdf0e10cSrcweir }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)75cdf0e10cSrcweir void XMLFieldParamImportContext::StartElement(const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList> & xAttrList)
76cdf0e10cSrcweir {
77cdf0e10cSrcweir 	SvXMLImport& rImport = GetImport();
78cdf0e10cSrcweir 	::rtl::OUString sName;
79cdf0e10cSrcweir 	::rtl::OUString sValue;
80cdf0e10cSrcweir 
81cdf0e10cSrcweir 	sal_Int16 nLength = xAttrList->getLength();
82cdf0e10cSrcweir 	for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
83cdf0e10cSrcweir 	{
84cdf0e10cSrcweir 		OUString sLocalName;
85cdf0e10cSrcweir 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().
86cdf0e10cSrcweir 			GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
87cdf0e10cSrcweir 							  &sLocalName );
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 		if ( (XML_NAMESPACE_FIELD == nPrefix) &&
90cdf0e10cSrcweir 			 IsXMLToken(sLocalName, XML_NAME)   )
91cdf0e10cSrcweir 		{
92cdf0e10cSrcweir 			sName = xAttrList->getValueByIndex(nAttr);
93cdf0e10cSrcweir 		}
94cdf0e10cSrcweir 		if ( (XML_NAMESPACE_FIELD == nPrefix) &&
95cdf0e10cSrcweir 			 IsXMLToken(sLocalName, XML_VALUE)   )
96cdf0e10cSrcweir 		{
97cdf0e10cSrcweir 			sValue = xAttrList->getValueByIndex(nAttr);
98cdf0e10cSrcweir 		}
99cdf0e10cSrcweir 	}
100cdf0e10cSrcweir 	if (rHelper.hasCurrentFieldCtx() && sName.getLength()>0) {
101cdf0e10cSrcweir 		rHelper.addFieldParam(sName, sValue);
102cdf0e10cSrcweir 	}
103cdf0e10cSrcweir }
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 
106cdf0e10cSrcweir TYPEINIT1( XMLTextMarkImportContext, SvXMLImportContext);
107cdf0e10cSrcweir 
XMLTextMarkImportContext(SvXMLImport & rImport,XMLTextImportHelper & rHlp,sal_uInt16 nPrefix,const OUString & rLocalName)108cdf0e10cSrcweir XMLTextMarkImportContext::XMLTextMarkImportContext(
109cdf0e10cSrcweir 	SvXMLImport& rImport,
110cdf0e10cSrcweir 	XMLTextImportHelper& rHlp,
111cdf0e10cSrcweir 	sal_uInt16 nPrefix,
112cdf0e10cSrcweir     const OUString& rLocalName )
113cdf0e10cSrcweir     : SvXMLImportContext(rImport, nPrefix, rLocalName)
114cdf0e10cSrcweir     , m_rHelper(rHlp)
115cdf0e10cSrcweir     , m_bHaveAbout(false)
116cdf0e10cSrcweir {
117cdf0e10cSrcweir }
118cdf0e10cSrcweir 
119cdf0e10cSrcweir enum lcl_MarkType { TypeReference, TypeReferenceStart, TypeReferenceEnd,
120cdf0e10cSrcweir 					TypeBookmark, TypeBookmarkStart, TypeBookmarkEnd,
121cdf0e10cSrcweir 					TypeFieldmark, TypeFieldmarkStart, TypeFieldmarkEnd
122cdf0e10cSrcweir 				  };
123cdf0e10cSrcweir 
124cdf0e10cSrcweir static SvXMLEnumMapEntry __READONLY_DATA lcl_aMarkTypeMap[] =
125cdf0e10cSrcweir {
126cdf0e10cSrcweir 	{ XML_REFERENCE_MARK,			TypeReference },
127cdf0e10cSrcweir 	{ XML_REFERENCE_MARK_START,	    TypeReferenceStart },
128cdf0e10cSrcweir 	{ XML_REFERENCE_MARK_END,		TypeReferenceEnd },
129cdf0e10cSrcweir 	{ XML_BOOKMARK,				    TypeBookmark },
130cdf0e10cSrcweir 	{ XML_BOOKMARK_START,			TypeBookmarkStart },
131cdf0e10cSrcweir 	{ XML_BOOKMARK_END,			    TypeBookmarkEnd },
132cdf0e10cSrcweir 	{ XML_FIELDMARK,				TypeFieldmark },
133cdf0e10cSrcweir 	{ XML_FIELDMARK_START,			TypeFieldmarkStart },
134cdf0e10cSrcweir 	{ XML_FIELDMARK_END,			TypeFieldmarkEnd },
135cdf0e10cSrcweir 	{ XML_TOKEN_INVALID,    		0 },
136cdf0e10cSrcweir };
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 
lcl_getFormFieldmarkName(rtl::OUString & name)139cdf0e10cSrcweir static const char *lcl_getFormFieldmarkName(rtl::OUString &name)
140cdf0e10cSrcweir {
141cdf0e10cSrcweir     static const char sCheckbox[]=ODF_FORMCHECKBOX;
142cdf0e10cSrcweir     static const char sFormDropDown[]=ODF_FORMDROPDOWN;
143cdf0e10cSrcweir     if (name.compareToAscii("msoffice.field.FORMCHECKBOX")==0)
144cdf0e10cSrcweir         return sCheckbox;
145cdf0e10cSrcweir     else if (name.compareToAscii(ODF_FORMCHECKBOX)==0)
146cdf0e10cSrcweir         return sCheckbox;
147cdf0e10cSrcweir     if (name.compareToAscii(ODF_FORMDROPDOWN)==0)
148cdf0e10cSrcweir         return sFormDropDown;
149cdf0e10cSrcweir     else
150cdf0e10cSrcweir         return NULL;
151cdf0e10cSrcweir }
152cdf0e10cSrcweir 
lcl_getFieldmarkName(rtl::OUString & name)153cdf0e10cSrcweir static rtl::OUString lcl_getFieldmarkName(rtl::OUString &name)
154cdf0e10cSrcweir {
155cdf0e10cSrcweir     static const char sFormtext[]=ODF_FORMTEXT;
156cdf0e10cSrcweir     if (name.compareToAscii("msoffice.field.FORMTEXT")==0)
157cdf0e10cSrcweir         return rtl::OUString::createFromAscii(sFormtext);
158cdf0e10cSrcweir     else if (name.compareToAscii(ODF_FORMTEXT)==0)
159cdf0e10cSrcweir         return rtl::OUString::createFromAscii(sFormtext);
160cdf0e10cSrcweir     else
161cdf0e10cSrcweir         return name;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 
StartElement(const Reference<XAttributeList> & xAttrList)165cdf0e10cSrcweir void XMLTextMarkImportContext::StartElement(
166cdf0e10cSrcweir 	const Reference<XAttributeList> & xAttrList)
167cdf0e10cSrcweir {
168cdf0e10cSrcweir     if (!FindName(GetImport(), xAttrList))
169cdf0e10cSrcweir     {
170cdf0e10cSrcweir         m_sBookmarkName = OUString();
171cdf0e10cSrcweir     }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir 	if (IsXMLToken(GetLocalName(), XML_FIELDMARK_END))
174cdf0e10cSrcweir     {
175cdf0e10cSrcweir         m_sBookmarkName = m_rHelper.FindActiveBookmarkName();
176cdf0e10cSrcweir     }
177cdf0e10cSrcweir 
178cdf0e10cSrcweir     if (IsXMLToken(GetLocalName(), XML_FIELDMARK_START) || IsXMLToken(GetLocalName(), XML_FIELDMARK))
179cdf0e10cSrcweir     {
180cdf0e10cSrcweir         if (m_sBookmarkName.getLength() == 0)
181cdf0e10cSrcweir         {
182cdf0e10cSrcweir             m_sBookmarkName = ::rtl::OUString::createFromAscii("Unknown");
183cdf0e10cSrcweir         }
184cdf0e10cSrcweir         m_rHelper.pushFieldCtx( m_sBookmarkName, m_sFieldName );
185cdf0e10cSrcweir 	}
186cdf0e10cSrcweir }
187cdf0e10cSrcweir 
EndElement()188cdf0e10cSrcweir void XMLTextMarkImportContext::EndElement()
189cdf0e10cSrcweir {
190cdf0e10cSrcweir 	SvXMLImportContext::EndElement();
191cdf0e10cSrcweir 
192cdf0e10cSrcweir     static const OUString sAPI_reference_mark(
193cdf0e10cSrcweir 		RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.ReferenceMark"));
194cdf0e10cSrcweir     static const OUString sAPI_bookmark(
195cdf0e10cSrcweir 		RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.Bookmark"));
196cdf0e10cSrcweir     static const OUString sAPI_fieldmark(
197cdf0e10cSrcweir 		RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.Fieldmark"));
198cdf0e10cSrcweir     static const OUString sAPI_formfieldmark(
199cdf0e10cSrcweir 		RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.FormFieldmark"));
200cdf0e10cSrcweir 
201cdf0e10cSrcweir     if (m_sBookmarkName.getLength() > 0)
202cdf0e10cSrcweir 	{
203cdf0e10cSrcweir 		sal_uInt16 nTmp;
204cdf0e10cSrcweir 		if (SvXMLUnitConverter::convertEnum(nTmp, GetLocalName(),
205cdf0e10cSrcweir 											lcl_aMarkTypeMap))
206cdf0e10cSrcweir 		{
207cdf0e10cSrcweir 			switch ((lcl_MarkType)nTmp)
208cdf0e10cSrcweir 			{
209cdf0e10cSrcweir 				case TypeReference:
210cdf0e10cSrcweir 					// export point reference mark
211cdf0e10cSrcweir 					CreateAndInsertMark(GetImport(),
212cdf0e10cSrcweir                         sAPI_reference_mark,
213cdf0e10cSrcweir                         m_sBookmarkName,
214cdf0e10cSrcweir                         m_rHelper.GetCursorAsRange()->getStart(),
215cdf0e10cSrcweir                         ::rtl::OUString());
216cdf0e10cSrcweir 					break;
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 				case TypeFieldmark:
219cdf0e10cSrcweir 				case TypeBookmark:
220cdf0e10cSrcweir 					{
221cdf0e10cSrcweir                         const char *formFieldmarkName=lcl_getFormFieldmarkName(m_sFieldName);
222cdf0e10cSrcweir                         bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmark && formFieldmarkName!=NULL); //@TODO handle abbreviation cases..
223cdf0e10cSrcweir 						// export point bookmark
224cdf0e10cSrcweir                         const Reference<XInterface> xContent(
225cdf0e10cSrcweir                             CreateAndInsertMark(GetImport(),
226cdf0e10cSrcweir 										(bImportAsField?sAPI_formfieldmark:sAPI_bookmark),
227cdf0e10cSrcweir                                 m_sBookmarkName,
228cdf0e10cSrcweir                                 m_rHelper.GetCursorAsRange()->getStart(),
229cdf0e10cSrcweir                                 m_sXmlId) );
230cdf0e10cSrcweir 						if ((lcl_MarkType)nTmp==TypeFieldmark) {
231cdf0e10cSrcweir                             if (xContent.is() && bImportAsField) {
232cdf0e10cSrcweir 								// setup fieldmark...
233cdf0e10cSrcweir                                 Reference< ::com::sun::star::text::XFormField> xFormField(xContent, UNO_QUERY);
234cdf0e10cSrcweir                                 xFormField->setFieldType(rtl::OUString::createFromAscii(formFieldmarkName));
235cdf0e10cSrcweir                                 if (xFormField.is() && m_rHelper.hasCurrentFieldCtx()) {
236cdf0e10cSrcweir                                     m_rHelper.setCurrentFieldParamsTo(xFormField);
237cdf0e10cSrcweir 								}
238cdf0e10cSrcweir 							}
239cdf0e10cSrcweir                             m_rHelper.popFieldCtx();
240cdf0e10cSrcweir 						}
241cdf0e10cSrcweir 					}
242cdf0e10cSrcweir 					break;
243cdf0e10cSrcweir 
244cdf0e10cSrcweir 				case TypeFieldmarkStart:
245cdf0e10cSrcweir 				case TypeBookmarkStart:
246cdf0e10cSrcweir 					// save XTextRange for later construction of bookmark
247cdf0e10cSrcweir                     {
248cdf0e10cSrcweir                         ::boost::shared_ptr< ::xmloff::ParsedRDFaAttributes >
249cdf0e10cSrcweir                             pRDFaAttributes;
250cdf0e10cSrcweir                         if (m_bHaveAbout && (TypeBookmarkStart
251cdf0e10cSrcweir                                 == static_cast<lcl_MarkType>(nTmp)))
252cdf0e10cSrcweir                         {
253cdf0e10cSrcweir                             pRDFaAttributes =
254cdf0e10cSrcweir                                 GetImport().GetRDFaImportHelper().ParseRDFa(
255cdf0e10cSrcweir                                     m_sAbout, m_sProperty,
256cdf0e10cSrcweir                                     m_sContent, m_sDatatype);
257cdf0e10cSrcweir                         }
258cdf0e10cSrcweir                         m_rHelper.InsertBookmarkStartRange(
259cdf0e10cSrcweir                             m_sBookmarkName,
260cdf0e10cSrcweir                             m_rHelper.GetCursorAsRange()->getStart(),
261cdf0e10cSrcweir                             m_sXmlId, pRDFaAttributes);
262cdf0e10cSrcweir                     }
263cdf0e10cSrcweir 					break;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 				case TypeFieldmarkEnd:
266cdf0e10cSrcweir 				case TypeBookmarkEnd:
267cdf0e10cSrcweir 				{
268cdf0e10cSrcweir 					// get old range, and construct
269cdf0e10cSrcweir 					Reference<XTextRange> xStartRange;
270cdf0e10cSrcweir                     ::boost::shared_ptr< ::xmloff::ParsedRDFaAttributes >
271cdf0e10cSrcweir                         pRDFaAttributes;
272cdf0e10cSrcweir                     if (m_rHelper.FindAndRemoveBookmarkStartRange(
273cdf0e10cSrcweir                             m_sBookmarkName, xStartRange,
274cdf0e10cSrcweir                             m_sXmlId, pRDFaAttributes))
275cdf0e10cSrcweir 					{
276cdf0e10cSrcweir 						Reference<XTextRange> xEndRange(
277cdf0e10cSrcweir                             m_rHelper.GetCursorAsRange()->getStart());
278cdf0e10cSrcweir 
279cdf0e10cSrcweir 						// check if beginning and end are in same XText
280cdf0e10cSrcweir 						if (xStartRange->getText() == xEndRange->getText())
281cdf0e10cSrcweir 						{
282cdf0e10cSrcweir 							// create range for insertion
283cdf0e10cSrcweir 							Reference<XTextCursor> xInsertionCursor =
284cdf0e10cSrcweir                                 m_rHelper.GetText()->createTextCursorByRange(
285cdf0e10cSrcweir 									xEndRange);
286cdf0e10cSrcweir                             try {
287cdf0e10cSrcweir 							xInsertionCursor->gotoRange(xStartRange, sal_True);
288cdf0e10cSrcweir                             } catch (uno::Exception&) {
289cdf0e10cSrcweir                                 OSL_ENSURE(false,
290cdf0e10cSrcweir                                     "cannot go to end position of bookmark");
291cdf0e10cSrcweir                             }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 							//DBG_ASSERT(! xInsertionCursor->isCollapsed(),
294cdf0e10cSrcweir 							// 				"we want no point mark");
295cdf0e10cSrcweir 							// can't assert, because someone could
296cdf0e10cSrcweir 							// create a file with subsequence
297cdf0e10cSrcweir 							// start/end elements
298cdf0e10cSrcweir 
299cdf0e10cSrcweir 							Reference<XTextRange> xInsertionRange(
300cdf0e10cSrcweir 								xInsertionCursor, UNO_QUERY);
301cdf0e10cSrcweir 
302cdf0e10cSrcweir                             bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmarkEnd && m_rHelper.hasCurrentFieldCtx());
303cdf0e10cSrcweir 
304cdf0e10cSrcweir 							// insert reference
305cdf0e10cSrcweir                             const Reference<XInterface> xContent(
306cdf0e10cSrcweir                                 CreateAndInsertMark(GetImport(),
307cdf0e10cSrcweir 												(bImportAsField?sAPI_fieldmark:sAPI_bookmark),
308cdf0e10cSrcweir                                     m_sBookmarkName,
309cdf0e10cSrcweir                                     xInsertionRange,
310cdf0e10cSrcweir                                     m_sXmlId) );
311cdf0e10cSrcweir                             if (pRDFaAttributes)
312cdf0e10cSrcweir                             {
313cdf0e10cSrcweir                                 const Reference<rdf::XMetadatable>
314cdf0e10cSrcweir                                     xMeta(xContent, UNO_QUERY);
315cdf0e10cSrcweir                                 GetImport().GetRDFaImportHelper().AddRDFa(
316cdf0e10cSrcweir                                     xMeta, pRDFaAttributes);
317cdf0e10cSrcweir                             }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir 							if ((lcl_MarkType)nTmp==TypeFieldmarkEnd) {
320cdf0e10cSrcweir                                 if (xContent.is() && bImportAsField) {
321cdf0e10cSrcweir 									// setup fieldmark...
322cdf0e10cSrcweir                                     Reference< ::com::sun::star::text::XFormField> xFormField(xContent, UNO_QUERY);
323cdf0e10cSrcweir                                     if (xFormField.is() && m_rHelper.hasCurrentFieldCtx()) {
324cdf0e10cSrcweir                                         rtl::OUString givenTypeName=m_rHelper.getCurrentFieldType();
325cdf0e10cSrcweir                                         rtl::OUString fieldmarkTypeName=lcl_getFieldmarkName(givenTypeName);
326cdf0e10cSrcweir 
327cdf0e10cSrcweir                                         xFormField->setFieldType(fieldmarkTypeName);
328cdf0e10cSrcweir                                         m_rHelper.setCurrentFieldParamsTo(xFormField);
329cdf0e10cSrcweir 									}
330cdf0e10cSrcweir 								}
331cdf0e10cSrcweir 								m_rHelper.popFieldCtx();
332cdf0e10cSrcweir 							}
333cdf0e10cSrcweir 						}
334cdf0e10cSrcweir 						// else: beginning/end in different XText -> ignore!
335cdf0e10cSrcweir 					}
336cdf0e10cSrcweir 					// else: no start found -> ignore!
337cdf0e10cSrcweir 					break;
338cdf0e10cSrcweir 				}
339cdf0e10cSrcweir 
340cdf0e10cSrcweir 				case TypeReferenceStart:
341cdf0e10cSrcweir 				case TypeReferenceEnd:
342cdf0e10cSrcweir 					DBG_ERROR("reference start/end are handled in txtparai !");
343cdf0e10cSrcweir 					break;
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 				default:
346cdf0e10cSrcweir 					DBG_ERROR("unknown mark type");
347cdf0e10cSrcweir 					break;
348cdf0e10cSrcweir 			}
349cdf0e10cSrcweir 		}
350cdf0e10cSrcweir 	}
351cdf0e10cSrcweir }
352cdf0e10cSrcweir 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)353cdf0e10cSrcweir SvXMLImportContext *XMLTextMarkImportContext::CreateChildContext( sal_uInt16 nPrefix,
354cdf0e10cSrcweir                                         const ::rtl::OUString& rLocalName,
355cdf0e10cSrcweir                                         const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >&  )
356cdf0e10cSrcweir {
357cdf0e10cSrcweir     return new XMLFieldParamImportContext(GetImport(), m_rHelper,
358cdf0e10cSrcweir                 nPrefix, rLocalName);
359cdf0e10cSrcweir }
360cdf0e10cSrcweir 
361cdf0e10cSrcweir 
CreateAndInsertMark(SvXMLImport & rImport,const OUString & sServiceName,const OUString & sMarkName,const Reference<XTextRange> & rRange,const OUString & i_rXmlId)362cdf0e10cSrcweir Reference<XTextContent> XMLTextMarkImportContext::CreateAndInsertMark(
363cdf0e10cSrcweir     SvXMLImport& rImport,
364cdf0e10cSrcweir     const OUString& sServiceName,
365cdf0e10cSrcweir     const OUString& sMarkName,
366cdf0e10cSrcweir     const Reference<XTextRange> & rRange,
367cdf0e10cSrcweir     const OUString& i_rXmlId)
368cdf0e10cSrcweir {
369cdf0e10cSrcweir     // create mark
370cdf0e10cSrcweir     const Reference<XMultiServiceFactory> xFactory(rImport.GetModel(),
371cdf0e10cSrcweir         UNO_QUERY);
372cdf0e10cSrcweir     Reference<XInterface> xIfc;
373cdf0e10cSrcweir 
374cdf0e10cSrcweir     if (xFactory.is())
375cdf0e10cSrcweir     {
376cdf0e10cSrcweir         xIfc = xFactory->createInstance(sServiceName);
377cdf0e10cSrcweir 
378cdf0e10cSrcweir         if (!xIfc.is())
379cdf0e10cSrcweir         {
380cdf0e10cSrcweir             OSL_ENSURE(false, "CreateAndInsertMark: cannot create service?");
381cdf0e10cSrcweir             return 0;
382cdf0e10cSrcweir         }
383cdf0e10cSrcweir 
384cdf0e10cSrcweir         // set name (unless there is no name (text:meta))
385cdf0e10cSrcweir         const Reference<XNamed> xNamed(xIfc, UNO_QUERY);
386cdf0e10cSrcweir         if (xNamed.is())
387cdf0e10cSrcweir         {
388cdf0e10cSrcweir             xNamed->setName(sMarkName);
389cdf0e10cSrcweir         }
390cdf0e10cSrcweir         else
391cdf0e10cSrcweir         {
392cdf0e10cSrcweir             if (sMarkName.getLength())
393cdf0e10cSrcweir             {
394cdf0e10cSrcweir                 OSL_ENSURE(false, "name given, but XNamed not supported?");
395cdf0e10cSrcweir                 return 0;
396cdf0e10cSrcweir             }
397cdf0e10cSrcweir         }
398cdf0e10cSrcweir 
399cdf0e10cSrcweir         // cast to XTextContent and attach to document
400cdf0e10cSrcweir         const Reference<XTextContent> xTextContent(xIfc, UNO_QUERY);
401cdf0e10cSrcweir         if (xTextContent.is())
402cdf0e10cSrcweir         {
403cdf0e10cSrcweir             try
404cdf0e10cSrcweir             {
405cdf0e10cSrcweir                 // if inserting marks, bAbsorb==sal_False will cause
406cdf0e10cSrcweir                 // collapsing of the given XTextRange.
407cdf0e10cSrcweir                 rImport.GetTextImport()->GetText()->insertTextContent(rRange,
408cdf0e10cSrcweir                     xTextContent, sal_True);
409cdf0e10cSrcweir 
410cdf0e10cSrcweir                 // xml:id for RDF metadata -- after insertion!
411cdf0e10cSrcweir                 rImport.SetXmlId(xIfc, i_rXmlId);
412cdf0e10cSrcweir 
413cdf0e10cSrcweir                 return xTextContent;
414cdf0e10cSrcweir             }
415cdf0e10cSrcweir             catch (com::sun::star::lang::IllegalArgumentException &)
416cdf0e10cSrcweir             {
417cdf0e10cSrcweir                 OSL_ENSURE(false, "CreateAndInsertMark: cannot insert?");
418cdf0e10cSrcweir                 return 0;
419cdf0e10cSrcweir             }
420cdf0e10cSrcweir         }
421cdf0e10cSrcweir     }
422cdf0e10cSrcweir     return 0;
423cdf0e10cSrcweir }
424cdf0e10cSrcweir 
FindName(SvXMLImport & rImport,const Reference<XAttributeList> & xAttrList)425cdf0e10cSrcweir sal_Bool XMLTextMarkImportContext::FindName(
426cdf0e10cSrcweir 	SvXMLImport& rImport,
427cdf0e10cSrcweir     const Reference<XAttributeList> & xAttrList)
428cdf0e10cSrcweir {
429cdf0e10cSrcweir 	sal_Bool bNameOK = sal_False;
430cdf0e10cSrcweir 
431cdf0e10cSrcweir 	// find name attribute first
432cdf0e10cSrcweir     const sal_Int16 nLength = xAttrList->getLength();
433cdf0e10cSrcweir 	for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
434cdf0e10cSrcweir 	{
435cdf0e10cSrcweir 		OUString sLocalName;
436cdf0e10cSrcweir         const sal_uInt16 nPrefix = rImport.GetNamespaceMap().
437cdf0e10cSrcweir 			GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
438cdf0e10cSrcweir 							  &sLocalName );
439cdf0e10cSrcweir 
440cdf0e10cSrcweir 		if ( (XML_NAMESPACE_TEXT == nPrefix) &&
441cdf0e10cSrcweir 			 IsXMLToken(sLocalName, XML_NAME)   )
442cdf0e10cSrcweir 		{
443cdf0e10cSrcweir             m_sBookmarkName = xAttrList->getValueByIndex(nAttr);
444cdf0e10cSrcweir 			bNameOK = sal_True;
445cdf0e10cSrcweir 		}
446cdf0e10cSrcweir 		else if ( (XML_NAMESPACE_XML == nPrefix) &&
447cdf0e10cSrcweir 			 IsXMLToken(sLocalName, XML_ID)   )
448cdf0e10cSrcweir 		{
449cdf0e10cSrcweir             m_sXmlId = xAttrList->getValueByIndex(nAttr);
450cdf0e10cSrcweir 		}
451cdf0e10cSrcweir         else if ( XML_NAMESPACE_XHTML == nPrefix )
452cdf0e10cSrcweir         {
453cdf0e10cSrcweir             // RDFa
454cdf0e10cSrcweir             if ( IsXMLToken( sLocalName, XML_ABOUT) )
455cdf0e10cSrcweir             {
456cdf0e10cSrcweir                 m_sAbout = xAttrList->getValueByIndex(nAttr);
457cdf0e10cSrcweir                 m_bHaveAbout = true;
458cdf0e10cSrcweir             }
459cdf0e10cSrcweir             else if ( IsXMLToken( sLocalName, XML_PROPERTY) )
460cdf0e10cSrcweir             {
461cdf0e10cSrcweir                 m_sProperty = xAttrList->getValueByIndex(nAttr);
462cdf0e10cSrcweir             }
463cdf0e10cSrcweir             else if ( IsXMLToken( sLocalName, XML_CONTENT) )
464cdf0e10cSrcweir             {
465cdf0e10cSrcweir                 m_sContent = xAttrList->getValueByIndex(nAttr);
466cdf0e10cSrcweir             }
467cdf0e10cSrcweir             else if ( IsXMLToken( sLocalName, XML_DATATYPE) )
468cdf0e10cSrcweir             {
469cdf0e10cSrcweir                 m_sDatatype = xAttrList->getValueByIndex(nAttr);
470cdf0e10cSrcweir             }
471cdf0e10cSrcweir         }
472cdf0e10cSrcweir         else if ( (XML_NAMESPACE_FIELD == nPrefix) &&
473cdf0e10cSrcweir 			 IsXMLToken(sLocalName, XML_TYPE)   )
474cdf0e10cSrcweir 		{
475cdf0e10cSrcweir             m_sFieldName = xAttrList->getValueByIndex(nAttr);
476cdf0e10cSrcweir 		}
477cdf0e10cSrcweir 	}
478cdf0e10cSrcweir 
479cdf0e10cSrcweir 	return bNameOK;
480cdf0e10cSrcweir }
481cdf0e10cSrcweir 
482