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 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 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 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 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 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 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 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 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 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 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