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