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