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